banner
wuhang2003

Zwh's Blog

ZH/EN | 一个人不在计算机专业却时不时就想折腾计算机相关东西的咸鱼

Sharkeyの構築と最適化の記録

前言#

最近友人たちが自分のインスタンスを構築しているのを見かけました。例えばこの方。そこで、Sharkey を試してみようと思い、長い間試行錯誤を始めました。この記事では、最近の試行錯誤の内容をまとめて、同じような考えを持つ方の参考にしたいと思います。

なぜ Sharkey なのか?#

まず、Misskey 系のインターフェースが私の好みに合っています。次に、以前試していた Firefish がメンテナンス状態に入り、更新が停止される準備をしているため(そうでなければこの記事の推奨は Firefish になっていたでしょう)。さらに、Sharkey は Misskey のブランチの中で Firefish を除いて新機能が最も多く追加されており、とても面白いです。最後に、私のメモリは十分です。

現在私が使用しているのはSharkey-stelpolvaで、無名星屑の管理者によるフォークで、オリジナルの Sharkey にさらに多くの機能が追加されています。ただし、このフォークは構築済みの Docker イメージを提供していないため、サーバーを更新するたびにイメージをコンパイルする負担を減らすために、自分でワークフローを作成し、定期的にソースコードを取得してイメージを構築し、DockerHub にアップロードしています。イメージ情報はこちらで確認できます。

デプロイ#

まず、新しいディレクトリを作成します mkdir Sharkey && mkdir Sharkey/.config して、設定ファイルを保存します。

次に、設定のサンプルを取得し、ディレクトリに入ります:(オリジナルの Sharkey を使用する場合は、ハッシュ記号付きのコマンドをコピーします)

wget -O Sharkey/docker-compose.yml https://raw.githubusercontent.com/Lhcfl/sharkey-stelpolva/refs/heads/stelpolva/compose_example.yml
# wget -O Sharkey/docker-compose.yml https://activitypub.software/TransFem-org/Sharkey/-/raw/stable/compose_example.yml
wget -O Sharkey/.config/default.yml https://raw.githubusercontent.com/Lhcfl/sharkey-stelpolva/refs/heads/stelpolva/.config/docker_example.yml
# wget -O Sharkey/.config/default.yml https://activitypub.software/TransFem-org/Sharkey/-/raw/stable/.config/docker_example.yml
wget -O Sharkey/.config/docker.env https://raw.githubusercontent.com/Lhcfl/sharkey-stelpolva/refs/heads/stelpolva/.config/docker_example.env
# wget -O Sharkey/.config/docker.env https://activitypub.software/TransFem-org/Sharkey/-/raw/stable/.config/docker_example.env
cd Sharkey

.config/default.ymlを編集します。urlの部分を自分が使用しているドメイン名に変更し、他の変数は状況に応じて変更します。

次に、docker-compose.ymlを編集し、service/webの下のimageの行のコメントを外します。上記で言及した構築したイメージを使用する場合は、内容をwuhang2003/sharkey-stelpolva-docker:latestに変更し、次の行のbuildをコメントアウトします。

Note

イメージに付属の Redis を、Redis のオープンソースバージョンのフォークであるValkeyに変更することを検討できます。完全に互換性があり、性能もオリジナルより優れています。

service/dbの下のimageの行を変更し、内容をgroonga/pgroonga:latestにします。これは修正版の必要な依存関係です。

完成したdocker-compose.ymlの参考は以下の通りです:(ネットワークは便利さのために 1Panel 管理で1panel-networkに変更しました)

services:
  web:
    image: wuhang2003/sharkey-stelpolva-docker:latest
    restart: always
    links:
      - db
      - valkey
    depends_on:
      db:
        condition: service_healthy
      valkey:
        condition: service_healthy
    ports:
      - "4514:3000"
    networks:
      - 1panel-network
    # env_file:
    #   - .config/docker.env
    volumes:
      - ./files:/sharkey/files
      - ./.config:/sharkey/.config:ro

  valkey:
    restart: always
    image: valkey/valkey:8-alpine
    networks:
      - 1panel-network
    volumes:
      - ./valkey:/data
    healthcheck:
      test: "valkey-cli ping"
      interval: 5s
      retries: 20

  db:
    restart: always
    image: groonga/pgroonga:3.2.5-alpine-17
    networks:
      - 1panel-network
    env_file:
      - .config/docker.env
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
      interval: 5s
      retries: 20

networks:
  1panel-network:
    external: true

