转载

开始使用 Docker 线上部署

我博客最早的时候使用 FTP 上传到虚拟空间以达到上线,后来认识到 SVN && Git ,就使用版本控制来上线,但也是笨笨的手动登录到服务器。再后来认识了 Jenkins ,发现原来上线可以如此美好,我把相关所有的服务的部署、上线使用 Jenkins 来完成,一切都是如此的美好。

但后来服务器硬盘出了点问题,Jenkins 相关的配置丢失了,等到我再搭建 Jenkins 时,发现那么配置是何等『复杂』,主要是依赖太多,再加上 SSL 证书到期后『续命』脚本出了问题,真是祸不单行,又回到了登录服务器执行代码的时代,并且这个时代直到现在还是这样。。。

前段时间注册了个 shangxian.app ,最近也正好在研究 Jenkins 和 Docker 相关的技术 ,于是我又燃气了自动化上线的想法,也为了更好的练习各类服务,那就干吧!

服务器

本身现在我已经有新加坡(sg01)、日本(jp01)和北京(bj01)服务器,但由于穷,服务器都是 1U1G 的,想跑一些服务肯定顶不住的。于是便看上了阿里去新加坡 4U16G 服务器,看上了好几天,但就如 @健驰 所说,只要心中有草了,最终肯定会买的。。。于是在一个阳光明媚的上午,我用本来打算买 LG 5K 屏幕的钱买了台服务器。心疼好几天。。。

注:新加坡比国内要稍微贵些,好处是不用备案,阿里云新加坡还是比较稳的。

  • 新加坡低配 sg01 - SS、MTProxy、前端小武 博客海外解析,其实只是为了练习多机部署、主从数据库
  • 新加坡高配 sg02 - Jenkins、Kibana、Netdata、Portainer 等
  • 北京 bj01 - 博客
  • 日本 - SS、MTProxy

Docker

所有的服务器上都安装 Docker && Docker Compose ,所有服务均是以 Docker 方式运行,这样好处是配置化、轻依赖、方便迁移。

Jenkins Pipeline

所有的 Jenkins Job 都是以 Jenkins Pipeline 方式编写脚本,以防再次丢失,以 SCM 方式运行。

授权

为了避免 Jenkins Job Console Log 明文出现密钥,使用 Jenkins 凭据管理,且把密钥、Token 等也存放在凭证里,使用统一的命名规则,如:

  • shangxianapp-xiaowu-ssh-key - 登录各个服务器 @xiaowu 帐号的密钥
  • shangxianapp-github-xuexb-ssh-key - GitHub @xuexb 用户的密钥
  • shangxianapp-github-xuexb-access-token - GitHub @xuexb 用户的 Access Token
  • shangxianapp-aliyun-xuexb-apikeyshangxianapp-aliyun-xuexb-secret - 阿里云相关令牌
  • shangxianapp-namecom-xuexb-apikeyshangxianapp-namecom-xuexb-secret - name.com 相关令牌
  • shangxianapp-shadowsocks-portshangxianapp-shadowsocks-pwd - SS 相关令牌

这些凭据可以直接在 Jenkins Job 或者 Jenkins Pipeline 脚本使用,并且会以 **** 显示。

Nginx Proxy

由于在服务器中肯定是有多个 Web Server 的,而使用 Docker 容器化后需要对外暴露端口,但由于端口只能占用一个(比如:80、443),那么就在每个服务器中专门启用一个 Nginx Proxy Docker 专门来反向代理各个虚拟主机( Web Server ),约定好统一的目录,比如:

  • DOCKER_NGINX_VHOST_DIR - 虚拟主机配置目录,以 域名.conf 存放配置文件
  • DOCKER_NGINX_CA_DIR - SSL 证书存放目录,以 域名 为子目录存放
  • DOCKER_NGINX_DIR - Nginx 运行目录,配置文件更新后可以运行 /bin/sh ${DOCKER_NGINX_DIR}/reload.sh 来刷新 Nginx Proxy Docker
  • WWWROOT_DIR - 网站目录映射,以 域名 为子目录存放,可以在 Nginx 配置文件里使用,比如设置 root 目录

更多 Nginx Proxy Docker 请看: https://github.com/shangxianapp/docker-sg02-nginx-proxy

为了更好的在 Nginx 配置文件中读取变量,专门创建了支持 Lua、echo-nginx 的 Nginx:alpine 镜像: https://github.com/shangxianapp/docker-nginx-alpine

SSL 证书同步

由于是需要多个服务器同步证书,启用了一个 Jenkins Job 来每三个月处理证书,由于证书有好几个,使用 Jenkins Pipeline 脚本生成,这样也可以直接使用 Jenkins 凭据密钥,再结合 Jenkins Pipeline parallel 并行生成证书,并同步到各个服务器,最后再重启 Nginx Proxy Docker 。

脚本见: https://github.com/shangxianapp/docker-auto-ssl

服务

搭建好基础服务后,随手搞了几个可视化的服务

  • https://shangxian.app - Shangxian APP
  • https://jenkins.shangxian.app - Jenkins
  • https://netdata.shangxian.app - 服务器性能监控,基于 netdata
  • https://portainer.shangxian.app - Docker Web 可视化管理平台,基于 Portainer

Todo

  • 迁移博客和周边各个服务
  • 启用 Jenkins 自动备份任务,每天在静悄悄的深夜里自动备份数据源到数据盘
  • 重要服务日志接入 Kibana
  • 有问题时自动回滚,现在当配置有问题时重启直接挂了。。。

所有上线相关的配置和脚本都在: https://github.com/shangxianapp

原文  https://xuexb.com/post/shangxianapp.html
正文到此结束
Loading...