本文主要是介绍Docker部署Mastodon最新版v4.1.4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
只部署服务,不讲原理。
本机配置:MacBook Pro M2 Max 32 GB
Mastodon 介绍
Mastodon 是一个自由、开源的去中心化的微博客平台,类似于 Twitter,但是使用分布式的架构,用户可以在不同的实例(服务器)之间自由迁移,并且可以互相关注和互相交流。Mastodon 的用户可以发布短文本、图片、视频、音频等内容,并且可以使用标签来组织和浏览内容。
Mastodon 的用户界面简洁、易用,支持自定义主题和语言,同时也支持多种客户端应用程序,包括 Web、Android、iOS 等。Mastodon 的消息是加密的,用户可以选择公开或私密地发布消息,同时也可以选择将消息限制在特定的用户或实例之间。
Mastodon 的去中心化架构使得其具有较高的安全性和可靠性,不易受到单点故障和攻击。同时,Mastodon 的开源性质也使得其具有较高的灵活性和可扩展性,开发者可以根据自己的需求进行定制和扩展。
总之,Mastodon 是一个自由、开源、去中心化的微博客平台,为用户提供了更加安全、可靠、灵活的社交体验。
(介绍来自ChatGPT3.5)
部署实践
搜索Mastodon你会发现有很多容器化部署的文章,可以参考借鉴。从完全部署运行后给我的感觉,只要认真看过官方文档,就能顺利的进行部署。
需要注意的细节,写最前面了
1,本地没有build镜像,使用的是官方镜像:
docker pull ghcr.io/mastodon/mastodon
2,networks与官方不同,因为我本地容器服务internal_、external_被占用了。另外traefik网络是为了与反向代理服务进行互通。不了解的可以参考以前文章
官方:
networks:- internal_network- external_network
本地配置:
networks:- mastodon_networks- traefik
3,一定要保证容器之间是互通的,否则找不到服务,会导致启动失败。
4,.env.production 配置文件在初始化安装的时候不需要引入!
5,创建网卡
docker network create mastodon_networks
1,使用官方docker-compose进行配置拆分
官方docker-compose配置、官方README 根据官方的配置文件共分为db、es、web、streaming、sidekiq5个服务融合在一起,不利于后期维护和服务更新。下面进行配置拆分。共拆分为4个服务。
1.1,PostgreSQL 配置
保存以下配置文件名为:docker-compose.postgresql.yml
version: '3'
services:postgresql:restart: alwaysimage: postgres:14-alpineshm_size: 256mb# 可视化连接使用ports:- 54322:5432networks:- mastodon_networkshealthcheck:test: ['CMD', 'pg_isready', '-U', 'postgres']volumes:- ./postgres14:/var/lib/postgresql/dataenvironment:POSTGRES_HOST_AUTH_METHOD: trust# 设置个密码 可视化工具连接使用POSTGRESQL_PASSWORD: bitnami1
networks:mastodon_networks:external: true
1.2,Redis 配置
保存以下配置文件名为:docker-compose.redis.yml
version: '3'
services:redis:restart: alwaysimage: redis:7-alpinehealthcheck:test: ['CMD', 'redis-cli', 'ping']volumes:- ./redis:/datanetworks:- mastodon_networks
networks:mastodon_networks:external: true
1.3,Elasticsearch 配置
保存以下配置文件名为:docker-compose.elasticsearch.yml
version: '3'services:elasticsearch:restart: alwaysimage: docker.elastic.co/elasticsearch/elasticsearch:7.17.4environment:- "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"- "xpack.license.self_generated.type=basic"- "xpack.security.enabled=false"- "xpack.watcher.enabled=false"- "xpack.graph.enabled=false"- "xpack.ml.enabled=false"- "bootstrap.memory_lock=true"- "cluster.name=es-mastodon"- "discovery.type=single-node"- "thread_pool.write.queue_size=1000"networks:- mastodon_networkshealthcheck:test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]volumes:- ./elasticsearch:/usr/share/elasticsearch/dataulimits:memlock:soft: -1hard: -1nofile:soft: 65536hard: 65536ports:- '9200:9200'networks:mastodon_networks:external: true
1.4,服务web、streaming、sidekiq的配置
.env.production.sample 复制文件内容并保存为:.env.production
保存以下配置文件名为:docker-compose.start.yml
version: '3'
services:web:image: ghcr.io/mastodon/mastodonrestart: alwaysenv_file: .env.productionenvironment:RAILS_ENV: productioncommand: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"healthcheck:# prettier-ignoretest:['CMD-SHELL','wget -q --spider --proxy=off localhost:3000/health || exit 1']volumes:- ./public/system:/mastodon/public/systemnetworks:- mastodon_networks- traefikstreaming:image: ghcr.io/mastodon/mastodonrestart: alwaysenv_file: .env.productioncommand: node ./streamingenvironment:- "NODE_ENV=production"healthcheck:# prettier-ignoretest:['CMD-SHELL','wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']networks:- mastodon_networks- traefiksidekiq:image: ghcr.io/mastodon/mastodonrestart: alwaysenv_file: .env.productionenvironment:- "RAILS_ENV=production"command: bundle exec sidekiqnetworks:- mastodon_networks- traefikvolumes:- ./public/system:/mastodon/public/systemhealthcheck:test: [ 'CMD-SHELL', "ps aux | grep '[s]idekiq 6' || false" ]networks:mastodon_networks:external: truetraefik:external: true
1.5,配置前端代理服务
NGINX配置参考官方配置nginx-configuration,删除了一下其他配置。修改了client_max_body_size为100,解决上传大图片返回413错误。(自行调整)
保存以下配置文件名为:docker-compose.index.yml
version: "3.6"
services:mastodon-halobug:image: nginx:1.21.4-alpinerestart: alwaysexpose:- 80volumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- ./nginx.index.conf:/etc/nginx/conf.d/default.confnetworks:- traefik- mastodon_networkslabels:- "traefik.enable=true"- "traefik.docker.network=traefik"- "traefik.http.routers.mastodon-halobug.entrypoints=https"- "traefik.http.routers.mastodon-halobug.tls=true"- "traefik.http.routers.mastodon-halobug.rule=Host(`chat.halobug.cn`)"- "traefik.http.services.mastodon-halobug-backend.loadbalancer.server.scheme=http"- "traefik.http.services.mastodon-halobug-backend.loadbalancer.server.port=80"logging:driver: "json-file"options:max-size: "1m"
networks:mastodon_networks:external: truetraefik:external: true
保存以下配置文件名为:nginx.index.conf
map $http_upgrade $connection_upgrade {default upgrade;'' close;
}
server {listen 80;server_name default_server;keepalive_timeout 70;sendfile on;client_max_body_size 100m;root /home/mastodon/live/public;gzip on;gzip_disable "msie6";gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;add_header Strict-Transport-Security "max-age=31536000";location / {try_files $uri @proxy;}location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {add_header Cache-Control "public, max-age=31536000, immutable";try_files $uri @proxy;}location /sw.js {add_header Cache-Control "public, max-age=0";try_files $uri @proxy;}location @proxy {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto "https";proxy_set_header Proxy "";proxy_pass_header Server;proxy_pass http://web:3000;proxy_buffering on;proxy_redirect off;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;tcp_nodelay on;}location /api/v1/streaming {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto "https";proxy_set_header Proxy "";proxy_pass http://streaming:4000;proxy_buffering off;proxy_redirect off;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;tcp_nodelay on;}
}
2,搭建文件存储服务
2.1,运行Minio
保存以下配置文件名为:docker-compose.minio.yml
version: "3"services:mastodon-minio-nginx:image: nginx:1.21.4-alpinevolumes:- ./nginx.minio.conf:/etc/nginx/conf.d/default.conf:roexpose:- 80environment:- NGINX_HOST=localhost- NGINX_PORT=80networks:- traefik- mastodon_networkslabels:- "traefik.enable=true"- "traefik.docker.network=traefik"- "traefik.http.routers.mastodon-oss-http.entrypoints=http"- "traefik.http.routers.mastodon-oss-http.rule=Host(`oss.halobug.cn`)"- "traefik.http.routers.mastodon-oss-https.entrypoints=https"- "traefik.http.routers.mastodon-oss-https.tls=true"- "traefik.http.routers.mastodon-oss-https.rule=Host(`oss.halobug.cn`)"- "traefik.http.services.mastodon-oss-backend.loadbalancer.server.scheme=http"- "traefik.http.services.mastodon-oss-backend.loadbalancer.server.port=80"depends_on:- miniominio:image: minio/minio:RELEASE.2022-01-08T03-11-54Zvolumes:- ./minio/data:/data:zcommand: minio server /data --address 0.0.0.0:80 --listeners 1 --console-address 0.0.0.0:9001environment:MINIO_ROOT_USER: umf3V1C3Hu5TzCDDqIXFbDDviYGhV627MINIO_ROOT_PASSWORD: OqIwA1GJADWgCf5yvlRTKTJ6bTYAhaO9exqX5lo3GlOlLfVcIbn4v2CsuamBMINIO_REGION_NAME: cn-homelab-1MINIO_BROWSER: onMINIO_BROWSER_REDIRECT_URL: https://mastodon-s3.halobug.cnMINIO_PROMETHEUS_AUTH_TYPE: publicrestart: alwaysports:- 9001:9001expose:- 80networks:- traefik- mastodon_networkslabels:- "traefik.enable=true"- "traefik.docker.network=traefik"- "traefik.http.middlewares.minio-gzip.compress=true"- "traefik.http.routers.minio-admin.middlewares=minio-gzip"- "traefik.http.routers.minio-admin.entrypoints=https"- "traefik.http.routers.minio-admin.tls=true"- "traefik.http.routers.minio-admin.rule=Host(`mastodon-s3.halobug.cn`)"- "traefik.http.routers.minio-admin.service=minio-admin-backend"- "traefik.http.services.minio-admin-backend.loadbalancer.server.scheme=http"- "traefik.http.services.minio-admin-backend.loadbalancer.server.port=80"healthcheck:test: ["CMD", "curl", "-f", "http://localhost:80/minio/health/live"]interval: 3sretries: 12logging:driver: "json-file"options:max-size: "10m"
networks:traefik:external: truemastodon_networks:external: true
保存以下配置文件名为:nginx.minio.conf
server {listen 80;server_name localhost;keepalive_timeout 70;sendfile on;client_max_body_size 80m;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Host $http_host;proxy_connect_timeout 300;proxy_http_version 1.1;proxy_set_header Connection "";chunked_transfer_encoding off;proxy_pass http://minio/mastodon/;}location /health {access_log off;return 200 "ok";}
}
运行minio
docker-compose -f docker-compose.minio.yml up -d
2.2,初始化Minio
保存以下配置文件名为:docker-compose.minio.init.yml
version: "3"
services:minio-client:image: minio/mc:RELEASE.2022-01-07T06-01-38Zentrypoint: >/bin/sh -c "/usr/bin/mc config host rm local;/usr/bin/mc config host add --quiet --api s3v4 local http://minio umf3V1C3Hu5TzCDDqIXFbDDviYGhV627 OqIwA1GJADWgCf5yvlRTKTJ6bTYAhaO9exqX5lo3GlOlLfVcIbn4v2CsuamB;/usr/bin/mc mb --quiet local/mastodon/;/usr/bin/mc policy set public local/mastodon;" networks:- traefiknetworks:traefik:external: true
运行命令(运行一次即可)
docker-compose -f docker-compose.minio.init.yml up

本地绑定hosts
127.0.0.1 mastodon-s3.halobug.cn oss.halobug.cn
浏览器访问 http://127.0.0.1:9001
初始化完成后查看Buckets

到此存储服务部署完成,下面开始启动基础服务。
所有配置文件

3,启动基础服务
3.1,运行PostgreSQL
docker-compose -f docker-compose.postgresql.yml up -d
3.2,运行Redis
docker-compose -f docker-compose.redis.yml up -d
3.3,运行Elasticsearch
docker-compose -f docker-compose.elasticsearch.yml up -d
全部使用官方镜像,启动成功后如下图所示:

4,安装Mastodon
4.1,容器内执行安装命令
上一步已经说了,安装的注意事项。再次提醒心急的同学们。
.env.production 配置文件在初始化安装的时候不需要引入
执行安装命令:
docker-compose -f docker-compose.start.yml run --rm web bundle exec rake mastodon:setup

按照安装引导进行配置

安装完成后的配置

# Generated with mastodon:setup on 2023-07-13 04:02:06 UTC# Some variables in this file will be interpreted differently whether you are
# using docker-compose or not.LOCAL_DOMAIN=chat.halobug.cn
SINGLE_USER_MODE=false
SECRET_KEY_BASE=d2f61bffbf601042a51bbbae7732ebb93a5803ac40713e3275220aa5894d1132bd4e0870c4fa3f17f99f5d7e06e7c83a46ec0f31b31c60b38242d8d07f042b96
OTP_SECRET=cecbae5d4595c57299b3d30eabc21f8c16c54d508a66547bbff107ad6d029a9129c252067aae6b9b725c7ce547a68b65a1eff5fc34efb112a35089fab193820d
VAPID_PRIVATE_KEY=9G4BjizL7_qyW8IwDhF-ILX_fdURffERFK8HT7sGrOs=
VAPID_PUBLIC_KEY=BIuyba_wWuguaTSZMqiFPOd6CzIv3wHKwdiD38oeOm5_IYfFIC0F3YOK7Muh7XO2EwLf3Og0ToprvQ-lejhsEpk=
DB_HOST=postgresql
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASS=bitnami1
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_ENABLE_STARTTLS=auto
SMTP_FROM_ADDRESS=Mastodon <notifications@chat.halobug.cn>
之后你会发现运行有个异常,因为docker-compose.start.yml文件里还有streaming、sidekiq这两个服务。并且到此使用的还是官方默认的配置文件、找不到对应的基础服务造成的。按照输出的配置重新修改即可。

4.2,将安装后配置参数值,复制至官方配置文件中
需要注意的是,安装引导没有Elasticsearch的指导。在配置文件中加上即可,ES_USER、ES_PASS设为空。
SMTP配置:我有阿里云服务所以直接配置了。(你也可以自己申请SMTP,自己搜索吧)
4.3,S3存储配置
S3_ENABLED=true
S3_PROTOCOL=https
S3_BUCKET=mastodon
S3_REGION=cn-homelab-1
S3_ALIAS_HOST=oss.halobug.cn
S3_ENDPOINT=https://mastodon-s3.halobug.cn
AWS_ACCESS_KEY_ID=umf3V1C3Hu5TzCDDqIXFbDDviYGhV627
AWS_SECRET_ACCESS_KEY=OqIwA1GJADWgCf5yvlRTKTJ6bTYAhaO9exqX5lo3GlOlLfVcIbn4v2CsuamB
因为是单机部署,容器间通讯用无法使用https,所以在docker-compose.start.yml中web、streaming、sidekiq 配置中增加extra_hosts。192.168.12.89 为局域网IP。
extra_hosts:- "mastodon-s3.halobug.cn:192.168.12.89"
配置参考图:
4.4,将env_file的注释“打开”
4.1注释了配置文件,现在重新“打开”
之后进入启动服务的流程
5,启动服务
5.1,运行Mastodon
启动命令:
docker-compose -f docker-compose.start.yml up -d
查看日志:
docker-compose -f docker-compose.start.yml logs -f
启动后如图所示
正常运行后,还差最后一步,即可对外提供服务。
5.2,启动 docker-compose.index.yml
自行配置https,可参考以前文章。
启动命令:
docker-compose -f docker-compose.index.yml up -d

本地绑定hosts。
127.0.0.1 chat.halobug.cn
6,注册使用
6.1,访问
浏览器访问 https://chat.halobug.cn
6.2,注册账号进行测试

6.3,邮件验证
过不了多久就收到一封邮件进行确认。

6.4,点开邮件中的连接,验证即可。成功后的页面

6.5,发布你的第一条动态吧。你好,世界!


到此服务搭建成功。
参考3.4版本的文章
这篇关于Docker部署Mastodon最新版v4.1.4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!