Contenedores y NAS
Copiar la carpeta de un contenedor con la base de datos en marcha no restaura. La receta Contenedores descubre los proyectos de Docker del servidor, hace el volcado de cada base de datos dentro del contenedor y lleva también el compose, la configuración y los volúmenes.
Índice
Qué se guarda
Por cada proyecto de Docker Compose (o contenedor suelto) elegido en el plan, la copia lleva:
- Los archivos del compose y los
.envde la carpeta del proyecto, con el mismo nombre; - La configuración de cada contenedor, tal como Docker la describe (puertos, variables, montajes, red), que permite recrear un contenedor suelto;
- La imagen exacta, por el digest, para restaurar la misma versión y no la
latestdel día; - El volcado de cada base de datos, generado dentro del contenedor de la base por una receta fija del agente: PostgreSQL y derivados (PostGIS, pgvector, TimescaleDB, el Postgres de Immich), MySQL y MariaDB, MongoDB y Redis;
- Los volúmenes y las carpetas montadas de los servicios, como archivos (se puede desactivar por proyecto);
- Un manifiesto del proyecto: servicios, imágenes, montajes y el resultado de cada volcado.
La carpeta de datos de la base que ya tiene volcado queda fuera por defecto: el volcado basta para restaurar, y la carpeta copiada con la base en marcha no es fiable. Quien quiera las dos marca llevar también la carpeta de datos de la base en el plan.
En el panel, el detalle de cada copia muestra, por proyecto, los volcados hechos (motor, tamaño, si salió bien o no), cuántos archivos de configuración se llevaron y el proyecto elegido que no se encontró en el servidor.
Cómo activarla
La receta pide el agente Arkame 0.6.0 o más nuevo. Él mismo le dice al panel que sabe hacerlo; con un agente más antiguo, la receta aparece en el plan con el aviso de la versión que falta.
En un servidor Linux común, el comando de instalación en Docker del panel no cambia: ya monta el disco del servidor en /host (-v /:/host), y por ahí el agente alcanza el socket de Docker del servidor. En un NAS, elige en el panel NAS o sistema de apps: el comando pasa a guardar la configuración en el disco de datos (ver Instalar en un NAS, abajo). El agente instalado directo en el sistema (nativo) también sirve.
En el plan, en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores. El panel muestra lo que el agente encontró en el servidor: los proyectos, los servicios de cada uno, los montajes y las bases que tendrán volcado automático. Elige todos los proyectos (los que aparezcan después entran solos) o marca los que quieras, y quita los servicios que no interesan.
El plan puede ser solo de contenedores, sin carpetas, o tener carpetas de más. El volcado de las bases en contenedor es automático con la receta, también con el agente en Docker; solo los comandos antes y después del plan no se ejecutan en Docker.
La lista se actualiza sola: el agente envía lo que encontró al iniciar y cuando algo cambia en el servidor.
Instalar en un NAS
En TrueNAS SCALE, Unraid y ZimaOS el sistema se reemplaza en las actualizaciones o se ejecuta desde la memoria, y solo el disco de datos sobrevive. Por eso, en un NAS, el agente guarda la clave del bucket, la identidad del servidor y el estado en una carpeta del disco de datos, que aquí llamamos PASTA, y la carpeta de trabajo de los volcados queda dentro de ella, en PASTA/conteineres, sin llenar el disco de arranque.
En el panel, en Servidores → Nuevo servidor, elige Docker, luego NAS o sistema de apps, y la plataforma: el panel sugiere la carpeta y arma el comando. Este es el formato, con PASTA en lugar de la carpeta y un código de ejemplo:
sudo docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v PASTA:/etc/arkame \ -e ARKAME_STATE_DIR=/hostPASTA/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ sudo docker stop -t 150 arkame-agent >/dev/null 2>&1; \ sudo docker rm arkame-agent >/dev/null 2>&1; \ sudo docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v PASTA:/etc/arkame \ -e ARKAME_STATE_DIR=/hostPASTA/estado \ ghcr.io/arkame-app/arkame-agent:latest; \}Copia el comando del panel, que ya trae tu código de instalación (válido por 24 horas). Tiene dos partes: la primera pide la clave de acceso y la clave secreta del bucket, las prueba en el bucket y espera la aprobación; solo si termina bien la segunda pone en marcha el agente.
El contenedor creado desde la terminal no aparece en la lista de Apps de TrueNAS ni en Apps de Unraid, y sigue en marcha: se reinicia con Docker, también después de reiniciar el NAS.
Al elegir las carpetas del plan, deja PASTA fuera: guarda la clave del bucket.
Lo verificado: Docker y Compose en Linux y CasaOS, de punta a punta; ZimaOS, por el sistema de archivos oficial de la versión 1.8.0. TrueNAS, Unraid, Synology y QNAP están en validación: las rutas y los pasos de abajo vienen de la documentación oficial o de foros.
Docker y Compose en Linux
Comprobado. Es el caso de referencia: proyectos de docker compose con la carpeta del proyecto en el propio servidor, y contenedores sueltos creados con docker run.
El agente busca el socket en /var/run/docker.sock y /run/docker.sock (o en DOCKER_HOST, si lo hay).
- Antes: Docker instalado en el servidor (el panel muestra el comando del script oficial de Docker, si falta).
- Abre la terminal del servidor (o SSH) con un usuario que use
sudo. En el panel, elige Servidor Linux: la configuración queda en/etc/arkame. - Pega el comando. El de aquí es un ejemplo con la carpeta
/etc/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.sudo docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /etc/arkame:/etc/arkame \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ sudo docker stop -t 150 arkame-agent >/dev/null 2>&1; \ sudo docker rm arkame-agent >/dev/null 2>&1; \ sudo docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /etc/arkame:/etc/arkame \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/etc/arkamefuera: guarda la clave del bucket. - Revisa:
sudo docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor.
CasaOS y ZimaOS
Comprobado. En un CasaOS real, sobre Debian 12, con la aplicación instalada desde su tienda (la API del propio CasaOS): las aplicaciones son proyectos compose en /var/lib/casaos/apps/nombre-de-la-app, con las etiquetas del compose que lee el agente, y los datos quedan en /DATA/AppData.
ZimaOS: comprobado con el sistema de archivos oficial de la versión 1.8.0 (rutas y etiquetas), pero el agente todavía no se ejecutó en un ZimaOS. En ZimaOS el agente corre en contenedor (recomendado): el sistema es de solo lectura y las actualizaciones reemplazan todo fuera de /DATA; la instalación persistente del programa nativo aún está en estudio.
- Antes: CasaOS instalado (Debian o Ubuntu) o ZimaOS. En el panel, elige la plataforma CasaOS o ZimaOS: la carpeta sugerida es
/DATA/AppData/arkame, donde quedan los datos de las apps y, en ZimaOS, la única parte que las actualizaciones no reemplazan. - Abre una terminal por SSH con tu usuario. El comando va con
sudo. - Pega el comando. El de aquí es un ejemplo con la carpeta
/DATA/AppData/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.sudo docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /DATA/AppData/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/DATA/AppData/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ sudo docker stop -t 150 arkame-agent >/dev/null 2>&1; \ sudo docker rm arkame-agent >/dev/null 2>&1; \ sudo docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /DATA/AppData/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/DATA/AppData/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/DATA/AppData/arkamefuera: guarda la clave del bucket. - Revisa:
sudo docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor.
TrueNAS
En validación. En TrueNAS SCALE 24.10 o más nuevo, cada aplicación es un proyecto compose llamado ix- seguido del nombre de la aplicación, con el compose generado en /mnt/.ix-apps/app_configs y los datos en /mnt/.ix-apps/app_mounts o en los datasets que elegiste.
El agente se ejecuta en un contenedor creado desde la terminal, con la configuración en un dataset del pool: las actualizaciones de TrueNAS reemplazan la raíz del sistema.
La receta Contenedores exige 24.10 o más nuevo, cuando las apps pasaron a ejecutarse en Docker. En 24.04 (Dragonfish) y anteriores las apps se ejecutan en Kubernetes (k3s) y no hay Docker en el sistema: el agente no ve las apps. En esos, actualiza a 24.10 o 25.04, que migran las apps solas; antes, haz una copia de la configuración (System → General → Manage Configuration → Download File) y un snapshot de los datasets. La copia solo de los archivos de los datasets en 24.04, con el agente sin la receta, todavía está en validación: el instalador de Linux no sirve allí, porque apt viene desactivado y el sistema se reemplaza en las actualizaciones.
- Antes: TrueNAS SCALE 24.10 (Electric Eel) o más nuevo, con Apps configurado en un pool (Apps → Configuration → Choose Pool). Crea el dataset
arkameen ese pool (Datasets → Add Dataset): con el pooltank, la carpeta es/mnt/tank/arkame. En el panel, cambiatankpor el nombre de tu pool. - Abre la terminal en System → Shell, o por SSH con el usuario administrador. El comando va con
sudo. - Pega el comando. El de aquí es un ejemplo con la carpeta
/mnt/tank/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.sudo docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /mnt/tank/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/mnt/tank/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ sudo docker stop -t 150 arkame-agent >/dev/null 2>&1; \ sudo docker rm arkame-agent >/dev/null 2>&1; \ sudo docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /mnt/tank/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/mnt/tank/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/mnt/tank/arkamefuera: guarda la clave del bucket. - Revisa:
sudo docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor. En TrueNAS, cada app aparece en el plan como un proyecto de nombreix-seguido del nombre de la app.
Unraid
En validación. Unraid no usa compose: cada contenedor nace de una plantilla XML en /boot/config/plugins/dockerMan/templates-user, que el agente lleva junto con la configuración del contenedor. Los datos suelen estar en /mnt/user/appdata.
El sistema se ejecuta desde la memoria, así que el agente va en contenedor, con la configuración en /mnt/user/appdata, en el array. La ruta del socket aún se verificará en el equipo.
- Antes: el array iniciado y Docker activado (Settings → Docker). En Unraid, Docker solo arranca con el array iniciado: con el array detenido, el agente también se detiene.
- Abre la terminal con el ícono de terminal arriba en la interfaz. Ya es root: el comando va sin
sudo. Usa el comando de una línea: Unraid no traedocker compose. - Pega el comando. El de aquí es un ejemplo con la carpeta
/mnt/user/appdata/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /mnt/user/appdata/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/mnt/user/appdata/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ docker stop -t 150 arkame-agent >/dev/null 2>&1; \ docker rm arkame-agent >/dev/null 2>&1; \ docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /mnt/user/appdata/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/mnt/user/appdata/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/mnt/user/appdata/arkamefuera: guarda la clave del bucket. - Revisa:
docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor.
Synology
En validación. En DSM 7.2, Container Manager guarda los proyectos en carpetas como /volume1/docker/nombre-del-proyecto, y Docker en /volume1/@docker. Las dos rutas todavía dependen de comprobarse en un equipo real, porque no hay máquina virtual oficial de DSM.
El agente se ejecuta en contenedor, creado desde la terminal, con el Container Manager instalado.
- Antes: DSM 7.2 con el Container Manager instalado, que crea la carpeta compartida
docker. Crea en ella la carpetaarkame(File Station) y activa el SSH en Panel de control → Terminal y SNMP. Si tu volumen no esvolume1, cámbialo en el panel. - Abre una terminal por SSH con el usuario administrador. El comando va con
sudo. - Pega el comando. El de aquí es un ejemplo con la carpeta
/volume1/docker/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.sudo docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /volume1/docker/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/volume1/docker/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ sudo docker stop -t 150 arkame-agent >/dev/null 2>&1; \ sudo docker rm arkame-agent >/dev/null 2>&1; \ sudo docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /volume1/docker/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/volume1/docker/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/volume1/docker/arkamefuera: guarda la clave del bucket. - Revisa:
sudo docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor.
QNAP
En validación. En Container Station, las aplicaciones quedan en /share/nombre-del-volumen/Container/container-station-data/application, ruta que aún vamos a confirmar en un equipo.
El agente nunca usa system-docker.sock: es del propio sistema de QNAP, no de tus contenedores.
- Antes: el Container Station instalado, que crea la carpeta compartida
Container. Crea en ella la carpetaarkame(File Station) y activa el SSH en Panel de control → Telnet/SSH. - Abre una terminal por SSH con el usuario
admin, que ya es root: el comando va sinsudo. - Pega el comando. El de aquí es un ejemplo con la carpeta
/share/Container/arkamey el códigoatk_...: copia el del panel, que ya trae tu código.docker run \ --pull always \ --rm \ -it \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /share/Container/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/share/Container/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest install \ --token=atk_... \ --panel-url=https://save.arkame.app \ --install-service=false &&{ docker stop -t 150 arkame-agent >/dev/null 2>&1; \ docker rm arkame-agent >/dev/null 2>&1; \ docker run \ -d \ --name arkame-agent \ --restart always \ --stop-timeout 150 \ --user 0 \ --security-opt label=disable \ --hostname "$(hostname)" \ -v /:/host \ -v /share/Container/arkame:/etc/arkame \ -e ARKAME_STATE_DIR=/host/share/Container/arkame/estado \ ghcr.io/arkame-app/arkame-agent:latest; \} - En el panel, revisa la máquina y la huella de la clave y aprueba el servidor. El agente pasa a ejecutarse en segundo plano.
- Crea el plan: en la etapa Qué copiar, pestaña Aplicaciones y comandos, elige Contenedores y marca los proyectos (o todos).
- Si el plan también tiene carpetas, deja
/share/Container/arkamefuera: guarda la clave del bucket. - Revisa:
docker logs --tail 50 arkame-agentmuestra el agente en marcha, y en el plan el árbol de la receta muestra los proyectos del servidor.
Portainer
En validación. Las stacks creadas por Portainer guardan el compose dentro de su contenedor, en /data/compose/número. El agente reconoce ese caso y encuentra el archivo por el montaje de /data de Portainer, en general el volumen portainer_data. Cuando no puede, el detalle de la copia dice qué archivo no se encontró; el resto del proyecto va normalmente.
Podman
En validación. El soporte existe, pero todavía no se comprobó en un Podman real. El agente habla con el socket de Podman: /run/podman/podman.sock como root, que viene apagado por defecto (actívalo con systemctl enable --now podman.socket); el agente nativo sin root busca $XDG_RUNTIME_DIR/podman/podman.sock. Los quadlets quedan para una próxima versión.
NAS sin Docker
Los equipos sin Docker, como los Iomega antiguos, no ejecutan el agente. El camino es instalar el agente en una computadora o servidor de la red y copiar el recurso compartido montado en él. Que el propio agente monte el recurso compartido está en los planes.
Seguridad
- El panel nunca envía un comando para ejecutar en un contenedor. Envía solo la elección: qué proyectos, qué servicios, copiar o no los volúmenes. El comando de cada volcado es fijo en el agente, elegido por la imagen de la base.
- El agente solo hace, en la API de Docker, las llamadas de una lista cerrada: listar, leer la configuración y ejecutar el volcado dentro del contenedor de la base. Crear, borrar, detener o descargar imágenes se rechaza antes de salir del agente.
- El panel nunca recibe las variables de entorno ni las contraseñas: solo nombres y rutas. El
.envy la configuración de los contenedores (el inspect, que trae las variables) van a tu bucket tal como están en el servidor, como cualquier archivo de la copia: el agente no cifra los archivos. Mantén el bucket privado y activa el cifrado del proveedor. El volcado se hace con la contraseña que el contenedor de la base ya tiene, sin pasar por el panel. - Tener acceso al socket de Docker equivale a ser administrador (root) del servidor. Es el mismo acceso que el agente ya tiene para leer los archivos, y por eso las llamadas se limitan en el propio agente.
Límites de esta versión
- Sin pausa ni detención del contenedor. El volcado es consistente; los volúmenes se copian con la aplicación en marcha, y un archivo escrito en medio de la copia puede quedar a medias.
- La restauración del proyecto completo aún no existe. Desde el panel restauras los archivos (compose, .env, volúmenes) y el volcado; cargar el volcado en la base y levantar el proyecto con
docker compose upqueda en tus manos. - Un volcado que falla deja la copia parcial, con el motivo en el detalle y en el aviso por correo: imagen sin el cliente de la base o sin
sh, contraseña incorrecta. Una base detenida no tiene volcado: con copiar los volúmenes activado, su carpeta de datos va entera, porque detenida es consistente; sin esa opción, la base detenida queda sin copia. Lo que se subió sigue siendo restaurable. Docker no disponible en un plan solo de contenedores hace fallar la copia con el motivo.
Crear un plan de contenedores
Instala o actualiza el agente a la versión 0.6.0 en el servidor con Docker y crea un plan con la receta Contenedores.
Abrir el panel →