Запуск зеркала

Коллекция приложений и файлов F-Droid работает на серверах, управляемых основными участниками F-Droid. Первоначально основной репозиторий размещался только на f-droid.org, но по мере роста F-Droid один f-droid.org уже не справлялся со всей нагрузкой. Теперь F-Droid поддерживает “зеркальные” серверы, которые копируют полную копию репозиториев. Размещение зеркала подразумевает запуск веб-сервера HTTPS, на котором находится полная копия репозитория, синхронизированная с помощью rsync.

Требования

Существует два официальных раздела репозитория F-Droid, “repo” (репозиторий) и “archive” (архив). Наиболее важно зеркалировать “репозиторий”, поскольку он используется гораздо чаще, чем “архив”.

Основными ресурсами, требуемыми зеркалу, являются дисковое пространство и пропускная способность канала загрузки. Требования к пропускной способности снижаются с каждым новым зеркалом, но требования к дисковому пространству растут с разумной скоростью. На момент написания статьи (март 2019 года) основное хранилище требует чуть более 60 ГБ дискового пространства в 24 тыс. файлов, а архив требует 300 ГБ дискового пространства в 52 тыс. файлов. Объем требуемого дискового пространства растет с каждым новым выпуском приложения.

Существует много серверов-зеркал, которые предлагают соединение rsync, убедитесь, что выбрали зеркало, ближайшее к вашему серверу-зеркалу:

Материковый Китайrsync -axv mirrors.tuna.tsinghua.edu.cn::fdroid
Германияrsync -axv ftp.agdsn.de::fdroid
Германияrsync -axv ftp.fau.de::fdroid
Индиана, СШАrsync -axv plug-mirror.rcac.purdue.edu::fdroid
Швецияrsync -axv ftp.lysator.liu.se::fdroid
Тайваньrsync -axv mirror.ossplanet.net::fdroid
Украинаrsync -axv fdroid.astra.in.ua::fdroid

Вы можете найти актуальную информацию о требованиях к дисковому пространству, выполнив в терминале следующее:

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

Настройка

Это руководство предполагает использование 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
  1. Синхронизируйте репозитории. Эти команды лучше всего выполнять в терминальном мультиплексоре (screen, tmux и т. д.), поскольку их выполнение займёт некоторое время. С помощью --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/
  1. Создайте cronjob для поддержания репозиториев в актуальном состоянии

Создайте файл cronjob в /etc/cron.d

$ vi /etc/cron.d/fdroid

Fill the file with entries to update the repositories. These commands will run at minute 35 past every 6th hour, you can change it to fit your needs.

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/
  1. Настройте свой веб-сервер

Это пример серверного блока для nginx. Если он используется, его следует скопировать в /etc/nginx/sites-available/ и симлинковать в /etc/nginx/sites-enabled. Обратите внимание, что важно, чтобы ваш URI был /fdroid/repo, чтобы приложение могло автоматически добавить ваше зеркало.

сервер {
  listen [::]:80 ipv6only=off;

  server_name fdroidmirror.example;

  rewrite ^ https://fdroidmirror.example$request_uri permanent;
}

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

  server_name fdroidmirror.example;

  root /var/www/fdroid/;

  # TODO: https://gitlab.com/snippets/1834032
  расположение /health {
    proxy_pass http://127.0.0.1:8000/;
  }

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

  # Вставьте сюда TLS-конфиг из генератора SSL-конфигов Mozilla https://mozilla.github.io/server-side-tls/ssl-config-generator/
}
  1. Отправьте свое зеркало для включения
  • Форк mirror monitor repo, добавьте ваше зеркало в список в README и откройте запрос на слияние.
  • Откройте проблему на admin repo, включив всю необходимую информацию, с просьбой включить ваше зеркало.
  • Как только команда основных авторов сочтет ваше зеркало заслуживающим доверия и надежным, оно будет включено в официальный список.

Кроме того, было бы неплохо включить политику конфиденциальности, чтобы пользователи могли понять, что происходит с их метаданными при использовании зеркала. Purdue PLUG https://plug-mirror.rcac.purdue.edu/info.html и FAU https://ftp.fau.de/datenschutz - два примера.

Другие соображения

  • Создайте политику конфиденциальности, которая описывает, что происходит с метаданными (например, FAU, PLUG, Lysator).
  • Пересылайте электронные письма о сбоях в работе cronjob, чтобы вы знали, если синхронизация не удалась
  • Настройте мониторинг на зеркале, чтобы знать, если оно упадет (в идеале ключевое слово на /srv/mymirror.org/htdocs/fdroid/repo/index-v1.jar)
  • Усильте конфигурацию вашего SSH-сервера (отключите аутентификацию пароля, установите fail2ban)
  • Включите автоматическое обновление безопасности (в Debian, просто apt-get install unattended-upgrades)

Запуск основного зеркала (получение синхронизации через push)

Предпочтительной настройкой является передача обновлений F-Droid на основное зеркало через rsync по ssh с аутентификацией SSH Key. Это аналогично 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