完了したら、まず PostageSQL と Redis(または Valkey)を起動します sudo docker compose up -d db redis、2 つのコンテナ名をコピーします(ここでは sharkey-valkey-1 と sharkey-db-1 と仮定します)。次に、.config/default.ymlの db 部分と redis 部分のhostを対応するコンテナ名に変更します。その後、db コンテナに入り、psql を通じてデータベースに接続し、CREATE EXTENSION pgroonga;を実行してデータベースに pgroonga 拡張を追加します。これで正式に起動する前のすべての準備が整いました。

次に、docker compose up -dを実行します。Misskey のドキュメントに従ってリバースプロキシを設定します。Sharkey ディレクトリでsudo chown -R 991:991 files/を実行して、ファイルの所有権を変更し、ウェブサイトでファイルをアップロードできない問題を回避します。

完了したら、ウェブサイトにログインして初期アカウントを登録し、サイト体験の最適化を行います。

最適化#

インスタンス情報の変更と中継の追加#

インスタンス情報を変更します:コントロールパネル -> 設定 -> 一般設定

サーバーとサイトのロゴを追加します:コントロールパネル -> 設定 -> ブランド

中継を追加します:コントロールパネル -> 設定 -> 中継。一般的な中国語の中継:喵家中継DragonRelay島站の中継

中継を有効にすると、小さなインスタンスでクロスサイトメッセージのブロッキング(中継に大規模なサイトがあり、情報の流れが頻繁すぎて小さなインスタンスの sidekiq がブロックされる)、クロスサイトタイムラインの混乱(より遠い時間からのコンテンツが現在のクロスサイトタイムラインに挿入される)などの問題が発生する可能性があります。これを受け入れられるか確認してください(基本的には大したことではありません)。また、追加した中継が多いと、サーバーの PostgreSQL データベースのサイズが増加します。

CloudFlare#

サイトの追加プロセスについては詳しく述べませんが、特に重要な点として、インスタンスのドメイン名に対して Rocket Loader をオフにする必要があります。このオプションを直接全体的にオフにすることができます(速度 -> 最適化 -> コンテンツ最適化)またはConfiguration Rulesを使用して特定のサイトのルールを設定します。

それ以外にも、R2 を使用して画像などのリソースを保存することを検討できます。

権限グループの追加と一部権限の開放#

コントロールパネル -> 役割、新しい役割を作成し、役割の権限を管理者に設定し、権限の対象を手動にします。ポリシー設定は以下の通りです:

  • レート制限をデフォルトから外し、最小 0% に設定します(後でツールを使用して絵文字をアップロードする際に問題が起きにくくなります)
  • カスタム絵文字の管理 / アバターの管理を有効にします
  • クラウドストレージの容量を適宜増やします(約 500M から 1G)以降のカスタム絵文字やアバターの追加を容易にするためです

その後、自分のアカウントにこの役割を割り当て、役割設定に戻り、基本的な役割の部分で「投稿を検索できるか」のオプションを有効にして完了します。

絵文字の追加(取得 + アップロード一貫)#

カスタム絵文字をアップロードすると、対応するアカウントのクラウドストレージに保存されるため、一般的には絵文字などの共有リソースを管理するために専用のアカウントを作成することをお勧めします。このアカウントには、上記の管理者役割を割り当てて、制限なく絵文字をアップロードできるようにします。

他の Misskey サイトから絵文字を取得する:powerfullz/misskey-emoji-downloader

一括分類アップロード:pentaCoxian/misskey-emoji-bulk-uploader

SPAM 対策#

昨年 10 月に Fediverse に対する SPAM の波が発生したことを考慮し、この部分を追加しました。主に内部防御(非承認登録の禁止)と外部防御(外部インスタンスからの SPAM メッセージ流の防止)に分かれます。

非承認登録の禁止:Sharkey は積極的に設定する必要はなく、デフォルトでオープン登録がオフになっています(つまり、招待コードが必要です)。コントロールパネル -> 管理にて「アカウント登録には電子メールアドレスが必要」と「新しいユーザーは手動で承認される必要がある」を有効にし、「セキュリティ」タブで CAPTCHA とメール認証を設定します。

外部インスタンスからの SPAM メッセージ流の防止:コントロールパネル -> 役割、新しい役割を作成し、役割の権限はそのままにして(通常のユーザー)、権限の対象を「条件に合う」に選択し、条件とポリシーの設定はこの投稿の画像を参照して保存します。

更新#

すべて Docker Compose でデプロイされているので、1 行のdocker compose pull && docker compose up -dで完了します。

最後に、@wuhang2003@m.zwh.moeをフォローしていただければ幸いです。また、私の古いアカウント@wuhang2003@nya.oneもよろしくお願いします。ありがとうございます。

参考資料#

この記事はMix Spaceによって xLog に同期更新されました。元のリンクはhttps://zwh.moe/posts/technology/sharkey-deployです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。