From 61848774d2b222db7c9e6541273f99ada6af215c Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 18 Jan 2026 00:09:50 +0300 Subject: [PATCH] fix: Correct media permissions via docker exec after deploy - Remove 2>/dev/null || true from chown/chmod in entrypoint.sh - Add write test for media directory in entrypoint.sh - Add Step 8 in deploy script: fix permissions via docker exec - This ensures media files remain accessible after auto-deploy Co-Authored-By: Claude Opus 4.5 --- docker/entrypoint.sh | 25 +++++++++++++++++-------- webhook/scripts/deploy-myproject.sh | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 8bd6c9f..fba2c7a 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -113,18 +113,27 @@ setup_directories() { # Создаем папки если их нет (рекурсивно) # Важно: создаем структуру папок для tenants - mkdir -p "$MEDIA_ROOT/tenants" "$STATIC_ROOT" 2>/dev/null || true - - # Пытаемся установить права доступа + mkdir -p "$MEDIA_ROOT/tenants" "$STATIC_ROOT" + + # Устанавливаем права доступа (без скрытия ошибок - чтобы увидеть проблемы) # Сначала меняем владельца на appuser (так как мы root) - chown -R appuser:appuser "$MEDIA_ROOT" "$STATIC_ROOT" 2>/dev/null || true - + chown -R appuser:appuser "$MEDIA_ROOT" "$STATIC_ROOT" + # Используем 777 для папок media, чтобы контейнер мог писать независимо от прав на хосте # Это безопасно, так как доступ контролируется на уровне Docker volume # Устанавливаем права рекурсивно на все существующие файлы и папки - find "$MEDIA_ROOT" -type d -exec chmod 777 {} \; 2>/dev/null || true - find "$MEDIA_ROOT" -type f -exec chmod 666 {} \; 2>/dev/null || true - chmod -R 755 "$STATIC_ROOT" 2>/dev/null || true + find "$MEDIA_ROOT" -type d -exec chmod 777 {} \; + find "$MEDIA_ROOT" -type f -exec chmod 666 {} \; + chmod -R 755 "$STATIC_ROOT" + + # Проверка что media доступна для записи + if ! touch "$MEDIA_ROOT/.test" 2>/dev/null; then + echo "ERROR: Cannot write to $MEDIA_ROOT" + ls -la "$MEDIA_ROOT" + exit 1 + fi + rm -f "$MEDIA_ROOT/.test" + echo "Media directory is writable: $MEDIA_ROOT" echo "Media directory created/checked: $MEDIA_ROOT (permissions set)" echo "Static directory created/checked: $STATIC_ROOT" diff --git a/webhook/scripts/deploy-myproject.sh b/webhook/scripts/deploy-myproject.sh index 1c70f6d..1707812 100644 --- a/webhook/scripts/deploy-myproject.sh +++ b/webhook/scripts/deploy-myproject.sh @@ -37,6 +37,9 @@ cp /Volume1/DockerAppsData/git/octopus/docker/docker-compose.yml "$DOCKER_COMPOS echo "Step 5: Setting permissions..." >> "$LOG_FILE" chown -R 1000:1000 "$APP_ROOT" >> "$LOG_FILE" 2>&1 chmod +x "$APP_ROOT/docker/entrypoint.sh" >> "$LOG_FILE" 2>&1 + +# Гарантируем существование media папки с правильными правами +mkdir -p /Volume1/DockerAppsData/mixapp/media >> "$LOG_FILE" 2>&1 chown -R 1000:1000 /Volume1/DockerAppsData/mixapp/media >> "$LOG_FILE" 2>&1 chown -R 1000:1000 /Volume1/DockerAppsData/mixapp/static >> "$LOG_FILE" 2>&1 @@ -57,8 +60,18 @@ echo "Step 7: Restarting ALL containers..." >> "$LOG_FILE" docker-compose down >> "$LOG_FILE" 2>&1 docker-compose up -d >> "$LOG_FILE" 2>&1 +# 8. Ждём запуска и исправляем права через docker exec (внутри контейнера от root) +echo "Step 8: Waiting for containers and fixing permissions..." >> "$LOG_FILE" +sleep 10 # Даём контейнерам время для запуска entrypoint.sh + +# Исправляем права внутри контейнера (entrypoint.sh запускается от root) +docker exec mix_web chown -R appuser:appuser /app/myproject/media >> "$LOG_FILE" 2>&1 +docker exec mix_web chown -R appuser:appuser /app/myproject/staticfiles >> "$LOG_FILE" 2>&1 +docker exec mix_web chmod -R 777 /app/myproject/media >> "$LOG_FILE" 2>&1 +echo "Permissions fixed inside container" >> "$LOG_FILE" + # Проверка -echo "Step 8: Check status..." >> "$LOG_FILE" +echo "Step 9: Check status..." >> "$LOG_FILE" docker-compose ps >> "$LOG_FILE" 2>&1 echo "=== Deploy finished at $(date) ===" >> "$LOG_FILE"