- docker-compose is deprecated, use 'docker compose' instead - This fixes the "docker-compose: not found" error in deploy script Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
78 lines
3.5 KiB
Bash
78 lines
3.5 KiB
Bash
#!/bin/sh
|
||
# Скрипт деплоя для octopus (FIXED v6 - Fix log path to use mounted volume)
|
||
LOG_FILE="/Volume1/DockerAppsData/mixapp/deploy-octopus.log"
|
||
HASH_FILE="/Volume1/DockerAppsData/mixapp/requirements-hash.txt"
|
||
DOCKER_COMPOSE_DIR="/Volume1/DockerYAML/mix"
|
||
APP_ROOT="/Volume1/DockerAppsData/mixapp/app"
|
||
|
||
echo "=== Deploy started at $(date) ===" >> "$LOG_FILE"
|
||
|
||
# 1. Git pull
|
||
echo "Step 1: Git pull..." >> "$LOG_FILE"
|
||
docker exec git-cli sh -c "cd /git/octopus && git pull" >> "$LOG_FILE" 2>&1
|
||
|
||
# 2. Вычисляем общий хеш (requirements + docker config + docker compose)
|
||
echo "Step 2: Checking for structural changes..." >> "$LOG_FILE"
|
||
NEW_HASH=$(docker exec git-cli sh -c "cd /git/octopus && cat myproject/requirements.txt docker/* docker/docker compose.yml | md5sum" | awk '{print $1}')
|
||
|
||
OLD_HASH=""
|
||
if [ -f "$HASH_FILE" ]; then
|
||
OLD_HASH=$(cat "$HASH_FILE")
|
||
fi
|
||
|
||
# 3. Копируем файлы приложения
|
||
echo "Step 3: Copying app files..." >> "$LOG_FILE"
|
||
rm -rf "$APP_ROOT/myproject"/*
|
||
cp -r /Volume1/DockerAppsData/git/octopus/myproject/. "$APP_ROOT/myproject/" >> "$LOG_FILE" 2>&1
|
||
|
||
rm -rf "$APP_ROOT/docker"
|
||
mkdir -p "$APP_ROOT/docker"
|
||
cp -r /Volume1/DockerAppsData/git/octopus/docker/. "$APP_ROOT/docker/" >> "$LOG_FILE" 2>&1
|
||
|
||
# 4. Обновляем docker compose.yml (Infrastructure as Code)
|
||
echo "Step 4: Updating docker compose.yml..." >> "$LOG_FILE"
|
||
cp /Volume1/DockerAppsData/git/octopus/docker/docker compose.yml "$DOCKER_COMPOSE_DIR/docker compose.yml" >> "$LOG_FILE" 2>&1
|
||
|
||
# 5. Устанавливаем права
|
||
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
|
||
|
||
# 6. Логика пересборки
|
||
cd "$DOCKER_COMPOSE_DIR"
|
||
|
||
if [ "$NEW_HASH" != "$OLD_HASH" ]; then
|
||
echo "Step 6: Changes detected! Rebuilding ALL images..." >> "$LOG_FILE"
|
||
docker compose build >> "$LOG_FILE" 2>&1
|
||
echo "$NEW_HASH" > "$HASH_FILE"
|
||
echo "Images rebuilt successfully!" >> "$LOG_FILE"
|
||
else
|
||
echo "Step 6: No structure changes, skipping rebuild." >> "$LOG_FILE"
|
||
fi
|
||
|
||
# 7. Полный перезапуск
|
||
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 9: Check status..." >> "$LOG_FILE"
|
||
docker compose ps >> "$LOG_FILE" 2>&1
|
||
|
||
echo "=== Deploy finished at $(date) ===" >> "$LOG_FILE"
|