Docker部署Mastodon最新版v4.1.4

2023-10-19 20:59

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242328

相关文章

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2