4. オブジェクトストレージ連携機能
このドキュメントでは、dat落ちしたスレッドのアーカイブ(ZIP/MHT)を、ConoHaなどの外部オブジェクトストレージに自動でアップロードし、ユーザーに高速なダウンロードリンクを提供する機能について説明します。
機能概要
この機能を有効にすると、以下の処理が自動的に行われます。
- dat落ちしたスレッドのアーカイブファイルがオブジェクトストレージにアップロードされます。
- アップロードされたファイルの公開URLがメタ情報に保存されます。
- ダウンロードページでは、従来のダウンロードリンクの代わりに、オブジェクトストレージへの直接リンクが表示されるようになります。
これにより、サーバーのディスク容量と転送負荷を削減し、ユーザーはCDNなどを経由した高速なダウンロードが可能になります。
1. 機能の有効化
まず、src/phplib/storage/StorageConfig.php ファイルを編集し、オブジェクトストレージ機能を有効にします。
// src/phplib/storage/StorageConfig.php
class StorageConfig {
/**
* @var bool オブジェクトストレージ機能全体を有効にするかどうかのフラグ
*/
public static bool $enabled = true; // false から true に変更
// ...
}
2. 設定ファイルの編集
設定は、まず共通設定ファイル StorageConfig.php でプロバイダを指定し、その後、各プロバイダ専用の設定ファイル (ConohaStorageConfig.php または R2StorageConfig.php) を編集する流れで行います。
2-1. 共通設定 (StorageConfig.php)
src/phplib/storage/StorageConfig.php を開き、環境に合わせて以下の項目を設定します。
$provider: 使用するオブジェクトストレージのプロバイダ ('conoha'または'r2') を指定します。$cacheDir: 認証トークンを保存するディレクトリのパス。セキュリティのため、Webから公開されていないパス(例:/var/tmp/ftbucket_cache)を指定してください。$storageEndpoint: オブジェクトストレージのエンドポイントURL。各サービスの管理画面で確認できます。- ConoHaの例:
'https://object-storage.tyo1.conoha.io/v1/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - R2の例:
'https://<account_id>.r2.cloudflarestorage.com'
- ConoHaの例:
$container: 使用するコンテナ(R2ではバケット)名。事前に作成しておく必要があります。$publishUrlFormat: ユーザーに公開するURLの形式。{object_name}と{container}がプレースホルダーとして利用できます。- 例 (カスタムドメイン/CDN経由):
'https://cdn.example.com/{object_name}' - 例 (プロバイダのURLを直接利用):
'https://object-storage.tyo1.conoha.io/v1/xxxxxxxx/{container}/{object_name}'
- 例 (カスタムドメイン/CDN経由):
$cleanupLifetimeSeconds: オブジェクトストレージ上のファイルを保持する期間(秒)。この期間を過ぎたファイルはクリーンアップ対象になります。デフォルトは172800(48時間) です。
2-2. プロバイダ別設定
$provider で指定したサービスに応じて、以下のファイルを編集します。
ConoHa (provider = 'conoha')
src/phplib/storage/ConohaStorageConfig.php を編集します。API情報はConoHaコントロールパネルの「API」メニューから確認・追加できます。
$tenantId: ConoHaのテナントID$username: APIユーザー名$password: APIパスワード$authUrl: ConoHa認証APIのエンドポイントURL (通常は変更不要)
Cloudflare R2 (provider = 'r2')
src/phplib/storage/R2StorageConfig.php を編集します。APIトークンはR2のバケット管理画面から作成・取得します。
$accountId: CloudflareのアカウントID$accessKeyId: R2 APIトークンのアクセスキーID$secretAccessKey: R2 APIトークンのシークレットアクセスキー
R2バケットの公開設定について Cloudflare R2にアップロードしたファイルを
$publishUrlFormatで設定したURLで公開するには、R2バケットを公開設定にする必要があります。カスタムドメインを接続して公開する方法が推奨されます。 詳しい手順については、以下のCloudflare公式ドキュメントを参照してください。 https://developers.cloudflare.com/r2/buckets/public-buckets/
- Public buckets · Cloudflare R2 docs
3. cronジョブの設定
オブジェクトストレージ機能の運用には、以下の2つのcronジョブを追加する必要があります。
cron_storage_publish.php (オブジェクトストレージへの公開)
- 役割: dat落ちしたスレッドのアーカイブをオブジェクトストレージにアップロードし、公開URLをメタ情報に記録します。
- 実行間隔の例: 数分に1回
*/5 * * * * php /path/to/your/project/src/cron_storage_publish.php
cron_storage_cleanup.php (オブジェクトストレージの掃除)
- 役割: オブジェクトストレージ上で設定された保持期間を過ぎた古いファイルを削除します。
- 実行間隔の例: 2時間に1回
Note: 「予防的クリーンアップ」は、ConoHaのようにストレージの最大容量(クォータ)がAPIで取得できるプロバイダでのみ動作します。Cloudflare R2のようにクォータの概念がないプロバイダでは、保持期間を過ぎたファイルの削除のみが実行されます。
0 */2 * * * php /path/to/your/project/src/cron_storage_cleanup.php
4. 動作確認
設定完了後、動作確認用スクリプト util/storage_test.php を src/ フォルダへとコピーし
src/storage_test.php にブラウザでアクセスすることで、設定が正しく行われているか、APIとの疎通が可能かを確認できます。このスクリプトは、認証、ファイル一覧取得、アップロード、削除、アカウント情報取得などの一連のテストを自動で実行します。
警告:
storage_test.phpは、APIの認証情報などを含むため、動作確認が完了したら必ずサーバーから削除してください。
R2利用時の注意: R2 (S3互換API) は、アカウント全体のクォータ情報を取得するAPIがありません。そのため、テスト項目の「アカウント情報の取得」では、利用量は表示されますが、契約容量(Quota)は「未設定」または「0」として表示されます。これは正常な動作です。
5. ダウンロードファイル名の調整 (Cloudflare Workers)
オブジェクトストレージに保存されるファイル名は、そのままではユーザーにとって分かりにくいものになります。
download.phpは、オブジェクトストレージのURLに dlname というクエリパラメータを付与して、推奨されるダウンロードファイル名を渡します。
この dlname パラメータを利用して、ダウンロード時に適切なファイル名をユーザーに提示することができます。
ここでは、Cloudflare Workersをリバースプロキシとして利用し、Content-Disposition ヘッダを付与してファイル名を調整する方法を説明します。
Cloudflare Workersによる実装
Cloudflare Workersは、オブジェクトストレージへのリクエストを中継するプロキシとして動作します。
- リクエストを受け取ったWorkerは、それを背後にあるオブジェクトストレージに転送します。
- オブジェクトストレージからレスポンスを受け取ります。
- 元のリクエストURLに
dlnameクエリパラメータが含まれていれば、その値をContent-Dispositionヘッダに設定します。 - この新しいヘッダを付与したレスポンスをユーザーに返します。
これにより、ユーザーがファイルをダウンロードする際に、ブラウザは dlname で指定されたファイル名をデフォルトとして提示します。
具体的な実装例として、util/example_workers.js が利用できます。このサンプルスクリプトは、ConoHaオブジェクトストレージにアップロードしたファイルをオリジンとし、Cloudflare Workers経由で公開する際の実装例です。このファイルを参考に、ご自身の環境に合わせて TARGET_HOST や PATH_PREFIX を設定してください。
親子関係のftbucketによる動作
親側でアップロードされたobjectstorageのurl情報は子側へも伝播します 子側のftbucketでもこのurl情報を元にdownloadページが生成されますが
親側でのオブジェクトストレージの保持期間より短い場合 子側でダウンロード不能になる問題があります(親側でオブジェクトが削除されているため)。 「+旧形式でのダウンロード」でのリンクからダウンロードできますが 煩雑になる場合、テンプレートファイルの編集も視野にいれてください
子インスタンスでのオブジェクトストレージ表示対応
親子関係のあるFTBucketでのオブジェクトストレージ機能の展開について 子側で古いFtbucketを利用している場合でも 少しの設定で対応可能です 子側のFTBucketに必要な変更は基本的に
子インスタンスに必要なファイル
親インスタンスでデプロイされたオブジェクトストレージへのリンクの表示に対応したい場合は 最低限以下のファイルの更新が必要です
src/phplib/meta_dao.phpsrc/templates/download.tpl
以上の変更により、子インスタンスは最小限の構成でオブジェクトストレージ機能の恩恵を受けることができます。