Atualização manual sem dor de cabeça dentro da China
passos
- criar um proxy SOCKS5 fora da China
- configurar e estabelecer a conexão do proxy no servidor CN
- criar um modelo para facilitar a edição
- adicionar configurações de proxy git ao modelo
- incluir o modelo em
app.yml
- reconstruir o app
1 - SOCKS5 remoto
Para facilitar o uso (e devido aos preços amigáveis), recomendo configurar um servidor Digital Ocean, por exemplo, em Cingapura. Basta usar um servidor Ubuntu padrão, passar por todas as configurações básicas de segurança (pares de chaves SSH, UFW, etc.) e, em seguida, instalar o Shadowsocks:
na máquina remota
$ sudo apt install shadowsocks-libev
Configure as configurações do proxy:
$ cd /etc/shadowsocks-libev
# Gosto de manter os arquivos originais
$ sudo cp config.json orig.config.json
$ sudo nano config.json
Preste muita atenção ao tempo limite (timeout) e ao método:
{
"server":"123.123.123.123", # IP do servidor remoto
"server_port":8400, # fica a seu critério
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= essencial!
"method":"chacha20-ietf-poly1305"
}
Certifique-se de verificar novamente todas as configurações na configuração do systemd (/lib/systemd/system/shadowsocks-libev-local@.service). Ative o shadowsocks-libev-local@.service, reinicie e verifique se o serviço está em execução.
2 - configurar a conexão do proxy no servidor CN
na máquina Discourse
$ sudo apt install shadowsocks-libev
Se estiver na Aliyun, procure as configurações do Firewall no console deles (que é estranho) e verifique as configurações de porta respectivas.
Você não precisa se preocupar com as configurações do systemd na máquina cliente, mas mantenha arquivos de configuração separados para o Docker e uso regular, pois você pode querer usar o proxy SOCKS5 fora do contexto do Docker; nesse caso, você usaria 127.0.0.1 em vez dos endereços de rede acessíveis pelo Docker.
$ cd /etc/shadowsocks-libev
$ sudo cp config.json local.json
$ sudo cp config.json docker.json
adapte a configuração para algo semelhante a isto
$ sudo nano local.json
{
"server":["123.123.123.123"], # o IP da máquina remota
"mode":"tcp_and_udp", # esta anotação é diferente devido às versões diferentes do shadowsocks-libev na minha configuração
"server_port":8400,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= certifique-se disso
"method":"chacha20-ietf-poly1305"
}
Por conveniência, vamos adicionar um alias ao nosso .bashrc :
$ nano ~/.bashrc
# cole
alias dockershadow='ss-local -c /etc/shadowsocks-libev/local.json'
adapte a outra configuração para permitir que o Docker use a rede da máquina host
$ 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"
}
defina o alias para usar a configuração específica do Docker:
alias dockershadow='ss-local -c /etc/shadowsocks-libev/docker.json'
3 & 4 - criar um modelo para manter seu app.yml organizado
Isso é absolutamente opcional e depende do seu gosto; eu prefiro manter o app.yml legível e curto, mantendo os componentes em outro lugar. Dê qualquer nome de acordo com seu gosto; eu escolhi web.git.template.yml.
$ nano templates/web.git.template.yml
# cole:
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
# opcional
after_code:
- exec:
cmd:
- git config --global --unset http.proxy
- git config --global --unset https.proxy
- git config --global --unset https.sslVerify
Testei com o hook after_web, mas isso não funcionou.
5 - adaptar o app.yml
Chame o modelo no seu 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"
Sua seção de modelos provavelmente parece diferente; apenas certifique-se de incluir web.china e os modelos web.git-blabla (ou como quer que você os tenha nomeado).
Não exponha 1080:1080 no seu app.yml!
6 - reconstrução
Antes de reconstruir, verifique se suas configurações de proxy funcionam ao clonar com 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
Isso, claro, adiciona as flags de proxy ao .gitconfig do usuário no diretório home, então tenha cuidado para removê-las após os testes.
Selecione um repositório grande e aleatório no Github com muitos arquivos e verifique sua velocidade de clonagem. Se sua configuração estiver correta, você deverá conseguir clonar com ~12-15 MB/s, dependendo da sua configuração da Aliyun. Se sua velocidade de conexão subir lentamente de 200 KB/s para cerca de 10 MB/s, então seus esforços não foram bem-sucedidos.
finalmente, reconstrua:
$ cd /<discourse directory>
# execute o proxy usando o alias que definimos antes
$ dockershadow
$ ./launcher rebuild app
O processo de reconstrução falhará frequentemente, então você precisará de paciência (e possivelmente Baijiu). Quanto menos plugins você tiver configurado no seu app.yml, mais provável será que sua reconstrução tenha sucesso.
7 - observações
Ainda considero isso uma solução alternativa, não um procedimento pronto para produção, então talvez alguém tenha uma ideia de como espelhar o repositório do GitHub na China, tornando isso menos doloroso. E, como todos sabemos, os mecanismos pouco transparentes dentro do GFW continuam mudando.
Claro, um proxy SOCKS5 é apenas uma das muitas opções, mas gosto de ter soluções de uso múltiplo à mão.
Se alguém tiver uma ideia de como tornar essa solução alternativa pronta para produção, agradeço sua contribuição. O Discourse é um software fantástico, mas presumo que uma das razões para não ser amplamente usado na China sejam os processos de instalação e manutenção complicados. Tentar atualizar via GUI me deu uma taxa de falha de 100% no último ano, não importa quais configurações de tempo limite eu tenha configurado no meu proxy reverso nGinx.
Tradução para o chinês seguirá