EpicrisisIA - despliegue Docker all-in-one en servidor Linux

Contenido esperado del paquete:
- app/
- modules/
- static/
- web/
- docker/
- Dockerfile
- docker-compose.yml
- .env (si no viene en el paquete, se puede regenerar desde `docker/env.example`)
- pyproject.toml
- uv.lock
- requirements.txt
- requirements-dev.txt
- README.md
- archivos de datos del proyecto

Requisitos en el servidor:
- Docker instalado
- Docker Compose plugin disponible
- Usuario con permiso para ejecutar `docker`

Nota sobre uv:
- No necesitas instalar `uv` en el servidor.
- La imagen ya instala `uv` dentro del build y usa `uv sync` durante la construcción.
- En el servidor solo se construye la imagen con Docker.

Pasos:

1. Subir el ZIP al servidor

Ejemplo:
scp epicrisis-docker-bundle.zip usuario@tu-servidor:/home/usuario/

2. Conectarte al servidor

ssh usuario@tu-servidor

3. Descomprimir

cd /home/usuario
unzip epicrisis-docker-bundle.zip -d epicrisis-docker-bundle

4. Entrar al directorio

cd epicrisis-docker-bundle

Si el paquete no incluye `.env`, créalo antes de levantar:

cp docker/env.example .env

5. Verificar Docker

docker --version
docker compose version

Si tu usuario no tiene permiso para Docker, necesitarás que el administrador te agregue al grupo `docker` o ejecutar con `sudo`.

6. Construir y levantar

docker compose up -d --build

7. Verificar estado

docker ps
docker inspect --format='{{.State.Health.Status}}' epicrisisia
docker logs -f epicrisisia

8. Abrir la aplicación

URL:
http://IP_DEL_SERVIDOR:7000

Comandos útiles:

Ver logs:
docker logs -f epicrisisia

Reiniciar:
docker compose restart

Detener:
docker compose down

Detener sin borrar volumen:
docker compose stop

Volver a construir tras cambios:
docker compose up -d --build

Entrar al contenedor:
docker exec -it epicrisisia bash

Persistencia:
- MongoDB
- Redis
- logs
- cargas batch
- cargas individuales
- índices FAISS

Todo eso queda en el volumen Docker:
- epicrisis06112026_epicrisis-data

Si quieres inspeccionarlo:
docker volume ls

Respaldo básico del volumen:
- usa `docker run --rm -v epicrisis06112026_epicrisis-data:/data -v $(pwd):/backup alpine tar czf /backup/epicrisis-data-backup.tgz /data`

Puertos:
- La app publica `7000:7000`
- MongoDB y Redis no se exponen fuera del contenedor

Variables ya incluidas:
- El paquete incluye `.env`
- Si necesitas cambiar algo luego, edita `.env` y reconstruye:
  docker compose up -d --build

Importante:
- `MONGO_APP_PASSWORD` ya no bloquea `docker compose` si falta.
- Si no lo defines en `.env`, el contenedor genera una clave interna para MongoDB y la guarda en `/data/runtime/.mongo_app_password`.

Si el contenedor no inicia:

1. Ver logs
docker logs epicrisisia

2. Revisar healthcheck
docker inspect --format='{{json .State.Health}}' epicrisisia

3. Confirmar que el puerto 7000 no esté ocupado
ss -ltnp | grep 7000

4. Si necesitas reinicio limpio conservando datos
docker compose down
docker compose up -d --build

5. Si necesitas reinicio total borrando datos persistidos
ADVERTENCIA: esto elimina MongoDB, Redis y artefactos persistidos
docker compose down -v
docker compose up -d --build

Observaciones:
- Esta modalidad empaqueta MongoDB, Redis, Celery y FastAPI en un solo contenedor.
- Es adecuada para despliegue simple por consola.
- No es la topología ideal para escalar servicios por separado.
