Copia de seguridad de Discourse desde la línea de comandos

:bookmark: This guide covers how to back up and restore your Discourse site using command line tools, specifically designed for self-hosted environments.

:person_raising_hand: Required user level: Administrator

:information_source: You can use the below placeholders to automatically fill out the command line prompts in this guide:

Backing up

To create a backup of your Discourse site, follow these steps:

  1. Enter the container:
./launcher enter app
  1. Run the backup:
discourse backup
exit

This will print out the final filename of your backup. Download the backup and container configuration (if needed) to your local machine:

scp =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/=FILENAME= .
scp =USER=@=HOST=:/var/discourse/containers/app.yml .

Restoring

To restore a Discourse backup, follow these steps:

  1. Install a Discourse site on the server you are restoring to.

If you’re testing this procedure multiple times, you can wipe the data on your test server.

Wipe Discourse data (optional)
./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/
mkdir -p /var/discourse/shared/standalone/backups/default/

  1. Upload the backup file:
scp =FILENAME= =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/
  1. Enter the container and start the restore:
./launcher enter app
discourse enable_restore
discourse restore =FILENAME=

If you happen to forget what the filename was, run the “discourse restore” command by itself to get a list of available backup files.

:information_source: For a two-container setup, use ./launcher enter web_only and replace standalone with web-only in the path to backups.

For additional information about restoring Discourse backups, see Restore a backup from the command line.

Last edited by @SaraDev 2024-08-23T20:50:17Z

Check documentPerform check on document:
40 Me gusta

¿dónde debo ejecutar este comando? ¿en la terminal de mi servidor en la nube o en mi máquina local?
aunque cualquiera de las dos me da un error de permiso denegado

En tu máquina local.

¿Estás usando una clave SSH para conectarte? El error está relacionado.

El comando debería ser entonces:

scp -i /path_to_your_key/your_key.pem root@147.43.15.199:/var/discourse/shared/standalone/backups/default/discourse-2024-12-25-033740-v20241211222608.tar.gz .

Tengo un escenario en el que quiero migrar la instalación de Discourse a un servidor completamente nuevo.
Mi plan era:

  1. crear una nueva instalación de Discourse en blanco
  2. hacer una copia de seguridad de Discourse antiguo, scp la copia de seguridad al nuevo servidor y restaurarla
  3. Copiar todo S3 (imágenes, etc.) al nuevo S3 en una cuenta diferente

El proceso de restauración va bien hasta que empieza a buscar S3 y luego falla por falta de acceso. Creo que está intentando acceder al mismo nombre de bucket S3 en el Discourse antiguo, pero ese no existe en el nuevo y no puedo crearlo.

¿Hay alguna solución recomendada?

Pensé que podría intentar cambiar el nombre del bucket S3 en el Discourse antiguo (antes de realizar la copia de seguridad) y luego, al restaurar, esperaría tener el nuevo bucket S3. Pero me temo lo que le pasará al Discourse antiguo si simplemente lo cambio a un bucket inexistente.

Hay una configuración oculta que descargará los archivos s3 y los incluirá en la copia de seguridad.

Necesitas configurar s3 en el archivo yml como en Configurar un proveedor de almacenamiento de objetos compatible con S3 para subidas

Luego, cuando restaures la copia de seguridad, enviará las subidas al nuevo bucket.

1 me gusta

¿Llegaste a resolver esto?

Necesitas configurar s3 en las variables de entorno como se describe en Configurar un proveedor de almacenamiento de objetos compatible con S3 para cargas

Esto es especialmente cierto si la configuración de s3 es diferente en el nuevo servidor. Poner los valores de s3 en la base de datos puede causar muchos problemas.

Pero hay un interruptor para el comando de restauración que hace que se detenga entre las distintas partes. Puede ayudar.

¿Puedo verificar que el archivo que terminas aquí es el mismo que obtienes al hacer una copia de seguridad desde el sitio web del foro?

Siempre reconstruyo desde la línea de comandos, pero primero hago una copia de seguridad usando el sitio web. ¡Esta vez olvidé hacer la copia de seguridad! Creo que usar la línea de comandos para ambas cosas podría ayudarme :slight_smile: ¡Deseadme suerte!

El script de copia de seguridad indicó:

¡Finalizado!
[ÉXITO]
Copia de seguridad realizada.
El archivo de salida se encuentra en: /var/www/discourse/public/backups/default/NOMBRE_ARCHIVO.tar.gz

Para empezar, intenté descargar eso, pero contenía la ruta incorrecta. Encontré el archivo en otro lugar y solo entonces noté que los comandos en este tema son correctos…

¡Hola! Solo quiero señalar que, para hacer una copia de seguridad sin subir archivos, usa el siguiente comando:

discourse backup --sql-only

1 me gusta

Buena observación: deberíamos añadir esto (y algunos otros detalles) al mensaje original.

2 Me gusta

¡Hola, @supermathie! Me alegra “verte”. No sé si te acuerdas de mí… Nos entrevistamos hace un tiempo.

Por cierto, sería genial que el parámetro --help funcionara después de ejecutar discourse backup. En su lugar, el respaldo termina llamándose “–helpXXX”. :lolsob:

