GitHub Actions Workflow: - Automatic build on push to main/develop - Build on tags (v*.*.*) - Multi-platform support (linux/amd64) - Publish to ghcr.io registry - Docker layer caching - Metadata extraction for tags Build Scripts (Linux + Windows): - build-image.sh/bat: Build and publish to registry - Registry authentication check - Image testing before push - Configurable registry (default: ghcr.io) Deployment Scripts (Linux + Windows): - deploy-prod.sh/bat: Production deployment automation - Pre-deployment checks (.env.prod validation) - Automatic backup before deploy - Image pull and stack deployment - Health check verification - Rollback support
98 lines
3.7 KiB
Bash
98 lines
3.7 KiB
Bash
#!/bin/bash
|
||
# Скрипт для деплоя в production
|
||
|
||
set -e
|
||
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m'
|
||
|
||
echo -e "${GREEN}🚀 Production Deploy - BUH Bot${NC}"
|
||
echo ""
|
||
|
||
# Проверка .env.prod
|
||
if [ ! -f .env.prod ]; then
|
||
echo -e "${RED}❌ Файл .env.prod не найден!${NC}"
|
||
echo "Создайте файл на основе .env.prod.example:"
|
||
echo " cp .env.prod.example .env.prod"
|
||
echo " nano .env.prod"
|
||
exit 1
|
||
fi
|
||
|
||
# Проверка обязательных переменных
|
||
echo -e "${YELLOW}🔍 Проверка конфигурации...${NC}"
|
||
source .env.prod
|
||
|
||
if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ "$TELEGRAM_BOT_TOKEN" = "your_production_bot_token_here" ]; then
|
||
echo -e "${RED}❌ TELEGRAM_BOT_TOKEN не настроен в .env.prod${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✅ Конфигурация корректна${NC}"
|
||
|
||
# Создание необходимых директорий на хосте
|
||
echo -e "${YELLOW}📁 Создание директорий...${NC}"
|
||
sudo mkdir -p /var/lib/buh_bot/data
|
||
sudo mkdir -p /var/log/buh_bot
|
||
sudo mkdir -p /var/tmp/buh_bot
|
||
|
||
# Backup существующих данных
|
||
if [ -d /var/lib/buh_bot/data ] && [ "$(ls -A /var/lib/buh_bot/data)" ]; then
|
||
echo -e "${YELLOW}💾 Создание backup...${NC}"
|
||
BACKUP_DIR="/var/backups/buh_bot/$(date +%Y%m%d_%H%M%S)"
|
||
sudo mkdir -p "$BACKUP_DIR"
|
||
sudo cp -r /var/lib/buh_bot/data/* "$BACKUP_DIR/"
|
||
echo -e "${GREEN}✅ Backup создан: $BACKUP_DIR${NC}"
|
||
fi
|
||
|
||
# Остановка существующих контейнеров
|
||
if docker ps -a --format '{{.Names}}' | grep -q "buh_bot"; then
|
||
echo -e "${YELLOW}🛑 Остановка существующих контейнеров...${NC}"
|
||
docker-compose -f docker-compose.prod.yml --env-file .env.prod down
|
||
fi
|
||
|
||
# Pull latest образов
|
||
echo -e "${YELLOW}📥 Получение последних образов...${NC}"
|
||
docker-compose -f docker-compose.prod.yml --env-file .env.prod pull
|
||
|
||
# Запуск
|
||
echo -e "${YELLOW}🚀 Запуск сервисов...${NC}"
|
||
docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d
|
||
|
||
# Проверка статуса
|
||
sleep 5
|
||
echo ""
|
||
echo -e "${BLUE}📊 Статус сервисов:${NC}"
|
||
docker-compose -f docker-compose.prod.yml --env-file .env.prod ps
|
||
|
||
# Проверка healthcheck
|
||
echo ""
|
||
echo -e "${YELLOW}🏥 Ожидание healthcheck...${NC}"
|
||
sleep 10
|
||
|
||
BOT_HEALTH=$(docker inspect --format='{{.State.Health.Status}}' buh_bot_prod 2>/dev/null || echo "unknown")
|
||
if [ "$BOT_HEALTH" = "healthy" ] || [ "$BOT_HEALTH" = "starting" ]; then
|
||
echo -e "${GREEN}✅ Бот запущен и работает${NC}"
|
||
else
|
||
echo -e "${RED}⚠️ Бот запущен, но healthcheck: $BOT_HEALTH${NC}"
|
||
echo "Проверьте логи: docker-compose -f docker-compose.prod.yml logs buh_bot"
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${GREEN}✅ Production деплой завершён!${NC}"
|
||
echo ""
|
||
echo -e "${BLUE}📝 Полезные команды:${NC}"
|
||
echo " Логи бота: docker-compose -f docker-compose.prod.yml logs -f buh_bot"
|
||
echo " Все логи: docker-compose -f docker-compose.prod.yml logs -f"
|
||
echo " Статус: docker-compose -f docker-compose.prod.yml ps"
|
||
echo " Остановка: docker-compose -f docker-compose.prod.yml down"
|
||
echo " Перезапуск: docker-compose -f docker-compose.prod.yml restart"
|
||
echo ""
|
||
echo -e "${BLUE}📊 Мониторинг:${NC}"
|
||
echo " Grafana: http://localhost:${GRAFANA_PORT:-3000}"
|
||
echo " Prometheus: http://localhost:${PROMETHEUS_PORT:-9090}"
|
||
echo " cAdvisor: http://localhost:8080"
|
||
echo ""
|