Files
Portainer/opencode

OpenCode Web UI

Este stack ejecuta OpenCode en un contenedor con aislamiento fuerte para exponerlo solo por HTTPS detras de Traefik + Authentik.

Objetivo

  • Dominio: https://ocode.sherlockhomeless.net
  • Acceso: solo usuarios autorizados en Authentik
  • Aislamiento: sin privilegios, filesystem raiz de solo lectura y workspace dedicado

Archivos

  • Compose: opencode/docker-compose.yml
  • Variables: opencode/.env (copiar desde opencode/.env.example)
  • Middleware Traefik (inyecta Authorization): /opt/traefik/dynamic/opencode-auth.yml

Despliegue en contenedor

cp opencode/.env.example opencode/.env
mkdir -p /opt/opencode/home /opt/opencode/config /opt/opencode/workspace
docker compose --env-file opencode/.env -f opencode/docker-compose.yml up -d

Para SSO directo (sin segundo login de OpenCode), crea tambien este middleware dinamico en Traefik:

http:
  middlewares:
    opencode-inject-auth:
      headers:
        customRequestHeaders:
          Authorization: "Basic <base64(usuario:password-opencode)>"

El router sandboxed usa la cadena ths-authentik@docker,opencode-inject-auth@file, asi Authentik valida al usuario y Traefik pasa despues la cabecera Basic al backend.

Endurecimiento aplicado

  • user: 1000:1000
  • cap_drop: [ALL]
  • security_opt: [no-new-privileges:true]
  • read_only: true
  • /tmp en tmpfs con exec, necesario para que Bun/OpenCode cargue librerias temporales
  • Home persistente aislada en /opt/opencode/home
  • Workspace aislado en /opt/opencode/workspace, montado dentro de la home como /home/opencode/workspace
  • Sin docker.sock ni montajes del host fuera de los paths definidos

Authentik (acceso solo a esta app)

En Authentik, ocode.sherlockhomeless.net necesita su propio Proxy Provider publicado en el authentik Embedded Outpost.

Para aislar el acceso, crea un grupo exclusivo, por ejemplo opencode-ocode-users, y una Policy Binding que permita solo ese grupo. El contenedor usa los modelos configurados mediante DEEPSEEK_API_KEY en su .env.