banner
 Aeris

Aerisの小宇宙

使用1Panelを使ってMastodonをデプロイし、中国語検索を設定する

前言#

Mastodon のデプロイは珍しいことではなくなりましたが、私のデプロイ方法を共有したいと思います。これは初心者にとってより適しているかもしれません。このチュートリアルは 1Panel にも適用可能です。

Mastodon のデプロイに関して、このガイドで構築するのはオリジナルの Mastodon ではなく、Glitch を基にしたフォークである Chuckya です。オリジナルに比べて、より多くの設定項目があり、基本的にソースコードを変更する必要はありません。

なぜ 1Panel を使用するのか#

皆さんが最初に宝塔を使ったように、私も 1Panel を使用しています。視覚的なファイル管理が可能で、SSH が内蔵されており、証明書の設定が非常に便利で、バックアップ設定も簡単で、初心者に適しています。

1Panel を使用するので、Docker でデプロイすることになります。これも最も便利な方法の一つです。

準備作業#

  1. サーバーを選択します。Mastodon を構築する場合、最低でも 2C4G のサーバーを推奨します。4C8G の方がより良いです。国内のサーバーは使用しないでください!
  2. ドメイン名を選択します。
  3. 1Panel をインストールします。(Docker を特別にインストールする必要はありません。1Panel をインストールする際に一緒にインストールされます。)

正式インストール#

Mastodon を保存するファイルを選択#

私は /opt/Mastodon に保存しました。

Pasted image 20250109190722.png

1Panel を使用すると、ここでフォルダを作成することができます。または、ターミナルに入力しても構いません:

mkdir /opt/mastodon

リポジトリから Mastodon の設定ファイルを取得し、変更します#

リポジトリのアドレス(Chuckya フォーク)
https://github.com/TheEssem/mastodon

2 つのファイルを取得する必要があります:docker-compose.yml と.env.production.sample です。
1Panel を使用してダウンロードしてからアップロードするか、ターミナルに入力します:

cd Mastodon
wget https://gcore.jsdelivr.net/gh/TheEssem/mastodon@refs/heads/main/docker-compose.yml
wget https://gcore.jsdelivr.net/gh/TheEssem/mastodon@refs/heads/main/.env.production.sample
cp ./.env.production.sample .env.production

docker-compose.yml の変更#

Glitch ブランチまたはオリジナルを使用したい場合は、image を変更するだけで済みます。

db、redis の部分はコメントアウトしました。明確に表示するために、下のコードではこれらの 2 つの部分をすべて削除しました。Elasticsearch は 1Panel でインストールする方が逆に面倒になったので、直接一緒にインストールしました。

変更が必要な部分: network をすべて 1panel-network に置き換え、最後に external 属性を追加します。

(フォーマットに誤りがあるかもしれませんので、リポジトリからファイルを直接取得して変更してください)

services:
  web:
    image: ghcr.io/theessem/mastodon:nightly #必要に応じて変更
    restart: always
    env_file: .env.production
    command: bundle exec puma -C config/puma.rb
    networks: #変更が必要
      - 1panel-network
    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL',"curl -s --noproxy localhost localhost:3000/health | grep -q 'OK' || exit 1"]
    ports:
      - '127.0.0.1:3000:3000' #必要に応じて変更
    volumes:
      - ./public/system:/mastodon/public/system
  es:
    restart: always
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
      - "xpack.license.self_generated.type=basic"
      - "xpack.security.enabled=false"
      - "xpack.watcher.enabled=false"
      - "xpack.graph.enabled=false"
      - "xpack.ml.enabled=false"
      - "bootstrap.memory_lock=true"
      - "cluster.name=es-mastodon"
      - "discovery.type=single-node"
      - "thread_pool.write.queue_size=1000"
    networks:
      - 1panel-network
    healthcheck:
      test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
    volumes:
       - ./elasticsearch:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - '127.0.0.1:9200:9200'

  streaming:
    image: ghcr.io/theessem/mastodon-streaming:nightly #必要に応じて変更
    restart: always
    env_file: .env.production
    command: node ./streaming/index.js
    networks: #変更が必要
      - 1panel-network
    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL', "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK' || exit 1"]
    ports:
      - '127.0.0.1:4000:4000' #必要に応じて変更
  
  sidekiq:
    image: ghcr.io/theessem/mastodon:nightly #必要に応じて変更
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq
    networks: #変更が必要
      - 1panel-network
    volumes:
      - ./public/system:/mastodon/public/system
    healthcheck:
      test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]

