# Agencia en Docker, sin el repo: la imagen se arma con la release publicada. # # mkdir agencia && cd agencia # curl -fsSLo compose.yml https://get.agencia.ip1.cc/docker/compose.yml # docker compose up -d --build # docker compose logs agencia | head -20 # los tokens del primer arranque # # Este archivo tiene dos versiones. Así como está en el repo, arma la imagen con # Dockerfile.release y entrypoint.sh de esta misma carpeta (`cd deploy/docker && docker # compose -f compose.release.yml up -d --build`). El que se publica en # get.agencia.ip1.cc/docker/compose.yml lo genera scripts/publish.sh, y su contexto es # docker/agencia.git: un repo de git servido como estático, con el Dockerfile y el # entrypoint, que Docker clona solo. Hace falta git en la máquina donde corre Docker. # # Un repo de git y no un .tar.gz, que sería lo obvio: con un contexto .tar.gz remoto # compose busca el Dockerfile como si fuera una ruta local ("open http:/…/context.tar.gz/ # Dockerfile: no such file or directory", Compose 2.40), y dockerfile_inline tampoco sirve # porque compose le interpola las variables y deja los $$ sin desescapar, así que no hay # forma de que un $VAR del Dockerfile llegue entero al build. Con un repo de git, compose # delega todo en el builder y anda. # # Para actualizar a una release nueva: `docker compose build --pull && docker compose up -d`. # El build vuelve a mirar latest.json y, si cambió, arma la versión nueva. Para fijar una # versión: AGENCIA_VERSION=v0.1.0 en el .env o en el entorno. # # El puerto por default es 7778 y no 7777 a propósito: si ya tenés una instalación nativa # andando, el contenedor no se la pisa. name: agencia services: agencia: build: # Generado por scripts/publish.sh desde deploy/docker/compose.release.yml. context: ${AGENCIA_GET_URL:-https://get.agencia.ip1.cc}/docker/agencia.git args: VERSION: ${AGENCIA_VERSION:-latest} GET_URL: ${AGENCIA_GET_URL:-https://get.agencia.ip1.cc} UID: ${UID:-1000} GID: ${GID:-1000} image: agencia:release container_name: agencia ports: # Sólo en 127.0.0.1: la app no se publica afuera de la máquina. Para entrar desde # otra, un túnel o un proxy con HTTPS adelante. - "127.0.0.1:${AGENCIA_PORT:-7778}:7777" environment: # 1 para que despierte agentes sola. Arranca apagado. AGENCIA_DISPATCH: "${AGENCIA_DISPATCH:-0}" # Con qué se autentica el agente: una API key, o el token largo de la suscripción # que imprime `claude setup-token`. La tercera opción es montar ~/.claude (abajo). ANTHROPIC_API_KEY: "${ANTHROPIC_API_KEY:-}" CLAUDE_CODE_OAUTH_TOKEN: "${CLAUDE_CODE_OAUTH_TOKEN:-}" AGENCIA_LOG_FILE: /data/server.log volumes: # La base, los adjuntos, el espejo y el agent-token. Es TODO el estado: para hacer # backup, se copia este volumen. - agencia-data:/data # Los repos donde el agente trabaja. El root_path de cada Proyecto tiene que ser la # ruta de ADENTRO del contenedor (/work/), no la del host. - ${AGENCIA_WORK:-./work}:/work # Credenciales y transcripts del agente. Descomentar para reusar el login de la # máquina en vez de una API key. Ojo: el contenedor escribe ahí. # - ${HOME}/.claude:/home/agent/.claude restart: unless-stopped volumes: agencia-data: