Actualiza n8n en Google Cloud de forma segura y sin downtime. Esta guía paso a paso te muestra cómo mantener flujos activos, proteger datos con Docker y evitar errores críticos durante el proceso. ¡Optimiza tu automatización hoy mismo!
Nivel técnico requerido
Este tutorial asume conocimientos básicos de Linux (comandos como sudo
, chown
) y experiencia inicial con Docker. Si manejas terminal y contenedores a nivel principiante-intermedio, podrás seguir los pasos sin dificultad.
Ingresar a nuestra Virtual Machine
Primero, vamos a abrir desde nuestra instancia de virtual machine (VM) el intérprete de comandos SSH para conectarnos a la instalación de Linux creada.

Se abrirá un popup el cual debemos autorizar para conectarnos a nuestra instancia.
Opcional: «SSH» es la opción por defecto. Pero, si prefieres una opción más parecida a Linux desde Windows:
- Te conviene abrir Git Bash o WSL (Windows Subsystem for Linux).
- PuTTY es perfectamente válido y funcional.
- CMD no sirve para comandos Linux como
usermod
,chmod
, etc.
Usa el mismo comando SSH que usarías en Linux:
ssh -i ruta-a-tu-llave user@IP-de-la-vm
Algunos interpretes son más visuales y llenarás un formulario en vez de escribir los comandos.
Instalación inicial y separación de datos
1. Dar permisos de Super User
Primero tenemos que dar acceso a nuestro usuario a la carpeta de Docker para realizar los cambios y/o ejecutar los comandos necesarios.
sudo usermod -aG docker nombre_usuario
Lo que significa:
sud
o → super user do: te permite ejecutar comandos con privilegios de administrador/root.- usermod → sirve para modificar cuentas de usuario en sistemas Linux. Se usa para cambiar grupos, nombre, contraseña, shell predeterminada, etc.
-a
→ append: agrega al usuario a uno o más grupos sin quitarlo de los grupos a los que ya pertenece.-G
→ groups: especifica a qué grupo(s) se debe agregar el usuario.
🔒 Esto es importante porque si usaras solo
-G
sin-a
, el usuario perdería su pertenencia a otros grupos, lo que podría romper permisos o accesos previos.
2. Verificar los datos con el user node
Una vez ya hemos dado permiso de «Super User» a nuestro Usuario podremos lanzar los siguientes comandos.
En teoría: abriremos un «terminal» dentro de Docker, que a su vez está dentro de de nuestra instancia de VM (virtual machine). Sin los permisos previos no podríamos acceder ni ejecutar comandos en Docker.
docker exec -it --user node n8n sh
Este comando abre una terminal dentro del contenedor Docker llamado n8n
, usando el usuario node
.
docker exec
: ejecuta un comando dentro de un contenedor que ya está corriendo.-it
:-i
= interactivo → mantiene la sesión abierta,-t
= terminal → te da acceso como si estuvieras en una consola real.
--user node
: indica que quieres ingresar como el usuarionode
, no como root.n8n
: es el nombre del contenedor al que quieres entrar.sh
: abre el shell de comandos (como un mini-terminal Linux) dentro del contenedor.
Una vez digitado los comandos el terminal se verá algo así:

Nótese que el nombre de usuario ya no está, si no, se ve un signo de dólar y el cursor. Eso indica que estás dentro del contenedor, y no en tu VM de Google Cloud directamente.
Una vez dentro de nuestro contenedor de Docker podemos revisar el contenido de este directorio.
ls -la /home/node/.n8n
Explicación:
ls
: lista archivos (comodir
en Windows).-l
: muestra detalles (permisos, dueño, tamaño, fecha…).-a
: incluye archivos ocultos (los que comienzan con punto.
)./home/node/.n8n
: es la ruta donde n8n guarda todo (datos, configuraciones, historiales, etc.).
Esto lista el contenido de la carpeta donde n8n guarda todos sus datos internos:

