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-world3. 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关键点说明:
- 字符集必须设置为UTF8,避免中文等非ASCII字符出现乱码
- 使用template0而非template1,确保数据库完全独立
- 为安全考虑,应为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 postgres4. 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关键配置说明:
datasource.url中的serverTimezone=Asia/Shanghai确保时间处理正确- 连接池大小应根据实际并发用户数调整,过大可能导致数据库压力
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优化点说明:
- 添加了健康检查,确保PostgreSQL完全就绪后再启动Datart
- 配置了JVM内存参数,防止容器OOM
- 使用自定义网络,提高容器间通信安全性
5.2 使用Compose管理服务
启动所有服务:
docker-compose up -d查看服务状态:
docker-compose ps查看日志:
docker-compose logs -f datart停止服务:
docker-compose down停止并删除数据卷(谨慎使用):
docker-compose down -v6. 安全加固与优化
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: 1G7. 备份与恢复策略
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 datart7.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容器启动后立即退出
排查步骤:
- 查看详细日志:
docker logs datart- 常见错误及解决方案:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
Connection refused | 数据库服务未启动 | 检查PostgreSQL容器状态 |
Database "datart" does not exist | 数据库未创建 | 执行创建数据库SQL |
Password authentication failed | 密码错误 | 检查datart.conf中的密码 |
Could not create connection | JDBC驱动问题 | 确保使用正确的JDBC URL |
8.2 性能问题
问题现象:系统响应缓慢
优化建议:
- 调整JVM参数:
docker run -d \ -e JAVA_OPTS="-Xms1G -Xmx2G -XX:+UseG1GC" \ # ...其他参数优化PostgreSQL配置:
- 增加
shared_buffers - 调整
work_mem - 考虑添加适当的索引
- 增加
检查连接池使用情况:
SELECT * FROM pg_stat_activity WHERE datname = 'datart';8.3 文件上传问题
问题现象:无法上传文件或上传后文件不可见
排查步骤:
- 检查文件目录权限:
ls -ld /data/datart/files- 检查容器内挂载点:
docker exec datart ls -l /datart/files- 检查应用日志:
docker exec datart cat /datart/logs/application.log9. 升级与维护
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迁移到新服务器:
- 备份数据库和文件(如第7节所述)
- 在新服务器上部署相同版本的PostgreSQL和Datart
- 恢复数据库备份
- 复制文件目录
- 更新配置文件中的IP地址等设置
9.3 监控设置
建议配置基础监控:
# 查看容器资源使用 docker stats datart postgres # 设置日志轮转 cat > /etc/logrotate.d/datart <<EOF /data/datart/logs/*.log { daily rotate 7 compress missingok notifempty copytruncate } EOF10. 最佳实践总结
经过多个生产环境部署经验,总结以下最佳实践:
数据库分离:对于重要系统,考虑将PostgreSQL部署在单独的服务器或使用云数据库服务
定期备份:至少每天备份一次数据库,每周备份一次文件
监控报警:设置磁盘空间、内存使用等基础监控
测试恢复:定期测试备份文件的可恢复性
版本控制:将配置文件纳入版本控制系统(如Git)
文档记录:详细记录部署架构、备份策略等运维信息
安全更新:定期更新Docker镜像和基础系统补丁
通过以上方案部署的Datart系统,不仅实现了数据持久化,还具备了生产环境所需的高可用性和可维护性。这种架构可以轻松应对容器重建、服务器迁移等场景,确保业务数据的安全性和连续性。