一键式自动给个人云服务搭建常用平台
背景
有時興致來了就喜歡瞎鼓搗,幾年前還是學(xué)生時買過學(xué)生優(yōu)惠的云服務(wù)器,但沒錢續(xù)費關(guān)停后就不了了之,近期看到有活動又重新入手了
但問題就來了,之前好不容易搭建上去的各種服務(wù),現(xiàn)在又得重新來一遍
幾年前還是學(xué)生時可能對這類環(huán)境搭建還比較感興趣
現(xiàn)在人老了,精力不夠了,做啥都考慮效率問題
如果幾年后又重新買了,豈不是又得重新來一遍?
所以啊,還是得搞個一鍵式操作,來把這類基礎(chǔ)、重復(fù)且低效的準(zhǔn)備工作改造成自動化
訴求
覆蓋我日常使用的服務(wù)有:
- 個人博客、筆記平臺
- 方便維護、查閱我過往積累的博客和筆記
- NextCloud
- 個人云網(wǎng)盤,也支持在線文檔編輯、查閱(如在線 office)
- UI 組件使用說明平臺
- 方便我查閱過往封裝的通用 UI 組件的使用文檔
- Jenkins
- 方便我自動化管理各個云服務(wù)
那么,該怎么做呢?
準(zhǔn)備工作
如果是第一次搞,那么還是有些準(zhǔn)備工作,就緒后,隨便在一臺新的云服務(wù)執(zhí)行下自動化腳本完事
1. 資料、代碼都上 github
- 把博客筆記平臺的各個 md 文檔、圖片資源等都存放到 github 管理
- 把組件使用平臺的項目代碼也 github 管理
- 把創(chuàng)建 docker 的相關(guān)配置文件也 github 管理
既然要方便一鍵式部署,就把各種資料都存儲到網(wǎng)上,免費且穩(wěn)定的應(yīng)該就是 github 了,這樣后續(xù)就可以寫個自動化腳本去自動拉取各個資料了
2. 編寫 docker-compose.yml 和各服務(wù)的 Dockerfile
各個云服務(wù)通過 docker 來部署,環(huán)境搭建就可以做到一份配置,到處部署的效果了。
目錄結(jié)構(gòu)說明
├─ doc # 博客、筆記平臺,用 nginx 做容器
│ ├─ Dockerfile
│ ├─ nginx.conf
├─ jenkins # jenkins 平臺,預(yù)置好 node, pnpm 等環(huán)境
│ ├─ Dockerfile
├─ nginx # 監(jiān)聽默認(rèn)端口(80,443),根據(jù)二級域名做反向代理
│ ├─ Dockerfile
│ ├─ nginx.conf
├─ uidoc # 組件庫使用說明平臺,用 nginx 做容器
│ ├─ Dockerfile
│ ├─ nginx.conf
├─ docker-compose.yml # 上述容器的統(tǒng)一管理、通信配置
jenkins 容器的 Dokcerfile
# 使用基于 Debian 的 Jenkins 鏡像作為基礎(chǔ)
FROM jenkins/jenkins:lts
# 切換到 root 用戶
USER root
# 安裝 Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
RUN apt-get install -y nodejs
# 安裝 pnpm
RUN npm install -g pnpm
# 安裝 yarn
RUN npm install -g yarn
# 切換回 Jenkins 用戶
USER jenkins
EXPOSE 8080
nginx 容器的反向代理配置
server {
listen 80;
listen [::]:80;
server_name *.dasu.fun;
client_max_body_size 1024M;
location / {
# 正則匹配二級域名,并賦值給變量 $domain
if ($http_host ~* "^(.*?)\.dasu\.fun$") {
set $domain $1;
}
# 根據(jù)二級域名,做反向代理轉(zhuǎn)發(fā)
if ($domain ~* "jenkins") {
proxy_pass http://192.168.5.104:8080;
}
if ($domain ~* "blog") {
proxy_pass http://192.168.5.105;
}
if ($domain ~* "uidoc") {
proxy_pass http://192.168.5.106;
}
if ($domain ~* "nextcloud") {
proxy_pass http://192.168.5.108;
}
if ($domain ~* "doc") {
proxy_pass http://192.168.5.110;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.5.110;
}
}
docker-compose.yml 配置
version: "3"
services:
nginx:
build: ./nginx/ # 使用位于 ./nginx/ 目錄中的 Dockerfile 來構(gòu)建容器鏡像
ports:
- "80:80" # 將容器的 80 端口映射到主機的 80 端口
restart: always # 容器停止后自動重啟
networks:
n_nginx:
ipv4_address: 192.168.5.103 # 為容器分配指定的 IPv4 地址
jenkins:
build: ./jenkins/ # 使用位于 ./jenkins/ 目錄中的 Dockerfile 來構(gòu)建容器鏡像
ports:
- "9001:8080" # 將容器的 8080 端口映射到主機的 9001 端口
- "50000:50000" # 將容器的 50000 端口映射到主機的 50000 端口
user: root # 在容器中以 root 用戶身份運行
restart: always # 容器停止后自動重啟
volumes:
- /root/Doc/:/var/jenkins_home/doc/codes/ # 將主機的 /root/Doc/ 目錄掛載到容器的 /var/jenkins_home/doc/codes/ 目錄
- /root/uidoc/:/var/jenkins_home/uidoc/codes/
- /root/.ssh/:/root/.ssh/:ro # 將主機的 /root/.ssh/ 目錄掛載到容器的 /root/.ssh/ 目錄,并設(shè)置為只讀
- /etc/localtime:/etc/localtime:ro # 將主機的 /etc/localtime 文件掛載到容器的 /etc/localtime 文件,并設(shè)置為只讀
networks:
n_nginx:
ipv4_address: 192.168.5.104 # 為容器分配指定的 IPv4 地址
uidoc:
build: ./uidoc/ # 使用位于 ./uidoc/ 目錄中的 Dockerfile 來構(gòu)建容器鏡像
ports:
- "9002:80" # 將容器的 80 端口映射到主機的 9002 端口
restart: always # 容器停止后自動重啟
volumes:
- /root/uidoc/dist/:/usr/share/nginx/html/
networks:
n_nginx:
ipv4_address: 192.168.5.106 # 為容器分配指定的 IPv4 地址
db:
image: postgres # 使用 PostgreSQL 鏡像
restart: always # 容器停止后自動重啟
environment:
- POSTGRES_PASSWORD=222zaqXSW! # 設(shè)置 PostgreSQL 數(shù)據(jù)庫的密碼
- POSTGRES_USER=postgres # 設(shè)置 PostgreSQL 數(shù)據(jù)庫的用戶名
volumes:
- /root/postgres/data:/var/lib/postgresql/data # 將主機的 /root/postgres/data 目錄掛載到容器的 /var/lib/postgresql/data 目錄
expose:
- "5432" # 暴露容器的 5432 端口給其他容器使用
networks:
n_nginx:
ipv4_address: 192.168.5.107 # 為容器分配指定的 IPv4 地址
nextcloud:
image: nextcloud # 使用 Nextcloud 鏡像
restart: always # 容器停止后自動重啟
ports:
- 9003:80 # 將容器的 80 端口映射到主機的 9003 端口
depends_on:
- db # 依賴于 db 服務(wù),確保數(shù)據(jù)庫服務(wù)在 Nextcloud 服務(wù)啟動之前已經(jīng)啟動
environment:
- POSTGRES_HOST=db # 設(shè)置 Nextcloud 使用的 PostgreSQL 數(shù)據(jù)庫的主機為 db
- POSTGRES_DB=postgres # 設(shè)置 Nextcloud 使用的數(shù)據(jù)庫名稱
- POSTGRES_USER=postgres # 設(shè)置 Nextcloud 使用的數(shù)據(jù)庫用戶名
- POSTGRES_PASSWORD=222zaqXSW! # 設(shè)置 Nextcloud 使用的數(shù)據(jù)庫密碼
volumes:
- nextcloud:/var/www/html # 將名為 "nextcloud" 的卷掛載到容器的 /var/www/html 目錄
networks:
n_nginx:
ipv4_address: 192.168.5.108 # 為容器分配指定的 IPv4 地址
doc:
build: ./doc/
ports:
- "9005:80"
restart: always
volumes:
- /root/Doc/dist/:/usr/share/nginx/html/
networks:
n_nginx:
ipv4_address: 192.168.5.110 # 為容器分配指定的 IPv4 地址
networks:
n_nginx:
driver: bridge # 使用橋接網(wǎng)絡(luò)模式
ipam:
config:
- subnet: 192.168.5.0/24 # 定義網(wǎng)絡(luò)的子網(wǎng)地址范圍為 192.168.5.0/24,宿主機一般會是該網(wǎng)段的 .1,所以不要將網(wǎng)段設(shè)置為 1
# 命名卷是多容器共享卷,具有持久化能力
volumes:
nextcloud:
3. 購買域名、備案和配置 DNS 解析
購買和備案自行參考域名購買的平臺指引
由于我使用到多個云服務(wù),而且是通過二級域名來區(qū)分,因此需要配置下各個二級域名的解析,如:
| 主機記錄(二級域名) | 記錄值(云服務(wù)器 IP) |
|---|---|
| uidoc | 59.110.12.xx |
| doc | 59.110.12.xx |
| netcloud | 59.110.12.xx |
| jenkins | 59.110.12.xx |
| blog | 59.110.12.xx |
| www | 59.110.12.xx |
4. 云服務(wù)器放開入端口
如果沒有購買域名,或者需要直接用 ip+port 訪問不同服務(wù),那么需要放開對應(yīng)的端口,以阿里云為例,在域名控制臺-安全組-訪問規(guī)則-入方向里配置:
自動化腳本一鍵式部署
1. 云服務(wù)生成 ssh
由于所有的資料都傳到 github 上了,因此需要先把云服務(wù)器的 ssh 配置到 github 上,以便服務(wù)器有權(quán)限拉取 github 項目
ssh-keygen -t rsa -b 4096 -C "xxx@qq.com"cat .ssh/id_rsa.pub- 將第二步輸出的公鑰復(fù)制到 github 的 ssh 配置
2. 在服務(wù)器上執(zhí)行腳本
cat << 'EOF' > setup.sh
#!/bin/bash
# 函數(shù):打印日志
log() {
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo "$1"
}
# 更新軟件庫
sudo yum update -y
# 安裝 Docker 環(huán)境
log "開始安裝 Docker 環(huán)境..."
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo systemctl start docker
sudo usermod -aG docker $USER
docker -v
log "Docker 環(huán)境安裝完成。"
# 安裝 Docker Compose 環(huán)境
log "開始安裝 Docker Compose 環(huán)境..."
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
log "Docker Compose 環(huán)境安裝完成。"
docker-compose --version
# 安裝 Git 環(huán)境
log "開始安裝 Git 環(huán)境..."
sudo yum install -y git
log "Git 環(huán)境安裝完成。"
git --version
# 安裝 nvm 和 Node.js 環(huán)境
log "開始安裝 nvm 和 Node.js 環(huán)境..."
curl -o- https://gitee.com/mirrors/nvm/raw/v0.39.0/install.sh | bash
source ~/.bashrc
nvm --version
nvm install --lts
npm config set registry https://registry.npm.taobao.org
log "nvm 和 Node.js 環(huán)境安裝完成。"
node -v
# 安裝 Whistle 環(huán)境
log "開始安裝 Whistle 環(huán)境..."
npm install whistle -g
log "Whistle 環(huán)境安裝完成。"
#w2 start
# 安裝 pnpm
log "開始 pnpm..."
npm install -g pnpm
pnpm -v
# 安裝 yarn
log "開始 yarn..."
npm install -g yarn
yarn -v
# 拉取 github 倉庫
log "拉取 github 倉庫..."
cd /root/
mkdir blog
mkdir github
mkdir postgres
echo -e "Host github.com\n StrictHostKeyChecking no" >> ~/.ssh/config
git clone git@github.com:woshidasusu/dockers.git
cd /root/blog
git clone git@github.com:woshidasusu/woshidasusu.github.io.git
cd /root/
git clone git@github.com:woshidasusu/Doc.git
cd Doc
pnpm install
pnpm run build
cd /root/
git clone git@github.com:woshidasusu/uidoc.git
cd uidoc
npm install
npm run build
log "所有環(huán)境安裝完成。"
docker -v
docker-compose --version
node -v
EOF
- 執(zhí)行后,會在當(dāng)前目錄下生成一份 setup.sh 文件,繼續(xù)執(zhí)行:
-
chmod +x setup.sh- 將文件設(shè)置成可執(zhí)行
-
bash setup.sh- 執(zhí)行腳本
腳本會自動去安裝 docker, docker-compose, git, nvm, node, whistle 以及拉取 github 的項目
注:有些下載源是 github 的可能會失敗,如果失敗了需要手動執(zhí)行,通常是 docker-compose 和 nvm 可能出現(xiàn)安裝失敗
docker-compose up -d
進入上述腳本下載的 dockers 目錄,在該目錄執(zhí)行:
docker-compose up -d
執(zhí)行結(jié)束后,各服務(wù)容器就會創(chuàng)建并運行起來了,這時候瀏覽器訪問相關(guān)服務(wù)試試看就完事了
搞完這些后,我可以隨便格式化云盤,每次重新搭時,先配置個 ssh,再執(zhí)行下腳本,服務(wù)就都自動搭建完畢,舒服~
總結(jié)
以上是生活随笔為你收集整理的一键式自动给个人云服务搭建常用平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挑战突破:《汉字找茬王》猩找18字全攻略
- 下一篇: Go 泛型之泛型约束