Skip to main content
官方 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 里,并查出网络名

挑出 PostgreSQL 和 Redis 的容器名,再看它们加入了哪些网络:
把输出里的网络名记下来。后文一律用示例名 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 看到的别名。
从 Infisical 即将使用的网络里探活(把服务名换成现场值):
两个 nc 都显示 open。失败就先修网络和监听地址,不要急着启动 Infisical。

3. 数据库初始化

Infisical 不会在空的 Postgres 实例上自动创建名为 infisical 的数据库。库必须先存在;表结构和迁移由应用启动时执行。 已有 Postgres 但没有目标库时,从同一个 Docker 网络里跑客户端。这样走的是服务名,不依赖宿主机有没有暴露 5432。 幂等示例:库已存在就跳过,不重复创建。
客户端镜像 postgres:18-alpine 只是 psql 工具版本,应与现场 Postgres 主版本兼容;不是要求你把现有库升级到 18。 为什么不假定库一定在:
  • 复用的实例通常已经给别的应用建过库,不会预留 infisical。
  • 启动阶段的迁移连的是 DB_CONNECTION_URI 里的那个库名。库不存在时,日志看起来像「迁移失败」,根因其实是连接串指向了不存在的 database。
给应用用户的权限需要覆盖建 schema、建表、改表。官方要求:该用户对 Infisical 库具备完整 DDL/DML 权限。
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 部署):
得到的是 32 个 [0-9a-f] 字符,例如形态 0123456789abcdef0123456789abcdef(这是格式示例,禁止原样使用)。 启动日志里的典型堆栈会经过 KMS / createCipheriv,报文是 Invalid key length。它出现在服务起来、开始做加密初始化的阶段,很容易被看成数据库迁移失败。先量长度,再查 Postgres。 生成并只检查长度和字符集,不要把密钥打到聊天或工单里:
期望:length 32,is_32_hex True,looks_base64 False。
改 ENCRYPTION_KEY 等于换根密钥。已经写入的加密数据无法用新钥匙解开。首次启动前就要定稿并备份;不要在有数据之后「试一个新的」。

可选: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

打健康检查

期望 HTTP 200,JSON 里是成功/就绪一类状态,而不是 5xx 或空响应。
6

打开首页

浏览器访问 http://127.0.0.1:18080。第一个注册的用户会成为实例管理员,完成后再考虑把端口暴露给别人。
本机 /api/status 成功之后,再去做 Nginx 和证书。不要反过来。