Развертывание веб-сайта

Сайт F-Droid построен с использованием Jekyll и gitlab-ci. Весь сайт теперь работает с использованием стандартного рабочего процесса git “fork”, который хорошо поддерживается GitLab и хорошо известен по сервисам вроде GitHub. Для всех страниц и информации о приложениях и пакетах, распространяемых f-droid.org, эти страницы создаются с помощью нашего плагина jekyll-fdroid, который берет содержимое из индексного файла f-droid.org.

Постановка на форки разработки

Все форки разработки fdroid-website автоматически имеют staging-сервер, установленный и поддерживаемый конфигурацией gitlab-ci. Это автоматически размещает содержимое ветки master форка на GitLab Pages. Например, git-форк nicoalt находится по адресу https://gitlab.com/nicoalt/fdroid-website, и ветка master из него автоматически размещается на https://nicoalt.gitlab.io/fdroid-website.

Постановка официального сайта

Как и в случае с форками, ветвь master основного git-репозитория для сайта, https://gitlab.com/fdroid/fdroid-website, автоматически развертывается в https://fdroid.gitlab.io/fdroid-website. Это место, где можно просмотреть текущее состояние сайта, прежде чем ставить метку релиза.

Развертывание на https://f-droid.org

Когда обновление сайта протестировано и готово к выпуску, менеджер выпуска создает тег выпуска с подписью PGP в основном git-репозитории. Сервер развертывания отслеживает основной git-репозиторий на предмет появления новых тегов. Когда он видит новый тег, он сначала проверяет PGP-подпись на git-теге, используя настроенный вручную набор ключей GnuPG, который содержит только открытые ключи PGP-ключей, разрешенных для тегов релизов сайта.

После проверки git-тега запускается f-droid.org target в .gitlab-ci.yml для генерации фактических файлов для сайта. Затем эти файлы копируются на место на серверы f-droid.org.

Теги развертывания используют схему именования “семантической версионности”:

  • <major>.<minor>
  • <minor> увеличивается при каждом развертывании
  • <major> увеличивается только при наличии серьезных изменений

Настройка и выполнение процедуры развертывания

Процедура развертывания была протестирована на машине под управлением Debian/stretch. Она должна запускаться всякий раз, когда публикуется индекс репозитория, чтобы можно было перестроить его с последней информацией о приложении. Вся эта процедура может быть запущена от имени root или просто gitlab-runner. Эта последняя процедура не является частью скрипта, зафиксированного в git-репозитории сайта, чтобы команды, выполняемые вне docker, не могли быть изменены через git.

  1. настройка docker
  2. настройка gitlab-ci-multi-runner
  3. подготовить deploy-allowlist-keyring.gpg с помощью GnuPG:
    $ gpg --recv-keys 00aa5556
    $ gpg --fingerprint 00aa5556  # verify it!
    $ gpg --export 00aa5556 > /path/to/deploy-allowlist-keyring.gpg
    
  4. получить исходный код сайта:
    $ git clone https://gitlab.com/fdroid/fdroid-website
    
  5. запустить генерацию:
    $ cd fdroid-website
    $ git fetch --tags
    $ sudo gitlab-runner exec docker f-droid.org \
              --pre-build-script ./tools/prepare-for-deploy.py \
              --docker-volumes "/path/to/deploy-allowlist-keyring.gpg:/root/.gnupg/pubring.gpg:ro" \
              --docker-volumes `pwd`/_site:/builds/output
    
  6. развернуть файлы сайта на веб-сервере, не позволяя jekyll сгенерированным файлам перезаписывать части сайта, которыми управляют другие вещи:
    $ rsync -ax --delete --exclude-from=_site/build/.rsync-deploy-exclude-list  _site/build/  f-droid.org:/var/www/
    

Базовая настройка Debian/Apache

Эти инструкции основаны на Debian/stretch, но они должны быть очень похожи как на более старых, так и на более новых версиях Debian, а также на любых производных Debian, таких как Ubuntu, Mint, Elementary и т.д.

$ sudo su -
# apt install apache2 certbot tor ca-certificates geoip-bin libapache2-mod-geoip \
  python-certbot-apache rsync unattended-upgrades locales
