Una forja de código propia resuelve dónde vive tu código. Lo que no resuelve sola es mantenerlo al día: librerías, imágenes base y acciones de CI se quedan obsoletas en silencio hasta que una de ellas tiene un fallo de seguridad conocido. Este stack añade esa pieza — Renovate abriendo pull requests de actualización solo, y un aviso a tu móvil en cuanto algo falla.
Forja de código propia con actualización automática de dependencias: Forgejo + Renovate + ntfy
Objetivo
Montar tu propia forja de código self-hosted con control de versiones de dependencias automatizado y aviso inmediato si una actualización o un build falla.
Componentes
Base · Hipervisor
Servicio principal · Forja de código
CI/CD · Ejecuta los workflows
Forgejo Actions Runner
Actualización automática de dependencias
Avisos push si Renovate o un build fallan
ntfy
Cómo se conecta

Haz clic para ampliar
Ensamblaje
Desplegar Forgejo
Forgejo se despliega con su docker-compose oficial: un contenedor con los datos del repositorio en un volumen persistente, puerto 3000 para la web y 22 para Git sobre SSH.
services: forgejo: image: codeberg.org/forgejo/forgejo:10 environment: - USER_UID=1000 - USER_GID=1000 volumes: - ./forgejo-data:/data ports: - "3000:3000" - "2222:22"Habilitar Forgejo Actions y registrar un runner
Con Actions activado en
app.ini([actions] ENABLED = true), se registra un runner independiente que ejecutará los workflows en contenedores propios:forgejo-runner register --instance https://forja.tu-dominio.lan --token <token-generado-en-la-web> forgejo-runner daemon
Añadir el workflow de Renovate
Un workflow programado en cada repositorio (o uno centralizado que recorra varios) lanza la imagen oficial de Renovate contra el propio Forgejo:
# .forgejo/workflows/renovate.yml on: schedule: - cron: "0 4 * * *" jobs: renovate: runs-on: docker container: image: renovate/renovate:latest steps: - run: renovate env: RENOVATE_PLATFORM: gitea RENOVATE_ENDPOINT: https://forja.tu-dominio.lan/api/v1 RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }}Conectar los avisos a ntfy
Un paso final en el mismo workflow (o en cualquier otro de CI) que solo se ejecuta si algo ha fallado manda un push a tu propio ntfy:
- name: avisar si falla if: failure() run: | curl -H "Title: Renovate falló" \ -H "Priority: high" \ -d "Revisa el workflow en Forgejo" \ https://ntfy.tu-dominio.lan/forjaProbarlo de extremo a extremo
Crea un repositorio de prueba con una dependencia desactualizada a propósito y espera al siguiente disparo programado: debería aparecer un pull request de Renovate solo. Luego rompe deliberadamente un paso del workflow (por ejemplo, un lint que falle) y confirma que la notificación llega al móvil por ntfy antes de entrar a mirar el panel de Forgejo.
Conclusión
Para comprobar que el stack funciona de verdad: espera al primer disparo programado del workflow de Renovate y confirma que aparece un pull request de actualización en tu Forgejo; luego rompe algo a propósito (por ejemplo, un paso de lint que falle) y confirma que la notificación llega a tu móvil por ntfy antes de que te enteres por otra vía. Si las dos cosas pasan, ya tienes gestión de dependencias y aviso de fallos sin depender de ningún SaaS externo.



