参考资料

  1. 九块记账(Docker-Compose)数据库分离部署教程
  2. 九块记账(Docker-Compose)完整部署教程
  3. MrDoc(觅道文档)是一款基于Python开发的在线文档系统
  4. Docker部署dzzoffice+onlyoffice
  5. Firefly III 部署指南 (PHP 8.0, 非Docker)
  6. 微擎是一款基于PHP+MySQL的开源微信公众号管理系统
  7. ERP办公系统是一款企业资源计划软件
  8. 可道云KODBOX是一款基于Web的在线文件管理与协作平台

九块记账(Docker-Compose)数据库独立部署教程

九块记账(Docker-Compose)数据库独立部署教程

本教程将指导您如何将九块记账应用的数据库与应用程序完全独立部署在不同的服务器上,实现真正的分离部署。

方案概述

  • 应用服务器:运行九块记账主程序

  • 数据库服务器:独立运行MySQL数据库

  • 两服务器通过内网或安全组规则连接

第一部分:数据库服务器部署

1. 在数据库服务器上操作

mkdir -p /data/jiukuai/mysql/{data,conf}
cd /data/jiukuai/mysql

2. 创建自定义MySQL配置文件

conf/my.cnf 文件内容:

[mysqld]
bind-address = 0.0.0.0
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000

[client]
default-character-set=utf8mb4

3. 创建docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: jiukuai_mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_very_strong_root_password
      MYSQL_DATABASE: jiukuai_accounting
      MYSQL_USER: jiukuai_prod_user
      MYSQL_PASSWORD: your_very_strong_db_password
    volumes:
      - ./data:/var/lib/mysql
      - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "3306:3306"
    restart: unless-stopped
    command: 
      --max-allowed-packet=64M
      --innodb-buffer-pool-size=1G
    networks:
      - jiukuai_network

networks:
  jiukuai_network:
    driver: bridge

4. 启动数据库服务

docker-compose up -d

5. 安全配置(重要)

# 进入MySQL容器
docker exec -it jiukuai_mysql mysql -uroot -p

# 执行以下SQL命令
CREATE USER 'jiukuai_prod_user'@'应用服务器IP' IDENTIFIED BY 'your_very_strong_db_password';
GRANT ALL PRIVILEGES ON jiukuai_accounting.* TO 'jiukuai_prod_user'@'应用服务器IP';
FLUSH PRIVILEGES;

6. 防火墙配置

# 只允许应用服务器访问数据库端口
iptables -A INPUT -p tcp -s 应用服务器IP --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

第二部分:应用服务器部署

1. 在应用服务器上操作

mkdir -p /data/jiukuai/app/{data,config}
cd /data/jiukuai/app

2. 创建docker-compose.yml

version: '3.8'

services:
  jiukuai-app:
    image: jiukuai/accounting:latest
    container_name: jiukuai_app
    environment:
      DB_HOST: 数据库服务器IP
      DB_PORT: 3306
      DB_NAME: jiukuai_accounting
      DB_USER: jiukuai_prod_user
      DB_PASSWORD: your_very_strong_db_password
      DB_SSL: "false"  # 如果启用SSL改为true
    volumes:
      - ./data:/app/data
      - ./config:/app/config
    ports:
      - "8080:8080"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3

3. 启动应用服务

docker-compose up -d

第三部分:高级配置

1. 数据库连接池配置(可选)

在应用服务器的环境变量中添加:

environment:
  DB_POOL_MAX: "20"
  DB_POOL_MIN: "5"
  DB_CONNECTION_TIMEOUT: "30000"

2. SSL加密连接(推荐)

  1. 在数据库服务器生成SSL证书

  2. 修改MySQL配置启用SSL

  3. 将CA证书复制到应用服务器

  4. 在应用配置中启用SSL连接

3. 数据库定期备份

创建备份脚本 /data/jiukuai/mysql/backup.sh

#!/bin/bash
DATE=$(date +%Y%m%d%H%M)
BACKUP_DIR="/data/backups/mysql"
mkdir -p $BACKUP_DIR
docker exec jiukuai_mysql mysqldump -u jiukuai_prod_user -p'your_very_strong_db_password' jiukuai_accounting | gzip > $BACKUP_DIR/jiukuai_$DATE.sql.gz
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete

添加到cronjob:

0 2 * * * /data/jiukuai/mysql/backup.sh

验证部署

  1. 检查应用日志:

docker logs jiukuai_app
  1. 测试数据库连接:

docker exec jiukuai_app ping 数据库服务器IP
  1. 验证数据库连接:

docker exec jiukuai_app telnet 数据库服务器IP 3306

故障排查

  1. 连接问题

    • 检查防火墙规则

    • 验证数据库用户权限

    • 检查网络连通性

  2. 性能问题

    • 监控数据库服务器资源使用情况

    • 优化MySQL配置参数

    • 考虑添加数据库读写分离

  3. 数据不一致

    • 验证备份是否正常

    • 检查应用日志中的数据库错误

注意事项

  1. 生产环境务必使用强密码并定期更换

  2. 建议启用数据库的SSL加密连接

  3. 定期监控数据库性能指标

  4. 考虑设置数据库主从复制提高可用性

  5. 重要操作前先进行完整备份

这种架构提供了更好的安全性和可扩展性,允许您独立扩展应用服务器或数据库服务器资源。