Files
octopus/webhook/scripts/deploy-myproject.sh
Andrey Smakotin 3006207812 fix: Use docker compose (v2) instead of docker-compose
- 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>
2026-01-18 00:48:05 +03:00

78 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"