# dpkg-reconfigure unattended-upgrades # включите их!
# sed -i 's,^# \(.* UTF-8\)$,\1,' /etc/locale.gen # включить все UTF-8 локали
# locale-gen
# a2dismod status
# a2enmod headers
# a2enmod rewrite
# a2enmod ssl
# a2enconf security
# apachectl configtest && apachectl restart
# certbot --apache

Конфигурация Apache2

Веб-сайт F-Droid переведен на несколько языков. Для того чтобы это работало, необходимо выполнить несколько действий.

О первом позаботится .gitlab-ci.yml, который заключается в запуске скрипта ./tools/prepare-multi-langs.sh _без _ аргумента --no-type-maps. Это гарантирует, что каждый файл .html будет заменен на Apache2 TypeMap.

Второе - включить mod_rewrite, который используется для автоматического выбора правильного языка для браузеров, не использующих JavaScript. Самый простой способ сделать это - выполнить команду sudo a2enmod rewrite.

Последнее - добавить следующее в конфигурацию сервера Apache2 или VirtualHost, чтобы TypeMaps использовались правильно, указывая apache, где найти переведенную версию файла (замените /var/www/html на фактический webroot):

<Directory /var/www/html>
    Options FollowSymLinks
    AllowOverride FileInfo
</Directory>

<Files *.html>
    SetHandler type-map
</Files>

# Виртуализация языка sub "directories"
AliasMatch ^(?:/(?:ach|af|ak|sq|am|anp|ar|ar_DZ|ar_MA|an|es_AR|hy|as|ast|de_AT|ay|az|ba|eu|bar|be|be_Latn|bn|bn_BD|bn_IN|brx|bs|bs_Cyrl|bs_Latn|br|bg|my|ca|km|ch|chr|hne|cgg|zh|zh_HK|zh_Hans|zh_Hant|ksh|kw|cr|hr|cs|da|doi|nl|nl_BE|dz|en|en_AU|en_CA|en_IE|en_PH|en_ZA|en_GB|en_US|eo|et|fo|fil|fi|frp|fr|fr_CA|fy|fur|ff|gd|gl|ka|de|el|kl|gu|gun|ht|ha|haw|he|hi|hu|is|ig|id|ia|ga|it|ja|jv|kab|kn|ks|csb|kk|rw|tlh|tlh-qaak|kok|ko|ku|ckb|ky|lo|la|lv|li|ln|lt|jbo|nds|lb|mk|mai|mg|ms|ml|mt|mnk|mi|arn|mr|mni|mn|me|mfe|nqo|nah|nap|ne|se|no|nb_NO|nb|nn|ny|oc|or|oj|os|pap|nso|fa|pms|pr|pl|pt|pt_BR|pt_PT|pa|ps|ro|rm|ru|sa|sat|sc|sco|sr|sr_Cyrl|sr_Latn|sh|sn|szl|sd|si|sk|sl|so|son|st|es|es_US|es_MX|es_PR|su|sw|sv|de_CH|tl|tg|ta|tt|te|th|bo|ti|ts|tr|tk|ug|uk|hsb|ur|ur_PK|uz|uz_Latn|ca@valencia|ve|vec|vi|wa|cy|vls|wo|sah|yi|yo|yue|zu)/)?(.*)?$ /var/www/html/$1

