Saltar a contenido

Despliegues avanzados

La instalación en un solo contenedor sirve para la mayoría de los servidores. Abre esta página si quieres la base de datos o el motor de búsqueda como servicios aparte, si el equipo es ARM, si necesitas una variante de la imagen, o si el sandbox de plugins indica algo distinto de landlock. Para usar Evey sin Docker, consulta Sin contenedor.

La base de datos integrada

El clúster está en ./evey-data/postgres (Postgres 17, creado en el primer arranque y propiedad del usuario del servidor). Solo escucha en la interfaz local del contenedor y exige la contraseña generada, así que un plugin que se ejecuta con otro usuario no puede abrirlo. docker stop lo apaga limpiamente después de que el servidor haya cerrado sus conexiones.

La carpeta de datos tiene que estar en un sistema de archivos local (ext4, btrfs, xfs...), no en una carpeta compartida SMB/CIFS o NFS. Para abrir una consola SQL:

docker exec -it evey-server sh -c 'PGPASSWORD=$(cat /data/keys/postgres.password) psql -h 127.0.0.1 -U evey evey'

Pasar a una versión mayor más reciente de Postgres

La imagen fija la versión mayor de la base de datos integrada. Una imagen que trae una versión mayor más reciente se niega a abrir el clúster antiguo, con un mensaje que remite a esta sección, en lugar de usar una carpeta de datos que no sabe leer. El camino es un volcado con la imagen antigua y una restauración con la nueva:

docker compose exec evey sh -c 'PGPASSWORD=$(cat /data/keys/postgres.password) pg_dump -h 127.0.0.1 -U evey -Fc evey' > evey-before-upgrade.dump
docker compose down
mv evey-data/postgres evey-data/postgres.old      # consérvalo hasta comprobar la restauración
# pon la nueva etiqueta de imagen en el archivo compose y después:
docker compose up -d                              # crea un clúster vacío con la nueva versión mayor
docker compose exec -T evey sh -c 'PGPASSWORD=$(cat /data/keys/postgres.password) pg_restore -h 127.0.0.1 -U evey -d evey --no-owner' < evey-before-upgrade.dump
docker compose restart evey

Usar Postgres como servicio aparte

Para gestionar tú mismo el ciclo de vida de la base de datos (un Postgres gestionado, una versión mayor fijada, tu propia política de volcados), ejecútala como un servicio aparte e indícale al servidor dónde está. Definir EVEY_DB_HOST es lo que desactiva la base de datos integrada. El servidor se niega a arrancar con la contraseña por defecto evey.

services:
  evey:
    # ... como en el archivo de un solo contenedor, más:
    environment:
      EVEY_DB_HOST: postgres
      EVEY_DB_SSLMODE: disable          # red interna, sin TLS
    depends_on:
      postgres: { condition: service_healthy }

  postgres:
    image: postgres:16-alpine
    container_name: evey-postgres
    environment:
      POSTGRES_DB: ${EVEY_DB_NAME:-evey}
      POSTGRES_USER: ${EVEY_DB_USER:-evey}
      POSTGRES_PASSWORD: ${EVEY_DB_PASSWORD:?EVEY_DB_PASSWORD must be set in .env}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${EVEY_DB_USER:-evey}"]
      interval: 5s
      timeout: 3s
      retries: 5
    restart: unless-stopped
EVEY_DB_PASSWORD=<strong-password>

Usar Meilisearch como servicio aparte

El mismo principio sirve para el motor de búsqueda: desactiva el integrado, indícale al servidor dónde está el tuyo y comparte la clave. Un MEILI_MASTER_KEY explícito tiene prioridad sobre la clave generada ./evey-data/keys/meili.key.

services:
  evey:
    # ... más:
    environment:
      EVEY_EMBEDDED_MEILI: "false"
      EVEY_MEILI_URL: http://meilisearch:7700
    depends_on:
      meilisearch: { condition: service_healthy }

  meilisearch:
    image: getmeili/meilisearch:v1.12
    container_name: evey-meilisearch
    environment:
      MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:?MEILI_MASTER_KEY must be set in .env}
      MEILI_NO_ANALYTICS: "true"
    volumes:
      - ./meili-data:/meili_data
    healthcheck:
      test: ["CMD", "curl", "-sf", "http://localhost:7700/health"]
      interval: 5s
      retries: 5
    restart: unless-stopped
MEILI_MASTER_KEY=<run: openssl rand -hex 16>

El índice de búsqueda se reconstruye a partir de la base de datos con docker exec evey-server evey admin reindex-search, así que siempre puedes borrar meili-data.

