docker-compose.prod.yml 会同时拉起 Infisical、PostgreSQL、Redis,并把应用映射到宿主机 80。这套模板适合从零 POC,不适合已经有数据库、缓存和系统 Nginx 的机器。
本页按「改 Compose → 接外部依赖 → 写环境变量 → 建库 → 启动验收」写。域名和证书见 域名与 HTTPS。
1. 官方 Compose 不能直接照抄
先下载官方文件,只当作对照,不要原样up:
只保留 Infisical 主服务的原因:有状态组件已经在别的 Compose 或容器里运行,再拉一套会双写、双备份、端口冲突。应用层应当是无本地状态的一个容器。
最小可用 Compose
完整文件:notes/infisical/examples/docker-compose.yml。
docker-compose.yml
INFISICAL_IMAGE_TAG 的值类似 v0.166.3(这是文档编写时 Docker Hub 上可见的发行 tag 形态,以你实际选定的版本为准)。查看标签:
Compose 里已经没有
db、redis 服务,镜像不是 latest,端口不是 80:8080。2. 接入已有 PostgreSQL / Redis
目标:Infisical 容器和数据库、缓存跑在同一 Docker 网络里,用服务名连接。确认它们在 Docker 里,并查出网络名
shared-network、postgresql、redis;现场别名以 docker inspect 为准。
让 Infisical 加入同一网络,就是 Compose 里声明 external: true 的那一段。启动前确认网络已存在:
shared-network 的容器列表里已经能看到 Postgres 和 Redis。还看不到 Infisical 是正常的,它要等 compose up 之后才会加入。为什么优先用服务名,而不是 localhost
如果 Redis 只监听宿主机回环(
127.0.0.1:6379),即使 docker ps 里看到 127.0.0.1:6379->6379,其他容器也连不上。端口映射给的是「这台机器上的进程」,不是「Docker 网络里的邻居」。正确做法是让 Redis 加入 shared-network,并让 Infisical 用 redis:6379 连接。
示例连接串:
postgresql/redis是共享网络里的 DNS 名示例。- 无密码 Redis 写成
redis://redis:6379。 - 实际名称必须换成
docker inspect看到的别名。
两个
nc 都显示 open。失败就先修网络和监听地址,不要急着启动 Infisical。3. 数据库初始化
Infisical 不会在空的 Postgres 实例上自动创建名为infisical 的数据库。库必须先存在;表结构和迁移由应用启动时执行。
已有 Postgres 但没有目标库时,从同一个 Docker 网络里跑客户端。这样走的是服务名,不依赖宿主机有没有暴露 5432。
幂等示例:库已存在就跳过,不重复创建。
postgres:18-alpine 只是 psql 工具版本,应与现场 Postgres 主版本兼容;不是要求你把现有库升级到 18。
为什么不假定库一定在:
- 复用的实例通常已经给别的应用建过库,不会预留
infisical。 - 启动阶段的迁移连的是
DB_CONNECTION_URI里的那个库名。库不存在时,日志看起来像「迁移失败」,根因其实是连接串指向了不存在的 database。
psql -h postgresql -U db_user -d infisical -c '\conninfo' 能连上,且 \l 里看得到 infisical。4. 关键环境变量
完整模板:notes/infisical/examples/.env.example。复制后改名 .env:
ENCRYPTION_KEY 和 AUTH_SECRET 必须在目标机器上现生成。
必填项
SITE_URL 必须带协议。http://infisical.example.com 和 https://infisical.example.com 不是一回事;证书启用后漏改这一项,是上线后最常见的「页面能开、登录乱跳」原因。
ENCRYPTION_KEY 与 Invalid key length
官方约定(非 FIPS 部署):
[0-9a-f] 字符,例如形态 0123456789abcdef0123456789abcdef(这是格式示例,禁止原样使用)。
启动日志里的典型堆栈会经过 KMS /
createCipheriv,报文是 Invalid key length。它出现在服务起来、开始做加密初始化的阶段,很容易被看成数据库迁移失败。先量长度,再查 Postgres。
生成并只检查长度和字符集,不要把密钥打到聊天或工单里:
length 32,is_32_hex True,looks_base64 False。
可选:SMTP
不配 SMTP 时,邀请用户、重置密码会在日志里报错,主服务仍可用来登录和管 secrets。需要邮件时再补SMTP_HOST 等变量并 docker compose restart backend。不要把 SMTP 报错当成部署失败。
5. 首次启动与验证
1
初始化数据库
跑上一节的幂等建库命令。确认
infisical 库存在。2
准备 Compose 目录
放入改造后的
docker-compose.yml 和 .env。INFISICAL_IMAGE_TAG、ENCRYPTION_KEY、AUTH_SECRET、两条连接串、SITE_URL 都已是现场值。3
启动
ps 只能说明容器进程活着。4
看应用日志
Invalid key length、没有 Postgres/Redis 连接拒绝。SMTP 报错可以先记下,不阻塞这一步。5
打健康检查
6
打开首页
浏览器访问
http://127.0.0.1:18080。第一个注册的用户会成为实例管理员,完成后再考虑把端口暴露给别人。本机
/api/status 成功之后,再去做 Nginx 和证书。不要反过来。