ubuntu22.04安装zabbix并设置邮件及钉钉机器人告警
一、使用docker-compose.yml文件启动Zabbix server、Zabbix web及Mysql
1、目录结构
zabbix-docker/
├── docker-compose.yml
├── .env
├── mysql-init/
│ └── 00-alter_charset.sql
└── server/
├── Dockerfile
└── sources.list
└── python-scripts/
└── alert_sms.py
mysql-init/00-alter_charset.sql:在 MySQL 容器首次启动时执行的脚本,用于将 zabbix 数据库设为 utf8mb4_bin
zabbix.com
。
server/Dockerfile:在官方 zabbix-server-mysql 镜像基础上安装 Python 3,以支持自定义脚本。
.env:存放数据库密码、时区、Web 端口等环境变量。
2、编写mysql-init/00-alter_charset.sql
ALTER DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
此脚本会在 MySQL 容器初始化时执行,保证之后由 Zabbix Server 导入的表全部继承 utf8mb4_bin
3、编写server/Dockerfile
# 使用官方 Zabbix Server 镜像作为基础镜像,基于 Ubuntu 系统,版本为 6.0
FROM zabbix/zabbix-server-mysql:ubuntu-6.0-latest
# 切换为 root 用户以便安装系统软件包
USER root
# 替换 apt 源为阿里云镜像,加快国内构建速度并避免网络超时问题
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse" > /etc/apt/sources.list && \
apt-get clean && \ # 清理旧缓存
apt-get update && \ # 更新 apt 索引
DEBIAN_FRONTEND=noninteractive \ # 避免安装过程中出现交互提示
apt-get install -y \ # 安装必要的软件包
python3-pip \ # Python 的包管理器
python3-requests \ # requests HTTP 库
vim && \ # 安装 vim 编辑器
rm -rf /var/lib/apt/lists/* # 安装完后清理 apt 缓存,减少镜像大小
# 将本地 python 脚本复制到容器内指定目录
COPY python-scripts/ /usr/local/bin/python-scripts/
# 赋予这些脚本可执行权限
RUN chmod -R +x /usr/local/bin/python-scripts/
# 切换回 zabbix 用户,确保容器内服务以非 root 用户运行,更安全
USER zabbix
-
python3-pip和python3-requests都由 APT 提供,符合 Debian 包管理流程,不触发 PEP 668 Ask UbuntuPi My Life Up。 -
安装
vim也是同理,通过 APT 安装,不需额外配置虚拟环境 Baeldung。
4、编写docker-compose.yml
services:
# MySQL 数据库服务
mysql-server:
image: mysql:8.0 # 使用官方 MySQL 8.0 镜像
container_name: zabbix-mysql # 容器名称
env_file: .env # 从 .env 文件加载环境变量
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # 数据库 root 密码
- MYSQL_DATABASE=${MYSQL_DATABASE} # 初始化的数据库名
- MYSQL_USER=${MYSQL_USER} # 普通用户
- MYSQL_PASSWORD=${MYSQL_PASSWORD} # 普通用户密码
- LANG=C.UTF-8 # 设置语言
- TZ=Asia/Shanghai # 设置时区为上海
command:
- --character-set-server=utf8mb4 # 设置默认字符集为 utf8mb4
- --collation-server=utf8mb4_bin # 设置字符序为 utf8mb4_bin(区分大小写)
- --skip-character-set-client-handshake # 忽略客户端字符集设置,强制使用服务器端字符集
volumes:
- zbx_mysql_data:/var/lib/mysql # 数据持久化存储路径
- ./mysql-init/00-alter_charset.sql:/docker-entrypoint-initdb.d/00-alter_charset.sql:ro # 初始化 SQL 脚本,设置数据库字符集
ports:
- "3306:3306" # 暴露 MySQL 端口
restart: unless-stopped # 容器异常退出时自动重启
networks:
- zbx-net # 加入名为 zbx-net 的自定义网络
# Zabbix 服务器服务
zabbix-server:
build:
context: ./server # Dockerfile 构建上下文目录
dockerfile: Dockerfile # 使用自定义 Dockerfile
container_name: zabbix-server # 容器名称
depends_on:
- mysql-server # 启动顺序依赖 MySQL
env_file: .env # 从 .env 文件加载环境变量
environment:
- DB_SERVER_HOST=mysql-server # 指定数据库主机地址
- MYSQL_DATABASE=${MYSQL_DATABASE} # 数据库名
- MYSQL_USER=${MYSQL_USER} # 用户名
- MYSQL_PASSWORD=${MYSQL_PASSWORD} # 密码
- ZBX_JAVAGATEWAY= # 不启用 Java 网关(留空)
- TZ=Asia/Shanghai # 设置时区
ports:
- "10051:10051" # Zabbix 服务监听端口
volumes:
- zbx_server_data:/var/lib/zabbix # 数据持久化路径
restart: unless-stopped # 自动重启策略
networks:
- zbx-net # 加入自定义网络
# Zabbix Web 前端服务
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.0-latest # 官方 Web 前端镜像(基于 nginx 和 MySQL)
container_name: zabbix-web # 容器名称
depends_on:
- zabbix-server # 启动依赖 Zabbix Server
- mysql-server # 启动依赖 MySQL
env_file: .env # 加载环境变量
environment:
- DB_SERVER_HOST=mysql-server # 数据库地址
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- ZBX_SERVER_HOST=zabbix-server # Zabbix Server 地址
- PHP_TZ=Asia/Shanghai # 设置 PHP 时区
ports:
- "${ZABBIX_FRONTEND_PORT}:8080" # 暴露 Web 前端端口,支持自定义
volumes:
- zbx_web_data:/var/lib/zabbix-web # 前端持久化数据存储
- /etc/localtime:/etc/localtime:ro # 保证容器时间与宿主机一致
- /etc/timezone:/etc/timezone:ro
restart: unless-stopped
networks:
- zbx-net # 加入统一网络
# 定义数据卷(用于持久化存储)
volumes:
zbx_mysql_data:
zbx_server_data:
zbx_web_data:
# 定义自定义网络
networks:
zbx-net:
driver: bridge # 使用 bridge 网络驱动
-
MySQL
command选项确保新建表直接使用utf8mb4_bin校对,避免 Web 端再次报错 Built InDiscussions on Python.org。 -
/docker-entrypoint-initdb.d/00-alter_charset.sql会在初始化时执行,对现有数据库做一次性转换 Stack Overflow。 -
Zabbix Server 服务构建时已带上 Python 3、pip、requests 和 vim,满足脚本编写与调试需求。
5、编写.env
# .env
MYSQL_ROOT_PASSWORD=Zabbixroot
MYSQL_DATABASE=zabbix
MYSQL_USER=zabbix
MYSQL_PASSWORD=zabbix
PHP_TZ=Asia/Shanghai
ZABBIX_FRONTEND_PORT=8080
6、#启动容器
构建 zabbix-server:
docker-compose build zabbix-server
启动全部服务:
docker compose up -d
# 查看容器状态
docker ps
# 在浏览器访问 Web
open http://<服务器IP>:${ZABBIX_FRONTEND_PORT}/
7、访问Zabbix Web
- 打开浏览器访问
http://<Ubuntu服务器IP> - 默认登录账号:
Admin,密码:zabbix
8、报错
等十几分钟自然就好了


9、修改中文

二、设置钉钉告警
1、在三个人以上的钉钉群聊加入机器人,复制webhook地址

2、使用root进入容器
docker exec -it -u root 5f556bfe5f3d /bin/bash
4、编写钉钉机器人脚本
vim /usr/lib/zabbix/alertscripts/dingalert.py
#!/usr/bin/env python3
import json
import requests
import sys
def send_msg(url, remiders, msg):
headers = {'Content-Type': 'application/json; charset=utf-8'}
data = {
"msgtype": "text",
"at": {
"atMobiles": remiders,
"isAtAll": False,
},
"text": {
"content": msg,
}
}
r = requests.post(url, data=json.dumps(data), headers=headers)
return r.text
if __name__ == '__main__':
msg = sys.argv[1]
remiders = []
url = '钉钉机器人Webhook地址' # 注意此处需输入机器人的webhook地址
print(send_msg(url, remiders, msg))
5、加可执行权限
chmod +x /usr/lib/zabbix/alertscripts/dingding.py
6、测试
sudo /usr/lib/zabbix/alertscripts/dingding.py '告警: 测试消息'
答复下文及钉钉机器人发信息为正常:
{"errcode":0,"errmsg":"ok"}
7、Zabbix web内设置
点开第一个媒介




三、设置邮件告警


三、启动防火墙
sudo ufw enable
8、允许基础服务端口
# 允许SSH远程连接(避免被防火墙锁在外面)
sudo ufw allow 22/tcp
# 允许HTTP/HTTPS访问(如果Zabbix Web部署在宿主机)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
9、允许核心端口
# 允许Docker容器间通信(需确保Docker网络已配置)
sudo ufw allow in on docker0 # 放行Docker内部流量
sudo ufw allow out on docker0 # 放行Docker外部流量
# 如果需要从宿主机直接访问Zabbix Server容器端口
sudo ufw allow 10051/tcp
10、验证防火墙规则
sudo ufw status numbered
输入应包含类似一下规则
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 10051/tcp ALLOW IN Anywhere
[ 5] 3306/tcp ALLOW IN Anywhere
[ 6] Anywhere on docker0 ALLOW IN Anywhere
[ 7] Anywhere ALLOW OUT Anywhere on docker0 (out)
[ 8] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 9] 80/tcp (v6) ALLOW IN Anywhere (v6)
[10] 443/tcp (v6) ALLOW IN Anywhere (v6)
[11] 10051/tcp (v6) ALLOW IN Anywhere (v6)
[12] 3306/tcp (v6) ALLOW IN Anywhere (v6)
[13] Anywhere (v6) on docker0 ALLOW IN Anywhere (v6)
[14] Anywhere (v6) ALLOW OUT Anywhere (v6) on docker0 (out)
致谢
zabbix添加钉钉机器人报警_zabbix对接钉钉-CSDN博客
ChatGPT
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)