静看光阴荏苒
不管不顾不问不说也不念

Docker快速部署Mastodon

最近打算记录自己一些零碎的信息,所以想来想去还是去弄个mastodon好了,反正正好有一台吃灰机器有2G内存,刚刚好。

说快速其实也不快速,只是我把坑都基本踩完了。。当然比起手动部署的话还是要快一点的,我之前也写过手动部署的方法。

官方其实不推荐用Docker,我也不知道为啥。。所以也没啥比较好的文档。

下面的步骤取自我目前的生产环境,有需要的可以参考参考。。

安装需要用到的软件包:

apt -y update
apt -y install curl git nginx python-certbot-nginx

安装docker:

curl -sSL https://get.docker.com/ | sh
systemctl enable --now nginx docker

安装docker-compose:

curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

拉取项目文件:

cd /opt
git clone https://github.com/tootsuite/mastodon.git
cd mastodon/

复制一份配置文件:

cp .env.production.sample .env.production

把项目内自带的docker-compose.yml重命名或者删了都可以,你直接用这个配置是肯定跑不起来的,有很多问题,这里就不细说了。

mv docker-compose.yml docker-compose.yml.bak

新建一个docker-compose.yml:

nano docker-compose.yml

这里我把自己目前在用的配置放上来:

version: '3.5'

services:
  mastodon-db:
    image: postgres:9.6-alpine
    shm_size: 256mb
    environment:
      POSTGRES_DB: mastodon
      POSTGRES_USER: imlala
      POSTGRES_PASSWORD: password
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  mastodon-redis:
    image: redis:6.0-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
    volumes:
      - ./redis:/data
    restart: unless-stopped

  mastodon-web:
    image: tootsuite/mastodon
    env_file: .env.production
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"]
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

  mastodon-streaming:
    image: tootsuite/mastodon
    env_file: .env.production
    command: node ./streaming
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"]
    ports:
      - "127.0.0.1:4000:4000"
    restart: unless-stopped

  mastodon-sidekiq:
    image: tootsuite/mastodon
    env_file: .env.production
    command: bundle exec sidekiq
    depends_on:
      - mastodon-db
      - mastodon-redis
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

接下来运行这个命令,进入配置向导:

docker-compose run --rm mastodon-web bundle exec rake mastodon:setup

按照下面的来即可:

Domain name: # 填写你的域名
Do you want to enable single user mode? # Yes
Are you using Docker to run Mastodon? # Yes
PostgreSQL host: # mastodon-db
PostgreSQL port: # 5432
Name of PostgreSQL database: # mastodon
Name of PostgreSQL user: # imlala
Password of PostgreSQL user: # 填你在compose内设置的密码
Redis host: # mastodon-redis
Redis port: # 6379
Redis password: # 留空,直接回车
Do you want to store uploaded files on the cloud? # No
Do you want to send e-mails from localhost? # Yes
Send a test e-mail with this configuration right now? # No
Save configuration? Yes

注:这个配置的是单用户模式,也就是默认不开放注册。其次没有配置SMTP,因为我就一个人用,所以就偷懒啦。

接下来它会把你填写的这些配置打印出来,现在你需要把你之前填的这些配置复制下来。

注意到了一个非常坑的地方,接下来你会看到下面这个提示:

Prepare the database now? (Y/n)

不要选择Y或者N,直接按键盘组合键Ctrl+C退出来。然后清空如下配置文件内的默认配置:

echo > .env.production

编辑它:

nano .env.production

把你之前通过向导复制的配置粘贴到里面保存。之后重新运行一次向导:

docker-compose run --rm mastodon-web bundle exec rake mastodon:setup

这次的配置和之前务必保持一致。再次来到下面这个位置的时候,就可以Yes了:

Prepare the database now? (Y/n) # Yes
Compile the assets now? (Y/n) # Yes

接下来的步骤就是创建管理员账户了,继续跟着这个向导走就OK了。

全部完成之后,up起来其他的服务:

docker-compose up -d

现在你还需要把public的目录所有者改为容器内的,不然后续不能上传头像:

chown -R 991:991 public

现在来复制一份nginx的站点配置文件:

cp /opt/mastodon/dist/nginx.conf /etc/nginx/conf.d/mastodon.conf

编辑mastodon.conf:

nano /etc/nginx/conf.d/mastodon.conf

在这个配置文件内,官方都写好了模板,你只需要改动两个server块下面的位置:

server {
  listen 80;
  listen [::]:80;
  server_name imlala.best; # 换成你的域名
  root /opt/mastodon/public; # public目录的绝对路径
...
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name imlala.best; # 换成你的域名
  root /opt/mastodon/public; # public目录的绝对路径
...
}

