diff --git a/Dockerfile b/Dockerfile index a1c6418..825fec0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,3 +65,11 @@ RUN python3 /app/code/patch_index.py && \ # light + dark pair so browser/PWA chrome matches the phone theme natively. RUN sed -i 's|"theme_color": *"#009688"|"theme_color":"#eaf3ea"|; s|"background_color": *"#000000"|"background_color":"#eaf3ea"|' /app/code/librechat/client/dist/manifest.webmanifest && \ sed -i 's||\n |' /app/code/librechat/client/dist/index.html + +# Log ownership guard: a host-side daily job creates the next day's dated log +# files in /app/data/logs as root:root at 00:00 UTC; LibreChat (cloudron user) +# then crashes with EACCES on its first log write of the day. This supervisor +# program runs as root and keeps the dated files cloudron-owned (see +# assets/log-guard.sh). Remove once the host logrotate config is fixed. +COPY assets/log-guard.sh /app/code/log-guard.sh +RUN printf '[program:logguard]\ncommand=/bin/bash /app/code/log-guard.sh\nuser=root\nautorestart=true\nstartsecs=0\npriority=1\n' > /etc/supervisor/conf.d/logguard.conf diff --git a/__pycache__/patch_index.cpython-313.pyc b/__pycache__/patch_index.cpython-313.pyc new file mode 100644 index 0000000..dfc3dd3 Binary files /dev/null and b/__pycache__/patch_index.cpython-313.pyc differ diff --git a/assets/log-guard.sh b/assets/log-guard.sh new file mode 100755 index 0000000..eb55f90 --- /dev/null +++ b/assets/log-guard.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Log ownership guard for /app/data/logs. +# +# A host-side daily job creates the next day's dated log files +# (error-.log, meiliSync-.log, ...) as root:root at 00:00 UTC. +# LibreChat runs as the `cloudron` user and crashes (EACCES on uncaught +# error) the first time it tries to append to a root-owned log. This guard +# runs as root (via supervisord) and, every minute: +# 1. pre-creates TODAY's and TOMORROW's dated files owned by cloudron +# (an existing correctly-owned file defeats the ownership flip — +# open(O_TRUNC) preserves the inode's owner), +# 2. chowns any root-owned strays back to cloudron. +# +# This is a defense-in-depth stopgap; the host-side rotation config should +# still be fixed to create files as cloudron (see co-op/support thread and +# the overlay README). +set -u +LOGDIR="/app/data/logs" +mkdir -p "$LOGDIR" + +while true; do + for offset in 0 1; do + d=$(date -u -d "+${offset} day" +%F 2>/dev/null) + [ -z "$d" ] && continue + for prefix in error meiliSync; do + f="$LOGDIR/${prefix}-${d}.log" + [ -e "$f" ] || : > "$f" + done + done + # Repair any root-owned strays (covers unknown file prefixes too). + find "$LOGDIR" ! -user cloudron -exec chown cloudron:cloudron {} \; 2>/dev/null + sleep 60 +done