¡Saludos!

Con la ayuda de cierta IA, aquí tienes una lista exhaustiva de subcomandos para el comando discourse.

La CLI de discourse (implementada mediante script/discourse usando la gema Thor) proporciona 13 subcomandos principales categorizados en Copias de seguridad y restauraciones, Gestión del sitio y modos, Utilidades de base de datos y Migración de datos (Importación/Exportación).


Referencia rápida de comandos

Categoría Subcomando Función principal
Copia de seguridad y restauración backup Genera un archivo de copia de seguridad completo o solo de la base de datos.
restore Restaura un archivo de copia de seguridad .tar.gz en la instancia.
enable_restore Otorga permiso para ejecutar comandos de restauración.
disable_restore Revoca el permiso para realizar restauraciones.
rollback Revierte el estado de la base de datos después de una restauración fallida.
Modos del sitio enable_readonly Activa el modo de solo lectura temporal en todo el sitio.
disable_readonly Desactiva el modo de solo lectura para restaurar las escrituras normales del sitio.
request_refresh Dispara una solicitud de actualización del navegador a todos los clientes conectados activos.
Operaciones de base de datos remap Realiza una búsqueda y reemplazo global de texto en las tablas de la base de datos.
Migración de datos export_category Exporta una sola categoría, sus temas y los usuarios asociados.
import_category Importa un archivo de categoría al foro actual.
export_topics Exporta temas específicos por ID y sus cuentas de autor/contestador.
import_topics Importa un archivo de temas al foro actual.

Documentación detallada de subcomandos

1. Comandos de copia de seguridad y restauración

discourse backup [FILENAME]

  • Descripción: Crea una copia de seguridad completa de la base de datos del foro y los activos.

  • Banderas:

  • --sql-only: (Booleano, Predeterminado: false) Volca solo la base de datos PostgreSQL, omitiendo los archivos cargados localmente.

  • --s3-uploads: (Booleano, Predeterminado: false) Fuerza la inclusión de activos almacenados en S3 en el archivo de copia de seguridad (se ignora cuando se establece --sql-only).

  • Ejemplo:

discourse backup
discourse backup --sql-only

discourse restore [FILENAME]

  • Descripción: Restaura una copia de seguridad del foro desde un archivo local .tar.gz ubicado en /var/www/discourse/public/backups/default.
  • Prerrequisito: Requiere ejecutar discourse enable_restore primero.
  • Ejemplo:
discourse restore discourse-2026-07-22-120000-v2026xxxx.tar.gz

discourse enable_restore y discourse disable_restore

  • Descripción: Alterna la bandera de la aplicación que permite o restringe las tareas de restauración basadas en consola/web.
  • Secuencia de uso:
discourse enable_restore
discourse restore <filename>
discourse disable_restore

discourse rollback

  • Descripción: Revuelve el esquema y el estado de la base de datos al punto anterior a una ejecución de restauración fallida.

2. Estado del sitio y controles de cliente

discourse enable_readonly y discourse disable_readonly

  • Descripción: Establece o borra la READONLY_MODE_KEY en Redis.
  • Detalles:
  • Congela las escrituras en la base de datos mientras mantiene el sitio legible para los usuarios.
  • Usa un bucle de tiempo de vida (TTL) corto que se actualiza mientras está activo, evitando que el sitio permanezca bloqueado permanentemente si una sesión de terminal falla.

discourse request_refresh

  • Descripción: Envía un mensaje del sistema a través de MessageBus instruyendo a todas las sesiones web en línea para que recarguen la página web. Útil después de implementar actualizaciones de activos o cambios globales de tema.

3. Remapeo de base de datos

discourse remap [OPTIONS] FROM TO

  • Descripción: Realiza una búsqueda y reemplazo directo de cadenas en las columnas de texto de la base de datos. Crucial al actualizar nombres de dominio, rutas de CDN o prefijos de carga de imágenes.

  • Banderas:

  • --global: (Booleano) Escanea y remapea en todas las tablas en lugar de solo en las tablas de contenido estándar.

  • --regex: (Booleano) Evalúa el parámetro FROM como una expresión regular en lugar de una cadena literal.

  • Ejemplo:

discourse remap "old-domain.com" "new-domain.com"
discourse remap --global "/uploads/default/" "/cdn-uploads/"

4. Importación y exportación selectiva de datos

discourse export_category [CATEGORY_ID]

  • Descripción: Serializa una sola categoría, incluyendo todos los temas anidados, publicaciones y perfiles de usuarios participantes, en un archivo de archivo JSON.

discourse import_category [FILE_PATH]

  • Descripción: Lee un archivo creado por export_category y fusiona los datos de la categoría en la instancia de destino.

discourse export_topics [TOPIC_IDS...]

  • Descripción: Toma uno o más IDs de temas separados por espacios y exporta los temas, publicaciones y cuentas de usuarios relevantes.
  • Ejemplo:
discourse export_topics 102 105 210

discourse import_topics [FILE_PATH]

  • Descripción: Importa un archivo JSON creado por export_topics en la instancia de Discourse de destino.
1 me gusta