Para lo cual cada fila llena los valores de esta manera:
- Permisos
- Cantidad de Enlaces (contenido)
- Dueño
- Grupo
- Tamaño
- Fecha/Hora
- Nombre del archivo o carpeta
Y para salir de la terminal dentro de Docker a la terminal de nuestra VM digitaremos el siguiente comando:
exit
Ese comando nos saca del contenedor y volvimos a tu consola principal, por eso volviste a ver el nombre de usuario (Como en la imagen).
🔒 Importante: No solo hemos verificado que podemos acceder al directorio de Docker y ejecutar sentencias. Si no también, comprobamos que todo el contenido y los permisos de la carpeta de datos de n8n se ven bien y están listos para respaldarse o migrarse.
3. Traer la última versión de n8n
Ok mira, ya tenemos los permisos listos para la cuenta, así que, antes de actualizar, descargaremos la nueva imagen de n8n con docker pull
. Esto porque reduce el tiempo de inactividad y no introduce riesgos adicionales.
- Cero impacto: Descarga en caché sin afectar tu contenedor activo.
- Menos downtime: La imagen se baja en segundo plano mientras n8n sigue operando.
- Chequeo anticipado: Verifica errores (etiquetas/red) antes de detener el servicio.
- Flexibilidad: Actualiza cuando quieras, sin depender de conexión externa.
Cambiaremos «nueva_versión» por la versión que queremos actualizar. O escribiremos «latest», que trae la ultima versión:
docker pull docker.n8n.io/n8nio/n8n:nueva_versión
Descargas capas nuevas → sin afectar producción.

4. Parar el contenedor de n8n
Ahora necesitamos detener el contenedor activo (docker stop
). Por qué conviene detenerlo antes de actualizar:
- Coherencia de datos: Evita que flujos activos se corten y dañen tu base SQLite.
- Bloqueo de accesos: Impide logins o webhooks nuevos durante la actualización.
- Backups seguros: Permite copiar volúmenes con datos 100% consistentes (sin cambios en curso).
- Conflictos evitados: Previene choques si la nueva versión migra la base al iniciar.
- Limpieza de recursos: Libera RAM/CPU y elimina procesos residuales al reiniciar.
- Dowtime mínimo: Solo segundos de inactividad (gracias al
pull
previo). - Impacto reducido: Ejecútalo en horarios de bajo tráfico (ej: madrugada).
Con el siguiente comando pararemos nuestro contenedor n8n:
docker stop n8n
Duración típica: < 2 s.
En respuesta sólo pensará y entregará el nombre del contenedor.
¿Qué NO hace «docker stop»? 🚫
Este comando solo pausa el servicio sin eliminar nada crítico. Así mantienes tu entorno seguro y recuperable:
- No borra contenedores
El contenedor sigue existiendo en estadoExited
(visible con:docker ps -a
). - No elimina imágenes
La imagen base permanece intacta para rollbacks rápidos si falla la nueva versión. - No toca volúmenes
Tus workflows quedan 100% protegidos y accesibles.
5. Obtener el ID del contenedor
Con el siguiente comando obtendremos la lista completa de contenedores, con su ID, imagen, estado y puertos, para que puedas identificar, debuggear o limpiar instancias como la de n8n de forma segura.
docker ps -a
Explicación:
- ps “Process Status” → lista contenedores gestionados por Docker.
- -a (–all) Muestra todos los contenedores: Running, Exited, Created, etc. Sin -a, solo verías los que están en ejecución.
Lo que nos muestra:

En contexto:
- CONTAINER ID Hash corto (12 chars) que identifica de forma única al contenedor.
- IMAGE Imagen/versión con la que se creó.
- COMMAND Proceso principal que corre dentro del contenedor.
- CREATED Cuándo se levantó.
- STATUS Estado actual: Up 3 hours, Exited (0) 2 hours ago, etc.
- PORTS Puertos publicados (0.0.0.0:5678->5678/tcp).
- NAMES Nombre amigable (ej. n8n).
Nosotros vamos a guardar lo que necesitamos de esta respuesta:

6. Hacer el backup de los datos
Una vez tengamos el CONTAINER ID de nuestro contenedor podremos realizar el backup de este mismo.
Para esto usaremos el comando cp o «copy«
docker cp <CONTAINER_ID>:/home/node/.n8n ./n8n_backup
- docker cp Ordena al Docker que copie archivos entre el host y un contenedor (en cualquier dirección).
- ID o nombre del contenedor. Puedes pegar los 3–4 primeros caracteres si son únicos; ej. 372e9b031910 o n8n.
- /home/node/.n8n Carpeta de datos dentro del contenedor (workflows, credenciales, logs).
- ./n8n_backup Destino en tu host: una carpeta en el directorio actual.
- Si NO existe, Docker la crea y mete dentro una subcarpeta llamada .n8n.
- Si existe, copia allí directamente (puedes quedar con n8n_backup/.n8n/…).
La respuesta de este comando no es visible para lo que tendremos que realizar el siguiente código para ver si realmente hicimos nuestro backup.
ls -la ./n8n_backup
La respuesta será la misma lista que en pasos anteriores donde verificamos los datos con user node:

Con esto tienes una copia íntegra de la información crítica de n8n. Si algo falla en la actualización, basta borrar el volumen dañado, crear uno nuevo y restaurar este backup para volver a la normalidad.
🔒 Esto es importante porque si usaras solo
-G
sin-a
, el usuario perdería su pertenencia a otros grupos, lo que podría romper permisos o accesos previos.
7. Crear nuevo volumen
Ok, ahora vamos a ejecutar este comando para preparar el almacenamiento de la nueva versión:
docker volume create nombre_volumen
Crea un «disco virtual» (volumen) dentro de Docker llamado n8n_data
, para lo cual solo nos responderá con el nombre creado.
Nombraremos este nuevo volumen con el nombre que nosotros querramos: en el ejemplo es «nombre_volumen»
📌 Nota: Este volumen es independiente de la imagen y otros contenedores.
8. Copiar el Backup al Volumen creado
Ahora vamos a copiar la información de nuestro backup hacia el nuevo volumen creado:
docker run --rm \
-v n8n_data:/data \
-v $(pwd)/n8n_backup:/backup \
busybox sh -c "cp -r /backup/* /data/"
Explicación:
docker run
→ lanza un contenedor temporal.--rm
→ se borra solo al terminar (no deja residuos).-v n8n_data:/data
→ monta el volumen vacíon8n_data
en/data
.-v $(pwd)/n8n_backup:/backup
→ monta tu carpeta de respaldo en/backup
.busybox
→ imagen mini de Linux, perfecta para tareas simples.sh -c "cp -r /backup/* /data/"
→ copia todo lo del backup al volumen.
La respuesta a este comando será una salto de línea, para lo cual lo haremos visible mediante el siguiente código:
docker volume inspect n8n_data
Esto muestra detalles técnicos del volumen n8n_data
para asegurarte de que existe y está montado correctamente.

⭐ Resultado: el volumen
n8n_data
ya contiene tu base de datos y archivos; está listo para que el nuevo contenedor de n8n arranque con la información intacta.
9. Ajustar permisos del volumen
¿Por qué es necesario? Al copiar datos con Busybox (como root), los archivos quedan con dueño root
. Pero n8n corre como usuario node
(UID 1000). Si no corriges esto:

Dentro del contenedor, comprueba el UID real con:
id -u
Beneficios:
- 🛡️ Evita errores: n8n puede leer/escribir sin bloqueos.
- 🔒 Mayor seguridad: Solo el usuario node accede a los datos.
- ⚙️ Compatibilidad: Asegura que el contenedor tenga control total.
sudo chown -R 1000:1000 /var/lib/docker/volumes/n8n_data/_data
sudo chmod -R 700 /var/lib/docker/volumes/n8n_data/_data
Los dos comandos corrigen posibles error y acceso seguro:
chown -R 1000:1000 …
→ cambia dueño y grupo anode
.chmod -R 700 …
→ da acceso completo solo al dueño (mayor seguridad).
Al ejecutar estos comandos solo saltaremos una línea sin más, pero los permisos ya estarán disponibles.
10. Eliminar contenedor anterior
Para este paso tenemos que tener ya la copia dentro de nuestro volumen y que coincidan con el usuario del que hemos hecho la copia, desde aquí ya no habrá marcha atrás.
docker rm n8n
Qué hace: borra el contenedor llamado n8n
que ya está detenido.
Qué NO hace:
- No toca las imágenes (las versiones descargadas siguen allí).
- No borra tu volumen
n8n_data
ni el backup; los datos permanecen intactos.
11. Reiniciar el contenedor con nueva versión
Ahora levantaremos el n8n nuevo, apuntándolo al volumen con nuestros datos y configurando que arranque solo.
docker run -d --restart unless-stopped \
--name n8n \
-p 5678:5678 \
-e N8N_HOST="app.r3crea.com" \
-e WEBHOOK_TUNNEL_URL="https://app.r3crea.com/" \
-e WEBHOOK_URL="https://app.r3crea.com/" \
-v n8n_data:/home/node/.n8n \
n8nio/n8n:version_pulled
Explicación:
-d
: modo background--restart unless-stopped
: reinicia si se cae, excepto si lo detienes tú.-p 5678:5678
: expone el puerto 5678 (de n8n).-e
: define variables de entorno como la URL (Aquí señalaremos el URL que hemos asignado para este servicio).-v
: monta el volumenn8n_data
en la ruta donde n8n guarda su info.- Último argumento: imagen de n8n, cambiar «versión_pulled» <– por la ultima versión traída desde el 3er paso: Ejm: «n8nio/n8n:1.97.1».
Con este Docker run
lanzamos la última versión de n8n en segundo plano, ligada al volumen n8n_data
, publicada en el puerto 5678 y configurada para reiniciarse sola si la VM se cae.
Advertencia crítica de seguridad ⚠️
Nunca expongas directamente el puerto 5678 de n8n a Internet sin un proxy HTTPS (como Nginx o Caddy). Esta práctica es un vector común de ataques: hackers pueden interceptar datos sensibles, ejecutar flujos no autorizados o comprometer tu instancia. Por lo que está tiene que tener su protocolo https sí o sí.
Una vez ejecutado este último comando, deberemos esperar unos minutos para que los cambios se vean reflejados. Y veremos que nuestro n8n estará actualizado a la versión elegida.
Actualizaciones futuras
Aquí no haces backup porque ya lo hiciste antes y todo está en el volumen.
1. Traer nueva versión
docker pull docker.n8n.io/n8nio/n8n:1.97.1
Descarga la imagen que quieras usar (en este caso, una versión: 1.97.1).
2. Detener contenedor
docker stop n8n
Detiene el contenedor actual.
3. Eliminar contenedor
docker rm n8n
Detiene el contenedor actual.
4. Reiniciar con nueva versión
docker run -d --restart unless-stopped \
--name n8n \
-p 5678:5678 \
-e N8N_HOST="n8n.tudominio.com" \
-e WEBHOOK_TUNNEL_URL="https://n8n.tudominio.com/" \
-e WEBHOOK_URL="https://n8n.tudominio.com/" \
-v n8n_data:/home/node/.n8n \
n8nio/n8n:1.97.1
Vuelve a lanzar n8n con la nueva imagen, montando los datos existentes.
Conclusiones
Después de varios intentos hemos logrado actualizar n8n dentro de google cloud. Ahora no vamos a perder más datos al actualizar nuestro software.
En resumen:
- Solo haces el backup + volumen la primera vez.
- Luego puedes cambiar de versión con
pull
,stop
,rm
yrun
. - Toda la información queda guardada en el volumen
n8n_data
.
Sígueme para mas consejos.
Descargar Recursos
Puedes obtener los recursos haciendo clic en el siguiente botón: