物联网平台部署环境详细文档
大约 16 分钟
物联网平台部署环境详细文档
目录
项目概述
目前平台依赖的组件过多,为了方便部署测试,综合情况下提供了docker 一键安装环境,一下为所依赖的环境组件。
docker-compose编排仓库
https://codeup.aliyun.com/62917f5a3e81781f3ad13296/wulianwang/Installation_env.git
技术栈
- 数据库: MySQL 8.0
- 缓存: Redis 7.0
- 时序数据库: InfluxDB 2.7
- 消息队列: NSQ
- 配置中心: Etcd
- 容器化: Docker & Docker Compose
- 数据库迁移: migrate
环境要求
硬件要求
- CPU: 4核心以上
- 内存: 8GB以上
- 存储: 50GB以上可用空间
- 网络: 稳定的网络连接
软件要求
- 操作系统: Linux/macOS/Windows
- Docker: 20.10.0+
- Docker Compose: 2.0.0+
- Git: 用于代码管理
端口占用情况
| 服务 | 端口 | 用途 |
|---|---|---|
| MySQL | 3319 | 数据库连接 |
| Redis | 6379 | 缓存连接 |
| InfluxDB | 8086 | 时序数据库 |
| NSQ Lookup | 4160, 4161 | 消息发现 |
| NSQ Daemon | 4150, 4151 | 消息处理 |
| NSQ Admin | 4171 | 管理界面 |
| Etcd | 2379, 2380 | 配置中心 |
应用情况
| 服务 | 端口 | 用途 |
|---|---|---|
| 用户管理模块 | 8000 | http服务 |
| 用户管理模块 | 51300 | grpc服务 |
| 设备管理模块 | 8001 | http服务 |
| 设备管理模块 | 51301 | grpc服务 |
| 数据处理模块 | 8002 | http服务 |
| 数据处理模块 | 51302 | grpc服务 |
| 报警模块 | 8003 | http服务 |
| 报警模块 | 51303 | grpc服务 |
| 消息推送模块 | 8004 | http服务 |
| 消息推送模块 | 51304 | grpc服务 |
Docker环境搭建
1. 安装Docker
Ubuntu/Debian
# 更新包索引
sudo apt update
# 安装必要的包
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-pluginCentOS/RHEL
# 安装必要的包
sudo yum install -y yum-utils
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable dockermacOS
# 使用Homebrew安装
brew install --cask docker
# 或下载Docker Desktop for Mac
# https://www.docker.com/products/docker-desktopWindows
# 方法1: 使用Chocolatey安装
# 首先安装Chocolatey (如果未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 使用Chocolatey安装Docker Desktop
choco install docker-desktop
# 方法2: 手动下载安装
# 1. 访问Docker官网下载页面
# https://www.docker.com/products/docker-desktop
# 2. 下载Docker Desktop for Windows
# 3. 运行安装程序Docker Desktop Installer.exe
# 4. 按照安装向导完成安装
# 5. 重启计算机
# 方法3: 使用Winget安装 (Windows 10/11)
winget install Docker.DockerDesktop
# 安装完成后启动Docker Desktop
# 首次启动可能需要启用WSL2或Hyper-V功能2. 验证Docker安装
# 检查Docker版本
docker --version
docker compose version
# 运行测试容器
docker run hello-world3. Windows特定配置
启用WSL2 (推荐)
# 1. 启用WSL功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 2. 启用虚拟机平台功能
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 3. 重启计算机
shutdown /r /t 0
# 4. 下载并安装WSL2 Linux内核更新包
# 访问: https://aka.ms/wsl2kernel
# 5. 设置WSL2为默认版本
wsl --set-default-version 2
# 6. 安装Linux发行版 (可选,推荐Ubuntu)
wsl --install -d Ubuntu启用Hyper-V (备选方案)
# 1. 以管理员身份运行PowerShell
# 2. 启用Hyper-V功能
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
# 3. 重启计算机
Restart-ComputerDocker Desktop配置
# 启动Docker Desktop后,进行以下配置:
# 1. 打开Docker Desktop设置
# 2. 进入Settings -> General
# - 勾选 "Use the WSL 2 based engine"
# - 勾选 "Use Docker Compose V2"
# 3. 进入Settings -> Resources -> WSL Integration
# - 勾选 "Enable integration with my default WSL distro"
# - 勾选要集成的Linux发行版
# 4. 进入Settings -> Resources -> Advanced
# - 调整内存分配 (建议8GB以上)
# - 调整CPU核心数 (建议4核以上)
# 5. 点击Apply & Restart应用配置Windows常见问题解决
问题1: Docker Desktop启动失败
# 解决方案:
# 1. 确保已启用WSL2或Hyper-V
# 2. 以管理员身份运行Docker Desktop
# 3. 检查Windows版本要求 (Windows 10 2004+ 或 Windows 11)
# 检查Windows版本
winver问题2: WSL2安装失败
# 解决方案:
# 1. 确保Windows版本支持WSL2
# 2. 手动下载WSL2内核更新包
# 3. 启用必要的Windows功能
# 检查WSL状态
wsl --status
wsl --list --verbose问题3: 端口被占用
# 检查端口占用
netstat -ano | findstr :2379
netstat -ano | findstr :3319
# 结束占用端口的进程
taskkill /PID <进程ID> /F问题4: 文件路径问题
# Windows路径转换为Linux路径格式
# C:\Users\username\project -> /mnt/c/Users/username/project
# 在WSL中使用Windows路径
cd /mnt/c/Users/username/installation_env4. 配置Docker权限(Linux)
# 将当前用户添加到docker组
sudo usermod -aG docker $USER
# 重新登录或执行
newgrp docker
# 验证权限
docker run hello-world服务组件详解
1. MySQL数据库服务
配置说明
mysql:
image: mysql:8.0
container_name: wulianwang_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wulianwang_server
ports:
- "3319:3306"
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql_config/my.cnf:/etc/my.cnfMySQL配置文件 (my.cnf)
[mysqld]
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES特性
- 版本: MySQL 8.0
- 端口映射: 3319:3306
- 数据持久化: ./mysql_data
- 健康检查: mysqladmin ping
- SQL模式: 严格模式,支持ANSI_QUOTES
2. Redis缓存服务
配置说明
redis:
image: redis:7.0
container_name: wulianwang_redis
restart: always
ports:
- "6379:6379"
volumes:
- ./redis_data:/data
command: redis-server --appendonly yes特性
- 版本: Redis 7.0
- 持久化: AOF (Append Only File)
- 端口: 6379
- 健康检查: redis-cli ping
3. InfluxDB时序数据库
配置说明
influxdb:
image: influxdb:2.7
container_name: wulianwang_influxdb
restart: always
ports:
- "8086:8086"
volumes:
- ./influxdb_data:/var/lib/influxdb2
- ./influxdb/config:/etc/influxdb2
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=xczn
- DOCKER_INFLUXDB_INIT_PASSWORD=xczn123456
- DOCKER_INFLUXDB_INIT_ORG=xczn
- DOCKER_INFLUXDB_INIT_BUCKET=wulianwang
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=fnT6_QACkntSE8r9qsRs--MsU_ZUEe2RNUukC8rX2jdqRuAUnjnZPpHP4IZq9uM89aVc9CyBBT9xSRln-AgmDw==InfluxDB配置文件
[default]
url = "http://localhost:8086"
token = "fnT6_QACkntSE8r9qsRs--MsU_ZUEe2RNUukC8rX2jdqRuAUnjnZPpHP4IZq9uM89aVc9CyBBT9xSRln-AgmDw=="
org = "xczn"
active = true特性
- 版本: InfluxDB 2.7
- 组织: xczn
- 存储桶: wulianwang, wulianwang_simple
- 认证: Token认证
- 健康检查: HTTP健康检查
4. NSQ消息队列
NSQ Lookup服务
nsqlookupd:
image: nsqio/nsq
container_name: wulianwang_server_nsqlookupd
restart: always
command: /nsqlookupd
ports:
- "4160:4160" # TCP端口
- "4161:4161" # HTTP端口NSQ Daemon服务
nsqd:
image: nsqio/nsq
container_name: wulianwang_server_nsqd
restart: always
command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=127.0.0.1
depends_on:
- nsqlookupd
ports:
- "4150:4150" # TCP端口
- "4151:4151" # HTTP端口NSQ Admin管理界面
nsqadmin:
image: nsqio/nsq
container_name: wulianwang_server_nsqadmin
restart: always
command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
depends_on:
- nsqlookupd
ports:
- "4171:4171"特性
- 版本: NSQ最新版
- 架构: 分布式消息队列
- 管理界面: http://localhost:4171
- 健康检查: HTTP ping检查
5. Etcd配置中心
配置说明
etcd:
image: quay.io/coreos/etcd:v3.5.15
container_name: wulianwang_server_etcd
restart: always
ports:
- "2379:2379" # 客户端通信端口
- "2380:2380" # 服务器间通信端口
volumes:
- etcd_data:/etcd-data
command: >
/usr/local/bin/etcd
--name=etcd-server
--data-dir=/etcd-data
--listen-client-urls=http://0.0.0.0:2379
--advertise-client-urls=http://etcd:2379
--listen-peer-urls=http://0.0.0.0:2380
--initial-advertise-peer-urls=http://etcd:2380
--initial-cluster=etcd-server=http://etcd:2380
--initial-cluster-token=etcd-cluster-token
--initial-cluster-state=new
--auto-compaction-retention=1
--quota-backend-bytes=4294967296
--heartbeat-interval=250
--election-timeout=1250特性
- 版本: Etcd v3.5.15
- 数据持久化: etcd_data卷
- 自动压缩: 保留1小时
- 存储配额: 4GB
- 健康检查: etcdctl endpoint health
6. 应用服务
配置说明
app:
image: xczn/wulianwang:1.1
container_name: wulianwang_app
restart: always
ports:
- "8232:8232" # HTTP服务端口
- "51308:51308" # GRPC服务端口
volumes:
- app_logs:/app/log
depends_on:
- mysql
- redis
- influxdb
- nsqd
- etcd环境变量配置
environment:
# 数据库配置
- GF_DATABASE_DEFAULT_LINK=mysql:root:root@tcp(mysql:3306)/equipment_model
# Redis配置
- GF_REDIS_DEFAULT_ADDRESS=redis:6379
- GF_REDIS_DEFAULT_DB=6
# InfluxDB配置
- GF_INFLUXDB_HOST=http://influxdb:8086
- GF_INFLUXDB_TOKEN=fnT6_QACkntSE8r9qsRs--MsU_ZUEe2RNUukC8rX2jdqRuAUnjnZPpHP4IZq9uM89aVc9CyBBT9xSRln-AgmDw==
- GF_INFLUXDB_ORG=xczn
- GF_INFLUXDB_BUCKET=wulianwang
- GF_INFLUXDB_BUCKET_SIMPLE=wulianwang_simple
# NSQ配置
- GF_NSQ_NSQD_ADDRESS=nsqd:4150
- GF_NSQ_NSQLOOKUPD_ADDRESS=nsqlookupd:4161
- GF_NSQ_MAX_IN_FLIGHT=200
- GF_NSQ_CONCURRENCY=10
# Etcd配置
- GF_ETCD_ENDPOINTS=etcd:2379
- GF_ETCD_NAMESPACE=/wulianwang
- GF_ETCD_TIMEOUT=5s
# 服务器配置
- GF_SERVER_ADDRESS=:8232
- GF_SERVER_OPENAPIPATH=/api.json
- GF_SERVER_SWAGGERPATH=/swagger
# GRPC配置
- GF_GRPC_NAME=wulianwang
- GF_GRPC_ADDRESS=:51308
# 日志配置
- GF_LOGGER_LEVEL=all
- GF_LOGGER_STDOUT=true
- GF_LOGGER_PATH=./log7. 数据库迁移服务
配置说明
migration:
image: migrate/migrate:v4.16.2
container_name: wulianwang_migration
volumes:
- ./migration:/migrations
depends_on:
mysql:
condition: service_healthy
command: >
-source file:///migrations
-database mysql://root:root@tcp(mysql:3306)/wulianwang_server
up数据库迁移
迁移文件结构
migration/
├── 000001_create_users_table.up.sql # 用户表
├── 000001_create_users_table.down.sql
├── 000002_create_users_role_table.up.sql # 用户角色关联表
├── 000002_create_users_role_table.down.sql
├── 000003_create_role_permission_table.up.sql # 角色权限关联表
├── 000003_create_role_permission_table.down.sql
├── 000004_create_permissions_table.up.sql # 权限表
├── 000004_create_permissions_table.down.sql
├── 000005_create_department_table.up.sql # 部门表
├── 000005_create_department_table.down.sql
├── 000006_create_organization_table.up.sql # 组织表
├── 000006_create_organization_table.down.sql
├── 000007_create_role_table.up.sql # 角色表
├── 000007_create_role_table.down.sql
├── 000008_create_physical_model_attribute_table.up.sql # 物理模型属性表
├── 000008_create_physical_model_attribute_table.down.sql
├── 000009_create_physical_model_data_type.up.sql # 物理模型数据类型表
├── 000009_create_physical_model_data_type.down.sql
├── 000010_create_product_table.up.sql # 产品表
├── 000010_create_product_table.down.sql
├── 000011_create_product_attribute.up.sql # 产品属性表
├── 000011_create_product_attribute.down.sql
├── 000012_create_sim_table.up.sql # SIM卡表
├── 000012_create_sim_table.down.sql
├── 000013_create_equipment_attribute.up.sql # 设备属性表
├── 000013_create_equipment_attribute.down.sql
├── 000014_add_data_type.up.sql # 添加数据类型
├── 000014_add_data_type.down.sql
├── 000015_add_data_physical_model_type.up.sql # 添加物理模型类型
├── 000015_add_data_physical_model_type.down.sql
├── 000016_equipment_attribute_setting.up.sql # 设备属性设置表
├── 000016_equipment_attribute_setting.down.sql
├── 000017_create_dirve_table.up.sql # 驱动表
├── 000017_create_dirve_table.down.sql
├── 000018_create_dirve_node_table.up.sql # 驱动节点表
├── 000018_create_dirve_node_table.down.sql
├── 000019_create_equipment_table.up.sql # 设备表
├── 000019_create_equipment_table.down.sql
├── 000020_create_alarm_rule_table.up.sql # 告警规则表
├── 000020_create_alarm_rule_table.down.sql
├── 000021_create_rule_content_table.up.sql # 规则内容表
├── 000021_create_rule_content_table.down.sql
├── 000022_create_rule_content_notice_way_table.up.sql # 规则内容通知方式表
├── 000022_create_rule_content_notice_way_table.down.sql
├── 000023_create_alarm_table.up.sql # 告警表
├── 000023_create_alarm_table.down.sql
├── 000024_create_equipment_control_table.up.sql # 设备控制表
├── 000024_create_equipment_control_table.down.sql
├── 000025_create_equipment_event.up.sql # 设备事件表
├── 000025_create_equipment_event.down.sql
├── 000026_create_equipment_handle_log.up.sql # 设备处理日志表
├── 000026_create_equipment_handle_log.down.sql
├── 000027_create_equipment_log.up.sql # 设备日志表
├── 000027_create_equipment_log.down.sql
├── 000028_create_equipment_setting.up.sql # 设备设置表
├── 000028_create_equipment_setting.down.sql
├── 000029_create_notication.up.sql # 通知表
├── 000029_create_notication.down.sql
├── 000030_create_notice_way.up.sql # 通知方式表
└── 000030_create_notice_way.down.sql迁移命令
执行迁移
# 使用Docker执行迁移
docker compose up migration
# 手动执行迁移
docker run --rm -v $(pwd)/migration:/migrations --network installation_env_app_network migrate/migrate:v4.16.2 \
-path /migrations \
-database "mysql://root:root@tcp(mysql:3306)/wulianwang_server" \
up回滚迁移
# 回滚到上一个版本
docker run --rm -v $(pwd)/migration:/migrations --network installation_env_app_network migrate/migrate:v4.16.2 \
-path /migrations \
-database "mysql://root:root@tcp(mysql:3306)/wulianwang_server" \
down 1
# 回滚到指定版本
docker run --rm -v $(pwd)/migration:/migrations --network installation_env_app_network migrate/migrate:v4.16.2 \
-path /migrations \
-database "mysql://root:root@tcp(mysql:3306)/wulianwang_server" \
goto 000010查看迁移状态
# 查看当前迁移版本
docker run --rm -v $(pwd)/migration:/migrations --network installation_env_app_network migrate/migrate:v4.16.2 \
-path /migrations \
-database "mysql://root:root@tcp(mysql:3306)/wulianwang_server" \
version配置说明
网络配置
networks:
app_network:
driver: bridge所有服务都在同一个Docker网络中,服务间可以通过容器名进行通信。
数据卷配置
volumes:
mysql_data: # MySQL数据持久化
redis_data: # Redis数据持久化
influxdb_data: # InfluxDB数据持久化
etcd_data: # Etcd数据持久化
app_logs: # 应用日志环境变量说明
数据库连接
GF_DATABASE_DEFAULT_LINK: MySQL连接字符串GF_REDIS_DEFAULT_ADDRESS: Redis连接地址GF_REDIS_DEFAULT_DB: Redis数据库编号
InfluxDB配置
GF_INFLUXDB_HOST: InfluxDB服务地址GF_INFLUXDB_TOKEN: 认证TokenGF_INFLUXDB_ORG: 组织名称GF_INFLUXDB_BUCKET: 主存储桶GF_INFLUXDB_BUCKET_SIMPLE: 简化存储桶
NSQ配置
GF_NSQ_NSQD_ADDRESS: NSQ Daemon地址GF_NSQ_NSQLOOKUPD_ADDRESS: NSQ Lookup地址GF_NSQ_MAX_IN_FLIGHT: 最大飞行消息数GF_NSQ_CONCURRENCY: 并发处理数
Etcd配置
GF_ETCD_ENDPOINTS: Etcd服务端点GF_ETCD_NAMESPACE: 命名空间前缀GF_ETCD_TIMEOUT: 超时时间
服务配置
GF_SERVER_ADDRESS: HTTP服务监听地址GF_SERVER_OPENAPIPATH: OpenAPI文档路径GF_SERVER_SWAGGERPATH: Swagger UI路径GF_GRPC_ADDRESS: GRPC服务监听地址
日志配置
GF_LOGGER_LEVEL: 日志级别GF_LOGGER_STDOUT: 是否输出到标准输出GF_LOGGER_PATH: 日志文件路径
部署流程
1. 环境准备
克隆项目
# Linux/macOS
git clone <repository-url>
cd installation_env
# Windows (PowerShell)
git clone <repository-url>
cd installation_env
# Windows (WSL)
git clone <repository-url>
cd installation_env检查端口占用
# Linux/macOS
netstat -tulpn | grep -E ':(3319|6379|8086|4150|4151|4160|4161|4171|2379|2380|8232|51308)'
# Windows (PowerShell)
netstat -ano | findstr ":3319 :6379 :8086 :4150 :4151 :4160 :4161 :4171 :2379 :2380 :8232 :51308"
# Windows (CMD)
netstat -ano | findstr "3319 6379 8086 4150 4151 4160 4161 4171 2379 2380 8232 51308"创建必要的目录
# Linux/macOS
mkdir -p mysql_data redis_data influxdb_data etcd_data app_logs
# Windows (PowerShell)
New-Item -ItemType Directory -Force -Path mysql_data, redis_data, influxdb_data, etcd_data, app_logs
# Windows (CMD)
mkdir mysql_data redis_data influxdb_data etcd_data app_logs2. 配置文件检查
验证docker-compose.yml
# 验证Docker Compose文件语法
docker compose config检查配置文件
# 检查MySQL配置
cat mysql_config/my.cnf
# 检查InfluxDB配置
cat influxdb/config/influx-configs3. 启动服务
启动所有服务
# 后台启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps分步启动服务
# 1. 启动基础设施服务
docker compose up -d mysql redis influxdb etcd
# 2. 等待服务健康检查通过
docker compose logs -f mysql redis influxdb etcd
# 3. 启动消息队列
docker compose up -d nsqlookupd nsqd nsqadmin
# 4. 执行数据库迁移
docker compose up migration
# 5. 启动应用服务
docker compose up -d app4. 验证部署
检查服务状态
# 查看所有容器状态
docker compose ps
# 查看服务日志
docker compose logs -f app测试服务连通性
# 测试MySQL连接
docker exec wulianwang_mysql mysql -uroot -proot -e "SELECT 1"
# 测试Redis连接
docker exec wulianwang_redis redis-cli ping
# 测试InfluxDB连接
curl -f http://localhost:8086/health
# 测试应用服务
curl http://localhost:8232/health访问管理界面
- NSQ Admin: http://localhost:4171
- InfluxDB UI: http://localhost:8086
- 应用Swagger: http://localhost:8232/swagger
监控与健康检查
健康检查配置
MySQL健康检查
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 10s
timeout: 5s
retries: 5Redis健康检查
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5InfluxDB健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8086/health"]
interval: 10s
timeout: 5s
retries: 5NSQ健康检查
healthcheck:
test: ["CMD", "sh", "-c", "wget -q --spider http://localhost:4151/ping || exit 1"]
interval: 10s
timeout: 5s
retries: 5Etcd健康检查
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health", "--endpoints=http://localhost:2379"]
interval: 30s
timeout: 10s
retries: 3监控命令
查看服务状态
# 查看所有服务状态
docker compose ps
# 查看特定服务状态
docker compose ps mysql redis influxdb
# 查看服务健康状态
docker inspect --format='{{.State.Health.Status}}' wulianwang_mysql查看服务日志
# 查看所有服务日志
docker compose logs
# 查看特定服务日志
docker compose logs app
# 实时查看日志
docker compose logs -f app
# 查看最近100行日志
docker compose logs --tail=100 app资源监控
# 查看容器资源使用情况
docker stats
# 查看特定容器资源使用
docker stats wulianwang_app wulianwang_mysql wulianwang_redis服务连通性测试
# 测试MySQL
docker exec wulianwang_app mysql -hmysql -uroot -proot -e "SELECT 1"
# 测试Redis
docker exec wulianwang_app redis-cli -h redis ping
# 测试InfluxDB
docker exec wulianwang_app curl -f http://influxdb:8086/health
# 测试NSQ
docker exec wulianwang_app curl -f http://nsqd:4151/stats故障排除
常见问题
1. 容器启动失败
问题: 容器无法启动或频繁重启
排查步骤:
# 查看容器状态
docker compose ps
# 查看详细错误信息
docker compose logs <service_name>
# 查看容器配置
docker inspect <container_name>解决方案:
- 检查端口冲突
- 检查配置文件语法
- 检查数据卷权限
- 检查环境变量设置
2. 数据库连接失败
问题: 应用无法连接数据库
排查步骤:
# 检查MySQL容器状态
docker compose ps mysql
# 查看MySQL日志
docker compose logs mysql
# 测试MySQL连接
docker exec wulianwang_mysql mysql -uroot -proot -e "SELECT 1"
# 检查网络连通性
docker exec wulianwang_app ping mysql解决方案:
- 等待MySQL完全启动
- 检查数据库密码配置
- 检查网络配置
- 重启相关服务
3. 迁移失败
问题: 数据库迁移执行失败
排查步骤:
# 查看迁移日志
docker compose logs migration
# 手动执行迁移
docker run --rm -v $(pwd)/migration:/migrations --network installation_env_app_network migrate/migrate:v4.16.2 \
-path /migrations \
-database "mysql://root:root@tcp(mysql:3306)/wulianwang_server" \
version解决方案:
- 检查迁移文件语法
- 检查数据库连接
- 清理失败的迁移记录
- 手动执行迁移
4. 服务依赖问题
问题: 服务启动顺序错误
排查步骤:
# 查看服务依赖关系
docker compose config
# 检查健康检查状态
docker inspect --format='{{.State.Health.Status}}' <container_name>解决方案:
- 使用depends_on配置依赖关系
- 使用健康检查确保依赖服务就绪
- 调整服务启动顺序
5. Windows特定问题
问题1: Docker Desktop无法启动
# 排查步骤:
# 1. 检查Windows版本
winver
# 2. 检查WSL2状态
wsl --status
# 3. 检查Hyper-V状态
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
# 解决方案:
# 1. 更新Windows到最新版本
# 2. 启用WSL2功能
# 3. 重启Docker Desktop
# 4. 以管理员身份运行问题2: 端口访问被拒绝
# Windows防火墙可能阻止端口访问
# 解决方案:
# 1. 打开Windows防火墙设置
# 2. 添加入站规则允许所需端口
# 3. 或临时关闭防火墙测试
# PowerShell命令添加防火墙规则
New-NetFirewallRule -DisplayName "Docker Ports" -Direction Inbound -Protocol TCP -LocalPort 3319,6379,8086,4150,4151,4160,4161,4171,2379,2380,8232,51308 -Action Allow问题3: 文件权限问题
# Windows文件权限可能导致容器无法访问数据卷
# 解决方案:
# 1. 确保Docker Desktop有足够权限
# 2. 在Docker Desktop设置中启用文件共享
# 3. 使用WSL2作为后端引擎
# 检查文件权限
icacls mysql_data问题4: 内存不足
# Docker Desktop默认内存分配可能不足
# 解决方案:
# 1. 打开Docker Desktop设置
# 2. 进入Resources -> Advanced
# 3. 增加内存分配 (建议8GB以上)
# 4. 重启Docker Desktop日志分析
应用日志
# 查看应用日志
docker compose logs app
# 过滤错误日志
docker compose logs app | grep -i error
# 查看特定时间段的日志
docker compose logs --since="2024-01-01T00:00:00" app数据库日志
# 查看MySQL日志
docker compose logs mysql
# 查看MySQL慢查询日志
docker exec wulianwang_mysql tail -f /var/log/mysql/slow.log系统资源日志
# 查看系统资源使用
docker stats --no-stream
# 查看磁盘使用情况
df -h
# 查看内存使用情况
free -h维护操作
数据备份
MySQL数据备份
# 备份数据库
docker exec wulianwang_mysql mysqldump -uroot -proot wulianwang_server > backup_$(date +%Y%m%d_%H%M%S).sql
# 备份特定表
docker exec wulianwang_mysql mysqldump -uroot -proot wulianwang_server users roles > users_roles_backup.sqlRedis数据备份
# 创建Redis备份
docker exec wulianwang_redis redis-cli BGSAVE
# 复制备份文件
docker cp wulianwang_redis:/data/dump.rdb ./redis_backup_$(date +%Y%m%d_%H%M%S).rdbInfluxDB数据备份
# 备份InfluxDB数据
docker exec wulianwang_influxdb influx backup /var/lib/influxdb2/backup
# 复制备份文件
docker cp wulianwang_influxdb:/var/lib/influxdb2/backup ./influxdb_backup_$(date +%Y%m%d_%H%M%S)数据恢复
MySQL数据恢复
# 恢复数据库
docker exec -i wulianwang_mysql mysql -uroot -proot wulianwang_server < backup_20240101_120000.sqlRedis数据恢复
# 停止Redis服务
docker compose stop redis
# 替换数据文件
docker cp redis_backup_20240101_120000.rdb wulianwang_redis:/data/dump.rdb
# 启动Redis服务
docker compose start redis服务更新
更新应用服务
# 拉取最新镜像
docker compose pull app
# 重启应用服务
docker compose up -d app更新所有服务
# 拉取所有最新镜像
docker compose pull
# 重启所有服务
docker compose up -d清理操作
清理未使用的镜像
# 删除未使用的镜像
docker image prune -f
# 删除所有未使用的资源
docker system prune -f清理日志文件
# Linux/macOS
# 清理Docker日志
docker system prune --volumes -f
# 清理应用日志
docker exec wulianwang_app find /app/log -name "*.log" -mtime +7 -delete
# Windows (PowerShell)
# 清理Docker日志
docker system prune --volumes -f
# 清理应用日志
docker exec wulianwang_app find /app/log -name "*.log" -mtime +7 -delete
# Windows (CMD)
# 清理Docker日志
docker system prune --volumes -f
# 清理应用日志
docker exec wulianwang_app find /app/log -name "*.log" -mtime +7 -delete性能优化
MySQL优化
# 查看MySQL配置
docker exec wulianwang_mysql mysql -uroot -proot -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'"
# 优化MySQL配置
# 编辑 mysql_config/my.cnf 添加优化参数Redis优化
# 查看Redis内存使用
docker exec wulianwang_redis redis-cli info memory
# 设置内存限制
docker exec wulianwang_redis redis-cli config set maxmemory 1gb应用优化
# 查看应用资源使用
docker stats wulianwang_app
# 调整应用配置
# 修改环境变量中的并发和超时设置安全建议
1. 密码安全
- 使用强密码
- 定期更换密码
- 不要在代码中硬编码密码
2. 网络安全
- 使用防火墙限制端口访问
- 配置SSL/TLS加密
- 使用VPN或内网访问
3. 数据安全
- 定期备份数据
- 加密敏感数据
- 限制数据库访问权限
4. 容器安全
- 使用非root用户运行容器
- 定期更新镜像版本
- 扫描镜像漏洞
总结
本文档详细介绍了物联网平台的完整部署流程,包括:
- 环境搭建: Docker和Docker Compose的安装配置
- 服务配置: 各个微服务组件的详细配置说明
- 数据库管理: 迁移文件的组织和管理
- 部署流程: 完整的部署步骤和验证方法
- 监控维护: 健康检查、日志分析和故障排除
- 安全建议: 生产环境的安全配置建议
通过遵循本文档,您可以成功部署和维护一个稳定可靠的物联网平台环境。如遇到问题,请参考故障排除部分或联系技术支持团队。