#変更が必要な部分:
networks:
  1panel-network:
    external: true

現在、Mastodon の web サービスは 3000 ポートに、streaming は 4000 ポートに設定されています。

1Panel アプリストアから PostgreSQL、Redis をインストール#

Pasted image 20250109192932.png
Pasted image 20250109192952.png

ワンクリックでインストールできます。PostgreSQL のバージョンは自分で選択できます。

データベースを作成#

  1. インストールが完了したら、左側のナビゲーションバーからデータベースに入ります。

Pasted image 20250109194446.png

  1. PostgreSQLを選択します。

Pasted image 20250109194517.png

  1. データベースを作成し、データベース名、ユーザー名、パスワードをカスタマイズします。

  2. PostgreSQL と Redis の接続情報を確認します:

PostgreSQL:

Pasted image 20250109195123.png

ここをクリックすると、コンテナ接続アドレスがあります:

Pasted image 20250109195224.png

Redis:同様です

Pasted image 20250109195336.png

ここで必要なパスワードも使用します

Pasted image 20250109195427.png

インストールを実行#

cd /opt/Mastodon
docker-compose run --rm web bundle exec rake mastodon:setup
Domain name: あなたのドメイン名

Single user mode disables registrations and redirects the landing page to your public profile.

Do you want to enable single user mode? N

Are you using Docker to run Mastodon? Y

PostgreSQL host: #先ほどのコンテナ接続アドレス

PostgreSQL port: 5432

Name of PostgreSQL database: mastodon

Name of PostgreSQL user: mastodon

Password of PostgreSQL user: (ここに上で設定したデータベースのパスワードを入力)

Database configuration works! 🎆

Redis host: #先ほどのコンテナ接続アドレス

Redis port: 6379

Redis password: #先ほどのパスワード 

Redis configuration works! 🎆

Do you want to store uploaded files on the cloud? N #必要に応じて、私はローカルに保存しました

Do you want to send e-mails from localhost? N #あなたのSMTPサーバーを設定

SMTP server: 

SMTP port: 587

SMTP username: 

SMTP password: 

SMTP authentication: plain

SMTP OpenSSL verify mode: none

E-mail address to send e-mails “from”: 

Send a test e-mail with this configuration right now? Y

This configuration will be written to .env.production

Save configuration? Yes

実行後、設定情報が生成されますので、それを.env.production に記入する必要があります。

管理者アカウントの生成を続ける#

現在のバージョンでは、管理者アカウントの生成にバグはありません。

.env.production の変更可能な内容#

私は AI を使用して翻訳しましたので、参考にしてください。Glitch バージョンでは Mastodon をより多くカスタマイズできます(文字数、最大タグ数、ピン数など、Chuckya ではアップロードと表示の最大添付ファイル数を設定できます)

# これはサンプル設定ファイルです。インタラクティブな設定ウィザード`bundle exec rails mastodon:setup`を使用して設定を生成できますが、さらにカスタマイズする場合は手動で編集する必要があります。このサンプルにはすべての利用可能な設定オプションが表示されているわけではありません。完全なドキュメントについては https://docs.joinmastodon.org/admin/config/ を参照してください。

# 注意:このファイルで受け入れられる構文は、`docker-compose`を使用するかどうかによってわずかに異なります。特に、`docker-compose`を使用する場合、宣言された各変数の値は、引用符を含めて直接採用されます。
# 参考:https://github.com/mastodon/mastodon/issues/16895

# フェデレーション設定
# ----------
# これはあなたのサーバーを識別し、後で安全に変更することはできません
# ----------
LOCAL_DOMAIN=example.com

# Mastodonをフェデレーションで使用するドメインとは異なるドメインで実行する必要がある場合のみ、このオプションを使用します。
# このオプションについての詳細は、https://docs.joinmastodon.org/admin/config/#web-domain を参照してください。
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
# WEB_DOMAIN=mastodon.example.com

# 複数のエイリアスを持ちたい場合[email protected]
# [email protected]など、同じユーザー用。LOCAL_DOMAINは含めないでください。カンマで区切ります。
# ALTERNATE_DOMAINS=example1.com,example2.com

# 出発リクエスト用のHTTPプロキシ(オプション)
# http_proxy=http://gateway.local:8118
# 隠しサービスへのアクセス制御。
# ALLOW_ACCESS_TO_HIDDEN_SERVICE=true

