feat: Gitea Actions CI/CD pipeline with container registry builds
Some checks failed
Build and Push Docker Image / Build & push to Gitea registry (push) Has been cancelled

- .gitea/workflows/docker.yml: builds and pushes image to
  devops.cloudhost.es/malin/paste.es on every push to main,
  tags as :latest and :<short-sha>, uses GHA layer cache
- docker-compose.yml: updated to pull pre-built image from Gitea
  container registry instead of building locally
- docker-compose.build.yml: new override file for local dev builds
  (docker compose -f docker-compose.yml -f docker-compose.build.yml up --build)
- docker-compose.runner.yml: act_runner service — mount docker socket,
  auto-registers with RUNNER_REGISTRATION_TOKEN from .env
- .env.example: added RUNNER_REGISTRATION_TOKEN section
- README.md: document CI/CD setup, runner registration, and updated
  quick-start to use registry pull workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 10:36:04 +01:00
parent 4d21c64998
commit 4968cb04c3
6 changed files with 148 additions and 22 deletions

View File

@@ -117,3 +117,12 @@ HEMMELIG_ANALYTICS_ENABLED=false
# -----------------------------------------------------------------------------
# (Los webhooks se configuran desde el panel de administración en /dashboard/instance)
# -----------------------------------------------------------------------------
# GITEA ACTIONS RUNNER — Solo necesario si ejecutas el runner en este servidor
# Obtén el token en: https://devops.cloudhost.es/Malin/paste.es/settings/actions/runners
# Luego arranca con: docker compose -f docker-compose.runner.yml up -d
# -----------------------------------------------------------------------------
# RUNNER_REGISTRATION_TOKEN=

View File

@@ -0,0 +1,44 @@
name: Build and Push Docker Image
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
name: Build & push to Gitea registry
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea Container Registry
uses: docker/login-action@v3
with:
registry: devops.cloudhost.es
username: ${{ gitea.actor }}
password: ${{ secrets.GITEA_TOKEN }}
- name: Extract image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: devops.cloudhost.es/malin/paste.es
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=sha,prefix=,format=short
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@@ -34,37 +34,43 @@ Servicio de compartición de secretos efímeros y cifrados para el público hisp
## Inicio rápido
### Docker Compose (recomendado)
### Docker Compose — imagen desde el registro (recomendado en producción)
Cada push a `main` construye y publica automáticamente la imagen en el registro de contenedores de Gitea. En el servidor de producción solo necesitas hacer pull:
```bash
git clone https://devops.cloudhost.es/Malin/paste.es.git
cd paste.es
# Autentícate en el registro de Gitea
docker login devops.cloudhost.es
# Copia y edita el fichero de entorno
cp .env.example .env
# Edita .env con tus valores (ver sección Configuración)
# Construye y arranca
docker compose up -d --build
# Descarga la imagen y arranca
docker compose pull
docker compose up -d
```
Para actualizar a la última versión:
```bash
docker compose pull && docker compose up -d
```
### Docker Compose — compilación local (desarrollo)
```bash
git clone https://devops.cloudhost.es/Malin/paste.es.git
cd paste.es
cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
```
El servicio quedará disponible en `http://localhost:3000`.
### Docker (imagen directa)
```bash
docker run -d \
--name paste-es \
-p 3000:3000 \
-v paste-data:/app/database \
-v paste-uploads:/app/uploads \
-e DATABASE_URL="file:/app/database/paste.db" \
-e BETTER_AUTH_SECRET="$(openssl rand -base64 32)" \
-e BETTER_AUTH_URL="https://paste.es" \
-e HEMMELIG_INSTANCE_NAME="paste.es" \
ghcr.io/cloudhost-es/paste.es:latest
```
---
## Configuración
@@ -106,6 +112,38 @@ npm run dev # Terminal 2 — cliente Vite con HMR
---
## CI/CD — Gitea Actions + registro de contenedores
El repositorio incluye un pipeline en `.gitea/workflows/docker.yml` que:
1. Se activa en cada push a `main` (o manualmente desde la UI de Gitea)
2. Construye la imagen Docker con caché de capas
3. La publica en el registro de contenedores de Gitea como `devops.cloudhost.es/malin/paste.es:latest` y `devops.cloudhost.es/malin/paste.es:<sha>`
### Requisitos previos
**1. Habilitar Gitea Actions** en el repositorio:
> Settings → Actions → Enable repository actions
**2. Arrancar un act_runner** (ejecutor del pipeline). Obtén el token en:
> Settings → Actions → Runners → Create Runner Token
Añádelo a `.env` y arranca el runner:
```bash
# En .env:
RUNNER_REGISTRATION_TOKEN=<token>
docker compose -f docker-compose.runner.yml up -d
```
El runner se registra automáticamente y queda disponible para ejecutar workflows.
**3. El siguiente push a `main`** disparará la build automáticamente. Puedes seguirla en:
> Gitea → Actions → Workflows
---
## Despliegue en producción
### Detrás de un proxy inverso (Nginx / Caddy)

11
docker-compose.build.yml Normal file
View File

@@ -0,0 +1,11 @@
# Local build override — use this during development instead of pulling from the registry.
#
# Usage:
# docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
services:
paste-es:
build:
context: .
dockerfile: Dockerfile
image: devops.cloudhost.es/malin/paste.es:latest

26
docker-compose.runner.yml Normal file
View File

@@ -0,0 +1,26 @@
# Gitea act_runner — CI/CD executor for Gitea Actions
#
# Setup steps:
# 1. Get a runner registration token from:
# https://devops.cloudhost.es/Malin/paste.es/settings/actions/runners
# 2. Add it to your .env file:
# RUNNER_REGISTRATION_TOKEN=<token from Gitea>
# 3. Start the runner:
# docker compose -f docker-compose.runner.yml up -d
#
# The runner registers itself automatically on first start.
# After that, push to main and the docker.yml workflow will fire.
services:
act-runner:
image: gitea/act_runner:latest
container_name: paste-es-act-runner
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data/runner:/data
environment:
- GITEA_INSTANCE_URL=https://devops.cloudhost.es
- GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_REGISTRATION_TOKEN}
- GITEA_RUNNER_NAME=paste-es-runner
- GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:20-bullseye

View File

@@ -1,8 +1,6 @@
services:
paste-es:
build:
context: .
dockerfile: Dockerfile
image: devops.cloudhost.es/malin/paste.es:latest
container_name: paste-es
restart: unless-stopped
env_file: