# Senflow App Ứng dụng Go với Docker cho môi trường development và production. ## Cấu Trúc Thư Mục ``` . ├── Dockerfile.dev ├── Dockerfile.prod ├── docker-compose.dev.yml ├── docker-compose.prod.yml ├── .env.dev ├── .env.prod ├── nginx/ │ └── conf.d/ │ └── default.conf ├── prometheus/ │ └── prometheus.yml └── scripts/ └── backup.sh ``` ## Yêu Cầu Hệ Thống - Docker - Docker Compose - Go 1.21 trở lên ## Môi Trường Development ### Cấu Hình 1. Tạo file `.env.dev`: ```env PORT=8080 APP_ENV=development BLUEPRINT_DB_HOST=mysql_bp BLUEPRINT_DB_PORT=3306 BLUEPRINT_DB_DATABASE=blueprint BLUEPRINT_DB_USERNAME=root BLUEPRINT_DB_PASSWORD=root BLUEPRINT_DB_ROOT_PASSWORD=root BLUEPRINT_DB_MAX_IDLE_CONNS=10 BLUEPRINT_DB_MAX_OPEN_CONNS=100 BLUEPRINT_DB_CONN_MAX_LIFETIME=1h LOGGER_LOG_LEVEL=debug LOGGER_FILE_LOG_NAME=logs/app.log LOGGER_MAX_SIZE=100 LOGGER_MAX_BACKUPS=3 LOGGER_MAX_AGE=28 LOGGER_COMPRESS=true ``` ### Chạy Ứng Dụng ```bash # Build và chạy docker-compose -f docker-compose.dev.yml up --build # Chạy ở chế độ detached docker-compose -f docker-compose.dev.yml up -d # Xem logs docker-compose -f docker-compose.dev.yml logs -f # Dừng ứng dụng docker-compose -f docker-compose.dev.yml down ``` ## Môi Trường Production ### Cấu Hình 1. Tạo file `.env.prod`: ```env PORT=8080 APP_ENV=production BLUEPRINT_DB_HOST=mysql_bp BLUEPRINT_DB_PORT=3306 BLUEPRINT_DB_DATABASE=blueprint BLUEPRINT_DB_USERNAME=root BLUEPRINT_DB_PASSWORD=your_secure_password BLUEPRINT_DB_ROOT_PASSWORD=your_secure_root_password BLUEPRINT_DB_MAX_IDLE_CONNS=10 BLUEPRINT_DB_MAX_OPEN_CONNS=100 BLUEPRINT_DB_CONN_MAX_LIFETIME=1h LOGGER_LOG_LEVEL=info LOGGER_FILE_LOG_NAME=logs/app.log LOGGER_MAX_SIZE=1000 LOGGER_MAX_BACKUPS=7 LOGGER_MAX_AGE=30 LOGGER_COMPRESS=true GRAFANA_ADMIN_PASSWORD=your_secure_grafana_password ``` ### Tính Năng Production 1. **Load Balancing** - Nginx làm load balancer - 3 instance của ứng dụng - Health check tự động - SSL/TLS support 2. **Monitoring** - Prometheus cho metrics collection - Grafana cho visualization - Metrics từ app và MySQL - Persistent storage cho dữ liệu monitoring 3. **Backup** - Backup MySQL tự động hàng ngày - Nén backup với gzip - Giữ backup trong 7 ngày - Volume riêng cho backups 4. **High Availability** - Health checks cho tất cả services - Auto-restart policy - Network isolation - Replica management ### Chạy Production ```bash # Build và chạy docker-compose -f docker-compose.prod.yml --env-file .env.prod up --build -d # Xem logs docker-compose -f docker-compose.prod.yml logs -f # Dừng services docker-compose -f docker-compose.prod.yml down ``` ### Endpoints - App instances: http://localhost:8083, http://localhost:8084, http://localhost:8085 - Nginx (Load Balancer): http://localhost:80 - Grafana: http://localhost:3000 - Prometheus: http://localhost:9090 ## Bảo Mật 1. **SSL/TLS** - Thêm certificates vào `nginx/ssl/` - Cấu hình SSL trong Nginx 2. **Mật Khẩu** - Thay đổi mật khẩu trong `.env.prod` - Sử dụng mật khẩu mạnh - Không commit file .env 3. **Network** - Cấu hình firewall - Giới hạn ports - Sử dụng internal networks ## Monitoring 1. **Grafana Dashboards** - App metrics - MySQL metrics - System metrics 2. **Alerts** - Cấu hình trong Prometheus - Thông báo qua email/Slack ## Backup & Recovery 1. **Backup** - Tự động hàng ngày - Nén với gzip - Giữ 7 ngày 2. **Recovery** ```bash # Restore từ backup gunzip -c backup_YYYYMMDD_HHMMSS.sql.gz | mysql -h mysql_bp -u root -p blueprint ``` ## Troubleshooting 1. **Logs** ```bash # App logs docker-compose -f docker-compose.prod.yml logs app # MySQL logs docker-compose -f docker-compose.prod.yml logs mysql_bp # Nginx logs docker-compose -f docker-compose.prod.yml logs nginx ``` 2. **Health Checks** - App: http://localhost:8080/health - MySQL: docker-compose exec mysql_bp mysqladmin ping - Nginx: http://localhost/health ## Maintenance 1. **Update** ```bash # Pull latest images docker-compose -f docker-compose.prod.yml pull # Rebuild và restart docker-compose -f docker-compose.prod.yml up -d --build ``` 2. **Cleanup** ```bash # Xóa unused volumes docker volume prune # Xóa old images docker image prune ```