部署网站
F-Droid 网站是使用 Jekyll和 gitlab-ci构建的。整个网站现在使用标准的 git“复刻”工作流程工作,GitLab 很好地支持该工作流程,并且由 GitHub 等服务众所周知。对于 f-droid.org 分发的所有页面和有关应用和软件包的信息,这些页面是使用我们的 jekyll-fdroid 插件生成的,该插件从 f-droid.org 索引文件获取内容。
开发复刻上的暂存
fdroid-website 的所有开发分支都会自动设置一个临时服务器,并由 gitlab-ci 配置维护。这会自动将分支的 master 分支的内容部署到 GitLab Pages。例如,nicoalt 的 git 分支是在 https://gitlab.com/nicoalt/fdroid-website,并且 master 分支自动的部署到 https://nicoalt.gitlab.io/fdroid-website。
官方网站的暂存
和复刻一样,网站主 git 存储库的 master 分支,https://gitlab.com/fdroid/fdroid-website,会自动部署到 https://fdroid.gitlab.io/fdroid-website。这是一个在标记发布前查看网站当前状态的地方。
部署到 https://f-droid.org
当网站的更新经过测试并准备就绪时,发布管理员会在主 git 存储库中创建一个有 PGP 签名的发布标签。部署服务器监控主 git 存储库中的新标签。当它看到一个新标签时,它首先使用手动配置的 GnuPG 密钥环检查 git 标签上的 PGP 签名,该密钥环只包含允许标记网站发布的PGP 密钥的公钥。
git 标签验证后,运行 .gitlab-ci.yml 中的 f-droid.org
目标以生成站点的实际文件。然后将这些文件复制到 f-droid.org 服务器上。
部署标签使用了一个“语义版本”命名方案:
- <major>.<minor>
- <minor> 在每次部署时都会递增
- <major> 只在有重大变化时递增
设置和运行部署程序
部署程序在一台运行 Debian/stretch 的机器上进行了测试。它应该在存储库索引发布时被触发,所以它可以用最新的应用信息进行重建。整个过程可以以 root 身份运行,也可以只运行 gitlab-runner
。这个最后的程序不是提交到网站 git 存储库中的脚本的一部分,所以在 docker 之外运行的命令不能通过git修改。
- 设置 docker
- 设置 gitlab-ci-multi-runner
- 使用 GnuPG 准备 deploy-allowlist-keyring.gpg:
$ gpg --recv-keys 00aa5556 $ gpg --fingerprint 00aa5556 # 验证它! $ 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
负责,即_不带_ --no-type-map
参数运行 ./tools/prepare-multi-langs.sh
脚本。这确保每个 .html
文件被替换成 Apache2 TypeMap。
第二是启用 mod_rewrite,它用于为不使用 JavaScript 的浏览器自动选择正确的语言。最简单的方法是运行 sudo a2enmod rewrite
。
最后是在 Apache2 服务器或 VirtualHost 配置中添加以下内容,告诉 apache 在哪里找到文件的翻译版本(将 /var/www/html
替换为实际的 webroot),以便正确使用 TypeMaps:
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride FileInfo
</Directory>
<Files *.html>
SetHandler type-map
</Files>
# 虚拟化语言子“文件夹”
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
的启用,但这在 Debian 上安装 apache2 时默认发生。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论