docker-compose.yaml 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. # =============================================================================
  2. # Zabbix 7.4.16 单机 Docker Compose —— 优化/低坑版
  3. # 用法(先备份原文件):
  4. # cd /opt/zabbix
  5. # cp docker-compose.yaml docker-compose.yaml.bak_$(date +%s)
  6. # docker compose -f docker-compose.new.yaml config -q # 先校验语法
  7. # docker compose -f docker-compose.new.yaml up -d # 重建生效
  8. # 说明:
  9. # - 镜像锁定精确版本,避免 `pull` 后被动升级。
  10. # - 密码/时区均可用 .env 覆盖,默认值与原文件一致,可直接替换。
  11. # - 缓存按 75k 项 / 186 台交换机的实测用量重估(见说明文档)。
  12. # =============================================================================
  13. services:
  14. zabbix-mysql:
  15. image: mysql:8.0.43
  16. container_name: zabbix-mysql
  17. command:
  18. - --character-set-server=utf8mb4
  19. - --collation-server=utf8mb4_bin
  20. - --innodb-buffer-pool-size=1G
  21. - --innodb-file-per-table=1
  22. - --log-bin-trust-function-creators=1
  23. environment:
  24. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
  25. MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
  26. MYSQL_USER: ${MYSQL_USER:-zabbix}
  27. MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
  28. TZ: ${TZ:-UTC}
  29. volumes:
  30. - /opt/zabbix/zabbix-server/mysql_data:/var/lib/mysql
  31. networks:
  32. zabbix:
  33. ipv4_address: 192.168.87.22
  34. restart: unless-stopped
  35. stop_grace_period: 1m
  36. logging:
  37. driver: json-file
  38. options:
  39. max-size: "10m"
  40. max-file: "3"
  41. healthcheck:
  42. test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
  43. interval: 10s
  44. timeout: 5s
  45. retries: 10
  46. start_period: 40s
  47. zabbix-server:
  48. image: zabbix/zabbix-server-mysql:ubuntu-7.4.16
  49. container_name: zabbix-server
  50. networks:
  51. zabbix:
  52. ipv4_address: 192.168.87.21
  53. ulimits:
  54. nproc: 65535
  55. nofile:
  56. soft: 20000
  57. hard: 40000
  58. # 仅保留实际需要的权限:NET_RAW 供 fping(ICMP 监控),SYS_NICE 供进程优先级。
  59. # 不再使用 privileged:true / cap_add:ALL(过度授权、有安全风险)。
  60. # 若完全不做 ICMP ping 监控,可删除整个 cap_add 段。
  61. cap_add:
  62. - NET_RAW
  63. - SYS_NICE
  64. sysctls:
  65. - net.ipv4.ip_local_port_range=1024 65000
  66. - net.ipv4.conf.all.accept_redirects=0
  67. - net.ipv4.conf.all.secure_redirects=0
  68. - net.ipv4.conf.all.send_redirects=0
  69. restart: unless-stopped
  70. stop_grace_period: 30s
  71. logging:
  72. driver: json-file
  73. options:
  74. max-size: "10m"
  75. max-file: "3"
  76. environment:
  77. DB_SERVER_HOST: zabbix-mysql
  78. MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
  79. MYSQL_USER: ${MYSQL_USER:-zabbix}
  80. MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
  81. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
  82. TZ: ${TZ:-UTC}
  83. # ---- 缓存:按 75k 项、186 台交换机的实测用量重新定容 ----
  84. ZBX_CACHESIZE: 512M # 配置缓存 实测 12%(~123M),512M 留约 4 倍余量
  85. ZBX_VALUECACHESIZE: 128M # 值缓存 实测 1.1%(~12M)
  86. ZBX_TRENDCACHESIZE: 64M # 趋势缓存 实测 0.39%(~4M),原 1G 严重超配
  87. ZBX_HISTORYCACHESIZE: 64M # 历史缓存 实测≈0
  88. ZBX_HISTORYINDEXCACHESIZE: 16M # 历史索引 实测 0.24%(~77K)
  89. ZBX_TRENDFUNCTIONCACHESIZE: 16M # 趋势函数缓存,默认 4M 已足
  90. # ---- 进程数:186 台交换机以 1 次 walk/台 轮询,30 个 SNMP poller 实测 busy≈3% ----
  91. ZBX_STARTSNMPPOLLERS: 30
  92. ZBX_STARTLLDWORKERS: 10 # 大批 LLD 发现更快
  93. ZBX_STARTPREPROCESSORS: 5
  94. ports:
  95. - '10051:10051'
  96. volumes:
  97. - /opt/zabbix/zabbix-server/data:/data
  98. - /opt/zabbix/zabbix-server/data/alertscripts:/usr/lib/zabbix/alertscripts
  99. depends_on:
  100. zabbix-mysql:
  101. condition: service_healthy
  102. zabbix-web-nginx-mysql:
  103. image: zabbix/zabbix-web-nginx-mysql:ubuntu-7.4.16
  104. container_name: zabbix-webservice
  105. networks:
  106. zabbix:
  107. ipv4_address: 192.168.87.20
  108. restart: unless-stopped
  109. logging:
  110. driver: json-file
  111. options:
  112. max-size: "10m"
  113. max-file: "3"
  114. environment:
  115. DB_SERVER_HOST: zabbix-mysql
  116. MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
  117. MYSQL_USER: ${MYSQL_USER:-zabbix}
  118. MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
  119. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
  120. ZBX_SERVER_HOST: zabbix-server
  121. TZ: ${TZ:-UTC}
  122. PHP_TZ: ${TZ:-UTC}
  123. volumes:
  124. - /opt/zabbix/zabbix-server/web:/data
  125. # 插件目录随仓库一起走:默认用 compose 同级的 ./web-modules,
  126. # 已有环境可用 WEB_MODULES_DIR 覆盖为绝对路径(如 /opt/zabbix/zabbix-server/web-modules)。
  127. - ${WEB_MODULES_DIR:-./web-modules}:/usr/share/zabbix/modules
  128. - /opt/zabbix/zabbix-server/fonts/simkai.ttf:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf
  129. depends_on:
  130. zabbix-mysql:
  131. condition: service_healthy
  132. zabbix-server:
  133. condition: service_started
  134. # ---------------------------------------------------------------------------
  135. # 首次部署自动登记 WecomCenter 模块(幂等):让全新 Docker 环境 up 起来后插件
  136. # 就已“启用”,无需手动去 Administration → General → Modules 点启用。
  137. # moduleid 在 Zabbix 里不是自增列,这里取 MAX+1 显式写入。
  138. # ---------------------------------------------------------------------------
  139. wecom-module-init:
  140. image: mysql:8.0.43
  141. container_name: zabbix-wecom-module-init
  142. restart: "no"
  143. depends_on:
  144. zabbix-mysql:
  145. condition: service_healthy
  146. environment:
  147. MYSQL_PWD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
  148. MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
  149. entrypoint: ["/bin/sh", "-c"]
  150. command:
  151. - |
  152. set -e
  153. HOST=zabbix-mysql
  154. DB="$${MYSQL_DATABASE}"
  155. echo "[wecom-init] waiting for MySQL at $$HOST ..."
  156. until mysql -h "$$HOST" -uroot -e "SELECT 1" >/dev/null 2>&1; do sleep 2; done
  157. mysql -h "$$HOST" -uroot "$$DB" <<'SQL'
  158. SET @nid := (SELECT COALESCE(MAX(moduleid), 0) + 1 FROM module);
  159. INSERT INTO module (moduleid, id, relative_path, status, config)
  160. SELECT @nid, 'wecom_center', 'modules/WecomCenter', 1, '[]'
  161. FROM DUAL
  162. WHERE NOT EXISTS (SELECT 1 FROM module WHERE id = 'wecom_center');
  163. SQL
  164. echo "[wecom-init] module 'wecom_center' ensured (enabled)."
  165. networks:
  166. - zabbix
  167. logging:
  168. driver: json-file
  169. options:
  170. max-size: "5m"
  171. max-file: "2"
  172. networks:
  173. zabbix:
  174. ipam:
  175. config:
  176. - subnet: 192.168.87.0/24