前言#
部署 Mastodon 已經不是稀奇的事情了,但是我還是想分享一下我的部署方式,可能相對來說更適合小白。本篇教程非 1Panel 同樣適用。
關於部署 Mastodon,本攻略搭建的並非原版 Mastodon,而是基於 Glitch 的 Fork——Chuckya,相比於原版有更多的可配置項目,也基本上無需修改源代碼了。
為什麼用 1Panel#
可能就像當初大家用寶塔一樣,我用的是 1panel,因為他可視化的文件管理,自帶 SSH,配置證書非常方便,有便捷的備份設置,很適合小白使用。
用了 1Panel 自然要用 Docker 部署,這也是最便捷的方式之一。
準備工作#
- 挑選伺服器,如果你要搭建 Mastodon,推薦最少 2C4G 的伺服器,4C8G 會更好。請不要使用國內的伺服器!
- 挑選域名
- 安裝 1Panel。(不必再特意安裝 Docker,安裝 1Panel 時已一起安裝完。)
正式安裝#
選擇一個文件存放你的 Mastodon#
我放在了 /opt/Mastodon
使用 1Panel 你可以在這裡進行創建文件夾操作,或進入終端輸入:
mkdir /opt/mastodon
從倉庫拉取 Mastodon 的配置文件,並修改#
倉庫地址 (Chuckya Fork)
https://github.com/TheEssem/mastodon
我們需要拉取兩個文件: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 部分都註釋掉了,為了清楚展示,我在下方代碼中將這兩部分全部刪除了。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#
一鍵安裝即可,PostgreSQL 的版本可以自行進行選擇。
創建數據庫#
- 在安裝完成後,從左側導航欄進入 數據庫。
- 並選擇 PostgreSQL。
-
點擊創建數據庫,自定義你的數據庫名稱、用戶名、密碼。
-
查看你的 PostgreSQL 和 Redis 連接信息:
PostgreSQL:
點擊進入,此處會有一個容器連接地址:
Redis:同理
額外需要用到此處的密碼
執行安裝#
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: (這裡寫上面你給mastodon設置的數據庫密碼)
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 中。
繼續生成管理員賬戶#
截至目前版本,生成管理員賬戶已經沒有 BUG。
.env.production 的可修改內容#
我用 AI 進行了翻譯,可以進行參考,Glitch 版本可以對 Mastodon 進行更多的自定義(如字符數、最大標籤數、pin 數等,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`生成(第一個是私鑰,第二個是公鑰)
# 你應該只為實例生成一次。如果你後來決定更改它,所有推送訂閱將
# 會被無效,需要用戶再次訪問網站以重新訂閱。
# --------
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作為fallback
# “email” pam環境變量由以下提供:
# https://github.com/devkral/pam_email_extractor
# PAM_ENABLED=true
# 用於郵箱地址生成的郵箱域名fallback(默認為LOCAL_DOMAIN)
# PAM_EMAIL_DOMAIN=example.com
# PAM服務的名稱(評估pam的“auth”部分)
# PAM_DEFAULT_SERVICE=rpam
# 用於檢查用戶是否可以註冊的PAM服務名稱(默認為nil(禁用))
# PAM_CONTROLLED_SERVICE=rpam
# 全局OAuth設置(可選):
# 如果你只有一個策略,可能希望啟用這個
# 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和會話保留
# -----------------------
# 確保修改config/sidekiq.yml中的ip_cleanup_scheduler調度
# 如果將IP_RETENTION_PERIOD設置為小於兩天(172800),則調度應小於每日。
# -----------------------
IP_RETENTION_PERIOD=31556952
SESSION_RETENTION_PERIOD=31556952
將之前生成的信息填入,並做一些自定義的修改。
為 Elasticsearch 安裝插件,優化中文搜索#
- 從左側導航欄的容器進入
- 選擇容器名稱包含 Elasticsearch 的,在操作一欄選擇終端進入並連接:
- 打開 https://release.infinilabs.com/ ,並進入,我們需要安裝 analysis-ik 與 analysis-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,並將你的 Elasticsearch 連接信息填入 .env.production。
之後你需要在 Mastodon 文件夾為 elasticsearch 文件夾賦權。
chown 1000:1000 -R elasticsearch
啟動#
docker-compose up -d
在啟動後,你需要為 public 文件夾賦權,否則服務會持續報錯:
chown 991:991 -R ./public
至此你的服務已經成功運行了。
設置 DNS 賬戶、Acme 賬戶並申請證書#
我使用的是 Cloudflare,如果你和我一樣,可以繼續看下去:
- 獲取 API Token ,創建令牌 - 使用模板(編輯 DNS),區域選擇所有區域:
- 在 1Panel 中選擇網站,根據要求安裝 OpenResty,完成後進入證書 - DNS 賬戶
- 創建 DNS 賬戶,選擇 Cloudflare,輸入你的 cloudflare 賬戶郵箱和 Token:
- 創建 Acme 賬戶,輸入郵箱(此處郵箱可隨意選擇):
- 點擊申請證書,填入你需要申請證書的網址。
創建網站#
-
從左側導航欄進入網站 - 網站,點擊創建網站 - 反向代理,代理地址填寫你的 web 地址,默認為 127.0.0.1:3000。
-
點擊網站名或從右側操作進入配置,點擊 HTTPs,選擇啟用,並選擇你剛剛申請的證書。
-
在 Cloudflare 中添加解析,將你的网站名稱,指向你的伺服器 IP。
-
此時你已經可以訪問你的伺服器了。
配置 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 進行文件備份的教程,第一次更新就先到這裡啦。