WeKnora All-in-One Docker 部署
一键启动 WeKnora 整站(PostgreSQL + Redis + Nginx + WeKnora API + Docreader),单容器搞定所有依赖。
镜像地址
host1syan/weknora:latest
host1syan/weknora:0.6.2
系统要求
- Docker 20.10+
- CPU: x86_64,4 核以上推荐
- 内存: 最低 4GB,生产 8GB+
- 磁盘: 镜像约 3GB,数据卷另计
快速启动
# 拉取
docker pull host1syan/weknora:latest
# 运行(最小配置)
docker run -d \
--name weknora \
-p 80:80 \
-e MODEL_API_KEY=sk-your-api-key \
-v weknora-data:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
启动后访问 http://localhost,API 端点 http://localhost/api/v1。
首次启动会初始化数据库、执行迁移,约需 30-60 秒。健康检查通过后即可使用。
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
MODEL_API_KEY |
— | 必填 LLM API Key |
MODEL_PROVIDER |
openai |
LLM 提供商,如 openai/azure/ollama |
MODEL_BASE_URL |
— | LLM API 地址(兼容 OpenAI 格式) |
MODEL_NAME |
gpt-4o |
模型名 |
DB_NAME |
weknora |
PostgreSQL 数据库名 |
DB_USER |
weknora |
PostgreSQL 用户 |
DB_PASSWORD |
weknora |
PostgreSQL 密码 |
REDIS_PASSWORD |
— | Redis 密码(空=无密码) |
JWT_SECRET |
自动生成 | JWT 签名密钥,首次运行后持久化到数据卷 |
SYSTEM_AES_KEY |
自动生成 | 系统 AES 密钥 |
TENANT_AES_KEY |
自动生成 | 租户 AES 密钥 |
MAX_FILE_SIZE_MB |
50 |
上传文件大小限制(MB) |
密钥相关变量仅在首次启动时生效,之后写入 data/files/.keys,重启不再滚动。
数据卷
| 挂载点 | 用途 | 推荐 |
|---|---|---|
/var/lib/postgresql/data |
PostgreSQL 数据文件 | 必挂,否则容器删除后数据丢失 |
/data/files |
用户上传文件、密钥持久化 | 必挂 |
完整示例
使用 OpenAI
docker run -d \
--name weknora \
-p 80:80 \
-e MODEL_API_KEY=sk-xxxxxxxxxxxx \
-e MODEL_NAME=gpt-4o \
-v weknora-pgdata:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
使用 Ollama(本地模型)
docker run -d \
--name weknora \
-p 80:80 \
--add-host host.docker.internal:host-gateway \
-e MODEL_PROVIDER=openai \
-e MODEL_API_KEY=ollama \
-e MODEL_BASE_URL=http://host.docker.internal:11434/v1 \
-e MODEL_NAME=qwen2.5:7b \
-v weknora-pgdata:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
映射自定义端口
docker run -d \
--name weknora \
-p 8080:80 \
-e MODEL_API_KEY=sk-xxxxxxxxxxxx \
-v weknora-pgdata:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
设置 Redis 密码
docker run -d \
--name weknora \
-p 80:80 \
-e MODEL_API_KEY=sk-xxxxxxxxxxxx \
-e REDIS_PASSWORD=myredispass \
-v weknora-pgdata:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
健康检查
容器内置 healthcheck,每 30 秒检查 /health 端点:
# 查看容器健康状态
docker inspect --format='{{json .State.Health}}' weknora | jq
# 手动检查
curl -s http://localhost/health
# → {"status":"ok"}
日志查看
# 所有服务日志(supervisor stdout)
docker logs -f weknora
# 只看 WeKnora 进程日志
docker exec weknora tail -f /dev/stdout
进入容器
docker exec -it weknora bash
内部服务端口:
- WeKnora API: 127.0.0.1:8080
- PostgreSQL: 127.0.0.1:5432
- Redis: 127.0.0.1:6379
- Docreader (gRPC): 127.0.0.1:50051
- Nginx: 80
停止与清理
# 停止容器
docker stop weknora
# 删除容器(数据卷保留)
docker rm weknora
# 删除容器并清理数据卷
docker rm -v weknora
docker volume rm weknora-pgdata weknora-files
升级
# 拉取新版
docker pull host1syan/weknora:latest
# 停旧容器
docker stop weknora && docker rm weknora
# 用相同数据卷启动新版
docker run -d \
--name weknora \
-p 80:80 \
-e MODEL_API_KEY=sk-xxxxxxxxxxxx \
-v weknora-pgdata:/var/lib/postgresql/data \
-v weknora-files:/data/files \
host1syan/weknora:latest
数据库迁移自动执行,无需手动操作。
架构
┌─────────────────────────────────────────┐
│ single container │
│ ┌────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Nginx │→ │WeKnora │→ │PostgreSQL│ │
│ │ :80 │ │ :8080 │ │ :5432 │ │
│ └────────┘ └────┬────┘ └─────────┘ │
│ │ │
│ ┌───────▼──────┐ ┌────────┐ │
│ │ Docreader │ │ Redis │ │
│ │ gRPC :50051 │ │ :6379 │ │
│ └──────────────┘ └────────┘ │
│ supervisor manages all 5 processes │
└─────────────────────────────────────────┘
构建说明(自行构建)
项目采用 COPY-only 策略:宿主机构建编译产物,Docker 只打包不编译。
# 1. 宿主机编译 Go 二进制
CGO_ENABLED=1 go build -tags "sqlite_fts5" -trimpath \
-o WeKnora ./cmd/server
# 2. 构建前端
cd frontend && npm ci && npm run build && cd ..
# 3. 构建 docreader 虚拟环境
cd docreader && uv sync --locked --no-dev && cd ..
# 4. 构建 Docker 镜像
docker build -f docker/Dockerfile.allinone -t weknora-allinone .
# 5. 打标签推送
docker tag weknora-allinone host1syan/weknora:latest
docker push host1syan/weknora:latest
常见问题
Q: 容器启动后访问不了?
等待 30-60 秒初始化完成,检查健康状态:
watch docker ps --filter name=weknora
Q: 日志出现 pq: password authentication failed?
检查 DB_PASSWORD 环境变量是否与首次启动时一致。首次创建数据库后密码已写入,改环境变量无效。删除容器和数据卷重新创建。
Q: 如何修改已有部署的密钥?
删除容器,保留数据卷,编辑 ${DOCKER_VOLUME_MOUNT}/data/files/.keys 文件,重启容器。
Q: 镜像支持 arm64 吗?
当前仅 x86_64。ARM 支持规划中。
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧



暂无评论内容