WeKnora All-in-One Docker 部署

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

访问 http://localhost:8080。

设置 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
喜欢就支持一下吧
点赞0 分享 收藏
评论 抢沙发
欢迎您留下宝贵的见解!(至少 2 字)
提交
昵称

昵称

昵称 表情 快捷回复

    暂无评论内容