运行镜像

F-Droid 的应用和文件集合在由 F-Droid 核心贡献者运行的服务器上运行。最初,这个主要的资源库只托管在 f-droid.org 上,但是随着 F-Droid 的发展,f-droid.org 本身已经无法单独处理整个负载了。F-Droid 现在支持”镜像”服务器,它复制了存储库的完整副本。托管一个镜像需要运行一个 HTTPS webserver,它有一个使用 rsync 同步的版本库的完整副本。

主要和次要镜像

每当 F-Droid 构建新索引,它都会主动将新索引推送到选定的镜像集合,即所谓的”主镜像“。 换句话说,主镜像几乎是立即更新的。 主镜像配置在 (最新列表) 中:

  • ftp.agdsn.de
  • ftp.lysator.liu.se
  • plug-mirror.rcac.purdue.edu

其他镜像为 “二级镜像”。 这些镜像应该定期从主镜像同步 (比如,每隔 4 小时)。因此,二级镜像通常有轻微的传播延迟。 尽管如此,请注意在实践中,两次索引更新间的时间由更新和构建应用的时间决定(按照天数顺序)。 限制主镜像数量使 F-Droid 源服务器 保持轻负载状态。通过从二级镜像同步可以拥有“三级镜像”,考虑到本地带宽限制,这种做法也许有意义。

有许多镜像服务器提供 rsync 连接,请确保选择最接近镜像服务器的镜像:

中国大陆rsync -axv mirrors.tuna.tsinghua.edu.cn::fdroid
德国rsync -axv ftp.agdsn.de::fdroid
德国rsync -axv ftp.fau.de::fdroid
德国rsync -axv mirror.level66.network::fdroid
丹麦rsync -axv mirrors.dotsrc.org::fdroid
美国印第安纳州rsync -axv plug-mirror.rcac.purdue.edu::fdroid
瑞典rsync -axv ftp.lysator.liu.se::fdroid
新加坡rsync -axv mirror.freedif.org::fdroid
台湾rsync -axv mirror.ossplanet.net::fdroid

要求

有两个官方的 F-Droid 存储库部分,”存储库” 和 “存档”。镜像 “存储库” 是最重要的,因为它的使用次数远远超过 “存档”。

运行镜像主要需要大量磁盘空间和带宽。每个新镜像都会减少带宽要求,但磁盘空间要求以 合理速度 增长。

  • 2019 年 3 月时,主存储库的 2.4万个文件需要 60GB 多一点的磁盘空间,存档存储库的 5.2 万个文件需要 300GB 的磁盘空间。
  • 2024 年 2 月时,主存储库的 18 万个文件需要 450GB 空间,存档存储库的 43 万个文件需要 1.9TB。
  • 2025 年 9 月时,主存储库的 18.9 万个文件需要 675GB,存档存储库的 53.8 万个文件需要 3.78TB。
  • 所需磁盘空间量随每个新的应用发布而增长。

你可以通过在终端中运行以下命令来查找有关磁盘空间要求的当前信息:

$ rsync --dry-run --recursive --stats --human-readable ftp.fau.de::fdroid .

当镜像满足 F-Droid 所需标准,它便能成为官方镜像。 官方镜像是 F-Droid 客户端默认会使用的镜像。 要成为官方镜像,镜像必须有可靠的稳定性,尊重隐私,良好的 TLS 配置及其他考量。可以在 mirror-monitor 追踪所有已知镜像。 比如,f-droid.org 记录会保留数周。 这些记录会被 处理 去除任何个人身份信息(PII) 然后永久保留最小化的安全数据。官方镜像的更常见日志记录配置是保留记录 4 周,然后删除它们。

设置

本指南假设使用 Nginx 和基于 deb 的发行版,并镜像主存储库和存档。如果你使用的是替代品,或者不打算镜像存档,请做相应调整。也可以用你自己的路径和域来代替例子。

如需有关该过程的协助,请随时与我们联络.

1. 创建合适的目录
$ sudo mkdir -p /var/www/fdroid/fdroid/repo
$ sudo mkdir -p /var/www/fdroid/fdroid/archive
$ sudo chown -R www-data.www-data /var/www/fdroid
2. 同步存储库。

这些命令最好在终端多路复用器(screentmux 等)中运行,因为它们需要一些时间才能完成。使用 --info=progress2 可以看到进度。

$ sudo -u www-data -E /usr/bin/rsync -aHS  --delete --delete-delay --info=progress2 ftp.fau.de::fdroid/repo/ /var/www/fdroid/fdroid/repo/
$ sudo -u www-data -E /usr/bin/rsync -aHS  --delete --delete-delay --info=progress2 ftp.fau.de::fdroid/archive/ /var/www/fdroid/fdroid/archive/
3. 建立一个 cronjob 以使存储库保持最新

