PostgreSQL 部署

关于

办公套件使用 PostgreSQL。postgres + postgres-init 服务创建并初始化数据库,其他服务通过 POSTGRES_* 变量连接它。

1. 部署

git clone https://github.com/bindoffice/bind-docker.git

cd bind-docker/office
cp env.example .env
修改 .env 配置,修改所有标记为 『需要修改』的变量
make openssl
make
访问 https://work.example.com 的方式见 docker 部署文档

2. PostgreSQL 变量

变量

默认值

Description

POSTGRES_IMAGE

postgres:16

PostgreSQL 镜像

POSTGRES_ADDR

127.0.0.1:5432

PostgreSQL 地址,各服务用它连接,同时也作为端口发布地址,见第 3 节

POSTGRES_USER

postgres

PostgreSQL user, need modify

POSTGRES_PASSWORD

changepassword

PostgreSQL password, need modify

POSTGRES_EXTENSIONS

空

首次启动时额外创建的扩展,逗号分隔,例如 pg_trgm,uuid-ossp

完整的变量列表见 配置文件示例 页面。

3. PostgreSQL 和 Redis 端口

postgres 和 redis 是仅有的两个不使用 host 网络的服务:host 模式下 ports 会被忽略,端口无法暴露给宿主机。这两个服务都把各自的地址变量同时当作发布地址:

变量

默认值

对局域网开放

POSTGRES_ADDR

127.0.0.1:5432

0.0.0.0:5432

REDIS_ADDR

127.0.0.1:6379

0.0.0.0:6379

默认 127.0.0.1 只把端口发布到宿主机回环,本地客户端连接已经够用:

psql "postgresql://postgres:<POSTGRES_PASSWORD>@127.0.0.1:5432/<DB_NAME>?sslmode=disable"
redis-cli -h 127.0.0.1 -p 6379

不要把 REDIS_ADDR 设成 0.0.0.0:6379:redis 没有密码,那样会把 session 和缓存数据暴露给网络上的所有人。

其余服务仍使用 host 网络,通过 127.0.0.1 访问这两个端口,因此 BIND_SQLDB、BIND_SESSION_HEDIS_HOST 无需修改。经发布端口进来的连接源地址不是 127.0.0.1,PostgreSQL 会用 POSTGRES_PASSWORD 认证它们,而不再匹配 pg_hba.conf 里本地的 trust 规则。

整套服务运行在 macOS 的 Docker Desktop 上时,只有已发布的端口会转发到 macOS,因此其他服务(web、smtp、imap 等)虽然在 Docker 虚拟机内监听,但从 Mac 上访问不到。OrbStack 与 macOS 共享 host 网络,所以这些服务在 Mac 上都可以访问。

4. 数据

数据库和缓存的数据都存放在各自的目录:

目录

数据

office/postgres/data/pgdata

PostgreSQL 文件

office/redis/data

redis 文件