Error al ejecutar el comando "./launcher rebuild app"

Hola.
El comando “./launcher rebuild app” no funciona para mí.
Discourse instalado en Digital Ocean
Ubuntu 20.04.2
Después de conectarme por SSH a mi servidor, descubrí que necesitaba una actualización, así que ejecuté “apt-get update” y “apt-get upgrade”.
Luego intenté instalar el plugin “Discourse Solved”, ejecuté “./launcher rebuild app” y me mostró lo siguiente:

./launcher rebuild app
Asegurando que el launcher esté actualizado
Obteniendo origen
El launcher está actualizado
Deteniendo el contenedor antiguo
+ /usr/bin/docker stop -t 60 app
app
./launcher: línea 289: advertencia: sustitución de comando: se ignoró un byte nulo en la entrada
cd /pups && git pull && git checkout v1.0.3 && /pups/bin/pups --stdin
De https://github.com/discourse/pups
   17f04ec..e0ff889  master     -> origin/master
 * [nueva etiqueta]         v1.1.1     -> v1.1.1
 * [nueva etiqueta]         v1.1.0     -> v1.1.0
Actualizando 17f04ec..e0ff889
Avance rápido
 .github/workflows/ci.yml     |  29 ++++++
 .github/workflows/lint.yml   |  27 +++++
 .rubocop.yml                 |   3 +
 Gemfile                      |   2 +
 Guardfile                    |   4 +-
 README.md                    |  21 ++++
 Rakefile                     |  14 +--
 bin/pups                     |   8 +-
 lib/pups.rb                  |  32 ++++--
 lib/pups/cli.rb              |  92 ++++++++++-------
 lib/pups/command.rb          |  25 +++--
 lib/pups/config.rb           | 240 +++++++++++++++++++++++--------------------
 lib/pups/docker.rb           |  69 +++++++++++++
 lib/pups/exec_command.rb     | 182 ++++++++++++++++----------------
 lib/pups/file_command.rb     |  60 +++++------
 lib/pups/merge_command.rb    |  94 ++++++++---------
 lib/pups/replace_command.rb  |  70 +++++++------
 lib/pups/runit.rb            |  47 +++++----
 lib/pups/version.rb          |   4 +-
 pups.gemspec                 |  37 ++++---
 test/cli_test.rb             | 102 +++++++++++++++---
 test/config_test.rb          | 215 ++++++++++++++++++++++++++++----------
 test/docker_test.rb          | 157 ++++++++++++++++++++++++++++
 test/exec_command_test.rb    |  62 ++++++-----
 test/file_command_test.rb    |  17 ++-
 test/merge_command_test.rb   |  64 ++++++------
 test/replace_command_test.rb |  86 ++++++++--------
 test/test_helper.rb          |   2 +
 28 archivos cambiados, 1158 inserciones(+), 607 eliminaciones(-)
 crear modo 100644 .github/workflows/ci.yml
 crear modo 100644 .github/workflows/lint.yml
 crear modo 100644 .rubocop.yml
 crear modo 100644 lib/pups/docker.rb
 crear modo 100644 test/docker_test.rb
Nota: verificando salida de 'v1.0.3'.

Estás en estado de 'HEAD desconectado'. Puedes explorar, hacer cambios experimentales
y confirmarlos, y puedes descartar cualquier confirmación que hagas en este
estado sin afectar ninguna rama realizando otra verificación.

Si deseas crear una nueva rama para conservar las confirmaciones que crees, puedes
hacerlo (ahora o más tarde) usando -b con el comando checkout nuevamente. Ejemplo:

  git checkout -b <nombre-nueva-rama>

