自分の Blossom サーバー
最終更新: 2026年10月27日
Herkos Drive は各ファイルを暗号化されたブロックに分け、複数の Blossom サーバーに保管します。 コピーは 3 つで、少なくとも 2 種類のサーバーに置き、そのうち 1 つは自分のサーバーに 置きます。公開サーバーは無料でブロックを保管しますが、何も約束しません。ブロックを消去したり、 容量がいっぱいになったり、閉鎖したりすることがあります。
自分の Blossom サーバーは、あなたが決めた期間だけあなたのコピーを保管し、あなたの Drive から のブロックしか受け付けません。このページでは、その立て方を 3 つの手順と、毎晩のバックアップで 説明します。自分のメールボックス用リレーと組み合わせるのに向いていて、すでに サーバーがあれば、およそ 15 分で終わります。
どのサーバーを使うか
hzrd149 による blossom-server、バージョン 6.4.1(2026年10月6日、MIT ライセンス)です。2026年10月27日に、下の設定と Drive 自身の アップロード用コードで実際に動かし、サーバーが宣伝している内容ではなく、Drive が必要とする ことを確認しました。
| Drive がすること | 結果 |
|---|---|
8 MiB の暗号化ブロックをアップロードする(application/octet-stream) |
受け付ける |
| アップロード前に問い合わせる(BUD-06) | 応答し、他の鍵はすべて断る |
| 公開サーバーからブロックをコピーするよう、あなたのサーバーに依頼する(BUD-04) | コピーされる |
| 識別せずにブロックを読む | 1 バイトも違わずに返される |
| アップロードした鍵でブロックを削除する | 削除される。再度求めると 404 |
| 他の鍵からアップロードする | 拒否される(401) |
必要なもの
- 常時稼働し、インターネットから到達できるマシン:小さな VPS か、自宅のコンピューター。 Drive に保存している量と同じだけのディスクと、増える分の余裕が必要です。
- それを指すドメインまたはサブドメイン。例:
blossom.example.com。 - Docker と、HTTPS を提供する リバースプロキシ。例では Caddy を使います。Caddy は 証明書を自動で取得します。
- Drive のボリューム鍵。Herkos Drive の 設定 → サーバー → 自分のサーバー に、 64 文字の英数字で表示されます。プロフィールの鍵ではありません。Drive はプロフィールの鍵で アップロードすることは決してないため、あなたの npub しか受け付けないサーバーは Drive を 拒否してしまいます。
手順 1:サーバーを動かす
サーバー用のフォルダー(例:/root/blossom)を作り、次の 2 つのファイルを保存します。
1 つ目は 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: {}
2 つ目は 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 に伝える
- Herkos Drive で 設定 → サーバー を開き、
https://blossom.example.comを追加して、 あなたのサーバー にします。 - Drive はアップロードのたびに、事前にこのサーバーに問い合わせます。それ以降、新しいファイル にはすべてそこにコピーが作られ、既存のファイルにも、次に Drive がコピーを確認するときにコピーが作られます。
- 一覧の他のサーバーは残しておいてください。あなたのサーバーは 3 つのコピーのうちの 1 つで あって、唯一のコピーではありません。停止しても、ファイルは他のサーバーに残っており、 1 週間応答がなければ Drive が知らせます。
手順 4:毎晩バックアップする
サーバーが壊れると、Drive はそれに気づき、影響を受けたファイルのコピーを一覧の他のサーバーに 作ります。しかし、あなたのサーバーにあるコピーは、誰にも依存しない唯一のコピーです。毎晩の バックアップがあれば、インターネット越しにすべてをコピーし直さずに、それを再構築できます。
サーバーはすべてを Docker ボリューム blossom_data の中に保存します(名前はファイルを
置いたフォルダー名で始まります。docker volume ls で確認してください)。中身は、1 つに
つき 1 ファイルのブロックと、各ブロックを誰がアップロードしたかを記録する小さな SQLite
データベースです。ブロックは決して変わりませんが、データベースは書き込み中にコピーしては
いけません。そこでスクリプトは、サーバーを動かしたまますべてをコピーし、その間に変わった分を
コピーする数秒間だけサーバーを停止し、再び起動してから、ようやくコピーをアップロードします。
停止中、Drive は少し後でやり直すだけです。
コピーは restic でサーバーの外へ送られます。restic は 送り出す前に暗号化します。サーバーとは別のプロバイダーの場所を使ってください。 SFTP アカウント(ストレージボックス、自宅のコンピューター)か、S3 互換のバケットです。 すでにこの方法でリレーをバックアップしている場合は、同じ場所の別のフォルダーを使ってください。
-
ツールをインストールし、リポジトリを作成します。パスワードはパスワード マネージャーにも保管してください。それがなければコピーは読めず、サーバーにしか なければ、サーバーと一緒に失われます。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' -
これを
/usr/local/bin/backup-blossomとして保存し、実行可能にします (sudo chmod 700 /usr/local/bin/backup-blossom)。ファイルが/root/blossomに ない場合はBLOSSOM_DIRを変更してください。直近の 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 -
一度手動で実行し(
sudo /usr/local/bin/backup-blossom)、その後sudo crontab -eで予約します。2 行目は毎月、保存データの 10 分の 1 を、毎回 異なる 10 分の 1 ずつ読み戻し、コピーがまだ開けることを確かめます。ときどき/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 はブロックが戻っていることを見つけ、最後のバックアップ以降に 届いた分を他のサーバーからコピーします。2026年10月27日に、この流れ全体を試しました。 バックアップ、サーバーの削除、復元を行い、すべてのブロックをそれぞれのハッシュで確かめながら 読み戻し、その後 Drive の鍵で削除しました。
年に一度、予備のマシンでこの復元を行い、サーバーがあなたのブロックで応答することを 確認してください。パスワードを含めた全体の流れを証明できる唯一のテストです。
知っておくとよいこと
- アップロードできるのはあなたの Drive だけです。 どの Blossom サーバーでもそうであるように、 ブロックのアドレスを知っている人なら誰でもダウンロードできますが、ブロックは暗号化されています。 Drive にある鍵がなければ、ただの雑音です。
- ボリューム鍵が変わったら(ボリュームが更新されると Drive が知らせます)、新しい鍵を
pubkeysの下に別の行として追加し、再起動して(docker compose up -d)、古い鍵は そのまま残してください。 - 更新。 変更履歴を読み、
image:のバージョンを変更して、docker compose pullとdocker compose up -dを実行します。 - あなたの IP アドレス。 サーバーは、どのサーバーでもそうであるように、接続して くるすべてのアプリのアドレスを見ます。自分のサーバーなら、それを見るのはあなただけです。