CI / ruff · mypy · pytest (pull_request) Successful in 1m11s
- docker-socket-proxy в Compose (только GET /containers/*), сокет только у него - app/runtime/docker.py: read-only клиент; видны только контейнеры с меткой tgit.managed=true, чужие id отклоняются до запроса - app/runtime/checks.py: running, health, рестарты за окно, CPU/RAM, ошибки в логе, HTTP-проба; у каждой проверки свой таймаут, отчёт всегда полный - app/runtime/snapshots.py: снапшоты раз в 15 с в container_snapshots - бот: список с 🟢🟡🔴⚪, карточка, «🩺 Запустить проверки», «🔄 Обновить» - деплой ставит метки tgit.sha / tgit.deployed_at на контейнер бота - имя джоба CD без неотрисованного выражения Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
1.3 KiB
Bash
Executable File
40 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Runs on the server: unpack release-<sha>.tgz, swap app/ atomically, compose up, wait for healthy.
|
|
# bash /srv/tgit/<env>/remote.sh <env> <sha> (uploaded by deploy.sh; safe to re-run)
|
|
set -euo pipefail
|
|
ENV=$1
|
|
SHA=$2
|
|
DIR=/srv/tgit/$ENV
|
|
PROJECT=tgit-$ENV
|
|
cd "$DIR"
|
|
|
|
if [ -f "release-$SHA.tgz" ]; then
|
|
rm -rf app.new && mkdir app.new && tar -xzf "release-$SHA.tgz" -C app.new && rm -f "release-$SHA.tgz"
|
|
cp .env app.new/.env
|
|
rm -rf app.old
|
|
[ -d app ] && mv app app.old
|
|
mv app.new app
|
|
fi
|
|
|
|
cd app
|
|
# Labels on the bot container, shown on its «Статус» card
|
|
export TGIT_SHA=$SHA TGIT_DEPLOYED_AT
|
|
TGIT_DEPLOYED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
docker compose -p "$PROJECT" up -d --build --remove-orphans </dev/null
|
|
|
|
status=""
|
|
for _ in $(seq 1 40); do
|
|
status=$(docker inspect -f '{{.State.Health.Status}}' "$PROJECT-bot-1" 2>/dev/null || true)
|
|
[ "$status" = healthy ] && break
|
|
sleep 3
|
|
done
|
|
if [ "$status" != healthy ]; then
|
|
echo "bot is '$status' after 2 min — last logs:" >&2
|
|
docker logs --tail 50 "$PROJECT-bot-1" >&2 || true
|
|
echo "rollback: cd $DIR && rm -rf app && mv app.old app && cd app && docker compose -p $PROJECT up -d --build" >&2
|
|
exit 1
|
|
fi
|
|
echo "$SHA" > ../REVISION
|
|
docker image prune -f >/dev/null
|
|
echo "bot healthy @ $SHA ($ENV)"
|