Flujo de petición — localhost

🌐
Navegador
localhost
:8090
HTTP
🗂
kutxan_portal
nginx
:8000
/api/*
kutxan_auth
FastAPI
:5432
interno
🗄
kutxan_auth_db
postgres:16

Kutxan — servicios

Contenedor
kutxan_portal
nginx:alpine
Host → Container
809080
Acceso
http://localhost:8090
Red
default
Contenedor
kutxan_auth
kutxan-auth
Host → Container
80918000
Swagger
http://localhost:8091/docs
Red
default
Contenedor
kutxan_auth_db
postgres:16-alpine
Host → Container
54355432
psql
localhost:5435 / kutxan_user
Red
default

Filmoteka (proyecto "pelis") — servicios

Contenedor
pelis_nginx
nginx:alpine
Host → Container
808080
Acceso
http://localhost:8080
Red
default
Contenedor
pelis_api
FastAPI
Host → Container
80018000
Swagger
http://localhost:8001/docs
Red
default
Contenedor
pelis_db
postgres:16-alpine
Host → Container
54345432
psql
localhost:5434 / pelis_user
Red
default

Auth propia todavía (no usa kutxan_token en local). La integración JWT con kutxan está pendiente de completar — ver nota en producción.

Bisk — servicios

Contenedor
bisk-frontend
nginx + Svelte build
Host → Container
807080
Acceso
http://localhost:8070
Redes
webbisk_internal
Contenedor
bisk-backend
FastAPI + WebSockets
Puerto
8000sin exponer al host
Acceso
vía /api/ y /ws/ del frontend
Redes
webbisk_internal
Contenedor
bisk-db
postgres:16-alpine
Puerto
5432sin exponer al host
Acceso
solo desde bisk-backend
Red
bisk_internal

Bisk ya implementa la integración con kutxan_token (lazy user creation, misma SECRET_KEY) — es el único de los tres que la tiene lista. Aún no desplegado en el servidor.

Kalendario — servicios

Proceso
manage.py runserver
Django + gunicorn en prod
Puerto
8000
Acceso
http://localhost:8000
Red
sin Docker (venv local)
Contenedor opcional
kalendario-db (dev)
postgres:16-alpine · docker-compose.dev.yml
Host → Container
54335432
psql
localhost:5433 / kalendario
Red
default (por defecto: SQLite)

En local no hace falta kutxan corriendo: DevFakeKutxanMiddleware firma una cookie kutxan_token falsa con el mismo KUTXAN_JWT_SECRET de desarrollo, simulando un login real.

Flujo de petición — 178.104.199.170

🌐
Internet
usuario final
443/80
TLS
🔀
infra_nginx
nginx:alpine
:80
red web
🗂
kutxan_portal
nginx:alpine
:8000
kutxan_internal
kutxan_auth
FastAPI
:5432
kutxan_internal
🗄
kutxan_auth_db
postgres:16

infra_nginx

Contenedor
infra_nginx
nginx:alpine · /srv/infra/
Puertos públicos
80443
Función
Terminación TLS · reverse proxy de todos los dominios · webroot certbot
Red
web (externa)

Kutxan — servicios

Contenedor
kutxan_portal
nginx:alpine
Puerto
80
Función
Estáticos + proxy /api/ → kutxan_auth
Redes
webkutxan_internal
Contenedor
kutxan_auth
FastAPI
Puerto
8000
Función
Auth JWT · usuarios · invitaciones · admin API
Red
kutxan_internal
Contenedor
kutxan_auth_db
postgres:16-alpine
Puerto
5432
Función
Usuarios · apps · invitaciones · permisos
Red
kutxan_internal

Filmoteka (proyecto "pelis")

Contenedor
pelis_api
FastAPI
Puerto
8000
Función
API + sirve las páginas de filmoteka.kutxan.com
Redes
webpelis interna
Contenedor
pelis_db
postgres:16-alpine
Puerto
5432
Función
Catálogo de películas · usuarios propios
Red
pelis interna

Pendiente: pelis_api aún tiene su propia autenticación y no valida el cookie kutxan_token — de ahí el bucle de redirección al entrar por filmoteka.kutxan.com (aparece brevemente y vuelve a kutxan). Falta adaptar su security.py al patrón de lazy user creation que ya usa Bisk.

Bisk

Estado
No desplegado todavía
código listo, falta subir al servidor
Puerto previsto
80frontend
Pendiente
DNS bisk.kutxan.com → 178.104.199.170 · certbot · bloque en infra_nginx
Red prevista
web (externa)

La integración con kutxan (JWT + lazy user creation) ya está implementada en el código — ver bisk/backend/app/auth.py. Solo falta el despliegue en el servidor.

Kalendario

Contenedor
kalendario-backend
Django + gunicorn
Puerto
8000
Función
Calendario compartido de viajes · media en /srv/kalendario/media
Redes
webdefault
Contenedor
kalendario-db
postgres:16-alpine
Puerto
5432
Función
DB kalendario · sin exponer al host
Red
default

Integración con kutxan completa y verificada de extremo a extremo (redirección a login, JWT firmado con el mismo SECRET_KEY, lazy user creation vía claim sub). Cert Let's Encrypt válido hasta 2026-11-26. Registrada en la tabla apps — falta conceder acceso por usuario en Admin → Usuarios.

Dominios

DominioDestinoProyectoEstado
www.kutxan.com infra_nginx → kutxan_portal → kutxan_auth Kutxan (hub) Producción
filmoteka.kutxan.com infra_nginx → pelis_api Filmoteka Auth pendiente
bisk.kutxan.com — (aún no configurado en infra_nginx) Bisk 🎲 Sin desplegar
kalendario.kutxan.com infra_nginx → kalendario-backend Kalendario 🗓️ Producción
www.pronostikalo.com infra_nginx → porra_web → porra_api Porra Mundial Independiente

Comandos servidor

Pull + rebuild authcd /srv/kutxan && git pull && docker compose -f docker-compose.prod.yml up -d --build auth
Estado de contenedores kutxandocker ps | grep kutxan
Logs de authdocker logs kutxan_auth --tail 50
Reiniciar nginx de infracd /srv/infra && docker compose up -d --force-recreate nginx
Logs de infra_nginxdocker logs infra_nginx --tail 30
Pull + rebuild kalendariocd /srv/kalendario && git pull && docker compose -f docker-compose.prod.yml up -d --build
Logs de kalendariodocker logs kalendario-backend --tail 50