Errores de permisos con \"./launcher rebuild app\" en instalación nueva

Hice lo siguiente:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

luego copié mi app.yml antiguo en containers e intenté reconstruir la aplicación:


[root@two discourse]# ./launcher rebuild app
Se detectó la arquitectura x86_64.
Asegurando que el lanzador esté actualizado
El lanzador está actualizado
Deteniendo el contenedor antiguo
+ /usr/bin/docker stop -t 600 app
app
2.0.20250722-0020: Extrayendo de discourse/base
Digest: sha256:3b975c30ef85e9742e2d7f6093450867e67dae204c93d22cc38d043dcbf530b3
Status: La imagen está actualizada para discourse/base:2.0.20250722-0020
docker.io/discourse/base:2.0.20250722-0020
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-09-12T19:05:09.283821 #1]  INFO -- : Leyendo desde stdin
I, [2025-09-12T19:05:09.296585 #1]  INFO -- : Archivo > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.301579 #1]  INFO -- : Archivo > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.307391 #1]  INFO -- : Archivo > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.313597 #1]  INFO -- : Archivo > /root/install_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.319914 #1]  INFO -- : Archivo > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.320255 #1]  INFO -- : Reemplazando data_directory = '/var/lib/postgresql/15/main' con data_directory = '/shared/postgres_data' en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.323526 #1]  INFO -- : Reemplazando (?-mix:#?listen_addresses *=.*) con listen_addresses = '*' en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324153 #1]  INFO -- : Reemplazando (?-mix:#?synchronous_commit *=.*) con synchronous_commit = $db_synchronous_commit en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324577 #1]  INFO -- : Reemplazando (?-mix:#?shared_buffers *=.*) con shared_buffers = $db_shared_buffers en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324945 #1]  INFO -- : Reemplazando (?-mix:#?work_mem *=.*) con work_mem = $db_work_mem en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325369 #1]  INFO -- : Reemplazando (?-mix:#?default_text_search_config *=.*) con default_text_search_config = '$db_default_text_search_config' en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325759 #1]  INFO -- : Reemplazando (?-mix:#?checkpoint_segments *=.*) con checkpoint_segments = $db_checkpoint_segments en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.329467 #1]  INFO -- : Reemplazando (?-mix:#?logging_collector *=.*) con logging_collector = $db_logging_collector en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330304 #1]  INFO -- : Reemplazando (?-mix:#?log_min_duration_statement *=.*) con log_min_duration_statement = $db_log_min_duration_statement en /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330761 #1]  INFO -- : Reemplazando (?-mix:^#local +replication +postgres +peer$) con local replication postgres  peer en /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.331823 #1]  INFO -- : Reemplazando (?-mix:^host.*all.*all.*127.*$) con host all all 0.0.0.0/0 md5 en /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332230 #1]  INFO -- : Reemplazando (?-mix:^host.*all.*all.*::1\/128.*$) con host all all ::/0 md5 en /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332621 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

mkdir: no se puede crear el directorio '/shared/postgres_run': Permiso denegado
chown: no se puede acceder a '/shared/postgres_run': No existe tal archivo o directorio
chmod: no se puede acceder a '/shared/postgres_run': No existe tal archivo o directorio
mkdir: no se puede crear el directorio '/shared/postgres_run': Permiso denegado
chown: no se puede acceder a '/shared/postgres_run/15-main.pg_stat_tmp': No existe tal archivo o directorio
install: no se puede cambiar el propietario y los permisos de '/shared/postgres_data': No existe tal archivo o directorio
initdb: error: no se pudo crear el directorio "/shared/postgres_data": Permiso denegado
find: '/shared/postgres_data': No existe tal archivo o directorio
chown: no se puede acceder a '/var/run/postgresql': No existe tal archivo o directorio
cat: /shared/postgres_data/PG_VERSION: No existe tal archivo o directorio
du: no se puede acceder a '/shared/postgres_data': No existe tal archivo o directorio
/root/upgrade_postgres: línea 7: * 2: error de sintaxis: se esperaba un operando (token de error «* 2»)
I, [2025-09-12T19:05:12.122891 #1]  INFO -- : Generando locales (esto puede tardar un poco)...
  en_US.UTF-8... listo
Generación completa.
Los archivos pertenecientes a este sistema de bases de datos serán propiedad del usuario "postgres".
Este usuario también debe ser propietario del proceso del servidor.

El clúster de bases de datos se inicializará con la configuración regional "en_US.UTF-8".
Por lo tanto, la codificación predeterminada de la base de datos se ha establecido en "UTF8".
La configuración de búsqueda de texto predeterminada se establecerá en "english".

Las sumas de verificación de páginas de datos están deshabilitadas.

creando directorio /shared/postgres_data ... Actualizando PostgreSQL de la versión a 15


FALLIDO
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 falló con el retorno #<Process::Status: pid 18 exit 1>
Ubicación del fallo: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec falló con los parámetros {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
fallo de arranque con código de salida 1
** FALLO AL ARRANQUE ** por favor desplácese hacia arriba y busque mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.
c9c7badf83b119a15b40255ae48a05182f72663cc870ca85e867c1f9a218bb83

Aparentemente hay un problema de permisos dentro del contenedor desde el principio:

mkdir: no se puede crear el directorio '/shared/postgres_run': Permiso denegado

¿Qué podría estar causando esto?

Al parecer, necesito ejecutar Docker con la bandera --privileged, ya que eso soluciona el problema:

./launcher rebuild app --docker-args '--privileged'

No me queda claro por qué es así. (Esto es en Fedora 42). Me encantaría entender qué está pasando aquí.

Porque en Discourse esos archivos son propiedad de root (¿o el directorio padre lo es?).

Quizás esté configurado por defecto en Ubuntu. No sé qué podría ser diferente en Ubuntu.

¿Podrías intentar configurar /var/discourse/shared para que sea escribible por todos y ver si funciona? ¿O quizás podrías ver si funciona sin --privileged ahora?

Ubuntu es lo que se recomienda y Debian es lo que está dentro del contenedor (¿y puede que ahora sea lo que CDCK usa para su sistema operativo anfitrión?). Fedora tiene un montón de cosas bloqueadas que Ubuntu no tiene. Si te encantaría entenderlo, probablemente estarás en gran medida por tu cuenta, aunque creo recordar que al menos a una persona aquí le gusta con cierta frecuencia Fedora CentOS (¡que está más cerca de Fedora que Ubuntu!). Esto podría tener pistas: MKJ's Opinionated Discourse Deployment Configuration

Me pregunto cuál es el uid efectivo en el punto en que el script de arranque intenta crear subdirectorios en /var/discourse/shared; había pensado que sería root, ya que docker se ejecuta como root, pero ¿aparentemente no?

Lamentablemente, no veo nada allí sobre el uso de --privileged, aunque comparto su deseo de hacer todo esto con podman en lugar de docker.

1 me gusta

Sí, no he intentado ejecutar Discourse en producción en Fedora, solo he hecho desarrollo de Discourse en Fedora, y eso no en la 42. Mis servidores de Discourse ahora están en AlmaLinux 9 y no necesito --privileged allí. No tengo Docker instalado en ninguno de mis sistemas Fedora.

1 me gusta

Creo que intentaré determinar quién es el propietario de esos directorios sin --privileged cuando tenga tiempo.

1 me gusta

Al mirar --privileged veo que deshabilita las etiquetas de procesos de SELinux.

No estoy deshabilitando SELinux en mi servidor Discourse y, de hecho, tengo instrucciones en mi guía sobre cómo adaptarme para mantener SELinux habilitado mientras se usa nginx externo. También puedes revisar tus registros de avc para ver las denegaciones relevantes y escribir una política local usando audit2allow. Pero ese puede ser un proceso iterativo largo. Empezaría desde cero (borrando /var/discourse) para asegurarme de que es una prueba válida y ver si todavía necesitas --permissive con SELinux deshabilitado (por ejemplo, setenforce 0). Luego, si eso funciona, puedes usar audit2allow porque setenforce 0 todavía escribe entradas avc, pero ya no se detiene en la primera puerta, por lo que llegarás a una política funcional más rápido.

No creo que seguiría usando --privileged en un sistema de producción si pudiera evitarlo.

1 me gusta