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

推荐订阅源

雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Scott Helme
Scott Helme
P
Proofpoint News Feed
D
Docker
The Hacker News
The Hacker News
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
Jina AI
Jina AI
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
博客园 - 叶小钗
U
Unit 42
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
T
Threatpost
V
Vulnerabilities – Threatpost
C
Cisco Blogs
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
V
Visual Studio Blog
G
GRAHAM CLULEY
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
G
Google Developers Blog
Know Your Adversary
Know Your Adversary
F
Fortinet All Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
Recent Announcements
Recent Announcements
量子位
S
Schneier on Security
I
Intezer
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security

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 卡使用体验和注意事项 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 在 Windows 中使用 Yubikey 的 OpenPGP 应用 Windows 11 IoT LTSC 养老指南 巧用浏览器生成 HAR 文件批量下载所需网页资源 聊聊静态网站的评论系统 在 Hugo 站点中优雅地展示实况照片 使用 snac 部署一个简洁优雅的 ActivityPub 实例 当 25 岁来临的时候 断网的这两年 从 Bitwarden/Vaultwarden 到 KeePassXC 也许是 Android 上最好的本地播放器 - 椒盐音乐 2023 半年小结 写一个好玩的 Hugo 货币汇率转换短代码 写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示 海信 Touch Lite 墨水屏音乐阅读器的简单体验 从 Debian 11(bullseye) 无感升级到 Debian 12(bookworm) 使用 GitHub Actions 自动提交 URL 到 IndexNow 批量重写 Git 历史提交记录 使用 cgit 托管小小的也很可爱的 Git 服务器 在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器 托管简单 Git 服务器的一些尝试 使用 stagit 自托管纯静态 Git 存储库 使用 Docker 快速部署单人 Fediverse 实例 我是如何建立自己的个人博客的? 简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南 服务器使用 Cloudflare CDN 的最佳实践 甲骨文服务器分配并启用 IPv6 地址 Git 版本控制学习笔记(二) Cloudflare WAF 防护策略简易指南 Mastodon 服务器批量导入自定义表情 自托管服务指南──有了服务器可以做什么? 使用 Miniflux + RSSHub 打造个人 RSS 阅读器 构建支持多种 CPU 架构的 Docker 镜像 一个可自托管的静态短链接应用 别了,二〇二二! Duplicacy CLI 进阶使用指南 Duplicacy CLI 备份工具的基本使用 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器 Yubikey 转运日志及上手指南 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室 初探 Cloudflare 零信任 - 通过 Cloudflare Tunnel 访问服务 某科学的 PGP 算号指南 2022 年的 MacBook Air M1 使用体验及应用推荐 使用 Vercel 和 Supabase 自托管 Cusdis 评论系统 为什么你的搜索引擎不好用? 个人在 Windows 上常用软件清单 macOS 基础开发环境设置指南 在 macOS 上使用 Canokey 的 OpenPGP 应用 提取 Windows UWP 应用商店的安装包以供离线安装 Git 版本控制学习笔记(一) 使用 Notion 管理 GitHub Star 项目 使用 Vercel 免费部署 Giscus 评论系统 将博客评论从 Utterances 无缝迁移到 Giscus Canokey 签名和认证应用指南 Canokey 的基本使用指南 Canokey Pigeon 揽件日志及简单开箱 关于 Google Play 保护机制和 DRM 安全等级的那些事 记录一次捡垃圾装机 GitHub 使用 GPG 密钥提交签名认证 使用 Scoop 管理 Windows 下的软件和开发环境 Windows Terminal+PowerShell 7 打造 Windows 下最好用的终端 一个好用的 Telegram 文件批量上传/下载工具 Clash for Windows 优雅地使用 TUN 模式接管系统流量 全平台搭建 Hexo 静态博客指南 尝试将 Manjaro 作为主力操作系统使用 Hexo 进行 SEO 优化的基本指南 使用本地代理给 Git 和 NPM 加速 使用 flowerss 部署 Telegram RSS 订阅机器人
低成本自托管 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 客户端

参考信息