前言
Discourse 论坛官方安装文档中,极其依赖公网 IP、域名解析(用于 SSL 证书的自动配置)。
为了避免公网 IP 的配置影响导致快速部署 Discourse 论坛功能,所以本文不涉及域名及 SSL 证书。
Discourse 论坛是一个极其依赖邮件功能的服务。
为了避免邮箱账户的配置影响导致快速部署 Discourse 论坛功能,所以本文不配置邮箱账户。
Discourse 论坛官方安装文档中,需要克隆 GitHub 仓库代码(还有部分编译过程)。
为了避免网络问题影响导致快速部署 Discourse 论坛功能,所以全部使用事先编译完成的 Docker 镜像进行安装。
由于本文全部使用 Docker 镜像进行安装,没有官方文档的交互式操作,所以可能涉及后续的一些操作比较复杂。
需要进入 Docker 容器使用命令进行手动创建账户(因为没有配置邮箱账户)。
邮箱配置时需要调试环境变量(因为没有使用 GitHub 代码进行交互式操作)。
没有 Https SSL(因为需要公网 IP、域名)。
安装
最低配置:1核心 2G内存 2G交换空间,备份数据时可能会导致服务器变慢,严重时可能导致服务器无响应
推荐配置:2核心 4G内存 4G交换空间
docker-compose.yml
# Discourse 部署的 Docker Compose 配置
# 使用 YAML Anchor (&discourse_env) 复用环境变量到多个服务
#
x-discourse-env: &discourse_env
# PostgreSQL 主机名(容器服务名)
DISCOURSE_DB_HOST: postgres
# 数据库名称
DISCOURSE_DB_NAME: ${DISCOURSE_DB_NAME:-discourse}
# 数据库密码
DISCOURSE_DB_PASSWORD: ${DISCOURSE_DB_PASSWORD:-discourse}
# 数据库端口
DISCOURSE_DB_PORT: 5432
# 数据库用户名
DISCOURSE_DB_USERNAME: ${DISCOURSE_DB_USERNAME:-discourse}
# 站点默认语言代码(如 zh_CN、en)
DISCOURSE_DEFAULT_LOCALE: ${DISCOURSE_DEFAULT_LOCALE:-zh_CN}
# 站点域名或 IP,用于生成链接与回调
DISCOURSE_HOSTNAME: 172.25.25.5
# Redis 主机名(容器服务名)
DISCOURSE_REDIS_HOST: redis
# PostgreSQL 容器初始化的数据库名称
POSTGRES_DB: ${DISCOURSE_DB_NAME:-discourse}
# PostgreSQL 超级用户密码
POSTGRES_PASSWORD: ${DISCOURSE_DB_PASSWORD:-discourse}
# PostgreSQL 用户名
POSTGRES_USER: ${DISCOURSE_DB_USERNAME:-discourse}
# Rails 运行环境(production/development)
RAILS_ENV: production
# 应用服务定义
services:
# PostgreSQL 数据库,带 pgvector 扩展,存储 Discourse 业务数据
postgres:
container_name: discourse-postgres
image: pgvector/pgvector:0.8.1-pg15
environment:
<<: *discourse_env
volumes:
- discourse_postgres:/var/lib/postgresql/data
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${DISCOURSE_DB_USERNAME:-discourse} -d ${DISCOURSE_DB_NAME:-discourse}" ]
interval: 10s
timeout: 5s
retries: 10
#ports:
# - "5432:5432"
restart: unless-stopped
networks:
- discourse
init: true
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Redis 缓存
redis:
container_name: discourse-redis
image: redis:7.4.7-alpine
volumes:
- discourse_redis:/data
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 10
#ports:
# - "6379:6379"
restart: unless-stopped
networks:
- discourse
init: true
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Web 应用容器,提供 HTTP 服务与静态资源
web:
container_name: discourse-web
image: discourse/discourse:2025.12.0-latest
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
<<: *discourse_env
volumes:
- discourse_uploads:/var/www/discourse/public/uploads
- discourse_shared:/shared
ports:
- "80:80"
- "443:443"
restart: unless-stopped
networks:
- discourse
init: true
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Sidekiq 后台任务工作进程(异步作业)
sidekiq:
container_name: discourse-sidekiq
image: discourse/discourse:2025.12.0-latest
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
profiles:
- worker
environment:
<<: *discourse_env
volumes:
- discourse_uploads:/var/www/discourse/public/uploads
restart: unless-stopped
networks:
- discourse
init: true
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# 持久化存储卷定义
volumes:
discourse_postgres:
discourse_redis:
discourse_uploads:
discourse_shared:
# 私有网络定义,用于隔离与服务间通信
networks:
discourse:
只需要将上述的 DISCOURSE_HOSTNAME: 172.25.25.5 修改为自己的机器 IP 即可
执行 docker compose up -d 即可完成。等待安装启动完成,访问机器 IP 即可
如果无法访问 Docker Hub 拉取镜像,只需将上述的镜像修改为下方即可。同时支持 amd64、arm64
docker hub 镜像
作者镜像
pgvector/pgvector:0.8.1-pg15
registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/pgvector:0.8.1-pg15
redis:7.4.7-alpine
registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/redis:7.4.7-alpine
discourse/discourse:2025.12.0-latest
registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/discourse:2025.12.0-latest
由于上述 docker-compose.yml 没有配置邮件,需要使用下方命令创建管理员、普通用户(由于没有配置邮箱服务,此处是不会发送邮件的)
# 进入 discourse-web 容器
docker exec -it discourse-web bash
# 在 discourse-web 容器内,执行创建用户命令
rake admin:create
# 提示输入邮箱:
Email: xuxiaowei@xuxiaowei.com.cn
# 提示输入密码:
Password:
# 提示重复输入上述密码:
Repeat password:
# 确保账户处于活跃状态!
Ensuring account is active!
# 账户已成功创建,用户名为 user1
Account created successfully with username user1
# 你想给这个账户授予管理员权限吗?(Y/n) y
Do you want to grant Admin privileges to this account? (Y/n) y
# 你的账户现在拥有管理员权限!
Your account now has Admin privileges!
验证码:
Discourse 论坛 hCaptcha 验证码
第三方登录:官方插件
Discourse 论坛配置 Discourse ID 登录
Discourse 论坛配置 Google 登录
Discourse 论坛配置 GitHub 登录
Discourse 论坛配置 OAuth2 登录
Discourse 论坛配置 Microsoft 微软 登录
Discourse 论坛配置 Discord 登录
个人开发插件
第三方登录:
Discourse 论坛 Gitee 码云 登录插件
Discourse 论坛 微信扫码 登录插件
日志路径
路径
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/www/discourse/log/production.log
/var/www/discourse/log/sidekiq.log