我博客最早的时候使用 FTP 上传到虚拟空间以达到上线,后来认识到 SVN && Git ,就使用版本控制来上线,但也是笨笨的手动登录到服务器。再后来认识了 Jenkins ,发现原来上线可以如此美好,我把相关所有的服务的部署、上线使用 Jenkins 来完成,一切都是如此的美好。
但后来服务器硬盘出了点问题,Jenkins 相关的配置丢失了,等到我再搭建 Jenkins 时,发现那么配置是何等『复杂』,主要是依赖太多,再加上 SSL 证书到期后『续命』脚本出了问题,真是祸不单行,又回到了登录服务器执行代码的时代,并且这个时代直到现在还是这样。。。
前段时间注册了个 shangxian.app ,最近也正好在研究 Jenkins 和 Docker 相关的技术 ,于是我又燃气了自动化上线的想法,也为了更好的练习各类服务,那就干吧!
本身现在我已经有新加坡(sg01)、日本(jp01)和北京(bj01)服务器,但由于穷,服务器都是 1U1G 的,想跑一些服务肯定顶不住的。于是便看上了阿里去新加坡 4U16G 服务器,看上了好几天,但就如 @健驰 所说,只要心中有草了,最终肯定会买的。。。于是在一个阳光明媚的上午,我用本来打算买 LG 5K 屏幕的钱买了台服务器。心疼好几天。。。
注:新加坡比国内要稍微贵些,好处是不用备案,阿里云新加坡还是比较稳的。
所有的服务器上都安装 Docker && Docker Compose ,所有服务均是以 Docker 方式运行,这样好处是配置化、轻依赖、方便迁移。
所有的 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-apikey
、 shangxianapp-aliyun-xuexb-secret
- 阿里云相关令牌 shangxianapp-namecom-xuexb-apikey
、 shangxianapp-namecom-xuexb-secret
- name.com 相关令牌 shangxianapp-shadowsocks-port
、 shangxianapp-shadowsocks-pwd
- SS 相关令牌
这些凭据可以直接在 Jenkins Job 或者 Jenkins Pipeline 脚本使用,并且会以 ****
显示。
由于在服务器中肯定是有多个 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
由于是需要多个服务器同步证书,启用了一个 Jenkins Job 来每三个月处理证书,由于证书有好几个,使用 Jenkins Pipeline 脚本生成,这样也可以直接使用 Jenkins 凭据密钥,再结合 Jenkins Pipeline parallel 并行生成证书,并同步到各个服务器,最后再重启 Nginx Proxy Docker 。
脚本见: https://github.com/shangxianapp/docker-auto-ssl
搭建好基础服务后,随手搞了几个可视化的服务
所有上线相关的配置和脚本都在: https://github.com/shangxianapp