Blueskyで「画像が黒くなる」「プロフィール画像が更新できない」「画像付き投稿がうまくいかない」といった不具合が起きることがあります。
本記事では、実際にBlueskyの自己ホスト版PDSを運用中に発生した不具合をもとに、原因の切り分け方法と解決手順をまとめました。特に、画像投稿やプロフィール画像の更新が失敗する場合に確認したいポイントを紹介します。
セルフホスト環境でBlueskyを運用していて、画像関連の不具合で困っている方は参考にしてください。
Blueskyで起きた不具合の概要
今回発生したのは、Blueskyの自己ホスト版PDSを運用中に起きた画像関連の不具合です。
具体的には、画像付き投稿を行うと画像が黒く表示される、プロフィール画像やヘッダー画像を更新しても反映されない、といった症状が発生しました。
一方で、テキスト投稿自体は正常に動作しており、PDSのヘルスチェックも 200 OK を返していました。そのため、PDS全体が停止しているのではなく、画像保存まわりに問題があると考えられました。

まず確認した症状
今回の不具合では、次のような症状を確認しました。
- Bluesky Web から画像付き投稿を行うと、画像が真っ黒になる
- プロフィール画像やヘッダー画像を変更しても反映されない
- テキスト投稿は成功する
- PDSは正常稼働しており、
curl /xrpc/_healthは 200 OK を返す
この時点で、PDS全体が停止しているわけではなく、画像関連の処理だけに問題がある可能性が高いと判断しました。
今回の環境
今回の不具合は、以下のようなセルフホスト環境で発生しました。
- サーバー:Ubuntu 22.04 LTS
- Docker で Bluesky PDS を運用
- 逆プロキシ:Caddy + Cloudflare
- PDS イメージ:
ghcr.io/bluesky-social/pds:0.4 - データ永続化パス:
/pds→ コンテナ内/app/dataにマウント
Blueskyで画像投稿できない時の確認ポイント
Blueskyで画像付き投稿がうまくいかない場合は、まずPDSの保存先設定とディレクトリ権限を確認します。
特にセルフホスト環境では、PDS_DATA_DIRECTORY と PDS_BLOBSTORE_DISK_LOCATION の参照先がずれていると、画像が正しく保存されず、黒い画像になったり、プロフィール画像が更新できなかったりすることがあります。
また、Dockerのボリュームマウントが正しく設定されていない場合も、見かけ上はPDSが起動していても画像関連の処理だけ失敗することがあります。
まず確認したいポイントは次の5つです。
- PDS_DATA_DIRECTORY の参照先
- PDS_BLOBSTORE_DISK_LOCATION の参照先
- BLOB保存ディレクトリの有無
- ディレクトリ権限
- Dockerのボリュームマウント設定
PDS_DATA_DIRECTORY の参照先を確認する
まず確認したいのは、PDS_DATA_DIRECTORY が実際の保存先ディレクトリと一致しているかどうかです。ここがずれていると、PDS本体が正しい保存先を認識できません。
PDS_BLOBSTORE_DISK_LOCATION の参照先を確認する
画像やプロフィール関連のデータは、BLOB保存先ディレクトリに格納されます。そのため、PDS_BLOBSTORE_DISK_LOCATION が正しい場所を指しているかどうかも重要です。
BLOB保存ディレクトリが存在するか確認する
ディレクトリ自体が存在しない場合、画像保存に失敗します。特にコンテナ再生成後は、保存先ディレクトリの再作成漏れが起きることがあります。
ディレクトリに書き込み権限があるか確認する
保存先が存在していても、書き込み権限が不足していれば正常に画像を保存できません。権限設定も必ず確認したいポイントです。
Dockerのボリュームマウント設定を確認する
PDSのコンテナ内パスとホスト側ディレクトリの対応がずれていると、表面的にはPDSが起動していても、画像保存だけが失敗することがあります。
エラーログから分かったこと
docker logs を確認したところ、以下のエラーが出ていました。
TypeError: Cannot open database because the directory does not existこのエラーから、PDSがSQLiteデータベースを開けておらず、参照先ディレクトリの構造が壊れている、または存在しない可能性が高いと判断しました。
今回の原因は何だったのか
環境変数 /pds/pds.env を確認したところ、以下の設定になっていました。
PDS_DATA_DIRECTORY=/app/data
PDS_BLOBSTORE_DISK_LOCATION=/app/data/blocksコンテナ再生成時にマウントパスがずれていたため、PDSが初期化エラーで終了していたことが原因でした。
つまり、画像そのものの不具合ではなく、BLOB保存ディレクトリの参照先不一致と永続化パスの不整合が本質的な問題でした。
BLOB保存ディレクトリの参照先がずれていた
PDSは画像ファイルを保存するために、正しいBLOBディレクトリを必要とします。今回のように参照先がずれていると、画像保存に失敗し、結果として画像が黒く表示されたり、プロフィール画像が更新できなくなったりします。
環境変数の設定と実際のマウント先に不整合があった
設定ファイル上では正しく見えていても、Docker側のマウントがずれていると、実際には保存先が存在しないのと同じ状態になります。セルフホスト環境では、このズレが不具合の原因になりやすいです。
実際に行った修正手順
ディレクトリを再作成して権限を修復する
まず、BLOB保存先ディレクトリを再作成し、必要な権限を付与しました。
mkdir -p /pds/blocks
chmod -R 777 /pds/blocks
docker restart pdsコンテナ内で保存先ディレクトリを確認する
次に、コンテナ内で /app/data/blocks が正しく見えているか確認しました。
docker exec -it pds sh -c 'ls -ld /app/data/blocks'確認の結果、/app/data はホストの /pds に正しくマウントされており、blocks ディレクトリも認識されていました。
PDSを再起動して動作確認する
最後に、PDSを再起動し、ヘルスチェックと実際の投稿テストを行いました。
curl -I https://bluesky.j-makoto.online/xrpc/_health
HTTP/2 200 OK修正後の動作確認
修正後は、プロフィール画像の再設定と画像付き投稿の両方が正常に反映されるようになりました。テキスト投稿だけでなく、画像関連の処理も問題なく動作することを確認できました。

根本原因のまとめ
| 問題点 | 原因 | 対応 |
|---|---|---|
| 画像が黒くなる | BLOBディレクトリ未マウント or 権限不足 | /pds/blocks を再作成+パーミッション調整 |
| PDS起動時に TypeError | /app/data が存在しなかった | 永続化ディレクトリを再確認 |
| 画像がアップロードできない | PDS_BLOBSTORE_DISK_LOCATION の参照先不一致 | /app/data/blocks に統一 |
再発防止チェックリスト
/pds/blocksが存在:ls -ld /pds/blocks✅/pds/blocksに書き込める:touch /pds/blocks/testfile✅- PDSがブロブディレクトリを認識:
docker exec -it pds sh -c 'ls /app/data/blocks'✅ - HTTPSヘルスチェックOK:
curl -I https://ドメイン/xrpc/_health✅ - Cloudflare経由でも画像URL表示可 ✅
セルフホスト運用で学んだこと
- PDS_DATA_DIRECTORY と PDS_BLOBSTORE_DISK_LOCATION の整合性が最重要
- Dockerマウントの破損や空ディレクトリに注意する
- Caddy や Cloudflare より先に、ローカル保存先設定を疑う
- 画像関連の不具合は、BLOBファイルを読めていないケースが多い
補足:生成AIで原因調査を進めた方法
セルフホスト環境では、原因の切り分けに時間がかかることがあります。今回は、エラーログや状況を生成AIにそのまま渡し、確認ポイントを整理しながら原因を特定しました。
ソースコードを深く読めなくても、ログや設定内容を言語化して相談することで、切り分けのスピードをかなり上げられます。
エラー内容や現在の構成をそのまま貼り付けるだけでも、確認すべきポイントをかなり絞り込めます。特に、セルフホスト運用に慣れていない場合は、原因調査の補助として有効だと感じました。

よくある質問(FAQ)
Blueskyで画像が黒くなる原因は何ですか?
セルフホスト版PDSでは、BLOB保存ディレクトリの設定不整合や書き込み権限不足が原因になることがあります。画像ファイルが正しく保存できていないと、投稿後に黒い画像として表示されることがあります。
Blueskyでプロフィール画像が更新できないのはなぜですか?
プロフィール画像の更新失敗も、画像保存先の設定ミスや権限不足が原因の可能性があります。特に PDS_BLOBSTORE_DISK_LOCATION の参照先が正しいか確認してください。
Blueskyでテキスト投稿はできるのに画像投稿だけ失敗するのはなぜですか?
テキスト投稿と画像投稿では処理系統が異なります。PDS本体は動作していても、画像保存ディレクトリやBLOB関連設定に問題があると、画像投稿だけ失敗することがあります。
まとめ
Blueskyで画像が黒くなる、プロフィール画像が更新できない、画像付き投稿が失敗するといった不具合は、セルフホストPDSのBLOB保存ディレクトリ設定やマウント不整合が原因になっていることがあります。
今回のケースでは、PDS_DATA_DIRECTORY と PDS_BLOBSTORE_DISK_LOCATION の整合性を見直し、/pds/blocks の再作成と権限修正を行うことで復旧できました。
セルフホスト環境で同様の症状が出ている場合は、まず画像保存先とマウント設定を優先的に確認してみてください。

