Schmerzloses manuelles Upgrade innerhalb Chinas
Schritte
- SOCKS5-Proxy außerhalb Chinas einrichten
- Proxy-Verbindung auf dem CN-Server konfigurieren
- Eine Vorlage für einfachere Bearbeitung erstellen
- Git-Proxy-Einstellungen zur Vorlage hinzufügen
- Vorlage in
app.yml einbinden
- App neu erstellen
1 - Remote-SOCKS5
Für die Benutzerfreundlichkeit (und ihre freundliche Preisgestaltung) empfehle ich die Einrichtung eines Digital-Ocean-Servers, z. B. in Singapur. Verwenden Sie einfach einen Standard-Ubuntu-Server, führen Sie alle grundlegenden Sicherheitskonfigurationen durch (SSH-Schlüsselpaare, UFW usw.) und installieren Sie dann Shadowsocks:
auf dem Remote-Computer
$ sudo apt install shadowsocks-libev
Konfigurieren Sie die Proxy-Einstellungen:
$ cd /etc/shadowsocks-libev
# Ich bewahre die Originaldateien gerne auf
$ sudo cp config.json orig.config.json
$ sudo nano config.json
Achten Sie besonders auf Timeout und Methode:
{
"server":"123.123.123.123", # IP des Remote-Servers
"server_port":8400, # Ihnen überlassen
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= unbedingt erforderlich!
"method":"chacha20-ietf-poly1305"
}
Stellen Sie sicher, dass Sie alle Einstellungen in der systemd-Konfiguration (/lib/systemd/system/shadowsocks-libev-local@.service) doppelt überprüfen. Aktivieren Sie den shadowsocks-libev-local@.service, starten Sie den Computer neu und prüfen Sie, ob der Dienst läuft.
2 - Proxy-Verbindung auf dem CN-Server einrichten
auf der Discourse-Maschine
$ sudo apt install shadowsocks-libev
Wenn Sie bei Aliyun sind, suchen Sie in deren seltsamer Konsole nach den Firewall-Einstellungen und prüfen Sie die jeweiligen Port-Einstellungen.
Sie müssen nicht mit den systemd-Einstellungen auf dem Client-Computer herumprobieren, aber halten Sie separate Konfigurationsdateien für Docker und den regulären Gebrauch bereit, da Sie den SOCKS5-Proxy möglicherweise außerhalb des Docker-Kontexts verwenden möchten. In diesem Fall würden Sie 127.0.0.1 anstelle der für Docker zugänglichen Netzwerkadressen verwenden.
$ cd /etc/shadowsocks-libev
$ sudo cp config.json local.json
$ sudo cp config.json docker.json
Passen Sie die Konfiguration an etwas Ähnliches an:
$ sudo nano local.json
{
"server":["123.123.123.123"], # IP der Remote-Maschine
"mode":"tcp_and_udp", # Diese Anmerkung unterscheidet sich aufgrund verschiedener shadowsocks-libev-Versionen in meiner Einrichtung
"server_port":8400,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"Swordfish",
"timeout":600, # <= darauf achten
"method":"chacha20-ietf-poly1305"
}
Aus Bequemlichkeit fügen wir einen Alias zu unserer .bashrc hinzu:
$ nano ~/.bashrc
# einfügen
alias dockershadow='ss-local -c /etc/shadowsocks-libev/local.json'
Passen Sie die andere Konfiguration an, damit Docker über das Netzwerk der Host-Maschine läuft:
$ 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"
}
Setzen Sie den Alias für die Verwendung der Docker-spezifischen Konfiguration:
alias dockershadow='ss-local -c /etc/shadowsocks-libev/docker.json'
3 & 4 - Vorlage erstellen, um Ihre app.yml übersichtlich zu halten
Dies ist absolut optional und hängt von Ihrem Geschmack ab; ich bevorzuge es, die app.yml lesbar und kurz zu halten und stattdessen Komponenten an anderer Stelle zu verwalten. Geben Sie ihr einen beliebigen Namen nach Ihrem Geschmack, ich habe web.git.template.yml gewählt.
$ nano templates/web.git.template.yml
# einfügen:
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
# optional
after_code:
- exec:
cmd:
- git config --global --unset http.proxy
- git config --global --unset https.proxy
- git config --global --unset https.sslVerify
Ich habe es mit dem Hook after_web getestet, aber das hat nicht funktioniert.
5 - app.yml anpassen
Rufen Sie die Vorlage in Ihrer app.yml auf:
$ 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"
Ihr Vorlagen-Abschnitt sieht höchstwahrscheinlich anders aus, stellen Sie einfach sicher, dass Sie web.china und die web.git-blabla (oder wie auch immer Sie sie genannt haben) Vorlagen einfügen.
Nicht 1080:1080 in Ihrer app.yml exponieren!
6 - Neuerstellung
Bevor Sie neu erstellen, überprüfen Sie, ob Ihre Proxy-Einstellungen beim Klonen mit Git funktionieren.
$ 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
Dies fügt natürlich die Proxy-Flags Ihrer .gitconfig im Home-Verzeichnis des Benutzers hinzu, also achten Sie darauf, dies nach dem Testen zu entfernen.
Wählen Sie ein zufälliges großes Repository auf GitHub mit vielen Dateien und überprüfen Sie Ihre Klon-Geschwindigkeit. Wenn Ihre Konfiguration korrekt ist, sollten Sie mit etwa 12-15 MB/s klonen können, abhängig von Ihrer Aliyun-Einrichtung. Wenn Ihre Verbindungsgeschwindigkeit langsam von 200 KB/s auf etwa 10 MB/s ansteigt, waren Ihre Bemühungen nicht erfolgreich.
Schließlich neu erstellen:
$ cd /<discourse directory>
# Proxy ausführen, indem wir den zuvor gesetzten Alias verwenden
$ dockershadow
$ ./launcher rebuild app
Der Neuerstellungsprozess wird häufig fehlschlagen, daher benötigen Sie Geduld (und möglicherweise Baijiu). Je weniger Plugins in Ihrer app.yml eingestellt sind, desto wahrscheinlicher ist es, dass Ihre Neuerstellung erfolgreich ist.
7 - Anmerkungen
Ich betrachte dies immer noch als Workaround, nicht als produktionsreifes Verfahren, also hat vielleicht jemand eine Idee, wie man das GitHub-Repository in China spiegeln kann, um dies weniger schmerzhaft zu machen. Und wie wir alle wissen, ändern sich die intransparenten Mechanismen innerhalb der GFW ständig.
Natürlich ist ein SOCKS5-Proxy nur eine von vielen Optionen, aber ich mag es, Mehrzwecklösungen zur Hand zu haben.
Wenn jemand eine Idee hat, wie man diesen Workaround produktionsreif macht, schätze ich Ihre Eingabe. Discourse ist fantastische Software, aber ich nehme an, einer der Gründe, warum sie in China nicht weit verbreitet ist, sind die umständlichen Installations- und Wartungsprozesse. Der Versuch, über die GUI zu aktualisieren, ergab im letzten Jahr eine 100%ige Ausfallrate, egal welche Timeout-Einstellungen ich in meinem Nginx-Reverse-Proxy konfiguriert hatte.
Chinesische Übersetzung folgt