HEAD ahora está en d1db030 cortar una nueva versión
I, [2021-08-03T13:36:03.894819 #1]  INFO -- : Cargando --stdin
/pups/lib/pups/cli.rb:15:in `split': secuencia de bytes no válida en UTF-8 (ArgumentError)
        desde /pups/lib/pups/cli.rb:15:in `run'
        desde /pups/bin/pups:8:in `<main>'
8a2fdd1ae3783177d5d5a04ac692afbf3c3e445398484e6f1845171f763ceb20
** FALLO AL INICIALIZAR ** por favor, desplázate hacia arriba y busca mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.

Luego ejecuté el comando “./discourse-doctor” y me mostró lo siguiente:

./discourse-doctor
DISCOURSE DOCTOR mar ago 3 13:20:43 UTC 2021
SO: Linux foro 5.4.0-80-generic #90-Ubuntu SMP vie jul 9 22:49:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux


Se encontró containers/app.yml

==================== CONFIGURACIONES YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=OCULTADO 
SMTP_PASSWORD=OCULTADO 
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=OCULTADO 

==================== INFORMACIÓN DE DOCKER ====================
VERSIÓN DE DOCKER: Docker versión 20.10.7, compilación f0df350

PROCESOS DE DOCKER (docker ps -a)

ID DEL CONTENEDOR   IMAGEN                 COMANDO        CREADO      ESTADO                   PUERTOS     NOMBRES
66eba750efb9   local_discourse/app   "/sbin/boot"   hace 4 días   Salido (5) hace 3 horas             app

==================== PROBLEMA GRAVE!!!! ====================
¡app no se está ejecutando!
Intentando reconstruir
==================== REGISTRO DE RECONSTRUCCIÓN ====================
Asegurando que el launcher esté actualizado
Obteniendo origen
El launcher está actualizado
Deteniendo el contenedor antiguo
+ /usr/bin/docker stop -t 60 app
app
./launcher: línea 289: advertencia: sustitución de comando: se ignoró un byte nulo en la entrada
cd /pups && git pull && git checkout v1.0.3 && /pups/bin/pups --stdin
De https://github.com/discourse/pups
   17f04ec..e0ff889  master     -> origin/master
 * [nueva etiqueta]         v1.1.1     -> v1.1.1
 * [nueva etiqueta]         v1.1.0     -> v1.1.0
Actualizando 17f04ec..e0ff889
Avance rápido
 .github/workflows/ci.yml     |  29 ++++++
 .github/workflows/lint.yml   |  27 +++++
 .rubocop.yml                 |   3 +
 Gemfile                      |   2 +
 Guardfile                    |   4 +-
 README.md                    |  21 ++++
 Rakefile                     |  14 +--
 bin/pups                     |   8 +-
 lib/pups.rb                  |  32 ++++--
 lib/pups/cli.rb              |  92 ++++++++++-------
 lib/pups/command.rb          |  25 +++--
 lib/pups/config.rb           | 240 +++++++++++++++++++++++--------------------
 lib/pups/docker.rb           |  69 +++++++++++++
 lib/pups/exec_command.rb     | 182 ++++++++++++++++----------------
 lib/pups/file_command.rb     |  60 +++++------
 lib/pups/merge_command.rb    |  94 ++++++++---------
 lib/pups/replace_command.rb  |  70 +++++++------
 lib/pups/runit.rb            |  47 +++++----
 lib/pups/version.rb          |   4 +-
 pups.gemspec                 |  37 ++++---
 test/cli_test.rb             | 102 +++++++++++++++---
 test/config_test.rb          | 215 ++++++++++++++++++++++++++++----------
 test/docker_test.rb          | 157 ++++++++++++++++++++++++++++
 test/exec_command_test.rb    |  62 ++++++-----
 test/file_command_test.rb    |  17 ++-
 test/merge_command_test.rb   |  64 ++++++------
 test/replace_command_test.rb |  86 ++++++++--------
 test/test_helper.rb          |   2 +
 28 archivos cambiados, 1158 inserciones(+), 607 eliminaciones(-)
 crear modo 100644 .github/workflows/ci.yml
 crear modo 100644 .github/workflows/lint.yml
 crear modo 100644 .rubocop.yml
 crear modo 100644 lib/pups/docker.rb
 crear modo 100644 test/docker_test.rb
Nota: verificando salida de 'v1.0.3'.

Estás en estado de 'HEAD desconectado'. Puedes explorar, hacer cambios experimentales
y confirmarlos, y puedes descartar cualquier confirmación que hagas en este
estado sin afectar ninguna rama realizando otra verificación.

Si deseas crear una nueva rama para conservar las confirmaciones que crees, puedes
hacerlo (ahora o más tarde) usando -b con el comando checkout nuevamente. Ejemplo:

  git checkout -b <nombre-nueva-rama>

HEAD ahora está en d1db030 cortar una nueva versión
I, [2021-08-03T13:20:51.459842 #1]  INFO -- : Cargando --stdin
/pups/lib/pups/cli.rb:15:in `split': secuencia de bytes no válida en UTF-8 (ArgumentError)
	desde /pups/lib/pups/cli.rb:15:in `run'
	desde /pups/bin/pups:8:in `<main>'
8a2381ff0429f3448f46daa6c1b238dde16efbaa75c7e3b9dc1b9cfb8090a069
** FALLO AL INICIALIZAR ** por favor, desplázate hacia arriba y busca mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.
==================== FIN DEL REGISTRO DE RECONSTRUCCIÓN ====================
No se pudo reconstruir la aplicación.

Verificando tu nombre de dominio . . .

Conexión al puerto 443 exitosa.
Probablemente debas eliminar cualquier plugin no estándar y reconstruir.
Intentando reiniciar el contenedor existente. . . 

iniciando el contenedor existente
+ /usr/bin/docker start app
app
Contenedor reiniciado.


==================== PLUGINS ====================


No se detectaron plugins no oficiales.

Consulta https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb para la lista oficial.

========================================
Versión de Discourse en : NO ENCONTRADA
Versión de Discourse en localhost: NO ENCONTRADA


==================== INFORMACIÓN DE MEMORIA ====================
SO: Linux
RAM (MB): 2084

              total        usada        libre      compartida  buff/cache   disponible
Mem:           1987         266         869          17         852        1542
Swap:          2047           0        2047

==================== VERIFICACIÓN DE ESPACIO EN DISCO ====================
---------- Espacio en disco del SO ----------
Sistema de archivos  Tamaño  Usado Disp Uso% Montado en
/dev/vda1        49G  8.1G   41G  17% /

==================== INFORMACIÓN DEL DISCO ====================
Disco /dev/loop0: 55.45 MiB, 58134528 bytes, 113544 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop1: 67.58 MiB, 70848512 bytes, 138376 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop2: 70.32 MiB, 73728000 bytes, 144000 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop3: 55.43 MiB, 58114048 bytes, 113504 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop4: 32.3 MiB, 33865728 bytes, 66144 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/loop5: 32.29 MiB, 33853440 bytes, 66120 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes


Disco /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: gpt
Identificador del disco: BEF50A53-93AD-46BC-A437-0668221D1666

Dispositivo      Inicio       Fin   Sectores  Tamaño Tipo
/dev/vda1  227328 104857566 104630239 49.9G Sistema de archivos Linux
/dev/vda14   2048     10239      8192    4M Arranque BIOS
/dev/vda15  10240    227327    217088  106M Datos básicos de Microsoft

Las entradas de la tabla de particiones no están en orden del disco.

==================== FIN DE LA INFORMACIÓN DEL DISCO ====================

==================== PRUEBA DE CORREO ====================
Para una prueba robusta, obtén una dirección en http://www.mail-tester.com/
Enviando correo a OCULTADO . . 
Probando el envío a test-9jlant6d8@srv1.mail-tester.com usando smtp.sendgrid.net:587, nombre de usuario:apikey con autenticación simple.
Conexión al servidor SMTP exitosa.
Enviando a test-9jlant6d8@srv1.mail-tester.com. . . 
Correo aceptado por el servidor SMTP.
ID del mensaje: 4e0d23cb-7ae1-4158-b365-9e5da624e2e8@fOCULTADO

Si no recibes el mensaje, revisa tu carpeta de SPAM
o prueba nuevamente usando un servicio como http://www.mail-tester.com/.

Si el mensaje no se entrega, no es un problema con Discourse.
Revisa los registros del servidor SMTP para el ID del mensaje anterior para ver por qué
falló el envío del mensaje.

==================== ¡LISTO! ====================
No se generó un registro públicamente disponible.

Puedes examinar la salida de este script con 
LESS=-Ri less /tmp/discourse-debug.txt

¡PERO PRIMERO, asegúrate de conocer los primeros tres comandos a continuación!!!

Comandos para conocer al ver el archivo con el comando anterior (llamado 'less'): 
q              -- salir
/error<ENTER>  -- buscar la palabra 'error'
n              -- buscar la siguiente aparición
g              -- ir al principio del archivo
f              -- avanzar una página
b              -- retroceder una página
G              -- ir al final del archivo

Mi archivo “app.yml” lo tengo así:

.app.yml
## este es la plantilla de contenedor Docker todo en uno, independiente de Discourse
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TEN *MUCHO* CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON EXTREMADAMENTE SENSIBLES A ERRORES EN ESPACIOS EN BLANCO O ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## ¿qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers a un máximo del 25% de la memoria total.
  ## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
  db_shared_buffers: "256MB"

  ## puede mejorar el rendimiento de ordenamiento, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según los CPUs detectados, o puedes sobrescribirlo
  UNICORN_WORKERS: 4

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Requerido. Discourse no funcionará con una dirección IP desnuda.
  DISCOURSE_HOSTNAME: OCULTADO

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (-h opción) que se especificó arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos delimitados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'usuario1@ejemplo.com,usuario2@ejemplo.com'
  DISCOURSE_DEVELOPER_EMAILS: 'OCULTADO'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # DIRECCIÓN SMTP, nombre de usuario y contraseña son obligatorios
  # ADVERTENCIA: el carácter '#' en la contraseña SMTP puede causar problemas!
  DISCOURSE_SMTP_ADDRESS: OCULTADO
  DISCOURSE_SMTP_PORT: OCULTADO
  DISCOURSE_SMTP_USER_NAME: OCULTADO
  DISCOURSE_SMTP_PASSWORD: "OCULTADO"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, predeterminado true)
  DISCOURSE_SMTP_DOMAIN: OCULTADO
  DISCOURSE_NOTIFICATION_EMAIL: OCULTADO

  ## Si agregaste la plantilla de Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: OCULTADO

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.ejemplo.com
  
  ## La clave de dirección IP de geolocalización de maxmind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-voting          

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  ## Después de obtener el primer correo electrónico de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@discourse.noconfigurado.org'"
  - exec: echo "Fin de comandos personalizados"

Agradezco tu ayuda de antemano.

Tu app.yml contiene un carácter no válido. Probablemente sea uno que omitiste al publicar aquí.

¿Dónde? Por favor, dime.

Prueba validándolo con una herramienta. http://www.yamllint.com/ debería funcionar.

Sí, es válido, no marca un error.

Ya lo solucioné; aparentemente el archivo estaba corrupto. Lo único que hice fue eliminarlo y crear uno nuevo pegando los datos usando el editor “sublimetext3”.

Olvidé mencionar que el error ocurrió después de intentar editar el archivo “app.yaml” mediante un editor en Android llamado “Admin Hands: SSH / FTP / SFTP / TLN”. Al parecer, al guardar, el editor guardó el archivo de forma errónea y lo corrompió. Lo curioso es que pude editarlo sin problemas y pasó la prueba del sitio: http://www.yamllint.com/.

De todos modos, dejo este mensaje para posibles referencias futuras.