使用certbot签发SSL证书:

certbot --nginx

OK,到这里就大功告成了。

后续如果你要搬家,直接打包/opt/mastodon这个目录就好了,传到别的机器内解压后直接up起来就可以了。

要改动.env.production内的配置也是一样,改完之后up一次就可以。

更新的话参考官方的release发布页面,我这才装的最新版也没得更,不知道会不会有啥坑。

赞(1)
未经允许不得转载:荒岛 » Docker快速部署Mastodon
分享到: 更多 (0)

评论 22

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    如果用nginx反代本机3000端口能运行吗?

    1024.EE3年前 (2020-12-13) Google Chrome 86.0.4240.111 Google Chrome 86.0.4240.111 Android 10 Android 10回复
    • 当然可以,这篇文章里面的nginx配置文件就是反代本机的3000端口。

      LALA3年前 (2020-12-13) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  2. #2
    • 要不大佬你搭建一个,带我起飞?我不会玩虚拟币啊 :cry:

      LALA3年前 (2020-12-13) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  3. #3

    曾經嘗試過Docker部署,沒成功⋯⋯
    記得DigitalOcean上有一鍵Mastodon,什麼時候GCP和AWS的MarketPlace能加進去就好了

    henry3年前 (2020-12-13) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Mac OS X  11.0.1 Mac OS X 11.0.1回复
    • Docker部署这个确实有些地方有点蛋疼,它的向导提示有点误导人。。但是只要跑起来就方便很多了,后续要迁移什么的也简单很多。

      LALA3年前 (2020-12-13) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  4. #4

    lala,我知道一个很好用的记录零碎的信息的。那个也不占内存。https://chyrplite.net/。虽然比较小众但真的不错。

    hofaeair3年前 (2020-12-14) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 小小的内容真的需要这种

      hofaeair3年前 (2020-12-14) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 感谢分享,竟然还有中文文档的。

      LALA3年前 (2020-12-19) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  5. #5

    根据我的经验,一些自己想出来的英文单词[比如我的名字]都不会有人注册

    hofaeair3年前 (2020-12-14) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
  6. #6

    大佬这是什么?需要用到2G内存?网上查了下说是类似推特的微博客? :grin:

    Foliage3年前 (2020-12-14) Chrome 87.0.4280.77 Chrome 87.0.4280.77 iPhone iOS 14.2 iPhone iOS 14.2回复
    • 对,相当于一个Twitter,不过是分散式的。

      LALA3年前 (2020-12-19) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  7. #7

    la神你好,这篇文章有一个小问题就是数据库版本有些低了,造成自编译的镜像没法启动,数据库报错,建议提升版本12.5,而第二个就是输入环境变量时候可以再开一个终端建立那个文件输入,这样就可以不用再输入一遍流程,经常逛你去网站收获良多, :roll:

    白墨3年前 (2020-12-23) Google Chrome 87.0.4280.101 Google Chrome 87.0.4280.101 Android 10 Android 10回复
    • 是的,我当时也想用更新的版本,但是怕整出一些问题,所以还是直接复制的官方存储库里面的那个compose改的,我看它官方文档也是用的这个版本。。

      LALA3年前 (2020-12-24) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  8. #8

    感謝!之前嘗試過官方docker部署,一直沒有成功,現在可以了。
    有空的話,請問如何在本文基礎上,改成多用戶模式(開放註冊)?

    henry3年前 (2021-03-04) Google Chrome 88.0.4324.192 Google Chrome 88.0.4324.192 Mac OS X  11.2.2 Mac OS X 11.2.2回复
    • 在.env.production配置文件内把SINGLE_USER_MODE=true改成false,重启容器就可以了。

      LALA3年前 (2021-03-05) Google Chrome 88.0.4324.150 Google Chrome 88.0.4324.150 Windows 10 x64 Edition Windows 10 x64 Edition回复
  9. #9

    Hi,大佬,按教程所有的都部署好了,但是打开网址是空白的请问是怎么回事啊

    613年前 (2021-04-20) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 直接到了Welcome to nginx!界面

      613年前 (2021-04-20) Google Chrome 87.0.4280.88 Google Chrome 87.0.4280.88 Windows 10 x64 Edition Windows 10 x64 Edition回复
      • 检查一下nginx配置,这一般都是nginx的vhost没配置好。

        LALA3年前 (2021-04-21) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  10. #10

    大佬这个能在群晖上部署吗?全网找遍了都没有在群晖部署的实例,自己尝试了下没成功

    Darkeet2年前 (2022-04-26) Microsoft Edge 100.0.1185.50 Microsoft Edge 100.0.1185.50 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