Herkos

Собственный сервер Blossom

Последнее обновление: 27 октября 2026 года

Herkos Drive разрезает каждый файл на зашифрованные блоки и хранит их на нескольких серверах Blossom: три копии, как минимум на двух видах серверов, и одна — на вашем собственном сервере. Публичные серверы хранят блоки бесплатно, но ничего не обещают: они могут удалить их, переполниться или закрыться.

Собственный сервер Blossom хранит вашу копию столько, сколько решите вы, и принимает блоки только от вашего Drive. На этой странице объясняется, как настроить такой сервер за три шага, плюс ночное резервное копирование. Он хорошо дополняет собственное почтовое реле, а вся настройка занимает около пятнадцати минут, если сервер у вас уже есть.

Какой сервер выбрать

blossom-server от hzrd149, версия 6.4.1 (6 октября 2026 года, лицензия MIT). 27 октября 2026 года мы запустили его с приведённой ниже конфигурацией и собственным кодом загрузки Drive и проверили то, что нужно Drive, а не то, что обещает сервер:

Что делает Drive Результат
Загружает зашифрованные блоки по 8 MiB (application/octet-stream) Принимаются
Спрашивает перед загрузкой (BUD-06) Отвечает и отклоняет любой другой ключ
Просит ваш сервер скопировать блок с публичного (BUD-04) Скопирован
Читает блок без идентификации Отдан байт в байт
Удаляет блок ключом, которым он был загружен Удалён: повторный запрос даёт 404
Загрузки с любого другого ключа Отклоняются (401)

Что понадобится

Шаг 1: запустите сервер

Создайте для него папку, например /root/blossom, и сохраните в ней эти два файла. Первый — docker-compose.yml:

services:
  blossom:
    image: ghcr.io/hzrd149/blossom-server:6.4.1
    environment:
      BLOSSOM_REQUIRE_CONFIG: "1"
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - data:/app/data
      - ./config.yml:/app/config.yml:ro
    restart: unless-stopped
volumes:
  data: {}

Второй — config.yml. Укажите свой домен в publicDomain, а ключ тома — там, где написано YOUR-VOLUME-KEY:

port: 3000
host: 0.0.0.0
publicDomain: blossom.example.com
storage:
  backend: local
  local:
    dir: ./data/blobs
  rules:
    - type: "*"
      expiration: 100 years
      pubkeys:
        - "YOUR-VOLUME-KEY"
upload:
  requireAuth: true
  maxSize: 104857600
  requirePubkeyInRule: true
mirror:
  enabled: true
  requireAuth: true
delete:
  requireAuth: true
list:
  enabled: false
media:
  enabled: false
report:
  enabled: false
landing:
  enabled: false

Что здесь сказано: загружать блоки и запрашивать копии может только ваш ключ тома (requirePubkeyInRule), а блок хранится, пока Drive его не удалит. Серверу нужен срок хранения в каждом правиле; 100 years без чтения — это на практике никогда, а Drive и так регулярно читает свои блоки. Порт слушает только на самой машине (127.0.0.1): всё идёт через прокси. Запустите его:

cd /root/blossom
docker compose up -d

Шаг 2: поставьте впереди HTTPS

С Caddy вся конфигурация (/etc/caddy/Caddyfile) выглядит так:

blossom.example.com {
    reverse_proxy 127.0.0.1:3000
}

Если тот же Caddy уже обслуживает ваше реле, добавьте этот блок под блоком реле. Перезагрузите Caddy (sudo systemctl reload caddy). Теперь адрес https://blossom.example.com, открытый в браузере, должен отвечать — кодом 404: домашней страницы нет, и так задумано.

Шаг 3: сообщите Herkos Drive

  1. В Herkos Drive откройте Настройки → Серверы, добавьте https://blossom.example.com и отметьте его как ваш.
  2. Drive спрашивает его перед каждой загрузкой. С этого момента каждый новый файл получает там копию, а файлы, которые у вас уже были, получат свою, когда Drive в следующий раз проверит копии.
  3. Оставьте в списке и другие серверы. Ваш — одна из трёх копий, но никогда не единственная: если он перестанет работать, ваши файлы останутся на других, а Drive сообщит вам об этом после недели молчания.

Шаг 4: делайте резервную копию каждую ночь

Если ваш сервер выйдет из строя, Drive это заметит и создаст копии затронутых файлов на других серверах из вашего списка. Но копия на вашем сервере — единственная, которая ни от кого больше не зависит, а ночная резервная копия позволяет восстановить её, не копируя всё заново через интернет.

