在中国境内无痛手动升级指南
步骤
- 在中国境外创建 SOCKS5 代理
- 在中国服务器上设置并配置代理连接
- 创建模板以简化编辑
- 将 Git 代理设置添加到模板
- 将模板包含在
app.yml 中
- 重新构建应用
1 - 远程 SOCKS5
为了方便使用(以及其友好的定价),我建议在新加坡等地设置一台 Digital Ocean 服务器。只需使用标准的 Ubuntu 服务器,完成所有基本的安全配置要求(SSH 密钥对、UFW 等),然后安装 Shadowsocks:
在远程机器上
$ sudo apt install shadowsocks-libev
配置代理设置:
$ cd /etc/shadowsocks-libev
# 我喜欢保留原始文件
$ sudo cp config.json orig.config.json
$ sudo nano config.json
请特别注意 timeout 和 method:
{
"server":"123.123.123.123", # 远程服务器 IP
"server_port":8400, # 由你决定
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= 至关重要!
"method":"chacha20-ietf-poly1305"
}
务必仔细检查 systemd 配置(/lib/systemd/system/shadowsocks-libev-local@.service)中的所有设置。启用 shadowsocks-libev-local@.service,重启系统,并检查服务是否正在运行。
2 - 在中国服务器上设置代理连接
在 Discourse 机器上
$ sudo apt install shadowsocks-libev
如果你使用的是阿里云,请在他们奇怪的控制台界面中搜索防火墙设置,并检查相应的端口设置。
你不需要在客户端机器上对 systemd 设置进行繁琐的调试,但请为 Docker 和普通用途保留单独的配置文件,因为你可能希望在 Docker 上下文之外使用 SOCKS5 代理,此时你应使用 127.0.0.1 而不是 Docker 可访问的网络地址。
$ cd /etc/shadowsocks-libev
$ sudo cp config.json local.json
$ sudo cp config.json docker.json
将配置调整为类似以下内容:
$ sudo nano local.json
{
"server":["123.123.123.123"], # 远程机器的 IP
"mode":"tcp_and_udp", # 此注释因我环境中的 shadowsocks-libev 版本不同而有所差异
"server_port":8400,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= 务必确认此项
"method":"chacha20-ietf-poly1305"
}
为了方便起见,让我们在 .bashrc 中添加一个别名:
$ nano ~/.bashrc
# 粘贴
alias dockershadow='ss-local -c /etc/shadowsocks-libev/local.json'
调整另一个配置,让 Docker 通过宿主机的网络:
$ sudo nano docker.json
{
"server":["123.123.123.123"],
"mode":"tcp_and_udp",
"server_port":8400,
"local_address":"172.17.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600,
"method":"chacha20-ietf-poly1305"
}
设置用于 Docker 特定配置的别名:
alias dockershadow='ss-local -c /etc/shadowsocks-libev/docker.json'
3 & 4 - 创建模板以保持 app.yml 整洁
这完全是可选的,取决于你的喜好;我更喜欢保持 app.yml 可读且简短,而将组件维护在其他地方。根据你的喜好给模板命名,我选择的是 web.git.template.yml。
$ nano templates/web.git.template.yml
# 粘贴:
hooks:
before_code:
- exec:
cmd:
- git config --global http.proxy socks5://172.17.0.1:1080
- git config --global https.proxy socks5://172.17.0.1:1080
- git config --global https.sslVerify = false
# 可选
after_code:
- exec:
cmd:
- git config --global --unset http.proxy
- git config --global --unset https.proxy
- git config --global --unset https.sslVerify
我曾用 after_web 钩子测试过,但不起作用。
5 - 调整 app.yml
在你的 app.yml 中调用模板:
$ cd /<discourse dir>
$ sudo nano containers/app.yml
templates:
- "templates/web.template.yml"
- "templates/web.china.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
- "templates/web.git.template.yml"
你的模板部分很可能看起来不同,只需确保包含 web.china 和 web.git-blabla(或者你命名的任何名称)模板即可。不要在 app.yml 中暴露 1080:1080!
6 - 重新构建
在重新构建之前,请验证使用 git 克隆时你的代理设置是否可用。
$ git config --global http.proxy socks5://172.17.0.1:1080
$ git config --global https.proxy socks5://172.17.0.1:1080
$ git config --global https.sslVerify = false
这当然会将代理标志添加到用户家目录中的 .gitconfig 文件,因此测试后请注意将其删除。
在 GitHub 上选择一个包含大量文件的大型随机仓库,检查你的克隆速度。如果你的配置正确,你应该能够以约 12-15 MB/s 的速度进行克隆,具体取决于你的阿里云设置。如果你的连接速度从 200 KB/s 缓慢爬升至约 10 MB/s,那么你的努力就不算成功。
最后重新构建:
$ cd /<discourse directory>
# 使用之前设置的别名运行代理
$ dockershadow
$ ./launcher rebuild app
重新构建过程经常失败,因此你需要耐心(可能还需要白酒)。你在 app.yml 中设置的插件越少,重新构建成功的可能性就越大。
7 - 备注
我仍然认为这是一种变通方法,而不是生产就绪的流程,所以也许有人知道如何在中国境内镜像 GitHub 仓库,以减轻这种痛苦。众所周知,GFW 内部不透明的机制一直在变化。
当然,SOCKS5 代理只是众多选项之一,但我喜欢手边有多种用途的解决方案。
如果有人知道如何让这种变通方法达到生产就绪标准,我很感激你的建议。Discourse 是一款出色的软件,但我认为其在中国未被广泛使用的原因之一是安装和维护过程繁琐。去年尝试通过 GUI 升级时,无论我在 Nginx 反向代理中配置了哪些超时设置,失败率均为 100%。
中文翻译将随后发布