diff --git a/.coolify.json b/.coolify.json new file mode 100644 index 0000000..96fb0b8 --- /dev/null +++ b/.coolify.json @@ -0,0 +1,46 @@ +{ + "name": "suite-logs", + "description": "Stack de monitoreo con Grafana, Prometheus, Loki, Tempo y Alloy", + "type": "docker-compose", + "dockerComposeFile": "docker-compose.yml", + "buildCommand": "docker-compose pull", + "deployCommand": "docker-compose up -d", + "healthCheckPath": "/", + "healthCheckPort": 3500, + "healthCheckProtocol": "http", + "environment": { + "COMPOSE_PROJECT_NAME": "suite-logs" + }, + "services": [ + { + "name": "grafana", + "port": 3500, + "protocol": "http", + "path": "/" + }, + { + "name": "prometheus", + "port": 9090, + "protocol": "http", + "path": "/" + }, + { + "name": "loki", + "port": 3100, + "protocol": "http", + "path": "/" + }, + { + "name": "tempo", + "port": 3200, + "protocol": "http", + "path": "/" + }, + { + "name": "alloy", + "port": 12345, + "protocol": "http", + "path": "/" + } + ] +} \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..842430f --- /dev/null +++ b/.env.example @@ -0,0 +1,33 @@ +# Configuración de autenticación para Grafana +# IMPORTANTE: Cambia estos valores por credenciales seguras +GRAFANA_ADMIN_USER=admin +GRAFANA_ADMIN_PASSWORD=cambiar_por_contraseña_segura + +# Configuración de red +# Puertos donde se expondrán los servicios +GRAFANA_PORT=3500 +PROMETHEUS_PORT=9090 +LOKI_PORT=3100 +TEMPO_PORT=3200 +ALLOY_PORT=12345 +ALLOY_UI_PORT=12345 + +# Configuración de volúmenes +# Rutas donde se almacenarán los datos persistentes +PROMETHEUS_DATA_PATH=./data/prometheus +LOKI_DATA_PATH=./data/loki +TEMPO_DATA_PATH=./data/tempo +ALLOY_DATA_PATH=./data/alloy +GRAFANA_DATA_PATH=./data/grafana + +# Configuración de Alloy +ALLOY_HOSTNAME=alloy + +# Configuración del proyecto +COMPOSE_PROJECT_NAME=suite-logs + +# INSTRUCCIONES: +# 1. Copia este archivo a .env: cp .env.example .env +# 2. Edita .env y cambia GRAFANA_ADMIN_PASSWORD por una contraseña segura +# 3. Opcionalmente modifica los puertos si hay conflictos +# 4. Nunca subas el archivo .env al repositorio (ya está en .gitignore) \ No newline at end of file diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..0f3fbca --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,35 @@ +name: Deploy to Coolify + +on: + push: + branches: + - master + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Deploy to Coolify + run: | + curl -X POST \ + -H "Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "deploymentUuid": "${{ secrets.COOLIFY_DEPLOYMENT_UUID }}", + "gitCommitSha": "${{ github.sha }}", + "gitBranch": "${{ github.ref_name }}" + }' \ + ${{ secrets.COOLIFY_WEBHOOK_URL }} + + - name: Notify deployment + if: always() + run: | + if [ "${{ job.status }}" == "success" ]; then + echo "✅ Deployment successful" + else + echo "❌ Deployment failed" + fi \ No newline at end of file diff --git a/.gitignore b/.gitignore index 899bead..88e415c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,10 @@ wheels/ # Virtual environments .venv -data \ No newline at end of file +# Data directories +data + +# Environment variables (contienen credenciales) +.env +.env.local +.env.production \ No newline at end of file diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..fcb8974 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,110 @@ +# Configuración de Despliegue Automático + +Este documento explica cómo configurar el despliegue automático desde Gitea a Coolify. + +## Pasos de Configuración + +### 1. En Gitea + +1. Ve a tu repositorio en Gitea +2. Habilita Gitea Actions si no está habilitado +3. Configura los siguientes secrets en Settings → Secrets: + - `COOLIFY_TOKEN`: Token de API de Coolify + - `COOLIFY_WEBHOOK_URL`: URL del webhook de Coolify + - `COOLIFY_DEPLOYMENT_UUID`: UUID del deployment en Coolify + +### 2. En Coolify + +1. **Crear nuevo proyecto:** + - Nombre: `suite-logs` + - Tipo: Docker Compose + - Repositorio: URL de tu repositorio en Gitea + +2. **Configurar Source:** + - Branch: `master` (o `main`) + - Auto Deploy: Habilitado + - Dockerfile/Compose path: `docker-compose.yml` + +3. **Variables de entorno:** + ```env + COMPOSE_PROJECT_NAME=suite-logs + ``` + +4. **Configurar dominios/puertos:** + - Grafana: puerto 3500 + - Prometheus: puerto 9090 + - Loki: puerto 3100 + - Tempo: puerto 3200 + - Alloy: puerto 12345 + +5. **Obtener webhook URL:** + - Ve a la configuración del proyecto + - Copia la URL del webhook + - Úsala como `COOLIFY_WEBHOOK_URL` en Gitea + +### 3. Configuración de Red + +Asegúrate de que Coolify tenga acceso a: +- Puerto 3500 (Grafana) +- Puerto 9090 (Prometheus) +- Puerto 3100 (Loki) +- Puerto 3200 (Tempo) +- Puerto 12345 (Alloy) + +### 4. Monitoreo de Despliegues + +El pipeline de Gitea Actions: +- Se ejecuta automáticamente en push a master/main +- Envía webhook a Coolify para iniciar despliegue +- Reporta estado del despliegue + +## Troubleshooting + +### Pipeline falla +1. Verifica que los secrets estén configurados correctamente +2. Revisa logs en Gitea Actions +3. Verifica conectividad entre Gitea y Coolify + +### Despliegue falla en Coolify +1. Revisa logs en Coolify dashboard +2. Verifica que docker-compose.yml sea válido +3. Asegúrate de que los volúmenes tengan permisos correctos + +### Servicios no se conectan +1. Verifica configuración de red en docker-compose.yml +2. Revisa logs de cada servicio +3. Verifica que los archivos de configuración existan + +## Comandos Útiles + +```bash +# Verificar estado local +docker-compose ps + +# Ver logs de todos los servicios +docker-compose logs -f + +# Reiniciar servicios específicos +docker-compose restart grafana + +# Limpiar y reiniciar todo +docker-compose down && docker-compose up -d +``` + +## URLs de Acceso Post-Despliegue + +Una vez desplegado en Coolify: +- **Grafana**: https://tu-dominio.com/grafana (o puerto configurado) +- **Prometheus**: https://tu-dominio.com/prometheus +- **Loki**: https://tu-dominio.com/loki +- **Tempo**: https://tu-dominio.com/tempo +- **Alloy**: https://tu-dominio.com/alloy + +## Secrets Necesarios en Gitea + +```yaml +# En Settings → Secrets de tu repositorio +COOLIFY_TOKEN: "tu_token_de_coolify_api" +COOLIFY_WEBHOOK_URL: "https://coolify.tudominio.com/webhooks/deploy/uuid" +COOLIFY_DEPLOYMENT_UUID: "uuid-de-tu-deployment" +``` \ No newline at end of file diff --git a/README-DASHBOARDS.md b/README-DASHBOARDS.md index 7135436..3d819a0 100644 --- a/README-DASHBOARDS.md +++ b/README-DASHBOARDS.md @@ -28,7 +28,7 @@ Todos en la carpeta **"Observability Stack"** en Grafana: ## Acceso - URL: http://localhost:3500 -- Usuario: `admin` -- Contraseña: `admin123` +- Usuario: Ver `GRAFANA_ADMIN_USER` en `.env` +- Contraseña: Ver `GRAFANA_ADMIN_PASSWORD` en `.env` Los dashboards se actualizan automáticamente cada 10 segundos si modificas los archivos JSON. \ No newline at end of file diff --git a/README.md b/README.md index dc2be77..828f9ae 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,21 @@ Esta configuraci�n incluye un stack completo de monitoreo con: ## Estructura de Archivos -## Uso +## Configuración Inicial -### Iniciar los servicios +### 1. Configurar variables de entorno + +```bash +# Copiar archivo de ejemplo +cp .env.example .env + +# Editar archivo .env y cambiar la contraseña de Grafana +nano .env +``` + +**IMPORTANTE**: Cambia `GRAFANA_ADMIN_PASSWORD` por una contraseña segura. + +### 2. Iniciar los servicios ```bash docker-compose up -d @@ -40,8 +52,8 @@ docker-compose down ## Acceso a los Servicios - **Grafana**: http://localhost:3500 - - Usuario: `admin` - - Contrase�a: `admin123` + - Usuario: Ver `GRAFANA_ADMIN_USER` en `.env` + - Contrase�a: Ver `GRAFANA_ADMIN_PASSWORD` en `.env` - **Prometheus**: http://localhost:9090 diff --git a/config/grafana/grafana.ini b/config/grafana/grafana.ini index 2b73a84..43ecfaf 100644 --- a/config/grafana/grafana.ini +++ b/config/grafana/grafana.ini @@ -16,10 +16,10 @@ type = sqlite3 path = /var/lib/grafana/grafana.db [security] -# Usuario administrador por defecto -admin_user = admin -# Contraseña administrador por defecto -admin_password = admin123 +# Usuario administrador por defecto (se sobrescribe con variables de entorno) +# admin_user = admin +# Contraseña administrador por defecto (se sobrescribe con variables de entorno) +# admin_password = admin123 # Clave secreta para cookies secret_key = your_secret_key_here diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..a3024d4 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Script de despliegue para Coolify +# Este script se ejecuta cuando Coolify despliega la aplicación + +set -e + +echo "🚀 Iniciando despliegue de Suite Logs..." + +# Verificar que Docker Compose esté disponible +if ! command -v docker-compose &> /dev/null; then + echo "❌ Docker Compose no está instalado" + exit 1 +fi + +# Verificar que el archivo docker-compose.yml existe +if [ ! -f "docker-compose.yml" ]; then + echo "❌ No se encuentra docker-compose.yml" + exit 1 +fi + +# Detener servicios existentes +echo "⏹️ Deteniendo servicios existentes..." +docker-compose down --remove-orphans || true + +# Limpiar imágenes antiguas +echo "🧹 Limpiando imágenes antiguas..." +docker image prune -f || true + +# Descargar nuevas imágenes +echo "📥 Descargando nuevas imágenes..." +docker-compose pull + +# Crear directorios necesarios si no existen +echo "📁 Verificando directorios..." +mkdir -p config/{prometheus,loki,tempo,alloy,grafana/provisioning} + +# Iniciar servicios +echo "▶️ Iniciando servicios..." +docker-compose up -d + +# Verificar que los servicios estén corriendo +echo "🔍 Verificando servicios..." +sleep 10 + +# Health checks +services=("prometheus:9090" "loki:3100" "tempo:3200" "alloy:12345" "grafana:3500") +for service in "${services[@]}"; do + name=${service%%:*} + port=${service##*:} + + if docker-compose ps | grep -q "$name.*Up"; then + echo "✅ $name está corriendo" + else + echo "❌ $name no está corriendo" + docker-compose logs "$name" + exit 1 + fi +done + +echo "🎉 Despliegue completado exitosamente!" +echo "📊 Grafana: http://localhost:3500 (credenciales en .env)" +echo "📈 Prometheus: http://localhost:9090" +echo "📝 Loki: http://localhost:3100" +echo "🔍 Tempo: http://localhost:3200" +echo "🔧 Alloy: http://localhost:12345" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 94e0097..4f348a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: image: prom/prometheus:latest container_name: prometheus ports: - - "9090:9090" + - "${PROMETHEUS_PORT:-9090}:9090" volumes: - ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus @@ -24,7 +24,7 @@ services: image: grafana/loki:latest container_name: loki ports: - - "3100:3100" + - "${LOKI_PORT:-3100}:3100" volumes: - ./config/loki/loki.yaml:/etc/loki/local-config.yaml - loki_data:/loki @@ -38,7 +38,7 @@ services: image: grafana/tempo:latest container_name: tempo ports: - - "3200:3200" # Solo puerto de consulta, sin endpoints de recepción + - "${TEMPO_PORT:-3200}:3200" # Solo puerto de consulta, sin endpoints de recepción volumes: - ./config/tempo/tempo.yaml:/etc/tempo/tempo.yaml - tempo_data:/var/tempo @@ -53,7 +53,7 @@ services: image: grafana/alloy:latest container_name: alloy ports: - - "12345:12345" # Puerto para la UI de Alloy + - "${ALLOY_UI_PORT:-12345}:12345" # Puerto para la UI de Alloy # Puertos para métricas - "9999:9999" # HTTP receiver para métricas externas # Puertos para logs @@ -80,7 +80,7 @@ services: - --server.http.listen-addr=0.0.0.0:12345 - /etc/alloy/config.river environment: - - ALLOY_HOSTNAME=alloy + - ALLOY_HOSTNAME=${ALLOY_HOSTNAME:-alloy} networks: - monitoring restart: unless-stopped @@ -94,10 +94,10 @@ services: image: grafana/grafana:latest container_name: grafana ports: - - "3500:3000" + - "${GRAFANA_PORT:-3500}:3000" environment: - - GF_SECURITY_ADMIN_USER=admin - - GF_SECURITY_ADMIN_PASSWORD=admin123 + - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin} + - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin123} - GF_PATHS_DATA=/var/lib/grafana - GF_PATHS_LOGS=/var/log/grafana - GF_PATHS_PLUGINS=/var/lib/grafana/plugins