☰
Docker部署Datart与PostgreSQL数据持久化实践
2026/11/3 17:52:44 网站建设 项目流程

1. 项目概述

Datart作为一款开源的数据可视化平台,在企业级BI场景中越来越受欢迎。而Docker化部署方案则大幅降低了部署门槛,让用户能够快速搭建起自己的数据分析环境。本文将详细介绍如何通过Docker部署Datart,并采用PostgreSQL作为元数据库实现数据持久化存储。

在实际生产环境中,我们经常会遇到容器重建导致数据丢失的问题。通过本文的方案,即使容器被删除重建,所有配置、用户、报表等关键数据都能得到完整保留。这种部署方式特别适合需要长期稳定运行的BI系统,也为后续的升级维护提供了便利。

2. 环境准备

2.1 硬件与软件要求

在开始部署前,我们需要确保环境满足以下基本要求:

  • 服务器配置:

    • 最低配置:2核CPU,2GB内存
    • 推荐配置:4核CPU,8GB内存(适用于中型企业应用)
    • 磁盘空间:至少20GB可用空间(视数据量而定)
  • 软件依赖:

    • Docker Engine 18.09或更高版本
    • Docker Compose 1.25.0或更高版本(可选但推荐)
    • PostgreSQL 16.4或更高版本
  • 网络要求:

    • 开放端口:8080(Datart Web界面)
    • 开放端口:5432(PostgreSQL数据库)
    • 确保服务器间网络通畅(如果数据库和应用分离部署)

2.2 Docker环境检查

在开始部署前,建议先检查Docker环境是否正常:

# 检查Docker版本 docker version # 检查Docker运行状态 systemctl status docker # 检查Docker Compose版本(如使用) docker-compose version

如果尚未安装Docker,可以参考以下快速安装命令(以Ubuntu为例):

# 安装必要工具 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加Docker仓库 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 安装Docker CE sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 将当前用户加入docker组(避免每次使用sudo) sudo usermod -aG docker $USER newgrp docker # 验证安装 docker run hello-world

3. PostgreSQL数据库部署

3.1 数据库容器化部署

PostgreSQL作为Datart的元数据库,存储了所有用户、权限、报表定义等关键信息。我们推荐使用Docker部署PostgreSQL,便于管理和维护。

docker run -d \ --name postgres \ --restart always \ -e POSTGRES_PASSWORD='your_secure_password' \ -e POSTGRES_DB=postgres \ -p 5432:5432 \ -v /data/postgres/data:/var/lib/postgresql/data \ -v /data/postgres/config:/etc/postgresql \ postgres:16

参数详解:

  • -e POSTGRES_PASSWORD:设置数据库超级用户密码,建议使用强密码
  • -v /data/postgres/data:将数据库文件持久化到宿主机
  • -v /data/postgres/config:将配置文件持久化到宿主机
  • postgres:16:使用PostgreSQL 16版本镜像

注意:生产环境中,建议将密码通过环境变量文件(--env-file)传入,而非直接在命令行中暴露密码。

3.2 数据库初始化

创建专用于Datart的数据库和用户:

# 进入PostgreSQL容器 docker exec -it postgres psql -U postgres # 创建数据库(注意字符集设置) CREATE DATABASE datart WITH ENCODING='UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0; # 创建专用用户并授权 CREATE USER datart_user WITH PASSWORD 'datart_password'; GRANT ALL PRIVILEGES ON DATABASE datart TO datart_user; # 退出PostgreSQL \q

关键点说明:

  1. 字符集必须设置为UTF8,避免中文等非ASCII字符出现乱码
  2. 使用template0而非template1,确保数据库完全独立
  3. 为安全考虑,应为Datart创建专用用户而非使用postgres超级用户

3.3 数据库性能调优

对于生产环境,建议调整PostgreSQL配置以获得更好性能。编辑/data/postgres/config/postgresql.conf:

# 连接数设置 max_connections = 100 # 内存设置(根据服务器内存调整) shared_buffers = 1GB effective_cache_size = 3GB work_mem = 16MB maintenance_work_mem = 256MB # WAL日志设置 wal_level = replica synchronous_commit = off fsync = on # 性能相关 random_page_cost = 1.1 effective_io_concurrency = 200 max_worker_processes = 8 max_parallel_workers_per_gather = 4

修改配置后需要重启容器使配置生效:

docker restart postgres

4. Datart容器部署

4.1 准备持久化目录

Datart运行时需要持久化存储配置文件、上传文件和日志:

# 创建配置目录 mkdir -p /data/datart/config # 创建文件存储目录(用于存储上传的Excel、CSV等) mkdir -p /data/datart/files # 创建日志目录 mkdir -p /data/datart/logs # 设置适当权限 chown -R 1000:1000 /data/datart

说明:这里使用1000:1000是因为大多数官方镜像默认使用这个UID/GID运行应用。如果遇到权限问题,可以通过docker inspect查看容器实际使用的UID/GID。

