翼度科技»论坛 编程开发 html5 查看内容

一键式自动给个人云服务搭建常用平台

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
背景

有时兴致来了就喜欢瞎鼓捣,几年前还是学生时买过学生优惠的云服务器,但没钱续费关停后就不了了之,近期看到有活动又重新入手了
但问题就来了,之前好不容易搭建上去的各种服务,现在又得重新来一遍
几年前还是学生时可能对这类环境搭建还比较感兴趣
现在人老了,精力不够了,做啥都考虑效率问题
如果几年后又重新买了,岂不是又得重新来一遍?
所以啊,还是得搞个一键式操作,来把这类基础、重复且低效的准备工作改造成自动化
诉求

覆盖我日常使用的服务有:

  • 个人博客、笔记平台

    • 方便维护、查阅我过往积累的博客和笔记

  • NextCloud

    • 个人云网盘,也支持在线文档编辑、查阅(如在线 office)

  • UI 组件使用说明平台

    • 方便我查阅过往封装的通用 UI 组件的使用文档

  • Jenkins

    • 方便我自动化管理各个云服务




那么,该怎么做呢?
准备工作

如果是第一次搞,那么还是有些准备工作,就绪后,随便在一台新的云服务执行下自动化脚本完事
1. 资料、代码都上 github


  • 把博客笔记平台的各个 md 文档、图片资源等都存放到 github 管理
  • 把组件使用平台的项目代码也 github 管理
  • 把创建 docker 的相关配置文件也 github 管理
既然要方便一键式部署,就把各种资料都存储到网上,免费且稳定的应该就是 github 了,这样后续就可以写个自动化脚本去自动拉取各个资料了
2. 编写 docker-compose.yml 和各服务的 Dockerfile

各个云服务通过 docker 来部署,环境搭建就可以做到一份配置,到处部署的效果了。
目录结构说明
  1. ├─ doc # 博客、笔记平台,用 nginx 做容器
  2. │ ├─ Dockerfile
  3. │ ├─ nginx.conf
  4. ├─ jenkins # jenkins 平台,预置好 node, pnpm 等环境
  5. │ ├─ Dockerfile
  6. ├─ nginx # 监听默认端口(80,443),根据二级域名做反向代理
  7. │ ├─ Dockerfile
  8. │ ├─ nginx.conf
  9. ├─ uidoc # 组件库使用说明平台,用 nginx 做容器
  10. │ ├─ Dockerfile
  11. │ ├─ nginx.conf
  12. ├─ docker-compose.yml # 上述容器的统一管理、通信配置
复制代码
jenkins 容器的 Dokcerfile
  1. # 使用基于 Debian 的 Jenkins 镜像作为基础
  2. FROM jenkins/jenkins:lts
  3. # 切换到 root 用户
  4. USER root
  5. # 安装 Node.js
  6. RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
  7. RUN apt-get install -y nodejs
  8. # 安装 pnpm
  9. RUN npm install -g pnpm
  10. # 安装 yarn
  11. RUN npm install -g yarn
  12. # 切换回 Jenkins 用户
  13. USER jenkins
  14. EXPOSE 8080
复制代码
nginx 容器的反向代理配置
  1. server {
  2.     listen  80;
  3.     listen [::]:80;
  4.     server_name *.dasu.fun;
  5.     client_max_body_size 1024M;
  6.     location / {
  7.       # 正则匹配二级域名,并赋值给变量 $domain
  8.       if ($http_host ~* "^(.*?)\.dasu\.fun$") {
  9.         set $domain $1;
  10.       }
  11.       # 根据二级域名,做反向代理转发
  12.       if ($domain ~* "jenkins") {
  13.         proxy_pass http://192.168.5.104:8080;
  14.       }
  15.       if ($domain ~* "blog") {
  16.         proxy_pass http://192.168.5.105;
  17.       }
  18.       if ($domain ~* "uidoc") {
  19.         proxy_pass http://192.168.5.106;
  20.       }
  21.       if ($domain ~* "nextcloud") {
  22.         proxy_pass http://192.168.5.108;
  23.       }
  24.       if ($domain ~* "doc") {
  25.         proxy_pass http://192.168.5.110;
  26.       }
  27.       proxy_set_header Host        $host;
  28.       proxy_set_header X-Real-IP        $remote_addr;
  29.       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  30.       proxy_pass http://192.168.5.110;
  31.     }
  32. }
