#!/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