Docker Compose 生产部署

Docker Compose(英文)

本页把 IMCore 基础版从零部署到一台公网 VPS:Docker Compose 拉起 PostgreSQL + Redis + 服务端,Caddy 自动签发 HTTPS 证书并反代 WebSocket。全程约 15 分钟。

只想先本地看看效果?用快速开始里的一条命令体验配置(占位密钥,勿对公网)。 本文与 Kubernetes 部署、systemd 部署(发行包 README)是并列的三种受支持形态,每套环境选一种。

前置条件

  • 一台 Linux 服务器(建议 2C4G 起步;单实例 4C8G 的实测容量见自建聊天服务器:选型与架构)
  • 一个域名,A 记录指向服务器公网 IP(示例中为 im.example.com,替换成你的)
  • Docker Engine 24+ 与 Docker Compose v2.23+(docker compose version 确认)
  • 开放 80 / 443 端口(Caddy 签发证书需要 80,服务需要 443)

1. 目录与密钥

mkdir -p /opt/imcore && cd /opt/imcore

生成三个密钥并记下(后两步要用):

openssl rand -base64 24   # POSTGRES_PASSWORD
openssl rand -base64 32   # JWT_SECRET(签发客户端 token 用)

2. 服务端配置 app.yaml

创建 /opt/imcore/app.yaml。与本地体验配置的差别只有三处:占位密钥换成刚生成的值、URL 换成你的域名(https/wss)、关闭演示模式:

app:
  logFile: log/gin.log
  httpPort: 8080
  standalone_websocket_enabled: false
  webSocketPort: 8089
  rpcPort: 9001
  httpUrl: https://im.example.com
  webSocketUrl: wss://im.example.com/acc
  autoOpenBrowser: false

redis:
  addr: "redis:6379"
  username: ""
  password: ""
  DB: 0
  poolSize: 50
  minIdleConns: 10

database:
  driver: "postgres"

postgres:
  dsn: "postgres://imcore:<POSTGRES_PASSWORD>@postgres:5432/imcore?sslmode=disable&connect_timeout=5"
  im:
    dsn: "postgres://imcore:<POSTGRES_PASSWORD>@postgres:5432/imcore?sslmode=disable&connect_timeout=5"

auth:
  jwt_secret: "<JWT_SECRET>"
  jwt_issuer: "imcore-prod"
  jwt_audience: "gowebsocket-client"
  jwt_required: true
  allow_empty_origin: false

demo:
  product_mode: false
  guest_token_enabled: false
  seed:
    enabled: false

broker:
  type: ""
rabbitmq:
  enabled: false

要点:

  • postgres.dsn 里的 <POSTGRES_PASSWORD> 替换成第 1 步生成的数据库密码(出现两处)。
  • demo.* 全部关闭——游客免登录与演示群只属于本地体验配置。
  • 基础版单实例不需要消息 broker;集群形态(专业版起)见最后一节。
  • 付费版本把授权文件放到服务器并在 license.file 中指向它(基础版无需)。

3. docker-compose.yml

创建 /opt/imcore/docker-compose.yml:

name: imcore

services:
  postgres:
    image: pgvector/pgvector:pg16
    environment:
      POSTGRES_USER: imcore
      POSTGRES_PASSWORD: <POSTGRES_PASSWORD>
      POSTGRES_DB: imcore
    volumes:
      - pgdata:/var/lib/postgresql/data
    configs:
      - source: initdb_vector
        target: /docker-entrypoint-initdb.d/01-vector.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U imcore -d imcore"]
      interval: 5s
      timeout: 5s
      retries: 12
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 12
    restart: unless-stopped

  # One-shot:应用数据库迁移后退出。升级时随 `docker compose up -d` 自动重跑。
  migrate:
    image: ${IMCORE_IMAGE:-crpi-zegbek7xpkekqods.cn-hangzhou.personal.cr.aliyuncs.im/balala/imcore-basic:latest}
    environment:
      APP_BIN: migrate
    configs:
      - source: app_yaml
        target: /app/config/app.yaml
    depends_on:
      postgres:
        condition: service_healthy
    restart: "no"

  imcore:
    image: ${IMCORE_IMAGE:-crpi-zegbek7xpkekqods.cn-hangzhou.personal.cr.aliyuncs.im/balala/imcore-basic:latest}
    configs:
      - source: app_yaml
        target: /app/config/app.yaml
    depends_on:
      migrate:
        condition: service_completed_successfully
      redis:
        condition: service_healthy
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - imcore
    restart: unless-stopped

configs:
  app_yaml:
    file: ./app.yaml
  initdb_vector:
    content: |
      CREATE EXTENSION IF NOT EXISTS vector;

volumes:
  pgdata:
  caddy_data:
  caddy_config:

说明:

  • 默认镜像走阿里云 ACR(国内拉取稳定)。海外服务器用 Docker Hub:IMCORE_IMAGE=balalaim/imcore-basic:latest docker compose up -d。
  • imcore 不发布端口,只有 Caddy 能经 compose 内网访问它——数据库、Redis 同理,均不暴露公网。
  • initdb_vector 在首次建库时启用 pgvector 扩展(客服版 RAG 的向量表依赖它),仅空库初始化时执行。
  • 内网 / 离线环境:先在有网机器 docker pull 全部镜像,docker save 拷入后 docker load。

4. Caddyfile(自动 HTTPS)

创建 /opt/imcore/Caddyfile,域名替换成你的:

im.example.com {
	encode gzip zstd
	reverse_proxy imcore:8080
}

Caddy 自动从 Let’s Encrypt 签发并续期证书;WebSocket 升级经 reverse_proxy 自动透传,/acc 无需额外配置。

5. 启动与验证

docker compose up -d
docker compose ps        # postgres/redis/imcore/caddy 为 Up,migrate 为 Exited(0)
docker compose logs migrate   # 确认迁移全部应用

浏览器打开 https://im.example.com 能看到站点即服务端就绪。客户端按《客户端接入指南》由你的业务后端签发 JWT 后连接 wss://im.example.com/acc。

升级与备份

# 升级:拉新镜像重新 up(migrate 自动应用新版本迁移)
docker compose pull
docker compose up -d

# 备份数据库(建议 cron 每日)
docker compose exec postgres pg_dump -U imcore imcore > imcore-$(date +%F).sql

回滚:换回旧镜像 tag 重新 up -d(迁移向下兼容策略见发行包 README)。

什么时候需要更多组件

需求 加什么
多实例水平扩展(专业版起) RabbitMQ / NATS / Redis Streams broker + persist_consumer,多副本共享同一 Redis 与 broker
容器编排、HPA、滚动升级 Kubernetes(Helm)
AI 客服 / RAG 知识库 客服版镜像 + PostgreSQL(pgvector,本配置已就绪)
单机偏好 systemd 直跑 发行包 README 的 systemd 路径

选型背景与容量参考见自建聊天服务器:选型与架构;与 SaaS / 开源方案的逐项对比见对比选型。