参考资料

  1. 使用 Docker 部署 Umami 数据库分离的两种常见场景
  2. 使用 Docker 部署 Umami 推荐的方式

当然可以。在上一个示例中,数据库虽然是一个独立的容器,但它仍然和 Umami 应用在同一个 docker-compose 项目里,通过内部网络通信。如果你希望把数据库完全分离——比如使用云数据库(AWS RDS、阿里云 RDS)、自建的独立 PostgreSQL 服务器,或者同一台机器上另一个 Docker 网络中的数据库——完全没问题。


✅ 数据库分离的两种常见场景

1. 使用外部 PostgreSQL 实例(IP 或域名可访问)

步骤:

  • 准备一个 PostgreSQL 数据库(版本 12+),创建好数据库(例如 umami)、用户名和密码。

  • 确保 Umami 容器所在的网络能够连通该数据库(防火墙/安全组放行 5432 端口)。

  • 在 Umami 的启动配置中,将 DATABASE_URL 指向外部地址。

示例 docker-compose.yml(不再包含 db 服务):

version: '3'
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://用户名:密码@你的数据库IP或域名:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: "一个强随机字符串"
    restart: always

注意:不再需要 db 服务和 volumes 定义。

然后直接运行:

docker compose up -d

Umami 容器启动时会自动检查数据库表结构,如果不存在则会自动创建。

2. 使用 Docker 但独立运行数据库容器(不同 compose 项目或网络)

如果你想在 Docker 中单独运行一个数据库容器,供多个应用(包括 Umami)共用,也可以。

启动独立的数据库容器:

docker run -d \
  --name postgres-umami \
  -e POSTGRES_DB=umami \
  -e POSTGRES_USER=umami \
  -e POSTGRES_PASSWORD=强密码 \
  -v umami_data:/var/lib/postgresql/data \
  -p 5432:5432 \       # 将端口暴露到宿主机
  postgres:15-alpine

然后在 Umami 的 DATABASE_URL 中使用宿主机的 IP(如果数据库和 Umami 在同一台机器上,可以用 host.docker.internal 或宿主机内网 IP):

DATABASE_URL: postgresql://umami:强密码@host.docker.internal:5432/umami

⚠️ 注意事项

  1. 数据库初始化
    Umami 首次连接时会自动创建所需的数据表和索引,不需要手动导入 SQL。你只需要确保数据库、用户名已存在,且用户对该数据库有 CREATE/ALTER/DROP/INSERT/SELECT 等完整权限。

  2. 网络延迟
    如果外部数据库与应用不在同一内网或同一可用区,增加的延迟可能影响 Umami 采集性能。建议将数据库部署在与 Umami 容器网络尽量近的位置(比如同一 VPC 下的云数据库)。

  3. 安全性

    • 绝对不要将数据库暴露在公网(除了通过 VPN/内网)。

    • DATABASE_URL 中包含明文密码,如果放在环境变量中,确保只有 Umami 容器能访问。

    • 使用强密码,并为数据库设置仅允许 Umami 服务器的 IP 连接。

  4. 备份与维护
    分离后你需要自行负责数据库的备份、升级和监控。不过这也带来了灵活性:你可以使用专业的数据库管理工具(如 pgBackRest、云数据库自动备份)。

  5. 同时连接多个 Umami 实例
    如果多个 Umami 实例(比如开发环境、生产环境)连接同一个数据库,可能会导致数据混乱。通常建议一个 Umami 实例对应一个独立的数据库(或 schema)。


📌 总结

  • 可以分离,只需修改 DATABASE_URL 指向外部数据库。

  • 如果不需要在 Docker 中管理数据库,可以完全省略 db 服务。

  • 分离后 Umami 应用容器变得更轻量,但你需要自己承担数据库的运维责任。

如果你想尝试,直接从上面的“外部 PostgreSQL 实例”方案开始即可,非常方便。

声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。