Сервер хранит всё внутри тома Docker blossom_data (имя начинается с папки, в которой лежат файлы; проверьте его командой docker volume ls): блоки, по одному файлу на каждый, и небольшую базу данных SQLite, в которой записано, кто загрузил каждый из них. Блоки никогда не меняются, но базу данных нельзя копировать, пока в неё идёт запись. Поэтому скрипт копирует всё при работающем сервере, останавливает его на те несколько секунд, которые нужны, чтобы скопировать изменившееся за это время, снова запускает его и только потом выгружает копию. Пока сервер остановлен, Drive просто повторяет попытку чуть позже.

Копия уходит с сервера с помощью restic, который шифрует её до отправки. Используйте место у другого провайдера, не у того, где стоит сервер: учётную запись SFTP (storage box, домашний компьютер) или S3-совместимый бакет. Если вы уже так делаете резервные копии своего реле, используйте то же место, но другую папку.

  1. Установите инструменты и создайте репозиторий. Сохраните пароль также в менеджере паролей: без него копии невозможно прочитать, а если он хранится только на сервере, он погибнет вместе с сервером. Для SFTP пользователю root также нужен SSH-ключ, который принимает машина для резервных копий (sudo ssh-keygen -t ed25519, затем добавьте туда /root/.ssh/id_ed25519.pub).

    sudo apt install restic rsync
    sudo sh -c 'openssl rand -base64 32 > /root/.restic-blossom-password'
    sudo sh -c 'cat > /root/.restic-blossom-env' <<'END'
    export RESTIC_REPOSITORY=sftp:backup@backup.example.com:/blossom
    export RESTIC_PASSWORD_FILE=/root/.restic-blossom-password
    END
    sudo chmod 600 /root/.restic-blossom-password /root/.restic-blossom-env
    sudo sh -c '. /root/.restic-blossom-env && restic init'
    
  2. Сохраните это как /usr/local/bin/backup-blossom и сделайте файл исполняемым (sudo chmod 700 /usr/local/bin/backup-blossom). Измените BLOSSOM_DIR, если ваши файлы лежат не в /root/blossom. Скрипт хранит копии за последние 14 дней, 8 недель и 12 месяцев. Блоки никогда не меняются, поэтому каждая ночь добавляет только новое.

    #!/bin/sh
    set -eu
    . /root/.restic-blossom-env
    BLOSSOM_DIR=/root/blossom
    COPY=/var/backups/blossom-data
    VOLUME=$(docker volume inspect --format '{{ .Mountpoint }}' blossom_data)
    mkdir -p "$COPY"
    rsync -a --delete "$VOLUME/" "$COPY/"
    cd "$BLOSSOM_DIR"
    docker compose stop blossom
    trap 'docker compose start blossom' EXIT
    rsync -a --delete "$VOLUME/" "$COPY/"
    docker compose start blossom
    trap - EXIT
    restic backup "$COPY" --tag blossom
    restic forget --tag blossom --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune
    
  3. Запустите его один раз вручную (sudo /usr/local/bin/backup-blossom), затем поставьте в расписание через sudo crontab -e. Вторая строка каждый месяц считывает обратно десятую часть сохранённых данных, каждый раз другую, чтобы доказать, что копии всё ещё открываются. Время от времени заглядывайте в /var/log/backup-blossom.log: строка с Fatal означает, что копия той ночи не удалась. Если на этой же машине делается резервная копия реле, это время не пересекается с её временем.

    35 4 * * * /usr/local/bin/backup-blossom >> /var/log/backup-blossom.log 2>&1
    55 5 2 * * . /root/.restic-blossom-env && restic check --read-data-subset=10% >> /var/log/backup-blossom.log 2>&1
    

Чтобы восстановить (новый сервер или после отказа диска): снова настройте сервер (шаги 1 и 2) и повторите пункты 1 и 2 этого шага с тем же репозиторием, но вместо создания нового пароля запишите сохранённый пароль в /root/.restic-blossom-password и пропустите restic init. Затем скопируйте последнюю резервную копию в том сервера:

sudo sh -c '. /root/.restic-blossom-env && restic restore latest --tag blossom --target /'
cd /root/blossom && sudo docker compose stop blossom
sudo rsync -a --delete /var/backups/blossom-data/ "$(sudo docker volume inspect --format '{{ .Mountpoint }}' blossom_data)/"
sudo docker compose start blossom

Когда Drive в следующий раз проверит копии, он снова найдёт блоки и докопирует с других серверов всё, что появилось после последней резервной копии. 27 октября 2026 года мы проверили всю эту цепочку: резервная копия, удаление сервера, восстановление, чтение каждого блока со сверкой его хеша и последующее удаление ключом Drive.

Раз в год выполняйте это восстановление на запасной машине и проверяйте, что сервер отвечает вашими блоками: это единственная проверка, которая подтверждает всю цепочку, включая пароль.

Полезно знать