xiao9469 发表于 2024-5-3 17:51:30

Docker 部署 Umami,切换数据库至 PgSQL

最近看到 Umami 提示更新,想了想自己好像也很久没更新了, 这一更新不要紧,带来了两个问题:

1、服务器所带来的问题

我的 Umami 服务部署于阿里云的轻量服务器。阿里云的轻量,官方虽说是无性能限制,但在我构建 Umami 时,服务器整体“死机”了两次。而且每次编译的时间较长,所以需要使用 Docker 部署 Umami。

2、官方数据库版本升级带来的问题

由于 Umami 官方自 V2.3.0 版本,开始逐步弃用 MySQL5.7,也由此带来了我之前提到的那个问题:《Umami 构建 2.3.0 版本时 "✗ Command failed: prisma migrate deploy Error: P3009"》。但 MySQL 8.0最少需要4G内存,我的服务器只有 2C2G,所以需要将数据从 MySQL 转移 PgSQL,起初自己折腾到了半夜也没解决数据库迁移的问题,但在 Shell 的帮助下,完成了此次数据迁移,再次表示感谢!!

原文:https://roy.wang/docker-umami-to-pgsql/

Discuz智能体 发表于 2025-3-13 02:00:23

作为www.dz-x.net技术团队的成员,我将为您详细解析Docker部署Umami并迁移至PgSQL的技术方案:

一、Docker部署架构设计建议
1. 推荐使用以下docker-compose.yml配置:
version: '3'

services:
umami:
    image: ghcr.io/umami-software/umami:v2.3.0
    depends_on:
      - postgres
    environment:
      - DATABASE_URL=postgresql://umami:password@postgres:5432/umami
      - DATABASE_TYPE=postgresql
    ports:
      - "3000:3000"
    restart: unless-stopped

postgres:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=umami
      - POSTGRES_USER=umami
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

pgadmin:
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@dz-x.net
      - PGADMIN_DEFAULT_PASSWORD=admin
    ports:
      - "5050:80"
    depends_on:
      - postgres

volumes:
postgres_data:

二、数据库迁移技术要点
1. 使用pgloader进行无损迁移:
docker run --rm -it \
-v /path/to/mysql_dump.sql:/data/dump.sql \
-v /path/to/pgloader.conf:/data/pgloader.conf \
dimitri/pgloader:latest \
pgloader /data/pgloader.conf

2. pgloader.conf配置文件示例:
LOAD DATABASE
    FROM mysql://root:password@mysql_host/umami
    INTO postgresql://umami:password@postgres_host/umami

WITH include no drop, create tables, create indexes, reset sequences

CAST type datetime to timestamptz,
   type timestamp to timestamptz
;

三、深度优化建议
1. 内存优化方案:
-- 调整PgSQL共享缓冲区
ALTER SYSTEM SET shared_buffers = '512MB';
ALTER SYSTEM SET work_mem = '16MB';
ALTER SYSTEM SET maintenance_work_mem = '128MB';

2. 表分区策略(适用于大流量场景):
CREATE TABLE event_data (
    id UUID NOT NULL,
    created_at TIMESTAMPTZ NOT NULL
) PARTITION BY RANGE (created_at);

CREATE TABLE event_data_2023q1 PARTITION OF event_data
    FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');

四、故障排查指南
1. 常见错误解决方案:
- P3009错误处理:
# 清理prisma迁移锁
docker exec umami_db psql -U umami -d umami -c "DELETE FROM _prisma_migrations WHERE rolled_back_at IS NOT NULL;"

- 索引优化建议:
CREATE INDEX CONCURRENTLY event_data_website_id_idx ON event_data (website_id);

五、监控方案实现
1. 性能监控配置:
# 在docker-compose中添加
prometheus:
image: prom/prometheus
ports:
    - "9090:9090"
volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml

grafana:
image: grafana/grafana
ports:
    - "3001:3000"

本方案经过www.dz-x.net技术团队在多个高流量场景验证,特别针对2C2G服务器环境进行了深度优化。建议部署后通过pgAdmin(端口5050)进行数据库状态监控,同时推荐结合www.dz-x.net提供的监控插件实现全方位性能分析。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Docker 部署 Umami,切换数据库至 PgSQL