Registro de asignación de puertos
Este documento es la única fuente de verdad para cada puerto del host consumido por Crow mismo, por los bundles en bundles/ y los reservados por la hoja de ruta del MVP. Cualquier PR de un bundle nuevo que introduzca un binding de puerto debe modificar este archivo en el mismo PR. El CI verifica que:
- Cada puerto del host en cualquier
bundles/**/docker-compose.ymlesté listado aquí. - Ningún par de bundles mapee el mismo puerto del host.
Convenciones
- Todos los puertos de los bundles se vinculan a
127.0.0.1, a menos que el bundle sea explícitamente un reverse proxy (Caddy) o usenetwork_mode: host(browser, companion, coturn, plex, tailscale, crowdsec-firewall-bouncer). - Las filas "existente" son bundles que ya se publicaron antes de que se introdujera este registro — se registran aquí para que los bundles futuros los eviten.
- Las filas "reservado" están reclamadas por bundles próximos de la Fase 2; no las consumas para trabajo no relacionado.
- Las filas "MVP" están reclamadas por los bundles del plan MVP actual.
- Subredes Docker:
crow-workspacefija 10.89.70.0/24 (scratch: 10.89.71.0/24 smoke, 10.89.72.0/24 restore). No las reutilices.
Conflictos conocidos en el bundles/ actual
Estos son anteriores a este registro y necesitan una resolución de seguimiento fuera del alcance del MVP:
| Puerto | Conflicto |
|---|---|
| — | ninguno. El conflicto 8080 LocalAI/Nextcloud se resolvió el 2026-10-02 (el bundle nextcloud ya no despliega; Crow Workspace usa 3070/3071). |
Tabla de asignación
| Puerto | Binding | Bundle / Servicio | Estado |
|---|---|---|---|
| 22 | host | sshd del host | reservado (sistema) |
| 25 | — | correo SMTP | reservado (correo, Fase 2) |
| 53 | host | DNS del host / systemd-resolved | reservado (sistema) |
| 80 | 0.0.0.0 | Caddy (reverse proxy + ACME HTTP-01) | MVP PR 0.5 |
| 143 | — | correo IMAP | reservado (correo, Fase 2) |
| 443 | 0.0.0.0 | Caddy | MVP PR 0.5 |
| 465 | — | correo SMTPS | reservado (correo, Fase 2) |
| 587 | — | correo submission | reservado (correo, Fase 2) |
| 993 | — | correo IMAPS | reservado (correo, Fase 2) |
| 2222 | — | (evitar: puerto sshd anti-escaneo común en hosts) | evitar |
| 2019 | 127.0.0.1 | API de administración de Caddy (local del host) | MVP PR 0.5 |
| 2223 | 127.0.0.1 | gitea (SSH) | MVP PR 5 |
| 2224 | 127.0.0.1 | forgejo (SSH) | MVP PR 5 |
| 2283 | 127.0.0.1 | immich (existente — verificar en el compose) | existente |
| 3001 | 127.0.0.1 | gateway de Crow (HTTPS) | core |
| 3002 | 127.0.0.1 | gateway de Crow (alterno) | core |
| 3004 | 127.0.0.1 | gateway de Crow (alterno) | core |
| 3005 | 127.0.0.1 | sdxl (se cambia con SDXL_PORT; companion lo alcanza en localhost por la red del host) | existente |
| 3007 | 127.0.0.1 | uptime-kuma | MVP PR 1 |
| 3020 | 127.0.0.1 | adguard-home (UI de administración) | MVP PR 3 |
| 3030 | 127.0.0.1 | homepage | MVP PR 1 |
| 3040 | 127.0.0.1 | gitea (web) | MVP PR 5 |
| 3050 | 127.0.0.1 | forgejo (web) | MVP PR 5 |
| 3080 | 127.0.0.1 | romm (existente) | existente |
| 3456 | 127.0.0.1 | vikunja (existente) | existente |
| 4533 | 127.0.0.1 | navidrome (existente) | existente |
| 5000 | 127.0.0.1 | kavita (existente) | existente |
| 5006 | 127.0.0.1 | actual-budget (existente) | existente |
| 5010 | 127.0.0.1 | changedetection | MVP PR 1 |
| 5042 | — | rotki (web/API) | reservado (finanzas, Fase 2) |
| 5080 | — | plausible | reservado (analítica, Fase 2) |
| 5335 | 127.0.0.1 | adguard-home (DNS, TCP+UDP) | MVP PR 3 |
| 5336 | — | pi-hole (DNS) | reservado (DNS, Fase 2) |
| 5337 | — | technitium (DNS) | reservado (DNS, Fase 2) |
| 6080 | 127.0.0.1 | browser (noVNC, existente) | existente |
| 6875 | 127.0.0.1 | bookstack (existente) | existente |
| 8000 | 127.0.0.1 | paperless (existente) | existente |
| 8004 | 127.0.0.1 | faster-whisper-server (STT local) | existente |
| 8018 | 127.0.0.1 | design-kit (puerta del renderizador: Vega-Lite / Mermaid / D2 → SVG; el contenedor de renderizado está en una red Docker interna sin salida; sin regla ufw) | Design kit v1 |
| 8080 | 127.0.0.1 | localai (existente) | existente |
| 8081 | 127.0.0.1 | calibre-server (existente) | existente |
| 8083 | 127.0.0.1 | calibre-web (existente) | existente |
| 8084 | 127.0.0.1 | wallabag (existente) | existente |
| 8085 | 127.0.0.1 | miniflux (existente) | existente |
| 8086 | 127.0.0.1 | shiori (existente) | existente |
| 8088 | 127.0.0.1 | trilium (existente) | existente |
| 8088 | 127.0.0.1 | valor por defecto de nominatim (NOMINATIM_PORT) — choca con trilium; define NOMINATIM_PORT si usas ambos | existente |
| 8091 | 127.0.0.1 | crowdsec (LAPI) | MVP PR 4 |
| 8092 | 127.0.0.1 | stirling-pdf | MVP PR 1 |
| 8094 | 127.0.0.1 | gatus | MVP PR 2 |
| 8095 | 127.0.0.1 | dozzle | MVP PR 2 |
| 8096 | 127.0.0.1 | jellyfin (existente) | existente |
| 8097 | 127.0.0.1 | vaultwarden | MVP PR 5 |
| 8098 | 127.0.0.1 | searxng | MVP PR 5 |
| 8456 | tailnet (Serve) | Tailscale Serve HTTPS → 127.0.0.1:3070 (Workspace; nunca Funnel) | W1 2026-10 |
| 8457 | tailnet (Serve) | Tailscale Serve HTTPS → 127.0.0.1:3071 (editor de Workspace; nunca Funnel) | W1 2026-10 |
| 8530 | 127.0.0.1 | adguard-home (DNS-over-TLS) | MVP PR 3 |
| 8554 | 127.0.0.1 | frigate (retransmisión RTSP) | existente |
| 8555 | 127.0.0.1 | frigate (WebRTC) | existente |
| 8765 | 127.0.0.1 | motioneye | existente |
| 8880 | 127.0.0.1 | kokoro-tts (TTS local) | existente |
| 8971 | 127.0.0.1 | frigate (UI autenticada) | existente |
| 9000 | 127.0.0.1 | minio (API S3, existente) | existente |
| 9001 | 127.0.0.1 | minio (consola, existente) | existente |
| 9090 | 127.0.0.1 | linkding (existente) | existente |
| 11434 | 127.0.0.1 | ollama (existente) | existente |
| 13378 | 127.0.0.1 | audiobookshelf (existente) | existente |
| 18018 | 127.0.0.1 | design-kit, instancia de PRUEBA del renderizador (scripts/design-kit/smoke-renderer.sh; temporal, solo para pruebas) | Design kit v1 |
| 18789 | 127.0.0.1 | openclaw-old-docker (proceso externo preexistente) | existente |
| 19999 | 127.0.0.1 | netdata | MVP PR 2 |
| 32400 | host | plex (red del host, existente) | existente |
Bundles con red del host (sin binding a 127.0.0.1 — usan el stack del host directamente)
Estos bundles usan network_mode: host. Consumen directamente en el host los puertos que su servicio upstream espera:
browser(Chrome DevTools — verificar puertos)companion(verificar)coturn(3478 UDP, más los puertos de escucha de turnserver)plex(32400, más los puertos de descubrimiento)tailscale(MagicDNS, conexiones con peers)crowdsec-firewall-bouncer(aplazado al PR 4.5 — el upstream no publica una imagen de Docker; necesita un Dockerfile propio y un comando de reversión probado y verificado en un host desechable) — necesitará la red del host para manipular iptables/nftables
Proceso para modificar este archivo
- Elige un puerto sin asignar en un rango razonable (UIs de administración en 3000-3099, APIs de backend en 8000-8099, métricas en 19000-19999).
- Agrega una fila a la tabla con el nombre del bundle y el PR/estado.
- La verificación de colisión de puertos del CI (el job
static-checksen.github/workflows/test.yml) comprueba que tu puerto nuevo no choque con otro. - Referencia este archivo en la descripción del PR de tu bundle.