4.2 配置文件详解

创建配置文件/data/datart/config/datart.conf,这是Datart的核心配置:

# =============== 数据库连接配置 =============== # 数据库服务器地址(如果是Docker网络内访问,可使用容器名) datasource.ip=postgres datasource.port=5432 datasource.database=datart datasource.username=datart_user datasource.password=datart_password # JDBC连接字符串(重要:添加时区参数) datasource.driver-class-name=org.postgresql.Driver datasource.url=jdbc:postgresql://postgres:5432/datart?useSSL=false&serverTimezone=Asia/Shanghai # =============== 连接池配置 =============== # 连接池大小(根据并发用户数调整) spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000 # =============== 服务配置 =============== server.port=8080 server.address=0.0.0.0 server.servlet.session.timeout=30m # =============== Datart应用配置 =============== # 必须修改为实际访问地址 datart.address=http://your-server-ip:8080 datart.filepath=/datart/files datart.send-mail=false # =============== 日志配置 =============== logging.level.com.datart=INFO logging.level.org.springframework.web=INFO logging.file.path=/datart/logs # =============== 安全配置 =============== # 是否允许用户注册(生产环境建议关闭) datart.user.registration.enabled=true # 默认时区设置 spring.jackson.time-zone=Asia/Shanghai

关键配置说明:

  1. datasource.url中的serverTimezone=Asia/Shanghai确保时间处理正确
  2. 连接池大小应根据实际并发用户数调整,过大可能导致数据库压力
  3. datart.address必须设置为实际访问地址,否则可能导致回调问题

4.3 启动Datart容器

拉取Datart镜像并启动容器:

docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/datart:latest docker run -d \ --name datart \ --restart unless-stopped \ --link postgres \ -p 8080:8080 \ -v /data/datart/config/datart.conf:/datart/config/datart.conf \ -v /data/datart/files:/datart/files \ -v /data/datart/logs:/datart/logs \ registry.cn-hangzhou.aliyuncs.com/qiluo-images/datart:latest

参数解析:

  • --link postgres:使容器能够通过主机名访问PostgreSQL
  • --restart unless-stopped:确保容器异常退出后自动重启
  • -v参数挂载三个关键目录,实现配置、文件和日志的持久化

4.4 验证部署

检查容器运行状态:

docker ps -f name=datart # 查看启动日志 docker logs -f datart

预期看到类似以下输出,表示启动成功:

Started DatartServerApplication in 15.345 seconds (JVM running for 16.678) HikariPool-1 - Starting... HikariPool-1 - Start completed. Tomcat started on port(s): 8080 (http)

5. Docker Compose集成部署

5.1 编写docker-compose.yml

对于生产环境,推荐使用Docker Compose管理多容器应用。创建docker-compose.yml:

version: '3.8' services: postgres: image: postgres:16 container_name: datart-postgres restart: unless-stopped environment: POSTGRES_DB: datart POSTGRES_USER: datart_user POSTGRES_PASSWORD: datart_password volumes: - ./postgres/data:/var/lib/postgresql/data - ./postgres/config:/etc/postgresql ports: - "5432:5432" networks: - datart-network healthcheck: test: ["CMD-SHELL", "pg_isready -U datart_user -d datart"] interval: 5s timeout: 5s retries: 5 datart: image: registry.cn-hangzhou.aliyuncs.com/qiluo-images/datart:latest container_name: datart restart: unless-stopped depends_on: postgres: condition: service_healthy ports: - "8080:8080" volumes: - ./datart/config/datart.conf:/datart/config/datart.conf - ./datart/files:/datart/files - ./datart/logs:/datart/logs environment: - JAVA_OPTS=-Xms512m -Xmx1024m networks: - datart-network networks: datart-network: driver: bridge

优化点说明:

  1. 添加了健康检查,确保PostgreSQL完全就绪后再启动Datart
  2. 配置了JVM内存参数,防止容器OOM
  3. 使用自定义网络,提高容器间通信安全性

5.2 使用Compose管理服务

启动所有服务:

docker-compose up -d

查看服务状态:

docker-compose ps

查看日志:

docker-compose logs -f datart

停止服务:

docker-compose down

停止并删除数据卷(谨慎使用):

docker-compose down -v

6. 安全加固与优化

6.1 网络隔离

建议为Datart和PostgreSQL创建专用网络:

docker network create datart-net

然后在运行容器时指定网络:

docker run -d \ --network datart-net \ --name postgres \ # ...其他参数

这样数据库服务不会直接暴露在主机网络上,提高安全性。

6.2 HTTPS配置

生产环境必须启用HTTPS。可以通过Nginx反向代理实现:

