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 / 开源方案的逐项对比见对比选型。