This commit is contained in:
@@ -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": "/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
@@ -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
|
||||||
+7
-1
@@ -9,4 +9,10 @@ wheels/
|
|||||||
# Virtual environments
|
# Virtual environments
|
||||||
.venv
|
.venv
|
||||||
|
|
||||||
data
|
# Data directories
|
||||||
|
data
|
||||||
|
|
||||||
|
# Environment variables (contienen credenciales)
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.production
|
||||||
+110
@@ -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"
|
||||||
|
```
|
||||||
@@ -28,7 +28,7 @@ Todos en la carpeta **"Observability Stack"** en Grafana:
|
|||||||
## Acceso
|
## Acceso
|
||||||
|
|
||||||
- URL: http://localhost:3500
|
- URL: http://localhost:3500
|
||||||
- Usuario: `admin`
|
- Usuario: Ver `GRAFANA_ADMIN_USER` en `.env`
|
||||||
- Contraseña: `admin123`
|
- Contraseña: Ver `GRAFANA_ADMIN_PASSWORD` en `.env`
|
||||||
|
|
||||||
Los dashboards se actualizan automáticamente cada 10 segundos si modificas los archivos JSON.
|
Los dashboards se actualizan automáticamente cada 10 segundos si modificas los archivos JSON.
|
||||||
@@ -8,9 +8,21 @@ Esta configuraci�n incluye un stack completo de monitoreo con:
|
|||||||
## Estructura de Archivos
|
## 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
|
```bash
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
@@ -40,8 +52,8 @@ docker-compose down
|
|||||||
## Acceso a los Servicios
|
## Acceso a los Servicios
|
||||||
|
|
||||||
- **Grafana**: http://localhost:3500
|
- **Grafana**: http://localhost:3500
|
||||||
- Usuario: `admin`
|
- Usuario: Ver `GRAFANA_ADMIN_USER` en `.env`
|
||||||
- Contrase�a: `admin123`
|
- Contrase�a: Ver `GRAFANA_ADMIN_PASSWORD` en `.env`
|
||||||
|
|
||||||
- **Prometheus**: http://localhost:9090
|
- **Prometheus**: http://localhost:9090
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ type = sqlite3
|
|||||||
path = /var/lib/grafana/grafana.db
|
path = /var/lib/grafana/grafana.db
|
||||||
|
|
||||||
[security]
|
[security]
|
||||||
# Usuario administrador por defecto
|
# Usuario administrador por defecto (se sobrescribe con variables de entorno)
|
||||||
admin_user = admin
|
# admin_user = admin
|
||||||
# Contraseña administrador por defecto
|
# Contraseña administrador por defecto (se sobrescribe con variables de entorno)
|
||||||
admin_password = admin123
|
# admin_password = admin123
|
||||||
# Clave secreta para cookies
|
# Clave secreta para cookies
|
||||||
secret_key = your_secret_key_here
|
secret_key = your_secret_key_here
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
+8
-8
@@ -4,7 +4,7 @@ services:
|
|||||||
image: prom/prometheus:latest
|
image: prom/prometheus:latest
|
||||||
container_name: prometheus
|
container_name: prometheus
|
||||||
ports:
|
ports:
|
||||||
- "9090:9090"
|
- "${PROMETHEUS_PORT:-9090}:9090"
|
||||||
volumes:
|
volumes:
|
||||||
- ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
- ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||||
- prometheus_data:/prometheus
|
- prometheus_data:/prometheus
|
||||||
@@ -24,7 +24,7 @@ services:
|
|||||||
image: grafana/loki:latest
|
image: grafana/loki:latest
|
||||||
container_name: loki
|
container_name: loki
|
||||||
ports:
|
ports:
|
||||||
- "3100:3100"
|
- "${LOKI_PORT:-3100}:3100"
|
||||||
volumes:
|
volumes:
|
||||||
- ./config/loki/loki.yaml:/etc/loki/local-config.yaml
|
- ./config/loki/loki.yaml:/etc/loki/local-config.yaml
|
||||||
- loki_data:/loki
|
- loki_data:/loki
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
image: grafana/tempo:latest
|
image: grafana/tempo:latest
|
||||||
container_name: tempo
|
container_name: tempo
|
||||||
ports:
|
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:
|
volumes:
|
||||||
- ./config/tempo/tempo.yaml:/etc/tempo/tempo.yaml
|
- ./config/tempo/tempo.yaml:/etc/tempo/tempo.yaml
|
||||||
- tempo_data:/var/tempo
|
- tempo_data:/var/tempo
|
||||||
@@ -53,7 +53,7 @@ services:
|
|||||||
image: grafana/alloy:latest
|
image: grafana/alloy:latest
|
||||||
container_name: alloy
|
container_name: alloy
|
||||||
ports:
|
ports:
|
||||||
- "12345:12345" # Puerto para la UI de Alloy
|
- "${ALLOY_UI_PORT:-12345}:12345" # Puerto para la UI de Alloy
|
||||||
# Puertos para métricas
|
# Puertos para métricas
|
||||||
- "9999:9999" # HTTP receiver para métricas externas
|
- "9999:9999" # HTTP receiver para métricas externas
|
||||||
# Puertos para logs
|
# Puertos para logs
|
||||||
@@ -80,7 +80,7 @@ services:
|
|||||||
- --server.http.listen-addr=0.0.0.0:12345
|
- --server.http.listen-addr=0.0.0.0:12345
|
||||||
- /etc/alloy/config.river
|
- /etc/alloy/config.river
|
||||||
environment:
|
environment:
|
||||||
- ALLOY_HOSTNAME=alloy
|
- ALLOY_HOSTNAME=${ALLOY_HOSTNAME:-alloy}
|
||||||
networks:
|
networks:
|
||||||
- monitoring
|
- monitoring
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@@ -94,10 +94,10 @@ services:
|
|||||||
image: grafana/grafana:latest
|
image: grafana/grafana:latest
|
||||||
container_name: grafana
|
container_name: grafana
|
||||||
ports:
|
ports:
|
||||||
- "3500:3000"
|
- "${GRAFANA_PORT:-3500}:3000"
|
||||||
environment:
|
environment:
|
||||||
- GF_SECURITY_ADMIN_USER=admin
|
- GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin}
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=admin123
|
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin123}
|
||||||
- GF_PATHS_DATA=/var/lib/grafana
|
- GF_PATHS_DATA=/var/lib/grafana
|
||||||
- GF_PATHS_LOGS=/var/log/grafana
|
- GF_PATHS_LOGS=/var/log/grafana
|
||||||
- GF_PATHS_PLUGINS=/var/lib/grafana/plugins
|
- GF_PATHS_PLUGINS=/var/lib/grafana/plugins
|
||||||
|
|||||||
Reference in New Issue
Block a user