# Сообщите mod_negotiation, какой язык предпочесть
SetEnvIf Request_URI ^/(ach|af|ak|sq|am|anp|ar|an|hy|as|ast|ay|az|ba|eu|bar|be|bn|brx|bs|br|bg|my|ca|km|ch|chr|hne|cgg|zh|ksh|kw|cr|hr|cs|da|doi|nl|dz|en|eo|et|fo|fil|fi|frp|fr|fy|fur|ff|gd|gl|ka|de|el|kl|gu|gun|ht|ha|haw|he|hi|hu|is|ig|id|ia|ga|it|ja|jv|kab|kn|ks|csb|kk|rw|tlh|tlh-qaak|kok|ko|ku|ckb|ky|lo|la|lv|li|ln|lt|jbo|nds|lb|mk|mai|mg|ms|ml|mt|mnk|mi|arn|mr|mni|mn|me|mfe|nqo|nah|nap|ne|se|no|nb|nn|ny|oc|or|oj|os|pap|nso|fa|pms|pr|pl|pt|pa|ps|ro|rm|ru|sa|sat|sc|sco|sr|sh|sn|szl|sd|si|sk|sl|so|son|st|es|su|sw|sv|tl|tg|ta|tt|te|th|bo|ti|ts|tr|tk|ug|uk|hsb|ur|uz|ca@valencia|ve|vec|vi|wa|cy|vls|wo|sah|yi|yo|yue|zu)/ prefer-language=$1

# Языковые коды из Weblate, содержащие заглавные буквы и знаки подчеркивания, должны обрабатываться
# по-другому, а именно: язык, на который они ссылаются, должен быть в нижнем регистре с дефисом.
SetEnvIf Request_URI ^/ar_DZ/ prefer-language=ar-dz
SetEnvIf Request_URI ^/ar_MA/ prefer-language=ar-ma
SetEnvIf Request_URI ^/be_Latn/ prefer-language=be-latn
SetEnvIf Request_URI ^/bn_BD/ prefer-language=bn-bd
SetEnvIf Request_URI ^/bn_IN/ prefer-language=bn-in
SetEnvIf Request_URI ^/bs_Cyrl/ prefer-language=bs-cyrl
SetEnvIf Request_URI ^/bs_Latn/ prefer-language=bs-latn
SetEnvIf Request_URI ^/de_AT/ prefer-language=de-at
SetEnvIf Request_URI ^/de_CH/ prefer-language=de-ch
SetEnvIf Request_URI ^/en_AU/ prefer-language=en-au
SetEnvIf Request_URI ^/en_CA/ prefer-language=en-ca
SetEnvIf Request_URI ^/en_GB/ prefer-language=en-gb
SetEnvIf Request_URI ^/en_IE/ prefer-language=en-ie
SetEnvIf Request_URI ^/en_PH/ prefer-language=en-ph
SetEnvIf Request_URI ^/en_US/ prefer-language=en-us
SetEnvIf Request_URI ^/en_ZA/ prefer-language=en-za
SetEnvIf Request_URI ^/es_AR/ prefer-language=es-ar
SetEnvIf Request_URI ^/es_MX/ prefer-language=es-mx
SetEnvIf Request_URI ^/es_PR/ prefer-language=es-pr
SetEnvIf Request_URI ^/es_US/ prefer-language=es-us
SetEnvIf Request_URI ^/fr_CA/ prefer-language=fr-ca
SetEnvIf Request_URI ^/nb_NO/ prefer-language=nb-no
SetEnvIf Request_URI ^/nl_BE/ prefer-language=nl-be
SetEnvIf Request_URI ^/pt_BR/ prefer-language=pt-br
SetEnvIf Request_URI ^/pt_PT/ prefer-language=pt-pt
SetEnvIf Request_URI ^/sr_Cyrl/ prefer-language=sr-cyrl
SetEnvIf Request_URI ^/sr_Latn/ prefer-language=sr-latn
SetEnvIf Request_URI ^/ur_PK/ prefer-language=ur-pk
SetEnvIf Request_URI ^/uz_Latn/ prefer-language=uz-latn
SetEnvIf Request_URI ^/zh_Hans/ prefer-language=zh-hans
SetEnvIf Request_URI ^/zh_Hant/ prefer-language=zh-hant
SetEnvIf Request_URI ^/zh_HK/ prefer-language=zh-hk

Если это не сделано или сделано неправильно, то при просмотре любой страницы вы увидите что-то вроде следующего:

URI: index.html.en Content-language: en Content-type: text/html URI: index.html.fr Content-language: fr Content-type: text/html

В результате браузеру возвращается реальная карта TypeMap, а не переведенный файл.

Обратите внимание, что это также зависит от того, включены ли mod_alias и mod_negotiation, но это происходит по умолчанию при установке apache2 на Debian.