Skip to content

运维指南

健康检查

后端暴露 /healthz(存活探针)和 /readyz(就绪探针):

bash
curl http://localhost:8080/healthz
curl http://localhost:8080/readyz

通过 nginx(TLS):

bash
curl -k https://localhost/healthz

日志

bash
# 所有服务
make prod-logs

# 特定服务
docker logs -f umoo-backend
docker logs -f umoo-postgres
docker logs -f umoo-nginx

生产环境后端输出结构化 JSON 日志(UMOO_LOG_FORMAT=json)。

监控

NATS

NATS 监控端点 http://localhost:8222

bash
curl http://localhost:8222/varz    # 服务器变量
curl http://localhost:8222/connz   # 连接信息
curl http://localhost:8222/routez  # 路由信息
curl http://localhost:8222/subsz   # 订阅信息

PostgreSQL

检查连接池和活跃查询:

bash
docker exec umoo-postgres psql -U umoo -d umoo -c \
  "SELECT pid, state, query_start, query FROM pg_stat_activity WHERE datname='umoo';"

Redis

bash
docker exec umoo-redis redis-cli -a $REDIS_PASSWORD INFO memory
docker exec umoo-redis redis-cli -a $REDIS_PASSWORD INFO clients

备份与恢复

PostgreSQL 备份

bash
docker exec umoo-postgres pg_dump -U umoo umoo > backup_$(date +%Y%m%d_%H%M%S).sql

PostgreSQL 恢复

bash
docker exec -i umoo-postgres psql -U umoo umoo < backup_20260101_120000.sql

Redis 备份

Redis 配置了 AOF 持久化,数据存储在 redis_data 卷中。

bash
docker exec umoo-redis redis-cli -a $REDIS_PASSWORD BGSAVE
docker cp umoo-redis:/data/dump.rdb ./redis_backup_$(date +%Y%m%d).rdb

故障排查

服务无法启动

bash
# 检查容器状态
docker ps -a | grep umoo

# 查看最近日志
docker logs --tail 50 umoo-backend

# 验证依赖服务是否健康
docker inspect --format='{{.State.Health.Status}}' umoo-postgres
docker inspect --format='{{.State.Health.Status}}' umoo-redis
docker inspect --format='{{.State.Health.Status}}' umoo-nats-1

数据库连接问题

bash
# 从后端容器测试连通性
docker exec umoo-backend sh -c 'nc -z postgres 5432 && echo OK || echo FAIL'

# 检查 PostgreSQL 最大连接数
docker exec umoo-postgres psql -U umoo -c "SHOW max_connections;"
docker exec umoo-postgres psql -U umoo -c "SELECT count(*) FROM pg_stat_activity;"

NATS 集群问题

bash
# 检查集群路由
curl -s http://localhost:8222/routez | python3 -m json.tool

# 验证所有节点相互可见
for port in 8222; do
  echo "Node on $port:"
  curl -s "http://localhost:$port/routez" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'  Routes: {d[\"num_routes\"]}')"
done

限流

如果客户端收到 HTTP 429 响应,请检查限流配置:

  • Nginx:nginx.conf 中的 limit_req_zone(默认每 IP 100r/s)
  • 应用层:通过 Redis 实现的租户级限流(可按租户配置)

优雅关闭

后端支持优雅排水。收到 SIGTERM 时:

  1. 健康端点返回不健康(nginx 停止路由)
  2. 处理中的请求完成(30 秒超时)
  3. WebSocket 连接排水
  4. 数据库和 Redis 连接关闭
  5. 进程退出
bash
# 优雅重启
docker restart umoo-backend

# 或通过 compose
make prod-down && make prod-up

资源监控

bash
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

Umoo — IoT Device Management Platform