Skip to content

使用 Podman Quadlet 安装

INFO

如果你使用 Docker,可以参考使用 Docker Compose 安装

1. 准备配置文件

假设我们使用的发行版为 Debian Trixie,使用 ~/.config/mastodon 来存储环境变量配置。我们当前所使用的用户是一个具有 sudo 权限的用户 gargron

(1) 创建必需服务要求的数据目录

bash
mkdir -p ~/.config/mastodon
cd ~/.config/mastodon

(2) 下载环境变量配置文件

bash
wget https://git.univ.town/univtown/mastodon/raw/branch/main/.env.production.sample
mv .env.production.sample production.env

(3) 转到 Podman Quadlet 配置目录

bash
mkdir -p ~/.config/containers/systemd
cd ~/.config/containers/systemd

(4) 在此目录中创建以下 Podman Quadlet 配置

ini
[Unit]
Description=Mastodon External Network

[Network]
Name=external_network
ini
[Unit]
Description=Mastodon Internal Network

[Network]
Name=internal_network
Internal=true
ini
[Unit]
Description=Mastodon Postgres data volume

[Volume]
Driver=local
ini
[Unit]
Description=Mastodon Redis data volume

[Volume]
Driver=local
ini
[Unit]
Description=Mastodon public/system uploads

[Volume]
Driver=local
ini
[Unit]
Description=Mastodon PostgreSQL
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/library/postgres:18
ContainerName=db
ShmSize=256m
Network=internal_network.network
HealthCmd=pg_isready -U postgres
Environment=POSTGRES_HOST_AUTH_METHOD=trust
Volume=db-data.volume:/var/lib/postgresql:z

[Service]
Restart=always

[Install]
WantedBy=default.target
ini
[Unit]
Description=Mastodon Redis
After=network-online.target
Wants=network-online.target

[Container]
ContainerName=redis
Image=docker.io/library/redis:7-alpine
Network=internal_network
Volume=redis-data.volume:/data
HealthCmd=redis-cli ping

[Service]
Restart=always

[Install]
WantedBy=default.target
ini
[Unit]
Description=Mastodon Web
After=db.service redis.service
Wants=db.service redis.service

[Container]
ContainerName=web
Image=git.univ.town/univtown/mastodon:latest
Network=internal_network
Network=external_network
EnvironmentFile=%h/.config/mastodon/production.env
Command=bundle exec puma -C config/puma.rb
PublishPort=127.0.0.1:3000:3000
Volume=public-data.volume:/mastodon/public/system
HealthCmd=/bin/bash -lc "curl -s --noproxy localhost localhost:3000/health | grep -q 'OK'"

[Service]
Restart=always

[Install]
WantedBy=default.target
ini
[Unit]
Description=Mastodon Streaming
After=db.service redis.service
Wants=db.service redis.service

[Container]
ContainerName=streaming
Image=git.univ.town/univtown/mastodon-streaming:latest
Network=internal_network
Network=external_network
EnvironmentFile=%h/.config/mastodon/production.env
Command=node ./streaming/index.js
PublishPort=127.0.0.1:4000:4000
HealthCmd=/bin/bash -lc "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK'"

[Service]
Restart=always

[Install]
WantedBy=default.target
ini
[Unit]
Description=Mastodon Sidekiq
After=db.service redis.service
Wants=db.service redis.service

[Container]
ContainerName=sidekiq
Image=git.univ.town/univtown/mastodon:latest
Network=internal_network
Network=external_network
EnvironmentFile=%h/.config/mastodon/production.env
Command=bundle exec sidekiq
Volume=public-data.volume:/mastodon/public/system
HealthCmd=/bin/bash -lc "ps aux | grep '[s]idekiq\\ [78]' || false"

[Service]
Restart=always

[Install]
WantedBy=default.target
ini
[Unit]
Description=Mastodon DB migrate
After=db.service redis.service
Wants=db.service redis.service

[Container]
Image=git.univ.town/univtown/mastodon:latest
Network=internal_network
EnvironmentFile=%h/.config/mastodon/production.env
Volume=public-data.volume:/mastodon/public/system
Command=bundle exec rails db:migrate
Remove=true

[Service]
Type=oneshot
RemainAfterExit=no

若要配置其余可选服务,请参考 docker-compose.yml 等示例进行配置。

2. 生成必要的加密参数

生成基础密钥:

bash
podman run --rm git.univ.town/univtown/mastodon:latest bundle exec rails secret

记下输出的基础密钥。

接下来生成 Active Record 加密参数:

bash
podman run --rm git.univ.town/univtown/mastodon:latest bin/rails db:encryption:init

记下输出的三个参数,注意每个参数要和对应的环境变量名对应。

接下来生成 Web 推送密钥:

bash
podman run --rm git.univ.town/univtown/mastodon:latest bundle exec rails mastodon:webpush:generate_vapid_key

3. 修改环境变量配置文件

参见修改环境变量配置文件

4. 首次启动实例

(1) 重载配置

bash
systemctl --user daemon-reload

(2) 执行数据库迁移

bash
systemctl --user start mastodon-db-migrate
# 查看迁移是否成功完成
journalctl --user -feu mastodon-db-migrate

(3) 首次启动服务

bash
systemctl --user start db redis mastodon-{web,streaming,sidekiq}

(4) 查看是否存在错误

bash
journalctl --user --feu mastodon-web

如果遇到错误且无法解决,可以向其它管理员或 admin@univ.town 寻求帮助。

5. 创建管理员账户

假设我们要创建的管理员账户用户名是 @admin,邮箱是 xxx@xxx.xxxx,那么需要执行:

bash
podman exec web tootctl accounts create admin --email xxx@xxx.xxxx --role Owner --confirmed

6. 配置反向代理

参见配置反向代理


至此,服务部署完成,你可以访问你的网站并登录账户了。后续的管理与配置参见安装后续配置