# 認可されたフェッチモード(オプション)
# リモートサーバーがツイートをフェッチする際に認証を必要とします。詳細は
# https://docs.joinmastodon.org/admin/config/#authorized_fetch
# AUTHORIZED_FETCH=true

# 制限されたフェデレーションモード(オプション)
# 特定のドメインとのフェデレーションのみを許可します。詳細は
# https://docs.joinmastodon.org/admin/config/#whitelist_mode
# LIMITED_FEDERATION_MODE=true

# Redis
# -----
REDIS_HOST=localhost
REDIS_PORT=6379

# PostgreSQL
# ----------
DB_HOST=/var/run/postgresql
DB_USER=mastodon
DB_NAME=mastodon_production
DB_PASS=
DB_PORT=5432

# Elasticsearch(オプション)
# ------------------------
#ES_ENABLED=true
#ES_HOST=localhost
#ES_PORT=9200
# Elasticsearch認証(オプション)
#ES_USER=elastic
#ES_PASS=password

# 秘密
# -------
# 各キーを生成するには`RAILS_ENV=production bundle exec rails secret`タスクを使用します(docker composeを使用している場合は、`docker-compose run --rm web bundle exec rails secret`を使用します)
# -------
SECRET_KEY_BASE=
OTP_SECRET=

# 暗号化キー
# ------------------
# すべてのサーバープロセスで利用可能で、値が同じである必要があります
# これらはプライベート/秘密の値であり、ホスティング環境外で共有しないでください
# 新しいキーを生成するには`bin/rails db:encryption:init`を使用します
# これらのキーを変更しないでください。そうしないとデータ損失やその他の問題が発生します
# ------------------
# ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
# ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
# ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=

# Web Push
# --------
# `bundle exec rails mastodon:webpush:generate_vapid_key`を使用して生成します(最初のものが秘密鍵、2番目が公開鍵)
# インスタンスのために一度だけ生成する必要があります。後で変更することに決めた場合、すべてのプッシュ購読は
# 無効になり、ユーザーは再度サイトにアクセスして再購読する必要があります。
# --------
VAPID_PRIVATE_KEY=
VAPID_PUBLIC_KEY=

# 登録
# -------------

# シングルユーザーモードは登録を無効にし、ホームページを最初のユーザープロフィールにリダイレクトします。
# SINGLE_USER_MODE=true

# 以下のメールドメインでの登録を防ぎます。
# EMAIL_DOMAIN_DENYLIST=example1.com|example2.de|etc

# 以下のメールドメインでの登録のみを許可します。
# EMAIL_DOMAIN_ALLOWLIST=example1.com|example2.de|etc

#TODO これを移動する
# 必要に応じてデフォルトの言語を変更します。
# DEFAULT_LOCALE=de

# メール送信
# ------------
SMTP_SERVER=
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS[email protected]

# ファイルストレージ(オプション)
# -----------------------
# 添付ファイルホストは、WEB_DOMAINからのクロスオリジンリクエストを許可する必要があります。
# WEB_DOMAINが設定されていない場合は、LOCAL_DOMAINからのリクエストを許可します。たとえば、サーバーには次のようなヘッダーが含まれている可能性があります:
# Access-Control-Allow-Origin: https://192.168.1.123:9000/
# -----------------------
#S3_ENABLED=true
#S3_BUCKET=files.example.com
#AWS_ACCESS_KEY_ID=
#AWS_SECRET_ACCESS_KEY=
#S3_ALIAS_HOST=files.example.com

# Swift(オプション)
# 添付ファイルホストはクロスオリジンリクエストを許可する必要があります - 上記の説明を参照してください。
# SWIFT_ENABLED=true
# SWIFT_USERNAME=
# Keystone V3の場合、SWIFT_TENANTの値はプロジェクト名である必要があります。
# SWIFT_TENANT=
# SWIFT_PASSWORD=
# 一部のOpenStack V3プロバイダーは、高負荷時にPROJECT_IDを設定する必要がある場合があります(オプション)。
# SWIFT_PROJECT_ID=
# Keystone V2およびV3 URLをサポートします。トークンのレート制限の問題を回避するために、V3 URLの使用をお勧めします。
# SWIFT_AUTH_URL=
# SWIFT_CONTAINER=
# SWIFT_OBJECT_URL=
# SWIFT_REGION=
# デフォルトは'default'です。
# SWIFT_DOMAIN_NAME=
# デフォルトは60秒です。0に設定すると無効になります。
# SWIFT_CACHE_TTL=

