返回介绍

部署网站

发布于 2023-08-06 23:35:04 字数 8766 浏览 0 评论 0 收藏 0

F-Droid 网站是使用 Jekyllgitlab-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修改。

  1. 设置 docker
  2. 设置 gitlab-ci-multi-runner
  3. 使用 GnuPG 准备 deploy-allowlist-keyring.gpg
    $ gpg --recv-keys 00aa5556
    $ gpg --fingerprint 00aa5556  # 验证它!
    $ 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 负责,即_不带_ --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_aliasmod_negotiation 的启用,但这在 Debian 上安装 apache2 时默认发生。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文