Volver a la base de datos integrada

Una instalación que usa Postgres como servicio aparte puede pasar al contenedor único. La base de datos integrada importa una sola vez el volcado que encuentre en ./evey-data/postgres-import.sql.gz, dentro del clúster que crea en su primer arranque y antes de que arranque el servidor. Después, las migraciones del servidor se aplican encima.

# 1. vuelca la base de datos actual (SQL plano, comprimido con gzip)
docker compose exec -T postgres pg_dump -U evey --no-owner --no-privileges evey \
  | gzip > evey-data/postgres-import.sql.gz
docker compose down

# 2. sustituye el archivo compose por el de un solo contenedor, conservando
#    tus carpetas de medios, los ajustes del proxy inverso y las líneas de hardware.

# 3. primer arranque: crea el clúster, importa, migra y arranca el servidor
docker compose up -d && docker compose logs -f evey     # "evey: import done"

# 4. el índice de un Meilisearch externo no se traslada: reconstrúyelo
docker exec evey-server evey admin reindex-search

EVEY_DB_PASSWORD, MEILI_MASTER_KEY y los ajustes EVEY_DB_HOST / EVEY_MEILI_URL ya no hacen falta. Conserva ./postgres-data hasta haber comprobado el servidor. Un volcado dejado junto a un clúster que ya existe se señala y se ignora, nunca se mezcla. Si la importación falla, el clúster nuevo se descarta para que el siguiente arranque vuelva a intentarlo desde el volcado.

Equipos ARM

Las imágenes construidas a partir de una etiqueta de versión (0.1.0, incluidas las versiones previas) son multiarquitectura (linux/amd64 y linux/arm64): Docker elige la adecuada. Las etiquetas de rama son solo amd64: en un equipo ARM, fija una etiqueta de versión.

  • La transcodificación por hardware en ARM se limita a los chips Rockchip (de la clase RK3588, RK3576, RK3568) a través de RKMPP. Da acceso a /dev/mpp_service, /dev/dri y, si el kernel lo expone, /dev/rga; el servidor prueba y mide el codificador antes de usarlo. El proyecto todavía no ha validado RKMPP en hardware real. Una Raspberry Pi o un NAS ARM con chip Realtek no tiene ningún codificador por hardware que el servidor pueda usar: esos equipos dependen de la reproducción directa y de la transcodificación por software, dimensionadas con la misma calibración que cualquier otro equipo.
  • El mapeo de tonos HDR usa el mismo filtro SIMD tonemapx en ARM (NEON) que en x86-64 (AVX2).

Etiquetas y variantes de la imagen

La imagen es eveyproject/evey.

Etiqueta Publicada por Notas
X.Y.Z, X.Y, X, latest una etiqueta de versión vX.Y.Z latest es siempre la versión estable más reciente
una etiqueta de versión previa (con guion) una etiqueta de versión previa publica su propia etiqueta y sha-<commit>, nunca latest
un nombre de rama, sha-<commit> una compilación de rama solo la imagen por defecto, solo amd64 (normalmente)

Las etiquetas de versión y de versión previa existen en tres variantes (una compilación de rama publica solo la imagen por defecto): la variante por defecto incluye todos los entornos de ejecución de plugins (Python 3, Node.js, PHP, Ruby y Lua), -nodejs conserva Python y Node.js y -lean solo Python (por ejemplo latest-lean). Elige una variante más ligera solo si el tamaño de la imagen importa: el instalador rechaza un plugin cuyo lenguaje declarado falta en la imagen, con un mensaje que indica la imagen por defecto.

Las imágenes publicadas llevan los controladores de todas las generaciones Intel y AMD compatibles. Una imagen que construyas tú puede quedarse con una sola familia con docker build --build-arg GPU=intel-legacy . (Intel de Gen9 a Gen11), GPU=intel (Gen12 y posteriores), GPU=amd o GPU=none. NVIDIA no necesita variante: el NVIDIA Container Toolkit inyecta el controlador del equipo al ejecutar el contenedor.

El sandbox de plugins en un equipo poco habitual

La imagen contiene todo lo necesario para confinar los plugins, sin modo privilegiado. El modo de sandbox por defecto (auto) elige el mecanismo más fuerte que permite el equipo: Landlock en cualquier kernel moderno. Comprueba el modo activo en el Panel de seguridad de Administración → Plugins. Un equipo que muestra basic no puede aislar el acceso de los plugins a los archivos: Configurar el sandbox de plugins explica lo que eso significa y qué cambiar. Las capas en sí se describen en Sandbox de plugins y modelo de amenazas.