Files
mqtt_power/docker-compose.yml

124 lines
4.6 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

version: '3.8'
services:
# MySQL Database Service
mysql-db:
image: mysql:8.0
container_name: mqtt_mysql_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-supersecretpassword} # 请通过环境变量或OneDev Secrets在生产中设置此密码
MYSQL_DATABASE: ${MYSQL_DATABASE:-mqtt_power}
MYSQL_USER: ${MYSQL_USER:-appuser}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-apppassword} # 请通过环境变量或OneDev Secrets在生产中设置此密码
ports:
# 仅在需要从外部直接访问数据库时暴露端口 (例如用于调试或外部工具)
# 对于应用容器它们将通过Docker内部网络连接
- "33061:3306" # 示例将容器的3306映射到主机的33061
volumes:
- mysql_data:/var/lib/mysql
# 如果有初始化脚本,可以挂载:
# - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u$$MYSQL_USER", "-p$$MYSQL_PASSWORD"]
interval: 10s
timeout: 5s
retries: 5
# EMQX MQTT Broker Service
emqx:
image: emqx/emqx:5.6.0 # 使用较新的 EMQX 5 版本
container_name: mqtt_emqx_broker
restart: unless-stopped
ports:
- "1883:1883" # MQTT default port
- "8083:8083" # MQTT over WebSocket
- "8084:8084" # MQTT over SSL/TLS WebSocket
- "8883:8883" # MQTT over SSL/TLS
- "18083:18083" # EMQX Dashboard / HTTP API
volumes:
- emqx_data:/opt/emqx/data
- emqx_log:/opt/emqx/log
# 如果有自定义配置,可以挂载 emqx.conf 或 mounted_plugins 等
# - ./emqx_conf/emqx.conf:/opt/emqx/etc/emqx.conf
networks:
- app-network
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 30s
timeout: 10s
retries: 3
environment:
EMQX_NODE_NAME: "emqx@node1.emqx.io" # 可以自定义节点名
EMQX_LISTENER__TCP__EXTERNAL: "1883"
EMQX_LISTENER__WS__EXTERNAL: "8083"
EMQX_DASHBOARD__LISTENER__HTTP: "18083"
# 更多 EMQX 配置可以通过环境变量设置,参考 EMQX 文档
# Backend Spring Boot Application Service
backend-app:
image: your-docker-registry/mqtt-springboot-app:latest # 将在 CI/CD 中构建和推送
container_name: mqtt_springboot_app_prod
restart: unless-stopped
depends_on:
mysql-db: # 确保数据库先启动并健康
condition: service_healthy
emqx: # 确保 MQTT Broker 先启动并健康
condition: service_healthy
ports:
- "7529:7529"
environment:
# Spring Boot Profile
SPRING_PROFILES_ACTIVE: prod # 或者其他生产环境profile
# Database connection (连接到此 compose 文件中的 mysql-db 服务)
DB_HOST: mysql-db
DB_PORT: 3306
DB_NAME: ${MYSQL_DATABASE:-mqtt_power}
DB_USER: ${MYSQL_USER:-appuser}
DB_PASSWORD: ${MYSQL_PASSWORD:-apppassword} # 确保与 mysql-db 中 MYSQL_PASSWORD 一致
# MQTT Broker connection (连接到此 compose 文件中的 emqx 服务)
MQTT_BROKER_URL: tcp://emqx:1883
# MQTT_USERNAME: # 如果 EMQX 设置了认证
# MQTT_PASSWORD: # 如果 EMQX 设置了认证
# 其他后端应用所需的环境变量
# ...
networks:
- app-network
# 如果需要,可以添加 healthcheck
# healthcheck:
# test: ["CMD", "curl", "-f", "http://localhost:7529/api/actuator/health"] # 假设有 actuator health 端点
# interval: 30s
# timeout: 10s
# retries: 3
# Frontend Next.js Application Service
frontend-app:
image: your-docker-registry/mqtt-nextjs-app:latest # 将在 CI/CD 中构建和推送
container_name: mqtt_nextjs_app_prod
restart: unless-stopped
ports:
- "3000:3000"
environment:
# API 地址,指向后端服务的容器名和端口 (如果前端直接调用API)
# 如果 Next.js 使用了 next.config.js/mjs 中的 rewrites 代理 /api 到后端,则这里可能不需要
# NEXT_PUBLIC_API_URL: http://backend-app:7529/api
# 如果前端需要连接 MQTT Broker (例如通过 WebSocket)
NEXT_PUBLIC_MQTT_WS_URL: ws://emqx:8083/mqtt # 指向 EMQX 的 WebSocket 端口
# 其他前端应用所需的环境变量
# ...
networks:
- app-network
depends_on: # 可选,如果前端启动时需要后端已启动
- backend-app
# - emqx # 如果前端直接依赖 MQTT Broker
volumes:
mysql_data: # 持久化 MySQL 数据
emqx_data: # 持久化 EMQX 数据
emqx_log: # 持久化 EMQX 日志
networks:
app-network:
driver: bridge