选择镜像与数据库模式¶
这是一个决定,而不是两个:PostgreSQL 在哪里运行? LANCache Manager 把它的数据库(下载历史、统计数据、游戏数据)保存在 PostgreSQL 中,镜像标签由你的答案决定。
| 模式 | 含义 | 镜像标签 |
|---|---|---|
| 内嵌(默认) | PostgreSQL 17 在 lancache-manager 容器内部通过 Unix 套接字运行。单容器,无需额外配置。 | :latest |
| 外部 | 你自己运行 PostgreSQL——边车容器、远程主机,或托管服务(RDS、Azure DB、Cloud SQL)。标准的 Docker 模式,升级也更省心。 | :latest 可用,也可用 :latest-slim(体积小约 150 MB,去掉了未使用的内嵌 Postgres)。需要设置 POSTGRES_MODE=external。 |
CI 发布的每个标签系列都遵循相同的配对(均为多架构镜像,amd64 + arm64):
| 标签 | 说明 |
|---|---|
latest / latest-slim |
最新发布版本。你应该运行的版本。 |
1.2.0 / 1.2.0-slim |
固定版本的发布——如果你想显式控制升级时机,就固定一个版本。 |
release / release-slim |
latest 的别名。 |
dev / dev-slim |
最新开发版构建。仅用于测试——随时可能出问题。 |
# 完整版——默认,同时支持内嵌和外部 Postgres
docker pull ghcr.io/regix1/lancache-manager:latest
# 精简版——仅支持外部 Postgres
docker pull ghcr.io/regix1/lancache-manager:latest-slim
示例 1:内嵌(默认)¶
这就是快速开始中的 Compose 文件——单容器,无边车服务。可以选择性地加上一个数据库密码:
不设置 POSTGRES_PASSWORD 的话,首次运行的 UI 会提示输入。内嵌模式的全部设置就是这些。
示例 2:外部(边车 Postgres)¶
两个服务:lancache-manager 通过 TCP 连接到 lancache-db。
services:
lancache-manager:
image: ghcr.io/regix1/lancache-manager:latest-slim
container_name: lancache-manager
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./data:/data
- /mnt/lancache/logs:/logs:ro
- /mnt/lancache/cache:/cache:ro
- /var/run/docker.sock:/var/run/docker.sock
environment:
- PUID=33
- PGID=33
- TZ=America/Chicago
- LanCache__LogPath=/logs/access.log
- LanCache__CachePath=/cache
- POSTGRES_MODE=external
- POSTGRES_HOST=lancache-db
- POSTGRES_PORT=5432
- POSTGRES_DB=lancache
- POSTGRES_USER=lancache
- POSTGRES_PASSWORD=change-this-password
depends_on:
- lancache-db
lancache-db:
image: postgres:17-alpine
container_name: lancache-db
restart: unless-stopped
environment:
- POSTGRES_USER=lancache
- POSTGRES_PASSWORD=change-this-password
- POSTGRES_DB=lancache
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
POSTGRES_PASSWORD 必须在两个服务中保持一致。用 docker compose up -d 同时启动两者。
要连接远程或托管的 Postgres? 把 POSTGRES_HOST 设置为它的主机名,删除 lancache-db 服务,删除 depends_on,并省略命名数据卷。
数据库用户需要什么权限? 它必须是该数据库的属主,或者对该数据库拥有 CREATE 权限。表结构会安装 citext 扩展,而 PostgreSQL 只允许对数据库本身拥有 CREATE 权限的角色安装扩展。只在 schema public 上授予 CREATE 是不够的,而这恰恰是最容易想到的授权方式,因为从 PostgreSQL 15 起它不再被默认授予。上面的 sidecar 示例已经满足这一点,因为 postgres 镜像会让 POSTGRES_USER 成为 POSTGRES_DB 的属主。如果这个角色不是你自己建的,请这样授权:
这跟超级用户无关:从 PostgreSQL 13 起,citext 就是受信任(trusted)扩展。如果你无法修改自己角色的权限,也可以请数据库管理员先把扩展装好,之后应用所用的角色就不需要任何额外权限:
有些托管服务还会对允许安装的扩展设置白名单。在 Azure Database for PostgreSQL 灵活服务器上,无论角色有什么权限,都必须先把 citext 加入 azure.extensions 服务器参数,上面两条语句才会生效。
弄错了不是给个警告,而是应用根本起不来。数据库初始化在 Web 服务器监听端口之前运行,进程会在那里结束,Docker 的重启策略又把它带回同样的失败,浏览器拿到的是连接被拒绝而不是设置页面。日志里是 Database initialization failed,下面跟着 PostgreSQL 自己的 permission denied to create extension "citext"。
设置了 POSTGRES_MODE=external 但没设置连接变量? 应用会以仅设置模式启动,并显示一个 UI 表单。在那里提交的凭据会保存到 /data/config/postgres-credentials.json;系统会提示你重启容器以让新连接生效。
已经在用内置数据库,想切换过去? 现有数据不会自动迁移。请先手动导出并恢复:参见从内置迁移到外部 PostgreSQL。