Este repositorio contiene la configuración y los scripts necesarios para empaquetar, desplegar y monitorizar una aplicación web de ejemplo utilizando Docker, AWS EC2, Prometheus, Node Exporter y Grafana.
- Primera Parte: Docker y HTTPS
- Segunda Parte: Despliegue en AWS EC2
- Tercera Parte: Prometheus y Node Exporter
- Cuarta Parte: Integración con Grafana (opcional)
-
Archivo de Virtual Host:
- Ubicado en
apache/webapp.conf(se copia luego a/etc/apache2/sites-available/webapp.confdentro del contenedor). - Define los bloques
<VirtualHost *:80>y<VirtualHost *:443>con redirección HTTP→HTTPS y rutas a la aplicación WSGI.
- Ubicado en
-
Certificados:
- Generados con OpenSSL y montados en
apache/certs/apache-selfsigned.{crt,key}. - El Dockerfile de Apache copia estos certificados y habilita el módulo SSL.
- Generados con OpenSSL y montados en
-
Diagrama de la estructura del proyecto en disco, con los directorios
apache/,mysql/,webapp/y eldocker-compose.ymlraíz. -
apache/Dockerfile
Construye un contenedor basado en Ubuntu, instala Apache+SSL, copia la configuración y los certificados, expone 80 y 443. -
mysql/Dockerfile
Utiliza la imagen oficial de MySQL, añade el script de inicialización en/docker-entrypoint-initdb.d/, expone el puerto 3306. -
webapp/Dockerfile
Basado en Python 3.11-slim, instala dependencias Flask y MySQL, expone el puerto 5000 y lanza la aplicación. -
docker-compose.yml
Orquesta tres servicios:
- db: MySQL con healthcheck y volumen persistente.
- flask: tu aplicación, que depende de
db. - apache: proxy HTTPS hacia Flask, que depende de
flask.
- Preparación de la instancia
-
Inicia una instancia EC2 (Ubuntu 22.04), abre puertos 80 y 443 en el Security Group.
-
Instala Docker y Docker Compose.
-
En la EC2:
Crear dokcer-compose.yaml
services: db: image: edwingd18/db:v1 environment: MYSQL_ROOT_PASSWORD: example_root_pw MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: secret volumes: - db_data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "user", "-psecret"] interval: 5s timeout: 3s retries: 5 flask: image: edwingd18/flask:v1 depends_on: db: condition: service_healthy restart: on-failure environment: FLASK_ENV: production MYSQL_HOST: db MYSQL_USER: user MYSQL_PASSWORD: secret MYSQL_DATABASE: mydb MYSQL_PORT: 3306 ports: - "5000:5000" apache: image: edwingd18/apache:v1 depends_on: - flask ports: - "80:80" - "443:443" volumes: db_data:
Correr el docker compose
docker login # Crea un docker-compose.yml idéntico, apuntando a tus imágenes en Docker Hub docker compose up -d
- Verificación
- Accede desde tu navegador a
http(s)://<IP-pública>y comprueba que la app responde correctamente.
- Sistema de ficheros y usuario
- Crea el usuario
prometheusy carpetas en/etc/prometheusy/var/lib/prometheus. - Binaries
- Descarga la release oficial, copia
prometheusypromtoola/usr/local/bin/. - Copia las carpetas
consolesyconsole_librariesa/etc/prometheus/. - Servicio systemd
- Archivo
/etc/systemd/system/prometheus.servicecon el comando de arranque apuntando a/etc/prometheus/prometheus.yml. - Configuración
prometheus.ymlhabilita dos jobs:prometheus(auto-scrape en127.0.0.1:9090)node_exporter(scrape en127.0.0.1:9100)
- Descarga y copia el binario a
/usr/local/bin/node_exporter. - Crea
/etc/systemd/system/node_exporter.service. - Arranca y habilita el servicio con
systemctl enable --now node_exporter. - Verifica en
http://<IP-pública>:9090/targetsque ambos jobs estén “UP”.
-
Memoria disponible:
node_memory_MemAvailable_bytes
Gráfica que muestra la cantidad de memoria RAM libre en bytes a lo largo del tiempo. Útil para detectar fugas de memoria o picos de uso inesperados. -
Uso de CPU (idle):
rate(node_cpu_seconds_total{mode="idle"}[5m])
Visualización de la tasa media de CPU inactiva durante ventanas de 5 minutos. Cuanto más alto, más ociosa está la CPU. -
Espacio en disco:
node_filesystem_avail_bytes{fstype!="tmpfs"}
Evolución del espacio libre (en bytes) en las particiones reales del sistema (ext4,xfs, etc.), excluyendotmpfs.
- Instalación:
- Instala Grafana en la misma máquina (o en un contenedor Docker).
- Fuente de datos:
- Añade Prometheus como data source apuntando a
http://localhost:9090.
-
Dashboard combinado
Panel de Grafana con varias métricas: uso de CPU, memoria y disco. Permite tener una visión unificada del estado del servidor. -
Node Exporter Full
Ejemplo de dashboard de la biblioteca oficial de Grafana para Node Exporter, mostrando un conjunto amplio de métricas del sistema. -
Prometheus 2.0 Overview
Dashboard preconfigurado que muestra la salud de Prometheus, tiempos de scrape, uso de TSDB y otros indicadores de rendimiento del propio Prometheus.
❗ Nota: Para detalles de comandos y configuraciones específicas, consulta los archivos correspondientes en cada carpeta (
apache/,mysql/,webapp/) y los ficheros de servicio en/etc/systemd/system/.






