惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
量子位
N
Netflix TechBlog - Medium
博客园 - 聂微东
博客园 - Franky
aimingoo的专栏
aimingoo的专栏
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
低成本自托管 Mastodon 实例简明指南
Dejavu Moe · 2023-02-14 · via Dejavu's Blog

前言

最近有点恶心 Twitter,在开始迁移到 Mastodon ,记录下今天自托管 Mastodon 实例的过程。

准备

  1. 服务器配置 2 核心 4GB 以上,物理位置最好在海外
  2. 安装好最新的 Docker CE 和 Docker Compose 插件
  3. 一个托管在 Cloudflare 上的域名
  4. 一个用于 SMTP 发信的电子邮箱【可选】

预部署

SSH 登录服务器,准备路径

cd && \
mkdir -p container/mastodon && \
cd container/mastodon

获取 .env.production 环境变量模板

wget https://blog.dejavu.moe/posts/selfhosted-mastodon-instance-with-docker/mastodon.env -O .env.production

sudo chown 991:991 .env.production

获取 docker-compose.yml 模板

wget https://blog.dejavu.moe/posts/selfhosted-mastodon-instance-with-docker/docker-compose.yml.sample -O docker-compose.yml

准备容器映射目录

mkdir -p mastodon/public \
&& sudo chown -R 991:991 mastodon/public \
&& mkdir elasticsearch \
&& sudo chown 1000:1000 -R elasticsearch

提前拉取最新的 Docker 镜像备用

云存储

不建议将 Mastodon 的媒体和文件保存到服务器本机,备份起来会很麻烦。Mastodon 支持使用 S3 或兼容 S3 API 的对象存储,比如 MinIO , Cloudflare R2 , Storj , Tebi.io …更多免费对象存储 在这里 查看。

这里以 Backblaze B2 为例,免费用户 10GB 对象存储,1GB 出站流量,兼容 S3 API,B2 和 Cloudflare 有「带宽联盟」豁免流量,对于单人 Mastodon 实例足够了。

Backblaze B2 注册帐号,新建 Bucket(存储桶)

Create Bucket

记下 S3 Endpoint

S3 Endpoint

接下来创建一个新的 Application Key

Application Key

按照下图配置权限

Add Application Key

记下 KeyID 和 applicationKey

S3 API

在这个 Bucket 随便上传一个文件

Upload File

点击上传的文件,可以看到 Friendly URL

Friendly URL

在 Cloudflare DNS 解析里添加一条 CNAME 记录,指向 Friendly URL 的主机名(必须开启小云朵代理)

DNS CNAME

在 Cloudflare 规则选项卡里面的转换规则中,创建一条重写规则

Transform Rule

编辑新创建的转换规则

Edit Transform Rule

重写资源路径

Rewrite URI

在规则设置里打开标准化传入

Standardization

现在上传到 Backblaze B2 存储的资源可以通过自定义域名访问了,记得设置更长的浏览器缓存时间和边缘缓存时间。将 S3 API 相关配置写入环境变量文件 .env.production

修改下面字段

# File Storage (optional)
# -----------------------
S3_ENABLED=true
S3_PROTOCOL=https  # S3 使用的协议
S3_ENDPOINT=https://s3.xxx.com  # S3 API Endpoint
S3_ALIAS_HOST=static.xxx.com  # 这里填写您的自定义域名(上面解析用于重写的那个)
S3_BUCKET=<Bucket 名称> # Bucket 名称
AWS_ACCESS_KEY_ID=<S3 API 兼容访问 KeyID>  # 对应 B2 KeyID
AWS_SECRET_ACCESS_KEY=<S3 API 兼容访问机密>  # 对应 B2 applicationKey

初始化

数据库

先查看当前路径

pwd
# 比如我的就是
/home/dejavu/container/mastodon

初始化数据库,数据库卷映射目录为

/home/dejavu/container/mastodon/postgres

下面的密码要记好1

sudo docker run --name postgres14 -v $(pwd)/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD='数据库管理密码' --rm -d postgres:14-alpine

进入 PostgreSQL 控制台

sudo docker exec -it postgres14 psql -U postgres

然后执行下列 SQL 语句

#  PostgreSQL 控制台中执行命令
/* 创建名为 mastodon 的用户并设置密码*/
CREATE USER mastodon WITH PASSWORD '密码' CREATEDB;
/* 创建名为 mastodon 的数据库*/
CREATE DATABASE mastodon;
/* 列出当前数据库 */
\l
/* 连接 mastodon 数据库*/
\c mastodon;
/* 出现下面的提示 */
You are now connected to database "mastodon" as user "postgres".
/* 继续执行 */
CREATE extension pg_stat_statements;
/* 退出 PostgreSQL 控制台 */
\q

完成后停止 PostgreSQL 容器

sudo docker stop postgres14

机密信息

在「预部署」阶段的环境变量文件中,有四个机密信息

# Secrets
# -------
SECRET_KEY_BASE=<浏览器会话机密>
# MFA secret
OTP_SECRET=<多因素认证机密>
# -------

# Web Push
# --------
# Push notification private key
VAPID_PRIVATE_KEY=<推送通知私钥>
# Push notification public key
VAPID_PUBLIC_KEY=<推送通知公钥>

我们可以预先生成并保留备用

# 运行两次
# 一次作为 SECRET_KEY_BASE=<浏览器会话机密>
# 一次作为 OTP_SECRET=<多因素认证机密>
sudo docker compose run --rm web bundle exec rake secret

# 运行一次
# 包含 VAPID_PRIVATE_KEY=<推送通知私钥>
# 和 VAPID_PUBLIC_KEY=<推送通知公钥>
sudo docker compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key

将上面的信息写入环境变量文件

环境变量

完成填写前面的环境变量2 ,比如 SMTP 发信配置。有关更多配置项的说明,请查看 Mastodon 文档 。现在开始准备 Mastodon 的数据库

sudo docker compose run --rm -v $(pwd)/.env.production:/opt/mastodon/.env.production web bundle exec rake db:setup

完成后停止所有容器

开始部署

先部署相关数据库服务,等待 10s 启动所有服务

sudo docker compose up -d db redis \
&& sleep 10s \
&& sudo docker compose up -d

完成后,在 Cloudflare Zero Trust 控制台添加一个 Tunnel,然后编辑公共主机名(用于 Mastodon 主页,建议裸域)

Mastodon Domain

在这个 Tunnel 上再添加一个公共主机名,这个用于 Mastodon Stream API

Mastodon Stream Domain

现在尝试访问绑定的 Mastodon 主页域名,应该可以正常访问了,那就 OK 了,先不要急着注册用户

设置管理员

直接使用 tootctl 工具来设置 Mastodon 实例管理员,这个帐号我们之后可以直接使用

# 注意修改
# 管理员用户名 username
# 管理员用户的邮箱 [email protected]
sudo docker exec mastodon-web tootctl accounts create "username" --email "[email protected]" --confirmed --role Owner

# 输出:
OK
New password: "初始密码"

上面的初始密码只会显示一次,如果不幸忘记了3 ,可以重置用户密码

sudo docker exec mastodon-web tootctl accounts modify "username" --email "[email protected]" --reset-password

# 输出:
OK
New password: "新的密码"

完成

恭喜您!😎 您刚刚部署的 Mastodon 实例已经可以访问了,欢迎加入联邦宇宙!您也许想要看看 Mastodon 客户端

参考信息