Discourse 论坛在 无公网IP、无邮箱账户 的服务器上使用 Docker 直接安装

前言

Discourse 论坛官方安装文档中,极其依赖公网 IP、域名解析(用于 SSL 证书的自动配置)。

  1. 为了避免公网 IP 的配置影响导致快速部署 Discourse 论坛功能,所以本文不涉及域名及 SSL 证书。

Discourse 论坛是一个极其依赖邮件功能的服务。

  1. 为了避免邮箱账户的配置影响导致快速部署 Discourse 论坛功能,所以本文不配置邮箱账户。

Discourse 论坛官方安装文档中,需要克隆 GitHub 仓库代码(还有部分编译过程)。

  1. 为了避免网络问题影响导致快速部署 Discourse 论坛功能,所以全部使用事先编译完成的 Docker 镜像进行安装。

由于本文全部使用 Docker 镜像进行安装,没有官方文档的交互式操作,所以可能涉及后续的一些操作比较复杂。

  1. 需要进入 Docker 容器使用命令进行手动创建账户(因为没有配置邮箱账户)。
  2. 邮箱配置时需要调试环境变量(因为没有使用 GitHub 代码进行交互式操作)。
  3. 没有 Https SSL(因为需要公网 IP、域名)。

安装

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 拉取镜像,只需将上述的镜像修改为下方即可。同时支持 amd64arm64

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 论坛邮箱账户配置环境变量

https SSL 域名证书配置:Discourse 论坛自定义 https SSL 证书配置环境变量

阿里云对象储存配置:Discourse 论坛阿里云 OSS 对象存储配置环境变量

IP 地理信息查询:Discourse 论坛配置 IP 查询 MAXMIND

WebHooks 内网 IP 白名单:Discourse 论坛 WebHooks 内网 IP 白名单环境变量

验证码:

  1. Discourse 论坛 hCaptcha 验证码

第三方登录:官方插件

  1. Discourse 论坛配置 Discourse ID 登录
  2. Discourse 论坛配置 Google 登录
  3. Discourse 论坛配置 GitHub 登录
  4. Discourse 论坛配置 OAuth2 登录
  5. Discourse 论坛配置 Microsoft 微软 登录
  6. Discourse 论坛配置 Discord 登录

个人开发插件

百度统计配置:Discourse 论坛添加百度统计插件

第三方登录:

  1. Discourse 论坛 Gitee 码云 登录插件
  2. Discourse 论坛 微信扫码 登录插件

日志路径

路径
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/www/discourse/log/production.log
/var/www/discourse/log/sidekiq.log