有没有那么一瞬间,你觉得现在的社交媒体有点儿...嗯...拥挤?想不想拥有一个完全属于自己的、干净清爽的社交空间,和同好们自由自在地交流?今天,我就带大家用 Docker 这把瑞士军刀,在 Ubuntu 系统上轻松搭建一个属于你自己的 Mastodon(长毛象)服务器!别害怕,整个过程就像搭积木一样简单有趣,跟我来!
认识一下我们的主角:Docker 和 Mastodon
先来简单认识一下今天我们要用到的两个“神器”:
Docker: 这家伙就像一个超级打包工头,它可以把你的应用程序和它所需要的各种依赖(比如运行环境、库文件等等)打包成一个独立的“集装箱”——镜像(Image)。然后,你可以在任何支持 Docker 的系统上,像启动一个普通程序一样运行这个“集装箱”——容器(Container)。这样做的好处就是环境统一,部署超快,再也不用担心“在我电脑上能跑,在你电脑上就不行”这种玄学问题了!简单来说,Docker 让软件部署变得标准化、轻量化、可移植。
Mastodon: 这位就是我们今天的主角——长毛象!它是一个开源的、去中心化的社交网络平台。你可以把它想象成一个由无数个独立服务器(也叫“实例”)组成的联邦宇宙。每个实例都有自己的规则、主题和社区文化,你可以选择加入感兴趣的实例,也可以自己搭建一个。相比于中心化的社交媒体,Mastodon 更加注重用户隐私和社区自治,给你更多的自由和掌控权。它的用户界面简洁友好,功能也挺丰富,支持文字、图片、视频等多种形式的内容分享。
手把手教你:Ubuntu Docker 部署 Mastodon 服务器 (2500 字以上)
好了,认识完主角,咱们就正式开始搭建自己的象牙塔吧!以下步骤我尽量写得详细再详细,保证你一步一个脚印,不会迷路。
第一步:确保你的 Ubuntu 系统已经安装了 Docker 和 Docker Compose
在开始之前,我们需要确保你的 Ubuntu 服务器上已经安装了 Docker 和 Docker Compose 这两个工具。Docker 是我们运行 Mastodon 的基础,而 Docker Compose 可以帮助我们更方便地管理由多个 Docker 容器组成的应用(Mastodon 服务包含多个组件)。
如果你还不确定是否安装了,或者还没有安装,没关系,跟着下面的命令来:
-
更新你的系统软件包列表:
Bashsudo apt update
这个命令会从软件源服务器上下载最新的软件包信息,保持你的系统软件包处于最新状态。输入这个命令后,你可能会被要求输入你的用户密码,照做就行。
-
安装 Docker 的依赖包:
Bashsudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
这些软件包是 Docker 在安装和运行过程中所依赖的一些工具和库。
-
添加 Docker 的官方 GPG 密钥:
Bashsudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
这个步骤是为了验证我们从 Docker 官方仓库下载的软件包是安全可靠的。
-
添加 Docker 的 APT 仓库到你的系统:
Bashecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这条命令会将 Docker 的官方软件仓库添加到你的系统软件源列表中。
$(dpkg --print-architecture)
会自动检测你的系统架构(比如 amd64),$(lsb_release -cs)
会获取你的 Ubuntu 版本代号(比如 jammy)。 -
再次更新软件包列表:
Bashsudo apt update
这次更新会把 Docker 仓库中的软件包信息也拉取下来。
-
安装 Docker Engine:
Bashsudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
这条命令会安装 Docker Engine、Docker CLI (命令行工具)、containerd (容器运行时) 和 Docker Compose 插件。
-
验证 Docker 是否安装成功:
Bashdocker --version docker compose version
如果成功安装,你会看到 Docker 和 Docker Compose 的版本信息输出。
第二步:创建 Mastodon 的工作目录和配置文件
接下来,我们需要为 Mastodon 创建一个专门的工作目录,并在其中准备好 Docker Compose 的配置文件。
-
创建一个目录来存放 Mastodon 的相关文件:
Bashmkdir ~/mastodon cd ~/mastodon
mkdir
命令用于创建目录,cd
命令用于切换到该目录下。你可以根据自己的喜好命名这个目录。 -
创建
docker-compose.yml
文件:在这个目录下,我们需要创建一个名为
docker-compose.yml
的文件。这个文件是 Docker Compose 的核心,它定义了 Mastodon 服务所需的各个容器以及它们之间的关系和配置。使用你喜欢的文本编辑器(比如
Bashnano
或vim
)创建并编辑这个文件:nano docker-compose.yml
然后,将下面的配置粘贴到文件中:
YAMLversion: '3.9' services: redis: image: redis:latest restart: unless-stopped volumes: - redis_data:/data db: image: postgres:15-alpine restart: unless-stopped volumes: - db_data:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_USER: mastodon POSTGRES_DB: mastodon healthcheck: test: ["CMD-SHELL", "pg_isready -U mastodon"] interval: 5s timeout: 5s retries: 5 web: image: tootsuite/mastodon:v4.3.0 restart: unless-stopped depends_on: - redis - db volumes: - public:/mastodon/public - system:/mastodon/system - config:/etc/mastodon ports: - "3000:3000" environment: RAILS_ENV: production WEB_DOMAIN: ${WEB_DOMAIN} LOCAL_DOMAIN: ${LOCAL_DOMAIN} SMTP_SERVER: ${SMTP_SERVER} SMTP_PORT: ${SMTP_PORT} SMTP_USER: ${SMTP_USER} SMTP_PASSWORD: ${SMTP_PASSWORD} SMTP_FROM_ADDRESS: ${SMTP_FROM_ADDRESS} REDIS_URL: redis://redis:6379 DATABASE_URL: postgres://mastodon:${POSTGRES_PASSWORD}@db:5432/mastodon PAPERCLIP_STORAGE: s3 S3_BUCKET_NAME: ${S3_BUCKET_NAME} S3_REGION: ${S3_REGION} S3_ENDPOINT: ${S3_ENDPOINT} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY} ENABLE_OPEN_SIGNUPS: 'true' # 建议先设置为 false,配置完成后再考虑开启 MAX_UPLOAD_SIZE: 50MB healthcheck: test: ["CMD-SHELL", "bundle exec rake health"] interval: 5s timeout: 5s retries: 5 streaming: image: tootsuite/mastodon:v4.3.0 restart: unless-stopped depends_on: - redis - web volumes: - config:/etc/mastodon environment: RAILS_ENV: production WEB_DOMAIN: ${WEB_DOMAIN} LOCAL_DOMAIN: ${LOCAL_DOMAIN} REDIS_URL: redis://redis:6379 DATABASE_URL: postgres://mastodon:${POSTGRES_PASSWORD}@db:5432/mastodon healthcheck: test: ["CMD-SHELL", "bundle exec rake health"] interval: 5s timeout: 5s retries: 5 sidekiq: image: tootsuite/mastodon:v4.3.0 restart: unless-stopped depends_on: - redis - db - web volumes: - config:/etc/mastodon environment: RAILS_ENV: production WEB_DOMAIN: ${WEB_DOMAIN} LOCAL_DOMAIN: ${LOCAL_DOMAIN} REDIS_URL: redis://redis:6379 DATABASE_URL: postgres://mastodon:${POSTGRES_PASSWORD}@db:5432/mastodon volumes: redis_data: db_data: public: system: config:
注意: 上面的配置文件中有很多以
${}
包裹的变量,这些是需要我们稍后在.env
文件中进行配置的。 -
创建
.env
环境变量配置文件:为了方便管理敏感信息和配置参数,我们通常会将这些信息放在一个名为
Bash.env
的文件中。在你的~/mastodon
目录下创建并编辑这个文件:nano .env
然后,根据你的实际情况填写以下配置信息:
Code snippet# PostgreSQL 数据库密码 (请务必设置一个强密码!) POSTGRES_PASSWORD=your_strong_postgres_password # 你的 Mastodon 域名 (例如: mastodon.example.com) WEB_DOMAIN=your_mastodon_domain.com LOCAL_DOMAIN=your_mastodon_domain.com # SMTP 服务器配置 (用于发送邮件,如注册确认、密码重置等) SMTP_SERVER=smtp.your_email_provider.com SMTP_PORT=587 # 通常是 587 (TLS) 或 465 (SSL) SMTP_USER=your_email_address SMTP_PASSWORD=your_email_password SMTP_FROM_ADDRESS=noreply@your_mastodon_domain.com # S3 对象存储配置 (用于存储上传的媒体文件,可选,但强烈建议) # 如果你没有 S3 服务,可以先注释掉这些配置,Mastodon 会将文件存储在本地,但这可能会占用你的服务器磁盘空间 S3_BUCKET_NAME=your_s3_bucket_name S3_REGION=your_s3_region S3_ENDPOINT=your_s3_endpoint # 有些服务商需要指定 Endpoint S3_ACCESS_KEY_ID=your_s3_access_key_id S3_SECRET_ACCESS_KEY=your_s3_secret_access_key
参数解释:
POSTGRES_PASSWORD
: 这是 PostgreSQL 数据库的密码,请务必设置一个足够强壮的密码!WEB_DOMAIN
: 这是你打算用来访问 Mastodon 服务的域名。LOCAL_DOMAIN
: 通常和WEB_DOMAIN
相同。SMTP_SERVER
,SMTP_PORT
,SMTP_USER
,SMTP_PASSWORD
,SMTP_FROM_ADDRESS
: 这些是你的 SMTP (简单邮件传输协议) 服务器的配置信息,用于 Mastodon 发送邮件。你需要从你的邮件服务提供商那里获取这些信息。S3_BUCKET_NAME
,S3_REGION
,S3_ENDPOINT
,S3_ACCESS_KEY_ID
,S3_SECRET_ACCESS_KEY
: 这些是如果你选择使用 Amazon S3 或其他兼容 S3 协议的对象存储服务时需要配置的信息。强烈建议使用对象存储来管理用户上传的媒体文件,这可以减轻你的服务器磁盘压力。如果你暂时没有,可以先注释掉docker-compose.yml
中web
服务下environment
部分相关的PAPERCLIP_STORAGE
和S3_*
配置。
保存并关闭
.env
文件。
第三步:初始化 Mastodon 并生成配置文件
现在我们已经有了 docker-compose.yml
和 .env
文件,接下来我们需要启动 Mastodon 服务并进行一些初始化配置。
-
启动 Mastodon 服务:
在
Bash~/mastodon
目录下运行以下命令:docker compose up -d
-d
参数表示在后台运行这些容器。Docker Compose 会根据docker-compose.yml
文件的定义,自动下载所需的镜像并启动各个服务(redis, db, web, streaming, sidekiq)。第一次运行这个命令时,可能需要一些时间来下载 Docker 镜像,请耐心等待。
-
进行 Mastodon 的初始化设置:
服务启动后,我们需要进入
web
容器中执行一些 Mastodon 提供的命令行工具来进行初始化设置。首先,获取
Bashweb
容器的名称(通常会是mastodon-web-1
):docker ps
在输出的列表中找到
image
列为tootsuite/mastodon:v4.3.0
的那一行,记住它的NAMES
列的值。然后,使用以下命令进入
Bashweb
容器的 bash shell(将mastodon-web-1
替换为你实际的容器名称):docker exec -it mastodon-web-1 bash
现在你已经进入了容器的内部。接下来,我们需要生成 Mastodon 的配置文件。运行以下命令:
BashRAILS_ENV=production bundle exec rake mastodon:setup
这个命令会引导你完成一些重要的设置,包括:
- 设置管理员账号的邮箱地址、用户名和密码。 请务必记住你设置的管理员账号信息,这是你管理整个 Mastodon 实例的关键。
- 询问你的 Mastodon 域名。 这里应该填写你在
.env
文件中设置的WEB_DOMAIN
。 - 询问是否启用 Open Signups (开放注册)。 建议你先选择
no
,等你的实例运行稳定后再考虑是否开放注册。 - 生成 SSH 密钥。 建议选择
yes
。 - 生成 VAPID 密钥。 建议选择
yes
(用于 Web Push 通知)。
按照提示一步步操作即可。完成后,会生成一个位于
/etc/mastodon/
目录下的mastodon.yml
配置文件。完成初始化设置后,输入
exit
命令退出容器的 bash shell。 -
预编译 Assets:
回到你的服务器终端(
Bash~/mastodon
目录下),运行以下命令预编译 Mastodon 的静态资源文件:docker compose exec web bundle exec rake assets:precompile
这个过程可能需要一些时间,请耐心等待。
-
初始化数据库:
运行以下命令初始化 Mastodon 的数据库:
Bashdocker compose exec web bundle exec rake db:migrate
这个命令会将数据库结构更新到最新的状态。
-
重启 Mastodon 服务:
完成以上步骤后,我们需要重启 Mastodon 服务来使配置生效:
Bashdocker compose down && docker compose up -d
docker compose down
命令会停止并移除之前启动的容器,docker compose up -d
命令会重新启动它们。
第四步:配置 Web 服务器反向代理 (Nginx 或 Apache,可选但强烈建议)
虽然 Mastodon 的 web
服务默认监听在 3000 端口,但是直接通过 你的域名:3000
访问不太方便,而且不利于配置 HTTPS。因此,我们强烈建议配置一个 Web 服务器(比如 Nginx 或 Apache)作为反向代理,将对你域名的 HTTP/HTTPS 请求转发到 Mastodon 的 web
服务。
这里以 Nginx 为例进行说明:
-
安装 Nginx:
如果你的服务器上还没有安装 Nginx,可以使用以下命令进行安装:
Bashsudo apt install nginx
-
配置 Nginx 虚拟主机:
创建一个新的 Nginx 配置文件,比如
Nginx/etc/nginx/sites-available/mastodon.conf
,并将以下内容粘贴到文件中(将your_mastodon_domain.com
替换为你的实际域名):server { listen 80; server_name your_mastodon_domain.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name your_mastodon_domain.com; ssl_certificate /path/to/your/ssl/certificate.crt; # 你的 SSL 证书路径 ssl_certificate_key /path/to/your/ssl/private.key; # 你的