server { listen 443 ssl; server_name datart.yourdomain.com; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; location / { proxy_pass http://datart:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

6.3 资源限制

为防止单个容器占用过多资源,可以设置资源限制:

# 在docker-compose.yml中添加 services: datart: deploy: resources: limits: cpus: '2' memory: 2G reservations: memory: 1G

7. 备份与恢复策略

7.1 数据库备份

定期备份PostgreSQL数据库至关重要:

# 简单备份命令 docker exec postgres pg_dump -U datart_user -d datart > datart_backup_$(date +%Y%m%d).sql # 带压缩的备份 docker exec postgres pg_dump -U datart_user -d datart | gzip > datart_backup_$(date +%Y%m%d).sql.gz # 恢复数据库 gunzip < datart_backup_20230101.sql.gz | docker exec -i postgres psql -U datart_user -d datart

7.2 文件备份

Datart上传的文件也需要定期备份:

# 备份文件 tar -czf datart_files_$(date +%Y%m%d).tar.gz /data/datart/files/ # 恢复文件 tar -xzf datart_files_20230101.tar.gz -C /

7.3 自动化备份脚本

创建/usr/local/bin/datart_backup.sh:

#!/bin/bash BACKUP_DIR="/data/backups/datart" DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=30 mkdir -p $BACKUP_DIR # 数据库备份 docker exec postgres pg_dump -U datart_user -d datart | gzip > $BACKUP_DIR/datart_db_$DATE.sql.gz # 文件备份 tar -czf $BACKUP_DIR/datart_files_$DATE.tar.gz /data/datart/files/ # 配置文件备份 cp /data/datart/config/datart.conf $BACKUP_DIR/datart_conf_$DATE.conf # 删除旧备份 find $BACKUP_DIR -name "datart_*" -mtime +$RETENTION_DAYS -delete # 记录日志 echo "[$(date)] Backup completed" >> $BACKUP_DIR/backup.log

添加定时任务:

chmod +x /usr/local/bin/datart_backup.sh (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/datart_backup.sh") | crontab -

8. 常见问题排查

8.1 容器启动失败

问题现象:Datart容器启动后立即退出

排查步骤:

  1. 查看详细日志:
docker logs datart
  1. 常见错误及解决方案:
错误信息可能原因解决方案
Connection refused数据库服务未启动检查PostgreSQL容器状态
Database "datart" does not exist数据库未创建执行创建数据库SQL
Password authentication failed密码错误检查datart.conf中的密码
Could not create connectionJDBC驱动问题确保使用正确的JDBC URL

8.2 性能问题

问题现象:系统响应缓慢

优化建议:

  1. 调整JVM参数:
docker run -d \ -e JAVA_OPTS="-Xms1G -Xmx2G -XX:+UseG1GC" \ # ...其他参数
  1. 优化PostgreSQL配置:

    • 增加shared_buffers
    • 调整work_mem
    • 考虑添加适当的索引
  2. 检查连接池使用情况:

SELECT * FROM pg_stat_activity WHERE datname = 'datart';

8.3 文件上传问题

问题现象:无法上传文件或上传后文件不可见

排查步骤:

  1. 检查文件目录权限:
ls -ld /data/datart/files
  1. 检查容器内挂载点:
docker exec datart ls -l /datart/files
  1. 检查应用日志:
docker exec datart cat /datart/logs/application.log

9. 升级与维护

9.1 版本升级

当需要升级Datart版本时:

# 停止旧容器 docker stop datart # 拉取新镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/datart:latest # 启动新容器(使用相同数据卷) docker run -d \ --name datart-new \ # ...其他参数与之前相同

9.2 数据迁移

将Datart迁移到新服务器:

  1. 备份数据库和文件(如第7节所述)
  2. 在新服务器上部署相同版本的PostgreSQL和Datart
  3. 恢复数据库备份
  4. 复制文件目录
  5. 更新配置文件中的IP地址等设置

9.3 监控设置

建议配置基础监控:

# 查看容器资源使用 docker stats datart postgres # 设置日志轮转 cat > /etc/logrotate.d/datart <<EOF /data/datart/logs/*.log { daily rotate 7 compress missingok notifempty copytruncate } EOF

10. 最佳实践总结

经过多个生产环境部署经验,总结以下最佳实践:

  1. 数据库分离:对于重要系统,考虑将PostgreSQL部署在单独的服务器或使用云数据库服务

  2. 定期备份:至少每天备份一次数据库,每周备份一次文件

  3. 监控报警:设置磁盘空间、内存使用等基础监控

  4. 测试恢复:定期测试备份文件的可恢复性

  5. 版本控制:将配置文件纳入版本控制系统(如Git)

  6. 文档记录:详细记录部署架构、备份策略等运维信息

  7. 安全更新:定期更新Docker镜像和基础系统补丁

通过以上方案部署的Datart系统,不仅实现了数据持久化,还具备了生产环境所需的高可用性和可维护性。这种架构可以轻松应对容器重建、服务器迁移等场景,确保业务数据的安全性和连续性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询