API REST mínima para demostrar un flujo completo de CI/CD con GitHub Actions y Docker, publicada en internet junto con un sitio estático.
| Superficie | Dónde vive | URL |
|---|---|---|
| Sitio web | GitHub Pages | https://developabba.github.io/ci-cd-example/ |
| API | Servidor Ubuntu propio vía Tailscale Funnel | https://abbadeslinux01.tail7bd986.ts.net |
| Documentación interactiva | Swagger UI servida por la API | https://abbadeslinux01.tail7bd986.ts.net/docs |
| Especificación | OpenAPI 3 servida por la API | https://abbadeslinux01.tail7bd986.ts.net/openapi.json |
feature/* ──→ develop ──→ main
↓ ↓
CI pipeline CD pipeline ──→ ghcr.io ──→ servidor Ubuntu
(lint + test) (lint + test (docker + funnel)
+ build + push)
↓
Pages pipeline ──→ sitio estático
| Método | Ruta | Descripción |
|---|---|---|
| GET | /health |
Estado de la app |
| GET | /items |
Lista todos los items |
| GET | /items/count |
Número total de items |
| POST | /items |
Crea un item — body: { "name": "..." } |
| DELETE | /items/:id |
Elimina un item por id |
| GET | /openapi.json |
Especificación OpenAPI 3 |
| GET | /docs |
Swagger UI |
Los items viven en memoria: se reinician con el proceso. Es intencional.
- Cabeceras de
helmet(CSP, HSTS,nosniff,X-Frame-Options), sinX-Powered-By. - Rate limiting de 300 peticiones cada 15 minutos por IP.
- Body JSON limitado a 10 kB, con 400 explícito ante JSON malformado.
- CORS restringido al origen del sitio; configurable con
CORS_ORIGINS. - Contenedor sin root,
read_only,cap_drop: ALL,no-new-privileges.
npm install
npm run devdocker compose up --buildVer deploy/README.md.
npm testnpm run lint