复制代码
docker-compose.yml 配置
  1. version: "3"
  2. services:
  3.   nginx:
  4.     build: ./nginx/ # 使用位于 ./nginx/ 目录中的 Dockerfile 来构建容器镜像
  5.     ports:
  6.       - "80:80" # 将容器的 80 端口映射到主机的 80 端口
  7.     restart: always # 容器停止后自动重启
  8.     networks:
  9.       n_nginx:
  10.         ipv4_address: 192.168.5.103 # 为容器分配指定的 IPv4 地址
  11.   jenkins:
  12.     build: ./jenkins/ # 使用位于 ./jenkins/ 目录中的 Dockerfile 来构建容器镜像
  13.     ports:
  14.       - "9001:8080" # 将容器的 8080 端口映射到主机的 9001 端口
  15.       - "50000:50000" # 将容器的 50000 端口映射到主机的 50000 端口
  16.     user: root # 在容器中以 root 用户身份运行
  17.     restart: always # 容器停止后自动重启
  18.     volumes:
  19.       - /root/Doc/:/var/jenkins_home/doc/codes/ # 将主机的 /root/Doc/ 目录挂载到容器的 /var/jenkins_home/doc/codes/ 目录
  20.       - /root/uidoc/:/var/jenkins_home/uidoc/codes/
  21.       - /root/.ssh/:/root/.ssh/:ro # 将主机的 /root/.ssh/ 目录挂载到容器的 /root/.ssh/ 目录,并设置为只读
  22.       - /etc/localtime:/etc/localtime:ro # 将主机的 /etc/localtime 文件挂载到容器的 /etc/localtime 文件,并设置为只读
  23.     networks:
  24.       n_nginx:
  25.         ipv4_address: 192.168.5.104 # 为容器分配指定的 IPv4 地址
  26.   uidoc:
  27.     build: ./uidoc/ # 使用位于 ./uidoc/ 目录中的 Dockerfile 来构建容器镜像
  28.     ports:
  29.       - "9002:80" # 将容器的 80 端口映射到主机的 9002 端口
  30.     restart: always # 容器停止后自动重启
  31.     volumes:
  32.       - /root/uidoc/dist/:/usr/share/nginx/html/
  33.     networks:
  34.       n_nginx:
  35.         ipv4_address: 192.168.5.106 # 为容器分配指定的 IPv4 地址
  36.   db:
  37.     image: postgres # 使用 PostgreSQL 镜像
  38.     restart: always # 容器停止后自动重启
  39.     environment:
  40.       - POSTGRES_PASSWORD=222zaqXSW! # 设置 PostgreSQL 数据库的密码
  41.       - POSTGRES_USER=postgres # 设置 PostgreSQL 数据库的用户名
  42.     volumes:
  43.       - /root/postgres/data:/var/lib/postgresql/data # 将主机的 /root/postgres/data 目录挂载到容器的 /var/lib/postgresql/data 目录
  44.     expose:
  45.       - "5432" # 暴露容器的 5432 端口给其他容器使用
  46.     networks:
  47.       n_nginx:
  48.         ipv4_address: 192.168.5.107 # 为容器分配指定的 IPv4 地址
  49.   nextcloud:
  50.     image: nextcloud # 使用 Nextcloud 镜像
  51.     restart: always # 容器停止后自动重启
  52.     ports:
  53.       - 9003:80 # 将容器的 80 端口映射到主机的 9003 端口
  54.     depends_on:
  55.       - db # 依赖于 db 服务,确保数据库服务在 Nextcloud 服务启动之前已经启动
  56.     environment:
  57.       - POSTGRES_HOST=db # 设置 Nextcloud 使用的 PostgreSQL 数据库的主机为 db
  58.       - POSTGRES_DB=postgres # 设置 Nextcloud 使用的数据库名称
  59.       - POSTGRES_USER=postgres # 设置 Nextcloud 使用的数据库用户名
  60.       - POSTGRES_PASSWORD=222zaqXSW! # 设置 Nextcloud 使用的数据库密码
  61.     volumes:
  62.       - nextcloud:/var/www/html # 将名为 "nextcloud" 的卷挂载到容器的 /var/www/html 目录
  63.     networks:
  64.       n_nginx:
  65.         ipv4_address: 192.168.5.108 # 为容器分配指定的 IPv4 地址
  66.   doc:
  67.     build: ./doc/
  68.     ports:
  69.       - "9005:80"
  70.     restart: always
  71.     volumes:
  72.       - /root/Doc/dist/:/usr/share/nginx/html/
  73.     networks:
  74.       n_nginx:
  75.         ipv4_address: 192.168.5.110 # 为容器分配指定的 IPv4 地址
  76. networks:
  77.   n_nginx:
  78.     driver: bridge # 使用桥接网络模式
  79.     ipam:
  80.       config:
  81.         - subnet: 192.168.5.0/24 # 定义网络的子网地址范围为 192.168.5.0/24,宿主机一般会是该网段的 .1,所以不要将网段设置为 1
  82. # 命名卷是多容器共享卷,具有持久化能力
  83. volumes:
  84.   nextcloud:
复制代码
3. 购买域名、备案和配置 DNS 解析

购买和备案自行参考域名购买的平台指引
由于我使用到多个云服务,而且是通过二级域名来区分,因此需要配置下各个二级域名的解析,如:
主机记录(二级域名)记录值(云服务器 IP)uidoc59.110.12.xxdoc59.110.12.xxnetcloud59.110.12.xxjenkins59.110.12.xxblog59.110.12.xxwww59.110.12.xx4. 云服务器放开入端口

如果没有购买域名,或者需要直接用 ip+port 访问不同服务,那么需要放开对应的端口,以阿里云为例,在域名控制台-安全组-访问规则-入方向里配置:

自动化脚本一键式部署

1. 云服务生成 ssh

由于所有的资料都传到 github 上了,因此需要先把云服务器的 ssh 配置到 github 上,以便服务器有权限拉取 github 项目

  • ssh-keygen -t rsa -b 4096 -C "xxx@qq.com"
  • cat .ssh/id_rsa.pub
  • 将第二步输出的公钥复制到 github 的 ssh 配置
2. 在服务器上执行脚本
  1. cat << 'EOF' > setup.sh
  2. #!/bin/bash
  3. # 函数:打印日志
  4. log() {
  5.   echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
  6.   echo "$1"
  7. }
  8. # 更新软件库
  9. sudo yum update -y
  10. # 安装 Docker 环境
  11. log "开始安装 Docker 环境..."
  12. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  13. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  14. sudo yum install -y docker-ce docker-ce-cli containerd.io
  15. sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
  16. sudo systemctl start docker
  17. sudo usermod -aG docker $USER
  18. docker -v
  19. log "Docker 环境安装完成。"
  20. # 安装 Docker Compose 环境
  21. log "开始安装 Docker Compose 环境..."
  22. sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  23. sudo chmod +x /usr/local/bin/docker-compose
  24. docker-compose --version
  25. log "Docker Compose 环境安装完成。"
  26. docker-compose --version
  27. # 安装 Git 环境
  28. log "开始安装 Git 环境..."
  29. sudo yum install -y git
  30. log "Git 环境安装完成。"
  31. git --version
  32. # 安装 nvm 和 Node.js 环境
  33. log "开始安装 nvm 和 Node.js 环境..."
  34. curl -o- https://gitee.com/mirrors/nvm/raw/v0.39.0/install.sh | bash
  35. source ~/.bashrc
  36. nvm --version
  37. nvm install --lts
  38. npm config set registry https://registry.npm.taobao.org
  39. log "nvm 和 Node.js 环境安装完成。"
  40. node -v
  41. # 安装 Whistle 环境
  42. log "开始安装 Whistle 环境..."
  43. npm install whistle -g
  44. log "Whistle 环境安装完成。"
  45. #w2 start
  46. # 安装 pnpm
  47. log "开始 pnpm..."
  48. npm install -g pnpm
  49. pnpm -v
  50. # 安装 yarn
  51. log "开始 yarn..."
  52. npm install -g yarn
  53. yarn -v
  54. # 拉取 github 仓库
  55. log "拉取 github 仓库..."
  56. cd /root/
  57. mkdir blog
  58. mkdir github
  59. mkdir postgres
  60. echo -e "Host github.com\n  StrictHostKeyChecking no" >> ~/.ssh/config
  61. git clone git@github.com:woshidasusu/dockers.git
  62. cd /root/blog
  63. git clone git@github.com:woshidasusu/woshidasusu.github.io.git
  64. cd /root/
  65. git clone git@github.com:woshidasusu/Doc.git
  66. cd Doc
  67. pnpm install
  68. pnpm run build
  69. cd /root/
  70. git clone git@github.com:woshidasusu/uidoc.git
  71. cd uidoc
  72. npm install
  73. npm run build
  74. log "所有环境安装完成。"
  75. docker -v
  76. docker-compose --version
  77. node -v
  78. EOF
复制代码

  • 执行后,会在当前目录下生成一份 setup.sh 文件,继续执行:
  • chmod +x setup.sh

    • 将文件设置成可执行

  • bash setup.sh

    • 执行脚本

脚本会自动去安装 docker, docker-compose, git, nvm, node, whistle 以及拉取 github 的项目
注:有些下载源是 github 的可能会失败,如果失败了需要手动执行,通常是 docker-compose 和 nvm 可能出现安装失败
docker-compose up -d

进入上述脚本下载的 dockers 目录,在该目录执行:

  • docker-compose up -d
执行结束后,各服务容器就会创建并运行起来了,这时候浏览器访问相关服务试试看就完事了
搞完这些后,我可以随便格式化云盘,每次重新搭时,先配置个 ssh,再执行下脚本,服务就都自动搭建完毕,舒服~

来源:https://www.cnblogs.com/dasusu/p/17934504.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具