Безболезненное ручное обновление из Китая
шаги
- Создайте 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
Обратите особое внимание на таймаут и метод шифрования:
{
"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
Если вы используете Aliyun, найдите настройки брандмауэра в их специфической консоли и проверьте соответствующие настройки портов.
Вам не нужно возиться с настройками systemd на клиентской машине, но держите отдельные конфигурационные файлы для Docker и обычного использования, так как вы можете захотеть использовать SOCKS5-прокси вне контекста Docker. В таком случае вам нужно будет использовать 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>
$ 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 (или как вы его назвали) шаблоны.
Не открывайте порт 1080:1080 в вашем app.yml!
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 МБ/с в зависимости от вашей настройки Aliyun. Если скорость подключения медленно растет с 200 КБ/с до примерно 10 МБ/с, значит, ваши усилия были безуспешными.
Наконец, выполните пересборку:
$ cd /<каталог discourse>
# запустите прокси, используя установленный ранее алиас
$ dockershadow
$ ./launcher rebuild app
Процесс пересборки часто завершается неудачей, поэтому вам понадобится терпение (и, возможно, байцзю). Чем меньше плагинов указано в вашем app.yml, тем выше вероятность успешной пересборки.
7 — замечания
Я все еще считаю это обходным путем, а не готовым к использованию в production решением, поэтому, возможно, у кого-то есть идея, как зеркалить репозиторий GitHub в Китае, чтобы сделать этот процесс менее болезненным. И, как мы все знаем, непрозрачные механизмы внутри Великого китайского фаервола постоянно меняются.
Конечно, SOCKS5-прокси — лишь один из многих вариантов, но мне нравятся многоцелевые решения.
Если у кого-то есть идея, как сделать этот обходной путь пригодным для production, я буду благодарен за ваш вклад. Discourse — фантастическое программное обеспечение, но я предполагаю, что одной из причин его широкого неиспользования в Китае являются громоздкие процессы установки и обслуживания. Попытки обновления через GUI давали мне 100% неудач в прошлом году, независимо от настроек таймаута, которые я конфигурировал в моем обратном прокси nGinx.
Китайский перевод будет добавлен позже