diff --git a/.gitea/workflows/deploy-ru-vps.yml b/.gitea/workflows/deploy-ru-vps.yml index 1765c12..4cfb03e 100644 --- a/.gitea/workflows/deploy-ru-vps.yml +++ b/.gitea/workflows/deploy-ru-vps.yml @@ -6,6 +6,7 @@ on: stack: description: "Stack to deploy (leave empty to reconcile all)" required: false + push: paths: - '.gitea/workflows/deploy-ru-vps.yml' diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 7aecb6c..a2a9678 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -61,19 +61,24 @@ for dir in $dirs; do docker compose config --quiet + # Remove containers whose container_name matches this stack but belong to a different project. + # docker compose down won't touch them because they carry no matching project labels. + while IFS= read -r cname; do + [ -z "$cname" ] && continue + existing="$(docker ps -aq --filter "name=^/${cname}$" 2>/dev/null || true)" + [ -z "$existing" ] && continue + owner="$(docker inspect --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}' "$existing" 2>/dev/null || true)" + if [ "$owner" != "$(pwd)" ]; then + echo "==> Removing conflicting container $cname (owner: ${owner:-none})" + docker rm -f "$existing" + fi + done < <(docker compose config 2>/dev/null | awk '/^[[:space:]]+container_name:/{gsub(/["'"'"']/, "", $2); print $2}') + if grep -qE '^[[:space:]]*build:' docker-compose.yml; then - docker compose up -d --build --remove-orphans || { - echo "==> up --build failed, tearing down and retrying" - docker compose down --remove-orphans 2>/dev/null || true - docker compose up -d --build --remove-orphans - } + docker compose up -d --build --remove-orphans else docker compose pull - docker compose up -d --remove-orphans || { - echo "==> up failed, tearing down and retrying" - docker compose down --remove-orphans 2>/dev/null || true - docker compose up -d --remove-orphans - } + docker compose up -d --remove-orphans fi # Health check: give containers a moment, then fail on crashed services