# オプションのマルチサーバー設定でのアセットホスト
# アセットホストは、WEB_DOMAINまたはLOCAL_DOMAINからのクロスオリジンリクエストを許可する必要があります。
# たとえば、サーバーには次のようなヘッダーが含まれている可能性があります:
# Access-Control-Allow-Origin: https://example.com/
# CDN_HOST=https://assets.example.com

# インスタンスにメディアを提供するためのホストのオプションリスト
# カスタムCSSやaboutページに外部メディアを含める場合、
# またはデータストレージプロバイダーが他のドメインへのリダイレクトを使用する場合に便利です。
# EXTRA_DATA_HOSTS=https://data.example1.com|https://data.example2.com

# S3のオプションエイリアス(たとえば、カスタムドメイン名を使用してファイルを提供する場合、CloudfrontやCloudflareを使用する可能性があります)
# S3_ALIAS_HOST=

# ストリーミングAPI統合
# STREAMING_API_BASE_URL=

# 外部認証(オプション)
# ----------------------------------
# LDAP認証(オプション)
# LDAP_ENABLED=true
# LDAP_HOST=localhost
# LDAP_PORT=389
# LDAP_METHOD=simple_tls
# LDAP_BASE=
# LDAP_BIND_DN=
# LDAP_PASSWORD=
# LDAP_UID=cn
# LDAP_MAIL=mail
# LDAP_SEARCH_FILTER=(|(%{uid}=%{email})(%{mail}=%{email}))
# LDAP_UID_CONVERSION_ENABLED=true
# LDAP_UID_CONVERSION_SEARCH=., -
# LDAP_UID_CONVERSION_REPLACE=_

# PAM認証(オプション)
# PAM認証は「email」PAM変数を使用してメールアドレスを生成し、
# 必要に応じてPAM_DEFAULT_SUFFIXをフォールバックとして使用します。
# 「email」pam環境変数は次の提供によって提供されます:
# https://github.com/devkral/pam_email_extractor
# PAM_ENABLED=true
# メールアドレス生成のためのメールドメインのフォールバック(デフォルトはLOCAL_DOMAIN)
# PAM_EMAIL_DOMAIN=example.com
# PAMサービスの名前(pamの「auth」部分を評価)
# PAM_DEFAULT_SERVICE=rpam
# ユーザーが登録できるかどうかを確認するためのPAMサービス名(デフォルトはnil(無効))
# PAM_CONTROLLED_SERVICE=rpam

# グローバルOAuth設定(オプション):
# 1つのポリシーしかない場合は、これを有効にしたいかもしれません。
# OAUTH_REDIRECT_AT_SIGN_IN=true

# オプションのCAS認証(omniauth-casを参照):
# CAS_ENABLED=true
# CAS_URL=https://sso.myserver.com/
# CAS_HOST=sso.myserver.com/
# CAS_PORT=443
# CAS_SSL=true
# CAS_VALIDATE_URL=
# CAS_CALLBACK_URL=
# CAS_LOGOUT_URL=
# CAS_LOGIN_URL=
# CAS_UID_FIELD='user'
# CAS_CA_PATH=
# CAS_DISABLE_SSL_VERIFICATION=false
# CAS_UID_KEY='user'
# CAS_NAME_KEY='name'
# CAS_EMAIL_KEY='email'
# CAS_NICKNAME_KEY='nickname'
# CAS_FIRST_NAME_KEY='firstname'
# CAS_LAST_NAME_KEY='lastname'
# CAS_LOCATION_KEY='location'
# CAS_IMAGE_KEY='image'
# CAS_PHONE_KEY='phone'