/etc/cron.d 中创建一个 cronjob 文件

$ vi /etc/cron.d/fdroid

在文件中填入条目以更新存储库。这些命令将在每隔6小时的第35分钟运行,你可以根据你的需要改变它。

35 */6 * * * www-data /usr/bin/rsync -aHS  --delete --delete-delay ftp.fau.de::fdroid/repo/ /var/www/fdroid/fdroid/repo/
35 */6 * * * www-data /usr/bin/rsync -aHS  --delete --delete-delay ftp.fau.de::fdroid/archive/ /var/www/fdroid/fdroid/archive/
4. 配置你的网络服务器

这是一个 nginx 服务器块的例子。如果使用,应该复制到 /etc/nginx/sites-available/,并将其符号链接到 /etc/nginx/sites-enabled。注意,你的 URI 必须是 /fdroid/repo,以便应用可以自动添加你的镜像。

server {
  listen [::]:80 ipv6only=off;

  server_name fdroidmirror.example.com;

  rewrite ^ https://$host$request_uri permanent;
}

server {
  listen [::]:443 ssl http2 ipv6only=off;

  server_name fdroidmirror.example.com;

  root /var/www/fdroid/;

  ssl_certificate /etc/letsencrypt/live/fdroidmirror.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/fdroidmirror.example.com/privkey.pem;

  # Insert here a TLS config from Mozilla SSL config generator https://mozilla.github.io/server-side-tls/ssl-config-generator/
}
5. 测试你的镜像可以正常运作

手动添加你的镜像到 F-Droid 客户端 测试其能否正常运作。

转到 设置 -> 存储库,单击 “+” 按钮,接着手动输入你的存储库 URL (不要使用二维码): https://fdroidmirror.example.com/fdroid/repo?fingerprint=43238D512C1E5EB2D6569F4A3AFBF5523418B82E0A3ED1552770ABB9A9C9CCAB

接着停用除了你的新镜像之外的其他所有镜像,下拉刷新索引,浏览并安装一些应用!

6. 设置隐私政策

请包含隐私政策,以便用户可以理解使用你的镜像时他们的元数据会发生什么。以下政策供参考:

  • FAU: https://ftp.fau.de/datenschutz
  • Lysator: https://ftp.lysator.liu.se/datahanteringspolicy.txt
  • Purdue PLUG: https://plug-mirror.rcac.purdue.edu/info.html
7. 提交镜像以进行收录
  • 复刻 mirror monitor repo,将你的镜像添加到 README 中的列表中,并打开一个合并请求。
  • admin repo 上打开一个问题,包括任何相关信息,请求包含你的镜像。
  • 一旦核心贡献者团队认为你的镜像值得信赖和可靠,它将被接受到官方列表中。

其他考虑

  • 转发来自 cronjob 失败的电子邮件,以便你知道同步是否失败
  • 监测磁盘用量防止其被填满
  • 检测镜像,以便你知道它是否出现故障(最好是 /srv/mymirror.org/htdocs/fdroid/repo/index-v1.jar 上的关键字)
  • 强化你的 SSH 服务器配置(禁用密码验证,安装 fail2ban
  • 启用无人值守安全升级(在 Debian 中,只需 apt-get install unattended-upgrades

运行主镜像(通过推送接收同步)

首选设置是将 F-Droid 更新通过 rsync 通过 ssh 和 SSH 密钥身份验证推送到主镜像。这与 Debian 相同,主要区别在于目前没有用于 command="" 的脚本,但是,有一个硬编码的 rsync 命令。这真的很好地将安全交互限制为只需要发生(最低权限!)。

command="rsync --server -logDtpre.iLsfx --log-format=X --delete --delay-updates . /srv/fdroid-mirror.at.or.at/htdocs/fdroid/"

该命令中唯一可定制的部分是最后的路径。 它可以是任何路径,但必须指向 /fdroid/ 目录,并且必须有尾部斜线。 如果任何一个 rsync 选项被改变,它将破坏同步设置。

作为额外的预防措施,应该有一个用户账户(例如 fdroid)专门用来接收 rsync/ssh 连接。 它应该有尽可能少的访问权限。 它绝对不应该有对 authorized_keys 文件的写入权限,因为这将允许获得写入权限的攻击者添加一个单独的密钥配置行,从而规避那里列出的所有限制。 这可以简单地通过执行以下操作实现:

$ sudo chown root.root /home/fdroid/.ssh /home/fdroid/.ssh/authorized_keys
$ sudo chmod 0755 /home/fdroid/.ssh
$ sudo chmod 0644 /home/fdroid/.ssh/authorized_keys