我的象牙塔我做主:Ubuntu 下 Docker 一键部署 Mastodon 完全指南

有没有那么一瞬间,你觉得现在的社交媒体有点儿...嗯...拥挤?想不想拥有一个完全属于自己的、干净清爽的社交空间,和同好们自由自在地交流?今天,我就带大家用 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 服务包含多个组件)。

如果你还不确定是否安装了,或者还没有安装,没关系,跟着下面的命令来:

  1. 更新你的系统软件包列表:

    Bash

    sudo apt update
    

    这个命令会从软件源服务器上下载最新的软件包信息,保持你的系统软件包处于最新状态。输入这个命令后,你可能会被要求输入你的用户密码,照做就行。

  2. 安装 Docker 的依赖包:

    Bash

    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
    

    这些软件包是 Docker 在安装和运行过程中所依赖的一些工具和库。

  3. 添加 Docker 的官方 GPG 密钥:

    Bash

    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    

    这个步骤是为了验证我们从 Docker 官方仓库下载的软件包是安全可靠的。

  4. 添加 Docker 的 APT 仓库到你的系统:

    Bash

    echo "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)。

  5. 再次更新软件包列表:

    Bash

    sudo apt update
    

    这次更新会把 Docker 仓库中的软件包信息也拉取下来。

  6. 安装 Docker Engine:

    Bash

    sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

    这条命令会安装 Docker Engine、Docker CLI (命令行工具)、containerd (容器运行时) 和 Docker Compose 插件。

  7. 验证 Docker 是否安装成功:

    Bash

    docker --version
    docker compose version
    

    如果成功安装,你会看到 Docker 和 Docker Compose 的版本信息输出。

第二步:创建 Mastodon 的工作目录和配置文件

接下来,我们需要为 Mastodon 创建一个专门的工作目录,并在其中准备好 Docker Compose 的配置文件。

  1. 创建一个目录来存放 Mastodon 的相关文件:

    Bash

    mkdir ~/mastodon
    cd ~/mastodon
    

    mkdir 命令用于创建目录,cd 命令用于切换到该目录下。你可以根据自己的喜好命名这个目录。

  2. 创建 docker-compose.yml 文件:

    在这个目录下,我们需要创建一个名为 docker-compose.yml 的文件。这个文件是 Docker Compose 的核心,它定义了 Mastodon 服务所需的各个容器以及它们之间的关系和配置。

    使用你喜欢的文本编辑器(比如 nanovim)创建并编辑这个文件:

    Bash

    nano docker-compose.yml
    

    然后,将下面的配置粘贴到文件中:

    YAML

    version: '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 文件中进行配置的。

  3. 创建 .env 环境变量配置文件:

    为了方便管理敏感信息和配置参数,我们通常会将这些信息放在一个名为 .env 的文件中。在你的 ~/mastodon 目录下创建并编辑这个文件:

    Bash

    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.ymlweb 服务下 environment 部分相关的 PAPERCLIP_STORAGES3_* 配置。

    保存并关闭 .env 文件。

第三步:初始化 Mastodon 并生成配置文件

现在我们已经有了 docker-compose.yml.env 文件,接下来我们需要启动 Mastodon 服务并进行一些初始化配置。

  1. 启动 Mastodon 服务:

    ~/mastodon 目录下运行以下命令:

    Bash

    docker compose up -d
    

    -d 参数表示在后台运行这些容器。Docker Compose 会根据 docker-compose.yml 文件的定义,自动下载所需的镜像并启动各个服务(redis, db, web, streaming, sidekiq)。

    第一次运行这个命令时,可能需要一些时间来下载 Docker 镜像,请耐心等待。

  2. 进行 Mastodon 的初始化设置:

    服务启动后,我们需要进入 web 容器中执行一些 Mastodon 提供的命令行工具来进行初始化设置。

    首先,获取 web 容器的名称(通常会是 mastodon-web-1):

    Bash

    docker ps
    

    在输出的列表中找到 image 列为 tootsuite/mastodon:v4.3.0 的那一行,记住它的 NAMES 列的值。

    然后,使用以下命令进入 web 容器的 bash shell(将 mastodon-web-1 替换为你实际的容器名称):

    Bash

    docker exec -it mastodon-web-1 bash
    

    现在你已经进入了容器的内部。接下来,我们需要生成 Mastodon 的配置文件。运行以下命令:

    Bash

    RAILS_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。

  3. 预编译 Assets:

    回到你的服务器终端(~/mastodon 目录下),运行以下命令预编译 Mastodon 的静态资源文件:

    Bash

    docker compose exec web bundle exec rake assets:precompile
    

    这个过程可能需要一些时间,请耐心等待。

  4. 初始化数据库:

    运行以下命令初始化 Mastodon 的数据库:

    Bash

    docker compose exec web bundle exec rake db:migrate
    

    这个命令会将数据库结构更新到最新的状态。

  5. 重启 Mastodon 服务:

    完成以上步骤后,我们需要重启 Mastodon 服务来使配置生效:

    Bash

    docker 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 为例进行说明:

  1. 安装 Nginx:

    如果你的服务器上还没有安装 Nginx,可以使用以下命令进行安装:

    Bash

    sudo apt install nginx
    
  2. 配置 Nginx 虚拟主机:

    创建一个新的 Nginx 配置文件,比如 /etc/nginx/sites-available/mastodon.conf,并将以下内容粘贴到文件中(将 your_mastodon_domain.com 替换为你的实际域名):

    Nginx

    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; # 你的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值