# オプションのSAML認証(omniauth-samlを参照)
# SAML_ENABLED=true
# SAML_ACS_URL=http://localhost:3000/auth/auth/saml/callback
# SAML_ISSUER=https://example.com
# SAML_IDP_SSO_TARGET_URL=https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO
# SAML_IDP_CERT=
# SAML_IDP_CERT_FINGERPRINT=
# SAML_NAME_IDENTIFIER_FORMAT=
# SAML_CERT=
# SAML_PRIVATE_KEY=
# SAML_SECURITY_WANT_ASSERTION_SIGNED=true
# SAML_SECURITY_WANT_ASSERTION_ENCRYPTED=true
# SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
# SAML_ATTRIBUTES_STATEMENTS_UID="urn:oid:0.9.2342.19200300.100.1.1"
# SAML_ATTRIBUTES_STATEMENTS_EMAIL="urn:oid:1.3.6.1.4.1.5923.1.1.1.6"
# SAML_ATTRIBUTES_STATEMENTS_FULL_NAME="urn:oid:2.16.840.1.113730.3.1.241"
# SAML_ATTRIBUTES_STATEMENTS_FIRST_NAME="urn:oid:2.5.4.42"
# SAML_ATTRIBUTES_STATEMENTS_LAST_NAME="urn:oid:2.5.4.4"
# SAML_UID_ATTRIBUTE="urn:oid:0.9.2342.19200300.100.1.1"
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED=
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED_EMAIL=

# カスタム設定
# ---------------
# Mastodonの動作をさまざまな方法でカスタマイズします。
# ---------------

# 最大許可文字数
MAX_TOOT_CHARS=500

# フィード列で許可される最大ハッシュタグ数
# この値を高く設定すると、データベースの負荷が大幅に増加する可能性があります。
MAX_FEED_HASHTAGS=4

# 最大ピン留め可能な投稿数
MAX_PINNED_TOOTS=5

# 最大許可プロフィール文字数
MAX_BIO_CHARS=500

# 最大プロフィールフィールド数
MAX_PROFILE_FIELDS=4

# 最大許可表示名文字数
MAX_DISPLAY_NAME_CHARS=30

# 最大許可投票オプション数
MAX_POLL_OPTIONS=5

# 最大許可投票オプション文字数
MAX_POLL_OPTION_CHARS=100

# 各投稿およびユーザーの最大絵文字反応数(最小1)
MAX_REACTIONS=1

# アップロードおよび表示の最大添付ファイル数
# MAX_MEDIA_ATTACHMENTS=4
# MAX_REMOTE_MEDIA_ATTACHMENTS=16

# 最大画像および動画/音声のアップロードサイズ
# 単位はバイト
# 1048576バイトは1メガバイトに相当します。
# MAX_IMAGE_SIZE=8388608
# MAX_VIDEO_SIZE=41943040

# 最大検索結果数
# Elasticsearchがインストールされている場合にのみ関連します。
# MAX_SEARCH_RESULTS=20

# 最大ハッシュタグ数
# 'Explore'に表示されるハッシュタグ数をカスタマイズします。
# MAX_TRENDING_TAGS=10

# カスタム絵文字ファイルの最大サイズ
# 定義されていないか、MAX_EMOJI_SIZE未満の場合は、
# MAX_EMOJI_SIZEの値がMAX_REMOTE_EMOJI_SIZEとして使用されます。
# 単位はバイト
# MAX_EMOJI_SIZE=262144
# MAX_REMOTE_EMOJI_SIZE=262144

# オプションのhCaptchaサポート
# HCAPTCHA_SECRET_KEY=
# HCAPTCHA_SITE_KEY=

# IPおよびセッション保持
# -----------------------
# IP_RETENTION_PERIODを2日(172800)未満に設定する場合は、
# config/sidekiq.yml内のip_cleanup_schedulerスケジュールを変更してください。
# -----------------------
IP_RETENTION_PERIOD=31556952
SESSION_RETENTION_PERIOD=31556952

以前に生成した情報を記入し、いくつかのカスタマイズを行います。

Elasticsearch にプラグインをインストールし、中国語検索を最適化#

  1. 左側のナビゲーションバーからコンテナに入ります。

Pasted image 20250109200629.png

  1. コンテナ名に Elasticsearch が含まれているものを選択し、操作の欄からターミナルに入って接続します:

Pasted image 20250109200751.png

  1. https://release.infinilabs.com/にアクセスし、analysis-ikanalysis-stconvertをインストールします。インストールしたいバージョンを選択します。ターミナルに戻り、以下のコードを入力します(上記の docker-compose.yml ファイルの 7.17.4 バージョンを例にします):
yes | elasticsearch-plugin install https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.14.zip
elasticsearch-plugin install https://release.infinilabs.com/analysis-stconvert/stable/elasticsearch-analysis-stconvert-7.17.4.zip

完了したら Elasticsearch を再起動し、.env.production に Elasticsearch の接続情報を記入します。

