أخطاء الأذونات مع "./launcher rebuild app" في تثبيت جديد

لقد فعلت:

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

ثم نسخت ملف app.yml القديم الخاص بي إلى containers وحاولت إعادة بناء التطبيق:


[root@two discourse]# ./launcher rebuild app
x86_64 arch detected.
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250722-0020: Pulling from discourse/base
Digest: sha256:3b975c30ef85e9742e2d7f6093450867e67dae204c93d22cc38d043dcbf530b3
Status: Image is up to date for 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 -- : Reading from stdin
I, [2025-09-12T19:05:09.296585 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.301579 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.307391 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.313597 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.319914 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.320255 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.323526 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324153 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324577 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324945 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325369 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325759 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.329467 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330304 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330761 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.331823 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332230 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /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: cannot create directory ‘/shared/postgres_run’: Permission denied
chown: cannot access '/shared/postgres_run': No such file or directory
chmod: cannot access '/shared/postgres_run': No such file or directory
mkdir: cannot create directory ‘/shared/postgres_run’: Permission denied
chown: cannot access '/shared/postgres_run/15-main.pg_stat_tmp': No such file or directory
install: cannot change owner and permissions of ‘/shared/postgres_data’: No such file or directory
initdb: error: could not create directory "/shared/postgres_data": Permission denied
find: ‘/shared/postgres_data’: No such file or directory
chown: cannot dereference '/var/run/postgresql': No such file or directory
cat: /shared/postgres_data/PG_VERSION: No such file or directory
du: cannot access '/shared/postgres_data': No such file or directory
/root/upgrade_postgres: line 7: * 2: syntax error: operand expected (error token is "* 2")
I, [2025-09-12T19:05:12.122891 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /shared/postgres_data ... Upgrading PostgreSQL from version to 15


FAILED
--------------------
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
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"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"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
c9c7badf83b119a15b40255ae48a05182f72663cc870ca85e867c1f9a218bb83

يبدو أن هناك مشكلة في الأذونات داخل الحاوية فور البدء:

mkdir: cannot create directory ‘/shared/postgres_run’: Permission denied

ما الذي يمكن أن يسبب هذا؟

يبدو أنني بحاجة إلى تشغيل دوكر (docker) باستخدام العلامة --privileged، حيث أن هذا يحل المشكلة:

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

ليس من الواضح لي سبب ذلك. (هذا على Fedora 42.) أود أن أفهم ما يحدث هنا.

لأن في Discourse، هذه الملفات مملوكة لـ root (أو الدليل الأصل؟).

ربما تم تعيينه افتراضيًا في Ubuntu. لا أعرف ما الذي قد يكون مختلفًا في Ubuntu.

هل يمكنك محاولة تعيين /var/discourse/shared للكتابة العالمية ومعرفة ما إذا كان يعمل؟ أو ربما يمكنك معرفة ما إذا كان يعمل بدون ``–privileged` الآن؟

Ubuntu هو ما يُوصى به و Debian هو ما يوجد داخل الحاوية (وقد يكون الآن ما تستخدمه CDCK لنظام التشغيل المضيف الخاص بها؟). Fedora لديها الكثير من الأشياء المقيدة التي لا تمتلكها Ubuntu. إذا كنت ترغب في الفهم، فمن المحتمل أن تكون بمفردك إلى حد كبير، على الرغم من أنني أعتقد أنني أتذكر شخصًا واحدًا على الأقل هنا بشكل متكرر يحب Fedora CentOS (وهو أقرب إلى Fedora من Ubuntu!). قد يكون هذا مفيدًا: MKJ's Opinionated Discourse Deployment Configuration

أتساءل ما هي معرف المستخدم الفعال (uid) في النقطة التي يحاول فيها البرنامج النصي للتمهيد إنشاء أدلة فرعية في /var/discourse/shared؛ كنت أعتقد أنه سيكون root، نظرًا لأن docker يتم تشغيله كـ root، ولكن يبدو أنه ليس كذلك؟

لا أرى شيئًا هناك حول استخدام --privileged، للأسف، على الرغم من أنني أشارك رغبته في القيام بكل هذا باستخدام podman بدلاً من docker.

إعجاب واحد (1)

نعم، لم أجرب تشغيل إنتاج Discourse على Fedora، بل قمت فقط بتطوير Discourse على Fedora، ولم يكن ذلك على 42. خوادم Discourse الخاصة بي الآن موجودة على AlmaLinux 9 ولا أحتاج إلى --privileged هناك. ليس لدي Docker مثبتًا على أي من أنظمة Fedora الخاصة بي.

إعجاب واحد (1)

أعتقد أنني سأحاول تحديد مالك تلك الدلائل دون استخدام --privileged عندما يتوفر لدي الوقت.

إعجاب واحد (1)

بالنظر إلى --privileged أرى أنه يعطل تسميات عمليات SELinux.

أنا لا أقوم بتعطيل SELinux على خادم Discourse الخاص بي، وفي الواقع لدي تعليمات في دليلي حول كيفية التكيف مع الحفاظ على SELinux ممكّنًا أثناء استخدام nginx خارجي. يمكنك أيضًا التحقق من سجلات avc الخاصة بك للحصول على الإنكارات ذات الصلة وكتابة سياسة محلية باستخدام audit2allow. ولكن يمكن أن تكون هذه عملية تكرارية طويلة. سأبدأ من الصفر (مع مسح /var/discourse) للتأكد من أنها اختبار صالح ومعرفة ما إذا كنت لا تزال بحاجة إلى --permissive مع تعطيل SELinux (على سبيل المثال، setenforce 0). ثم إذا نجح ذلك، يمكنك استخدام audit2allow لأن setenforce 0 لا يزال يكتب إدخالات avc، ولكنه لم يعد يتوقف عند البوابة الأولى، لذلك ستصل إلى سياسة عاملة بشكل أسرع.

لا أعتقد أنني سأستمر في استخدام --privileged على نظام إنتاجي إذا كان بإمكاني تجنبه.

إعجاب واحد (1)