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 sudochown) 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.

Instancia de VM dentro de Google Cloud

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:

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.

Lo que significa:

  • sudo → 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.
  • -aappend: agrega al usuario a uno o más grupos sin quitarlo de los grupos a los que ya pertenece.
  • -Ggroups: 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.

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 usuario node, 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í:

Entramos a la terminal dentro de Docker con el usuario node.

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.

Explicación:

  • ls: lista archivos (como dir 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:

Podemos ver todos los metadatos que nos brinda el directorio /home/node/.n8n.

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:

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:

Descargas capas nuevas → sin afectar producción.

Hemos descargado la ultima versión sin afectar la versión activa.

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:

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 estado Exited (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.

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:

Como podemos observar, lo que buscamos es el CONTAINER ID.

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:

Sólo tenemos activo, creado, existente un solo contenedor.

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 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.

La respuesta será la misma lista que en pasos anteriores donde verificamos los datos con user node:

El dato importante aquí es el tamaño del archivo .sqlite, tiene que coincidir con el del contendor oficial.

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:

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:

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ío n8n_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:

Esto muestra detalles técnicos del volumen n8n_data para asegurarte de que existe y está montado correctamente.

Ya tenemos los datos copiados

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:

Debemos cambiar los permisos para realizar los cambios necesarios en el nuevo volumen.

Dentro del contenedor, comprueba el UID real con:

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.

Los dos comandos corrigen posibles error y acceso seguro:

  1. chown -R 1000:1000 … → cambia dueño y grupo a node.
  2. 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.

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.

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 volumen n8n_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

Descarga la imagen que quieras usar (en este caso, una versión: 1.97.1).

2. Detener contenedor

Detiene el contenedor actual.

3. Eliminar contenedor

Detiene el contenedor actual.

4. Reiniciar con nueva versión

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 y run.
  • 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: