【ITニュース解説】Postiz Self Host Bluesky Python Client
2026年09月05日に「Dev.to」が公開したITニュース「Postiz Self Host Bluesky Python Client」について初心者にもわかりやすく解説しています。
ITニュース概要
PostizをDocker Composeで自己ホストし、Python API連携を紹介。オンデバイスAI統合目的で、ローカルSNS環境で投稿作成・取得を実装。設定とコード例を提示。
ITニュース解説
軽量なソーシャルプラットフォームであるPostizを、自分たちの環境で運用するセルフホストの具体的な方法と、それをPythonプログラムで操作する手順が示されている。この技術は、AI(人工知能)との連携を見据え、外部のクラウドサービスに依存せず、ローカル環境でデータ管理と活用を進めるための重要な一歩である。
まず、Postizとは、シンプルで扱いやすい特徴を持つソーシャルプラットフォームだ。このプラットフォームは、プログラムが外部から操作するための仕組みである「オープンAPI」を提供しているため、自分たちのシステムに組み込みやすい利点がある。記事を公開したApex Grid Technologiesは、AIを組み込んだデバイスで動作するシステム(オンデバイスAI)の研究開発を進めており、その一環として、外部にデータを預けず自分たちで管理できる「セルフホスト型」のソーシャルプラットフォームを探していた。PostizはそのミニマリズムとオープンAPIが、彼らの目的に合致したため採用された。
Postizをセルフホストする主な理由は、運用環境を完全に自分たちのコントロール下に置き、必要に応じて簡単に規模を変更したり、設定を変更したりできるようにするためだ。これにより、独自の要件に合わせた柔軟なシステム構築が可能になる。
Postizのセットアップには、「Docker Compose」というツールが使われている。Dockerは、アプリケーションとその実行に必要な環境(OSやライブラリなど)を「コンテナ」と呼ばれる独立したパッケージにまとめる技術だ。これにより、どの環境でも同じようにアプリケーションを動作させることができる。Docker Composeは、Postiz本体とデータベースのように、複数のコンテナが必要なアプリケーションをまとめて管理し、簡単に起動・停止するためのツールである。
具体的な設定は、docker-compose.ymlというファイルで行われる。このファイルでは、Postizを構成する二つの主要なサービスが定義されている。一つはPostiz本体のアプリケーション、もう一つはそのデータを保存するPostgreSQLデータベースだ。
Postizのサービスでは、postiz/postiz:latestという公式のDockerイメージが使用されている。これは、Postizアプリケーションの最新版をすぐに使えるようにするもので、イメージはアプリケーションのひな形のようなものだ。ports: "8080:8080"という設定は、外部からコンピューターのポート8080にアクセスすると、Postizコンテナ内のポート8080に接続されるようにする。environmentセクションでは、Postizがデータベースに接続するためのURLや、セキュリティに必要な秘密鍵などの設定情報が定義されている。depends_on: dbという設定は、Postizサービスが起動する前に、データベースサービスが先に起動している必要があることを示している。
データベースサービスでは、postgres:15というPostgreSQLのバージョン15のイメージが使われている。ここでもenvironmentセクションで、データベースのユーザー名、パスワード、データベース名などの設定が行われている。volumes: postgres_data:/var/lib/postgresql/dataという設定は非常に重要で、データベースのデータをコンピューター上のpostgres_dataという場所に保存するように指示している。これにより、Postizやデータベースのコンテナを停止したり削除したりしても、重要なデータが失われることなく永続的に保存される。
このようにDocker Composeを使うことで、複雑なPostizとデータベースの環境を、数行の設定ファイルと簡単なコマンドで迅速に構築できる。
Postizのインスタンスが正常に動作し始めたら、次にPythonプログラムでPostizのAPIと連携させるためのクライアントが開発された。Pythonクライアントは、Postizに新しい投稿を作成したり、既存の投稿を取得したりするために、/api/public/v1/postsというAPIのエンドポイントにアクセスする。APIは、プログラムが外部のサービスに指示を送ったり、情報を受け取ったりするための仕組みだ。
Pythonクライアントでは、WebサイトやAPIと通信するためのrequestsというライブラリが使用されている。リクエストの構築は以下のステップで行われる。
まず、headers(ヘッダー)と呼ばれる追加情報が設定される。これには、APIにアクセスするユーザーを認証するためのAuthorization情報(Bearer <your-jwt-token>の部分に秘密のトークンが入る)と、送信するデータがJSON形式であることを示すContent-Type: application/jsonが含まれる。
次に、APIに送信する本体のデータとしてpayloadが定義される。例えば、"text": "This is a test post from the Python client."は投稿したい内容を、"visibility": "public"は投稿を公開にすることを意味する。
そして、requests.post("http://localhost:8080/api/public/v1/posts", headers=headers, json=payload)というコードで、PostizのAPIに新しい投稿を作成する指示(POSTリクエスト)が送信される。このリクエストは、先ほどDocker Composeで設定したPostizの公開ポート8080に送られる。
APIからの応答が返ってくると、response.status_codeでその状態を確認する。200というステータスコードは、リクエストが成功したことを意味する。成功した場合、response.json()を使って、APIから返されたデータをJSON形式で取得する。
記事では、/api/public/v1/postsエンドポイントが、新しい投稿を作成した際には単一の投稿オブジェクトを返し、既存の投稿を一覧で取得した際には投稿のリストを返す可能性があるという重要な点に触れている。そのため、Pythonクライアントではisinstance(result, list)を使って、返されたデータがリスト型であるか否かをチェックし、それぞれに応じた適切な処理を行うように実装されている。これにより、APIの挙動の違いに対応し、プログラムが正確にデータを扱えるようになる。
現在のPostizのパブリックAPIには、一人のユーザーが短時間に何度も投稿できないようにする「レートリミット」や、より詳細なアクセス権限の設定といった高度な機能は提供されていない。しかし、オンデバイスAIとの連携という現在のユースケースにおいては、これらの機能がなくても問題なく利用できると判断されている。必要であれば、将来的にクライアントやPostizの設定を拡張することも可能である。
今後の展望としては、このセルフホスト型PostizとPythonクライアントのセットアップを、同社が開発しているオンデバイスAIモデルと連携させる計画がある。目標は、外部のクラウドサービスに頼ることなく、ローカルで完結するソーシャルレイヤーを構築し、AIが生成したコンテンツとリアルタイムでやり取りできるようにすることだ。また、Pythonクライアントに関しても、より高速な処理を可能にする「非同期リクエスト」のサポートや、エラー発生時のより堅牢な対応(エラーハンドリング)を追加するなど、改良が進められる予定だ。