龙年到,又到了搬迁时刻

文章目录
  1. 迁移 Nginx
    1. Nginx 中的配置
  2. 迁移 Gogs
  3. Git Repo 的配置

去年此时,用了三年的两台华为云主机到期了,再续费成本已是天价。原本准备搬迁到成本更低的云服务厂商,结果发现自己实在懒得搬迁 nginx,gogs 等一堆的服务,最后降主机数量,降配置,降带宽续了1年,现在马上又要到期了,此时手里已经有了腾讯云的3年便宜云主机,必须要搬迁了。

不想再跟以前一样一个个的去搭建各种服务,于是尝试容器化部署。对 docker 实在还是不熟悉,前后折腾了快一天,才算勉强在容器上跑起了 nginx 和 gogs。其实自己挺愿意探索技术,写点心得什么的,只是这几年经济形势不好,公司组织结构调整,部门转型做产品,早已没有了往日的那份清闲,终日卷的要死,我的心中一直很矛盾,一方面恨不得马上退休享受生活,另一方面又暗暗盼望着哪怕这样卷着,自己也能一直在公司里狗下去,毕竟就算不再升级,当前的收入也是让人安心的。只是未来太多不确定性,我找不到平衡点,难以做决定,未来总是在迷雾中,向前的每一步都是摸索,只有回头时才会发现当年的自己有多么幼稚和愚蠢,然后周而复始……

# 服务搬迁:
  1. 从原来的主机服务迁移到容器化部署
  2. 迁移 Nginx(含证书)
  3. 迁移 GOGS
  4. 迁移相关定时任务和脚本

迁移 Nginx

启动 Nginx 服务

1
docker run -d -p 80:80 -p 443:443 --name nginx --add-host host.docker.internal:host-gateway --network ice-network --network-alias nginx -v /root/opt/nginx/html:/usr/share/nginx/html -v /root/opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/opt/nginx/logs:/var/log/nginx -v /root/opt/nginx/cert:/data/cert nginx
  1. –add-host :使容器可以访问本地的服务
  2. –network:使容器间共享网络,可以彼此访问
  3. -v:将配置文件、内容、日志、证书目录映射到本地

证书之前用的是 certbot 的免费证书,每3个月更新一次,有点麻烦,刚才迁移服务时才发现腾讯云提供免费的证书,每年更新即可。

Nginx 中的配置

可以直接使用 –network-alias gogs 中的别名,注意后面的端口号是容器内的端口号

可以使用 host.docker.internal 访问宿主机上的服务

upstream gitserver {
  server gogs:3000;
}
upstream grafana {
  server host.docker.internal:2999;
}

配置 SSL 访问和证书、秘钥路劲

listen  443 ssl default_server;
listen  [::]:443 ssl default_server;
server_name  welooking.cn;
#rewrite ^(.*)$ https://$host$1 permanent;
if ($server_port = 80) {
  rewrite ^(.*)$ https://$host$1 permanent;
}
root    /usr/share/nginx/html/blog;

ssl_certificate "/data/cert/welooking.cn_bundle.crt";
ssl_certificate_key "/data/cert/welooking.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;

#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

迁移 Gogs

1
docker run -d --name=gogs --network ice-network --network-alias gogs -p 10022:22 -p 10300:3000 -v /root/opt/gogs:/data gogs/gogs
  1. –network:使容器间共享网络,可以彼此访问
  2. –network-alias:指定别名,以便在容器中使用
  3. -v:将数据目录映射到本地

Git Repo 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
将原本华为云主机上的 git repo 目录拷贝到腾讯云后,会出现无法 git pull 的问题

git pull
hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Authentication failed for 'http://welooking.cn/xxx/xxx/xxx.git/'

处理方案:

  1. 执行 git config pull.rebase false
  2. 修改 .git/config 文件,修改其中的 url,注意这里是 https
1
2
3
[remote "origin"]
url = https://username:password@welooking.cn/xxx/xxx/xxx.git
fetch = +refs/heads/master:refs/remotes/origin/master

让人抓狂的问题:不管怎么尝试,死活无法push,在gogs页面上也不能上传文件,编辑或者新建都失败……

网上搜了半天都是说什么权限问题,可以强制提交什么,都是扯淡……

1
2
3
4
5
6
7
8
9
10
11
12
git credential-'cache store: -c: line 0: unexpected EOF while looking for matching `''
git credential-'cache store: -c: line 1: syntax error: unexpected end of file
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 3.18 KiB | 3.18 MiB/s, done.
Total 5 (delta 2), reused 0 (delta 0)
remote: hooks/pre-receive: line 2: /home/git/gogs/gogs: No such file or directory
To https://welooking.cn/gogs/ice/hexo.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://welooking.cn/xxx/xxx/xxx.git'

主要原因就是在于 gogs 有一大堆默认的 hook 要执行,这些 hook 跟之前安装的 gogs 路径有关,需要做重置操作。

1
控制面板-> 管理员操作-> 重新同步所有仓库的钩子

PS:8天的春节假期一闪而过,明早又要上班了,可我还想,再放……500天……