Сайт 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.
- настройка docker
- настройка gitlab-ci-multi-runner
- подготовить deploy-allowlist-keyring.gpg с помощью GnuPG:
$ gpg --recv-keys 00aa5556 $ gpg --fingerprint 00aa5556 # verify it! $ gpg --export 00aa5556 > /path/to/deploy-allowlist-keyring.gpg
- получить исходный код сайта:
$ git clone https://gitlab.com/fdroid/fdroid-website
- запустить генерацию:
$ 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
- развернуть файлы сайта на веб-сервере, не позволяя 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.