Tutoriales de VPS
Instalar Zabbix en un VPS (2026): Docker, PostgreSQL, Agent 2, HTTPS, alertas y copias de seguridad
Este tutorial se basa en Zabbix 7.4 y despliega el servicio de monitorización en un VPS con Ubuntu 24.04 usando Docker Compose y PostgreSQL, configura Caddy HTTPS, la recolección activa/pasiva de Agent 2, cifrado PSK, alertas por correo y Webhook, y cubre retención de datos, copias de seguridad, actualizaciones y resolución de problemas.

Cuando un VPS se convierte en una docena, ya no basta con top, df -h y "iniciar sesión para investigar cuando el sitio no abre". Necesitas saber de antemano si la CPU está saturada de forma constante, si el disco se agotará en tres días, si un servicio systemd se reinicia repetidamente, y recibir una notificación antes de que el fallo afecte a los usuarios. Zabbix reúne la recolección de métricas, el descubrimiento de hosts, las plantillas, los triggers, los gráficos, las alertas y la gestión de permisos en una sola plataforma, lo que lo hace adecuado para equipos que quieren gestionar a largo plazo varios equipos Linux, Windows, dispositivos de red o servicios de negocio.
Este artículo toma como base Zabbix 7.4, Ubuntu 24.04, Docker Compose, PostgreSQL y Zabbix Agent 2, y cubre el despliegue del servidor, Caddy HTTPS, la incorporación de hosts remotos, la recolección activa y pasiva, el cifrado PSK, las alertas por correo/Webhook, la retención de datos, las copias de seguridad, las actualizaciones y la resolución de problemas habituales. Los criterios de versión y los puertos de este artículo siguen la documentación oficial de Zabbix 7.4 a fecha de septiembre de 2026; la documentación de 8.0 pertenece actualmente a una rama de desarrollo y no debe copiarse directamente como tutorial de producción estable.
Zabbix no es solo un panel para "ver curvas de CPU". Sus capacidades principales incluyen:
- Recoger datos mediante Agent 2, SNMP, IPMI, JMX, HTTP, bases de datos y API de nube;
- Crear en lote items, triggers, gráficos y reglas de descubrimiento mediante plantillas oficiales;
- Disparar alertas cuando el disco se queda corto, un servicio se detiene, un certificado está a punto de caducar o la tasa de errores de una interfaz aumenta;
- Enviar notificaciones por correo, Webhook, SMS o scripts personalizados;
- Usar grupos de hosts, grupos de usuarios y roles para controlar qué recursos puede ver cada equipo;
- Escalar a varios centros de datos, redes internas y redes de alta latencia con nodos proxy.
Si solo monitorizas de 2 a 5 máquinas y quieres terminar la instalación en diez minutos, el tutorial de monitorización ligera de servidores con Beszel consume menos recursos; si solo te importa si un sitio web está en línea, puedes elegir Uptime Kuma. Cuando necesitas PromQL, correlación de logs y visualización muy flexible, lee la solución de monitorización Prometheus + Grafana. Cuando necesitas una gran cantidad de plantillas listas, triggers unificados, gestión de activos y permisos granulares, el flujo de trabajo integrado de Zabbix es más adecuado.
| Solución | Ventajas principales | Costes principales | Escenarios recomendados |
|---|---|---|---|
| Zabbix | Plantillas, triggers, descubrimiento, alertas y permisos completos | Muchos detalles de base de datos y parámetros, mayor coste de aprendizaje | Varios hosts, dispositivos de red, operación a largo plazo |
| Prometheus + Grafana | Ecosistema cloud native potente, PromQL flexible | Las alertas, los activos y el almacenamiento a largo plazo suelen requerir combinar varios componentes | Kubernetes, métricas de aplicaciones |
| Beszel | Despliegue sencillo, interfaz ligera | Menos plantillas empresariales y triggers complejos | VPS de pequeña escala |
| Uptime Kuma | Monitorización de disponibilidad HTTP/TCP intuitiva | No apto para métricas profundas de host y análisis de capacidad | Comprobación de sitios web y puertos |
Este artículo usa cuatro componentes principales:
浏览器 -> Caddy :443 -> Zabbix Web :8080
|
+-> PostgreSQL
受监控主机 Agent 2 -> Zabbix Server :10051(主动检查)
Zabbix Server -> 受监控主机 Agent 2 :10050(被动检查)
El frontend web, Zabbix Server y PostgreSQL se ejecutan como contenedores en el VPS de monitorización; los hosts monitorizados instalan Agent 2 directamente. La base de datos no se mapea a la red pública, el puerto del contenedor web se enlaza solo a la dirección de loopback y Caddy proporciona el dominio y HTTPS.
Zabbix indica oficialmente que la capacidad de la base de datos depende principalmente del número de valores procesados por segundo, el periodo de retención de datos de historial, el periodo de retención de datos de tendencias y el número de eventos. No se puede estimar solo por el "número de hosts". A continuación se muestran valores iniciales conservadores para un entorno VPS pequeño, no una garantía oficial de capacidad:
| Escala | Configuración inicial recomendada | Recomendación de retención de datos |
|---|---|---|
| 5–20 hosts, métricas básicas de Linux | 2 vCPU, 4GB de RAM, 60GB NVMe | History 7–14 días, Trends 365 días |
| 20–100 hosts, con monitorización de servicios e interfaces | 4 vCPU, 8GB de RAM, 120GB NVMe | Observar primero NVPS y el crecimiento de la base de datos |
| Más de 100 hosts o muchos items de intervalo bajo | 8 vCPU, 16GB de RAM o más | Dividir Proxy y ajustar la base de datos tras pruebas de carga |
Aunque 1GB o 2GB de RAM puedan arrancar, PostgreSQL, Server, Web y Docker en la misma máquina dejan muy poco margen. Una vez que el propio sistema de monitorización se detiene por OOM, se queda en silencio justo cuando más necesitas las alertas. Los entornos de producción también deberían colocar las copias de seguridad en otra máquina o en almacenamiento de objetos, no solo en el mismo disco del VPS de monitorización.
Prepara un dominio, por ejemplo zabbix.example.com, y añade un registro A que apunte a la IP pública del VPS. Si no tienes IPv6 correcta y funcional, no añadas un registro AAAA incorrecto.
Todos los componentes de Zabbix deben mantener una hora precisa. La página de requisitos oficiales destaca especialmente la sincronización horaria, porque la deriva del reloj provoca anomalías en las marcas de tiempo de los datos, la evaluación de triggers y los gráficos. En Ubuntu 24.04 puedes comprobar:
timedatectl status
systemctl status systemd-timesyncd --no-pager
Abre los puertos predeterminados según el modo de recolección real:
| Puerto | Dirección | Uso | Recomendación |
|---|---|---|---|
80/443 TCP | Navegador al VPS de monitorización | Validación HTTP e interfaz de gestión HTTPS | Abierto a la red pública, se pueden añadir restricciones de VPN/IP después |
10051/TCP | Agent/Proxy al Server | Comprobaciones activas, Trapper, Proxy | Permitir solo subredes monitorizadas o mediante VPN |
10050/TCP | Server al Agent 2 | Comprobaciones pasivas | Permitir solo la IP del Zabbix Server en cada Agent |
5432/TCP | Red interna de contenedores | PostgreSQL | No mapear a la red pública |
8080/8443 TCP | Caddy local al contenedor Web | Frontend del contenedor | Enlazar solo a 127.0.0.1 |
En las comprobaciones activas, Agent 2 se conecta activamente al 10051/TCP del Server, lo que resulta adecuado para hosts detrás de NAT, con IP que cambia con frecuencia o cuando no quieres exponer 10050 al exterior. En las comprobaciones pasivas, el Server se conecta al 10050/TCP del Agent 2; la configuración es intuitiva, pero requiere que el Server pueda acceder directamente al Agent. Ambos modos pueden coexistir; en última instancia depende de los tipos de item de la plantilla.
Si un puerto ya está escuchando pero las conexiones externas siguen fallando, sigue la guía de resolución de problemas de puertos, firewall y grupos de seguridad para comprobar al mismo tiempo el grupo de seguridad de la nube, UFW, el mapeo de puertos de Docker y la dirección de escucha.
Primero actualiza el sistema e instala Git, Make, OpenSSL y Caddy. Se recomienda instalar Docker desde el repositorio oficial de Docker para Ubuntu; si la máquina ya ejecuta Docker, no vuelvas a ejecutar scripts que modifiquen la configuración del repositorio.
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y git make openssl ca-certificates curl caddy
docker --version
docker compose version
La documentación oficial de contenedores de Zabbix 7.4 requiere Docker Compose 2.24.0 o superior:
docker compose version --short
Si la salida es inferior a 2.24.0, actualiza primero el plugin de Docker Compose. Los despliegues en producción también deberían entender las comprobaciones de estado, la rotación de logs, los límites de recursos y la reversión; puedes leer primero la lista de verificación de configuración de producción de Docker Compose.
El repositorio oficial zabbix/zabbix-docker contiene tanto combinaciones MySQL/MariaDB como PostgreSQL. Este artículo hace checkout explícito de la rama 7.4 y usa compose_pgsql.yaml:
sudo git clone --depth 1 --branch 7.4 \
https://github.com/zabbix/zabbix-docker.git /opt/zabbix-docker
sudo chown -R "$USER":"$USER" /opt/zabbix-docker
cd /opt/zabbix-docker
git branch --show-current
docker compose version
La rama esperada es 7.4. El .env predeterminado del repositorio usa imágenes Zabbix 7.4 de la serie Alpine y PostgreSQL 17 Alpine; la página oficial de requisitos de Zabbix 7.4 admite PostgreSQL 15–18.
No uses directamente la contraseña de base de datos de ejemplo del repositorio. El env_vars/.POSTGRES_PASSWORD del repositorio oficial es el valor de ejemplo zabbix, que debe sustituirse antes del primer arranque:
cd /opt/zabbix-docker
umask 077
openssl rand -base64 36 | tr -d '\n' > env_vars/.POSTGRES_PASSWORD
printf '\n' >> env_vars/.POSTGRES_PASSWORD
chmod 600 env_vars/.POSTGRES_PASSWORD
No copies contraseñas reales en tutoriales, tickets ni commits de Git. Compose proporciona el usuario y la contraseña de PostgreSQL a los contenedores Server, Web y de base de datos mediante secretos basados en archivos.
El Compose oficial publica el puerto Web de forma predeterminada. Para evitar que 8080 y 8443 se expongan directamente saltándose Caddy, crea un archivo de anulación local que restrinja ambos puertos a la dirección de loopback:
services:
zabbix-web-nginx-pgsql:
ports:
- name: web-http
target: 8080
published: "8080"
host_ip: 127.0.0.1
protocol: tcp
- name: web-https
target: 8443
published: "8443"
host_ip: 127.0.0.1
protocol: tcp
Guárdalo como /opt/zabbix-docker/compose.local.yaml y primero renderiza la configuración para comprobar la sintaxis y los puertos finales:
cd /opt/zabbix-docker
docker compose -f compose_pgsql.yaml -f compose.local.yaml config > /tmp/zabbix-compose-rendered.yaml
grep -nE 'host_ip|published|target' /tmp/zabbix-compose-rendered.yaml
Confirma que el host_ip de Web es 127.0.0.1 y luego inicia el conjunto mínimo de componentes:
docker compose -f compose_pgsql.yaml -f compose.local.yaml pull
docker compose -f compose_pgsql.yaml -f compose.local.yaml up -d
docker compose -f compose_pgsql.yaml -f compose.local.yaml ps
El primer arranque necesita inicializar el esquema de PostgreSQL, y el tiempo depende del disco del VPS y de la velocidad de descarga de las imágenes. No juzgues que ha fallado solo porque el contenedor de inicialización sale; server-db-init debe terminar después de completarse correctamente. Céntrate en si PostgreSQL, Zabbix Server y Nginx Web están en ejecución o en estado saludable:
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=100 postgres-server
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=100 zabbix-server
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=100 zabbix-web-nginx-pgsql
curl -I http://127.0.0.1:8080/
ss -lntp | grep -E ':8080|:8443|:10051'
8080 y 8443 solo deben aparecer en 127.0.0.1; si 10051 escucha externamente depende de si necesitas que Agents externos se conecten activamente. Incluso si debes publicar 10051, restringe el origen en el grupo de seguridad de la nube y el firewall del host.
Crea /etc/caddy/Caddyfile:
zabbix.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:8080
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
Sustituye el dominio de ejemplo por el dominio real, comprueba y recarga:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo systemctl status caddy --no-pager
curl -I https://zabbix.example.com/
Caddy solicita y renueva los certificados automáticamente, pero solo si el dominio resuelve correctamente, el 80/443 público puede llegar al VPS y no hay un registro AAAA incorrecto. Para más información sobre varios dominios, cabeceras de proxy inverso y resolución de problemas de certificados, consulta el tutorial de HTTPS automático con Caddy.
La cuenta inicial indicada en el inicio rápido oficial de Zabbix es:
用户名:Admin
密码:zabbix
Cambia la contraseña de Admin inmediatamente después del primer inicio de sesión. No trates el HTTPS de Caddy como una estrategia de seguridad completa del backend; también deberías:
- Crear una cuenta independiente para cada administrador, sin compartir
Admin; - Asignar roles, grupos de usuarios y permisos de grupos de hosts según las responsabilidades;
- Activar una política de contraseñas fuertes y configurar MFA cuando las condiciones lo permitan;
- Cuando no se necesite gestión pública, restringir el frontend mediante WireGuard/Tailscale o una IP fija;
- Registrar los cambios por separado en el sistema, el firewall y Zabbix;
- Hacer que la propia plataforma de monitorización sea sondeada externamente, para evitar que "el sistema de monitorización ha muerto pero nadie lo sabe".
El frontend de Zabbix se pausa durante 30 segundos tras cinco inicios de sesión fallidos consecutivos, pero esto no es motivo para sustituir las restricciones de acceso del proxy inverso, MFA y contraseñas fuertes.
Las siguientes operaciones se realizan en un VPS Ubuntu 24.04 monitorizado. Usa el repositorio oficial de software de Zabbix 7.4; no instales el Agent desde scripts desconocidos:
cd /tmp
wget https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.4+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.4+ubuntu24.04_all.deb
sudo apt update
sudo apt install -y zabbix-agent2
zabbix_agent2 -V
Primero decide si usar comprobaciones activas o pasivas.
El modo activo solo requiere que el Agent pueda acceder al 10051/TCP del VPS de monitorización, lo que lo hace más adecuado para VPS públicos. Edita los elementos clave en /etc/zabbix/zabbix_agent2.conf:
ServerActive=zabbix.example.com:10051
Hostname=web-01.example.com
Hostname distingue mayúsculas de minúsculas y debe coincidir exactamente con el Host name introducido al crear el host en el frontend de Zabbix. Sin ServerActive, las comprobaciones activas se desactivan.
El modo pasivo hace que el Server acceda al 10050/TCP del Agent:
Server=监控VPS的固定公网IP
ListenPort=10050
Hostname=web-01.example.com
Server determina qué Servers o Proxies pueden iniciar conexiones. No escribas 0.0.0.0/0 por comodidad. Al mismo tiempo, permite solo el VPS de monitorización en el grupo de seguridad de la nube y UFW:
sudo ufw allow from 监控VPS的固定公网IP to any port 10050 proto tcp
sudo ufw status numbered
Comprueba la configuración e inicia:
sudo zabbix_agent2 -t system.cpu.load
sudo systemctl enable --now zabbix-agent2
sudo systemctl status zabbix-agent2 --no-pager
sudo journalctl -u zabbix-agent2 -n 100 --no-pager
HTTPS solo protege el enlace del navegador al frontend web y no cifra automáticamente la comunicación entre Agent y Server. Los componentes de Zabbix admiten tres métodos de conexión: sin cifrado, certificado y PSK. Para VPS de pequeña escala, genera un PSK independiente para cada host:
sudo install -d -m 750 -o root -g zabbix /etc/zabbix/keys
sudo sh -c 'openssl rand -hex 32 > /etc/zabbix/keys/web-01.psk'
sudo chown root:zabbix /etc/zabbix/keys/web-01.psk
sudo chmod 640 /etc/zabbix/keys/web-01.psk
Para comprobaciones activas añade:
TLSConnect=psk
TLSPSKIdentity=web-01-psk
TLSPSKFile=/etc/zabbix/keys/web-01.psk
Si también usas comprobaciones pasivas, añade:
TLSAccept=psk
Luego reinicia el Agent:
sudo systemctl restart zabbix-agent2
sudo journalctl -u zabbix-agent2 -n 50 --no-pager
En la pestaña Encryption del host en el frontend de Zabbix, selecciona el mismo modo de conexión e introduce exactamente la misma identidad PSK y clave. No envíes claves a chats de grupo ni permitas que varios hosts compartan la misma. La documentación oficial indica que TLSConnect de Agent 2 se usa para conexiones salientes de comprobaciones activas, y TLSAccept para conexiones entrantes de comprobaciones pasivas; cuando los modos de ambos extremos no coinciden, no se recurre automáticamente a otro método de cifrado.
Ve a Data collection → Hosts → Create host:
- Pon
Host namecomoweb-01.example.com, coincidiendo exactamente con elHostnamede Agent 2; - Añade un grupo de hosts como
Linux servers; - En modo activo puedes crear una interfaz Agent pero no dependes de que el Server se conecte directamente a ella; en modo pasivo introduce la IP accesible del host y
10050; - Vincula las plantillas Linux Agent/Agent active correspondientes incluidas en Zabbix 7.4;
- Introduce la configuración PSK de este host en Encryption;
- Tras guardar, observa Availability, Latest data y los logs del Agent.
No vincules todas las plantillas a la vez al principio. Cuantas más plantillas y más corto sea el intervalo de recolección, más rápido crecerán el número de valores nuevos por segundo y la base de datos. Primero cubre CPU, memoria, disco, red, procesos y estado de servicios, y luego añade monitorización de Nginx, PostgreSQL, Docker o aplicaciones personalizadas según el negocio.
Verificaciones recomendadas primero:
- Si
Latest datamuestra métricas de CPU, memoria y sistemas de archivos; - Si el nombre del host coincide exactamente;
- Si las comprobaciones activas pueden conectarse a
10051; - Si el Server puede conectarse al
10050del Agent en comprobaciones pasivas; - Si
Monitoring → Problemsmuestra items unsupported; - Si las horas del sistema del Server y de Agent 2 son coherentes.
La documentación oficial actual de Zabbix admite tipos de medio Email, SMS, scripts personalizados y Webhook. Para recibir realmente notificaciones, deben cumplirse tres condiciones a la vez: un tipo de medio funcional, Media en la cuenta de usuario y una Action que coincida con el evento.
Ve a Alerts → Media types, abre el tipo Email y rellena el servidor SMTP, el puerto, el método de cifrado, la dirección del remitente y la información de autenticación. Es preferible gestionar la contraseña SMTP con macros; no dejes secretos en texto plano directamente en una configuración de tipo de medio que se exportará.
Luego:
- Abre Media en el perfil del usuario destinatario y añade la dirección de correo;
- Selecciona el periodo de recepción y los niveles de gravedad;
- Crea una acción en Alerts → Actions → Trigger actions;
- Define condiciones como grupo de hosts y gravedad;
- Selecciona usuarios o grupos de usuarios en Operations;
- Crea un trigger de prueba y verifica tanto la notificación de Problem como la de Recovery.
Hacer clic en "prueba correcta" solo en la página del tipo de medio no significa que los fallos reales vayan a notificarse, porque la Action, el Media del usuario o los permisos aún pueden faltar.
Si usas un bot de chat o un sistema de tickets, puedes copiar el tipo de medio Webhook integrado oficial y rellenar la URL de destino, el Token, el canal y los parámetros del mensaje. Guarda los secretos en macros de tipo Secret y restringe los Webhooks para que solo envíen solicitudes a dominios de confianza.
Antes de producción, prueba al menos:
- Si el mensaje de Problem incluye el host, el trigger, la gravedad y el enlace del evento;
- Si Recovery puede correlacionarse con el evento original;
- Si las alertas repetidas y los pasos de escalado se ajustan a la política de guardia;
- Si Zabbix registra los fallos de envío cuando el servicio externo limita la tasa o no está disponible;
- Si la configuración del trigger y de la acción se restaura tras finalizar las alertas de prueba.
El History de Zabbix guarda valores brutos de alta granularidad, mientras que Trends guarda datos agregados por hora. Conservar todo el History durante un año normalmente es innecesario y aumentará notablemente el tamaño de PostgreSQL, el tiempo de copia de seguridad y el riesgo en las actualizaciones.
Los entornos pequeños pueden empezar con la siguiente política y luego ajustarla según las necesidades de cumplimiento y resolución de problemas:
| Datos | Periodo de retención inicial | Uso |
|---|---|---|
| History de alta frecuencia | 7–14 días | Fallos recientes y análisis detallado |
| History normal | Menos de 30 días | Resolución de problemas habitual |
| Trends | 365 días | Tendencias de capacidad y comparación interanual |
| Events/Alerts | 90–180 días | Análisis posterior de fallos |
| Audit log | Según requisitos de seguridad y cumplimiento | Seguimiento de operaciones de gestión |
Ve a Administration → Housekeeping para comprobar el housekeeping interno. La documentación oficial indica que elimina datos caducados o borrados para evitar el crecimiento ilimitado de la base de datos y la degradación del rendimiento. No reduzcas de golpe el periodo de retención de un año a un día esperando que la base de datos se reduzca inmediatamente; las eliminaciones masivas generan carga en la base de datos, y la recuperación de espacio también depende de los mecanismos de mantenimiento de PostgreSQL.
Registra semanalmente el tamaño de los contenedores, la base de datos y el directorio de datos:
cd /opt/zabbix-docker
docker compose -f compose_pgsql.yaml -f compose.local.yaml ps
docker system df
sudo du -sh /opt/zabbix-docker/zbx_env
df -h /
Al mismo tiempo, monitoriza dentro de Zabbix el espacio en disco, las colas, los procesos y las métricas de rendimiento internas del propio "VPS de monitorización".
Una copia de seguridad válida incluye al menos:
- Una copia lógica de la base de datos PostgreSQL;
/opt/zabbix-docker/.env,env_vars, archivos de anulación y scripts personalizados/certificados enzbx_env;/etc/caddy/Caddyfile;- La configuración
/etc/zabbixy el PSK del lado del Agent; - Un documento de recuperación que indique claramente la versión, el orden de recuperación y las dependencias de DNS/firewall.
Crear una copia de seguridad de la base de datos:
cd /opt/zabbix-docker
sudo install -d -m 700 /var/backups/zabbix
docker compose -f compose_pgsql.yaml -f compose.local.yaml \
exec -T postgres-server pg_dump -U zabbix -d zabbix -Fc \
> /var/backups/zabbix/zabbix-$(date +%F-%H%M).dump
ls -lh /var/backups/zabbix/
Los archivos de configuración se pueden archivar por separado, pero contienen contraseñas de base de datos y PSK, por lo que el medio de copia de seguridad debe cifrarse y restringir los permisos:
sudo tar -C / -czf /var/backups/zabbix/zabbix-config-$(date +%F-%H%M).tar.gz \
opt/zabbix-docker/.env \
opt/zabbix-docker/env_vars \
opt/zabbix-docker/compose.local.yaml \
etc/caddy/Caddyfile
sudo chmod 600 /var/backups/zabbix/*
Después, sincroniza la copia de seguridad a otra máquina o a almacenamiento de objetos, y restáurala periódicamente en un entorno aislado. Ver que existe un archivo de copia de seguridad no significa que se pueda restaurar. Para un proceso completo de simulacro con bases de datos, Docker Volumes, restic y rclone, consulta simulacro de copia de seguridad y recuperación en VPS.
Al probar la recuperación, primero despliega la misma versión mayor de Zabbix y un PostgreSQL vacío, y luego importa:
cat /path/to/zabbix.dump | docker compose \
-f compose_pgsql.yaml -f compose.local.yaml \
exec -T postgres-server pg_restore -U zabbix -d zabbix --clean --if-exists
Este comando limpiará los objetos que ya existan en la base de datos de destino; solo puede ejecutarse en una base de datos de prueba de recuperación confirmada como desechable o en un proceso explícito de recuperación ante desastres, y no debe ejecutarse sin más contra una base de datos de producción que sigue en servicio.
El Compose oficial de 7.4 usa por defecto la etiqueta latest de la misma rama, por lo que pull puede descargar una nueva imagen de parche 7.4. Antes de actualizar, debes leer las notas de actualización y hacer copia de seguridad de la base de datos, la configuración y los archivos. Zabbix Server puede ejecutar automáticamente una actualización de la base de datos al arrancar; si la actualización de la base de datos falla, el servicio no arrancará correctamente.
Proceso recomendado:
- Registrar el ID de imagen actual, la versión de Zabbix y el commit de Git;
- Completar copias de seguridad de base de datos y configuración en otra máquina;
- Verificar la actualización en un entorno de prueba;
- Programar una ventana de mantenimiento y detener las escrituras;
- Actualizar los archivos Compose de la rama 7.4 y renderizar el diff;
- Descargar las imágenes y reconstruir;
- Observar continuamente los logs de Server y PostgreSQL;
- Verificar el inicio de sesión, Latest data, Problems, las notificaciones y las conexiones de los Agents.
Comprobar el estado actual:
cd /opt/zabbix-docker
git rev-parse --short HEAD
docker compose -f compose_pgsql.yaml -f compose.local.yaml images
docker compose -f compose_pgsql.yaml -f compose.local.yaml exec -T zabbix-server zabbix_server -V
No cambies de rama a ciegas entre versiones mayores y luego ejecutes up -d directamente, ni dependas de instantáneas de nube cuando no hay copia de seguridad de la base de datos. La reversión de la base de datos y la reversión de la imagen del contenedor deben ir juntas; no se garantiza que un Server antiguo pueda leer un esquema de base de datos nuevo ya actualizado.
Comprueba el estado de salud de PostgreSQL, los permisos de los archivos secret y los logs de los tres componentes:
cd /opt/zabbix-docker
docker compose -f compose_pgsql.yaml -f compose.local.yaml ps
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=200 postgres-server
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=200 zabbix-server
docker compose -f compose_pgsql.yaml -f compose.local.yaml logs --tail=200 zabbix-web-nginx-pgsql
Si cambiaste la contraseña de PostgreSQL después del primer arranque, la contraseña antigua del volumen de la base de datos no se sincronizará automáticamente. No borres volúmenes repetidamente confiando en la suerte; primero confirma si hay datos de producción, luego cambia la contraseña de PostgreSQL y sincroniza el secret, o reconstruye desde una copia de seguridad verificada.
En modo activo, comprueba especialmente:
getent ahosts zabbix.example.com
nc -vz zabbix.example.com 10051
sudo journalctl -u zabbix-agent2 -n 100 --no-pager
En modo pasivo, prueba el 10050 del Agent desde la red donde reside el Server, y verifica el grupo de seguridad de la nube, UFW y la lista de permitidos Server=. Ambos modos requieren comprobar el Hostname, que distingue mayúsculas de minúsculas.
Normalmente se debe a que el Hostname de Agent 2 no coincide con el Host name del frontend, el host está deshabilitado, la plantilla no tiene items de tipo active, o el Agent no puede conectarse a ServerActive. No cambies solo el Display name; no es el Host name que se usa para la coincidencia de comprobaciones activas.
Comprueba la dirección de conexión entre el frontend y el Agent, la identidad PSK, el contenido de la clave y los permisos. En comprobaciones activas mira TLSConnect; en comprobaciones pasivas mira TLSAccept. Un salto de línea adicional al copiar la clave normalmente puede manejarse al leer el archivo, pero espacios, rutas incorrectas, identidades distintas o un modo de cifrado mal seleccionado en el frontend provocarán fallos.
Primero revisa los hosts añadidos recientemente, las plantillas, los intervalos de recolección bajos, los items de descubrimiento LLD, los periodos de retención de History/Trends y el número de valores procesados por segundo. Ampliar el disco a ciegas solo pospone el problema. Primero reduce items sin valor y ajusta las políticas de retención, y luego evalúa parámetros de PostgreSQL, particionado o TimescaleDB.
Comprueba la resolución A/AAAA, los logs de Caddy, los puertos públicos 80/443, el grupo de seguridad y si el puerto Web sigue escuchando solo en 127.0.0.1:
getent ahosts zabbix.example.com
sudo journalctl -u caddy -n 100 --no-pager
curl -I http://127.0.0.1:8080/
curl -I https://zabbix.example.com/
ss -lntp | grep -E ':80|:443|:8080|:8443'
- Zabbix Server, Web y PostgreSQL funcionan correctamente, y el contenedor de inicialización termina correctamente;
- El
8080/8443de Web está enlazado solo a127.0.0.1; - El HTTPS del dominio es válido y HTTP redirige automáticamente a HTTPS;
- La contraseña predeterminada de
Admin/zabbixse ha cambiado; - Los administradores usan cuentas independientes, mínimo privilegio y MFA;
- Los modos activo/pasivo del Agent coinciden con la dirección del firewall;
- El PSK está configurado por host, no se reutiliza y no se ha subido a Git;
- Latest data se actualiza continuamente y los relojes de los hosts están sincronizados;
- Se han probado realmente tanto Problem como Recovery del correo o Webhook;
- Se han planificado los periodos de retención de History, Trends, Events y Audit;
- PostgreSQL y la configuración están respaldados en otra máquina y se ha completado un simulacro de recuperación;
- El sondeo externo de disponibilidad puede detectar que el propio Zabbix está fuera de línea.
Puede funcionar con poca escala y recolección de baja frecuencia, pero PostgreSQL, Server, Web y Docker en la misma máquina dejan muy poco margen de memoria. Para nuevos despliegues es mejor empezar con 4GB de RAM, configurar Swap y monitorizar OOM y el crecimiento de la base de datos. El número de hosts no es la única variable; el número de items y el intervalo de recolección importan más.
Los VPS públicos, los hosts detrás de NAT y los hosts con IP dinámica deberían preferir el modo activo, que solo requiere acceso saliente al 10051/TCP del Server. El modo pasivo puede usarse cuando la red es controlable y el Server puede acceder directamente al Agent. Ambos pueden coexistir, pero los tipos de item de la plantilla, las direcciones de los puertos y la configuración de cifrado deben coincidir.
No necesariamente. Cuando solo se usan comprobaciones activas, el Agent se conecta activamente al 10051 del Server, por lo que 10050 no necesita abrirse a la red pública. Solo cuando se usan comprobaciones pasivas hay que permitir que el Server acceda al 10050 del Agent, y debería permitirse solo la IP fija del Server o del Proxy.
Un tipo de medio funcional es solo el primer paso. También hay que añadir Media al usuario destinatario, activar la gravedad y el periodo correspondientes, y crear una Trigger action y una Operation que coincidan con el evento. Prueba por separado el tipo de medio, Problem, Recovery y los pasos de escalado, y revisa los errores de envío en Alerts.
Sí, Agent 2 tiene un ecosistema de plugins y plantillas, pero permisos como el Docker Socket deben concederse con cuidado. Leer el Docker Socket normalmente equivale a privilegios elevados en el host; no expongas el Socket sin restricciones a contenedores o usuarios arbitrarios solo para mostrar una lista de contenedores. Monitoriza primero el host y los servicios clave, y luego añade métricas de contenedores con mínimo privilegio.
Primero haz copia de seguridad de PostgreSQL, la configuración y las claves, verifica la actualización de la misma versión mayor en un entorno de prueba, y luego descarga las imágenes durante una ventana de mantenimiento y observa los logs de actualización de la base de datos. No hagas copia de seguridad solo de los contenedores ni vuelvas simplemente a una imagen antigua del Server después de que la base de datos ya se haya actualizado. Antes de cruzar versiones mayores debes leer las notas oficiales de actualización.
- Documentación actual y requisitos de instalación de Zabbix 7.4
- Instrucciones oficiales de instalación de contenedores de Zabbix
- Rama 7.4 del repositorio oficial de Docker Compose de Zabbix
- Parámetros de configuración de Zabbix Agent 2
- Documentación de cifrado de componentes de Zabbix
- Documentación de inicio de sesión y contraseña predeterminada de Zabbix
- Tipos de medio y notificaciones de Zabbix
- Zabbix Housekeeping
El valor de Zabbix no está en "cuántos gráficos puede dibujar", sino en convertir la recolección, los umbrales, las notificaciones, los permisos y la verificación de recuperación en un proceso de operación mantenible de forma continua. Empieza con pocas métricas clave, completa una alerta y recuperación reales, y luego amplía las plantillas gradualmente; esto es más fiable que importar decenas de miles de items el primer día.