その後、Mastodon フォルダ内で elasticsearch フォルダに権限を付与する必要があります。

chown 1000:1000 -R elasticsearch

起動#

docker-compose up -d

起動後、public フォルダに権限を付与する必要があります。そうしないとサービスが継続的にエラーを報告します:

chown 991:991 -R ./public

これでサービスは正常に稼働しています。

DNS アカウント、Acme アカウントを設定し、証明書を申請#

私は Cloudflare を使用していますので、私と同じようにする場合は続けてください:

  1. API Tokenを取得し、トークンを作成します - テンプレートを使用し(DNS を編集)、ゾーンをすべて選択します:

Pasted image 20250109202334.png

Pasted image 20250109202424.png

  1. 1Panel でサイトを選択し、要求に従って OpenResty をインストールし、完了したら証明書 - DNS アカウントに入ります。

Pasted image 20250109202526.png

Pasted image 20250109202539.png

  1. DNS アカウントを作成し、Cloudflare を選択し、あなたの cloudflare アカウントのメールアドレスとトークンを入力します:

Pasted image 20250109202647.png

  1. Acme アカウントを作成し、メールアドレスを入力します(このメールアドレスは自由に選択できます):

Pasted image 20250109202755.png

  1. 証明書を申請し、必要な証明書の URL を入力します。

サイトを作成#

  1. 左側のナビゲーションバーからサイト - サイトに入ります。サイトを作成 - リバースプロキシをクリックし、プロキシアドレスにあなたの web アドレスを入力します。デフォルトは 127.0.0.1:3000 です。

  2. サイト名をクリックするか、右側の操作から設定に入り、HTTPs をクリックして有効にし、先ほど申請した証明書を選択します。

  3. Cloudflare に解析を追加し、あなたのサイト名をサーバーの IP に指向させます。

  4. これであなたのサーバーにアクセスできるようになりました。

Nginx の設定#

サービスが正常に稼働した後、Nginx を設定する必要があります。Mastodon 公式の Nginx 設定ファイルを取得して確認できます:

wget https://gcore.jsdelivr.net/gh/TheEssem/mastodon@refs/heads/main/dist/nginx.conf
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

upstream backend {
    server 127.0.0.1:3000 fail_timeout=0;
}

upstream streaming {
    # Instruct nginx to send connections to the server with the least number of connections
    # to ensure load is distributed evenly.
    least_conn;

    server 127.0.0.1:4000 fail_timeout=0;
    # Uncomment these lines for load-balancing multiple instances of streaming for scaling,
    # this assumes your running the streaming server on ports 4000, 4001, and 4002:
    # server 127.0.0.1:4001 fail_timeout=0;
    # server 127.0.0.1:4002 fail_timeout=0;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/live/public;
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2 TLSv1.3;

  # You can use https://ssl-config.mozilla.org/ to generate your cipher set.
  # We recommend their "Intermediate" level.
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;

  # Uncomment these lines once you acquire a certificate:
  # ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 99m;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon;
  gzip_static on;

  location / {
    try_files $uri @proxy;
  }

  # If Docker is used for deployment and Rails serves static files,
  # then needed must replace line `try_files $uri =404;` with `try_files $uri @proxy;`.
  location = /sw.js {
    add_header Cache-Control "public, max-age=604800, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/assets/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/avatars/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/emoji/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/headers/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/packs/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/shortcuts/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/sounds/ {
    add_header Cache-Control "public, max-age=2419200, must-revalidate";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    try_files $uri =404;
  }

  location ~ ^/system/ {
    add_header Cache-Control "public, max-age=2419200, immutable";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header Content-Security-Policy "default-src 'none'; form-action 'none'";
    try_files $uri =404;
  }

  location ^~ /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";

    proxy_pass http://streaming;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";

    tcp_nodelay on;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://backend;
    proxy_buffering on;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_cache CACHE;
    proxy_cache_valid 200 7d;
    proxy_cache_valid 410 24h;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cached $upstream_cache_status;

    tcp_nodelay on;
  }

  error_page 404 500 501 502 503 504 /500.html;
}

これをあなたの OpenResty に追加してください。

総括#

本記事は、基本的にコードの知識がなく、視覚的なインターフェースを重視する友人たちに提供するアイデアの一つです。今後、さらに改善し、1Panel を使用したファイルバックアップのチュートリアルを更新する予定です。最初の更新はここまでです。

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