Files
Ultroid-fork/docker-deploy.sh
Cursor User 7f1ba3cdc3 Add comprehensive Docker deployment with safety features
Features:
- Complete Ubuntu dependency resolution in requirements.txt
- Safe Docker deployment that preserves existing bash startup setups
- Isolated Docker environment (docker-ultroid/) with different ports
- Automatic detection of existing bot configurations
- Session generation scripts for Docker deployment
- Health check and diagnostic tools
- Comprehensive documentation and deployment guides

 Safety:
- Detects existing 'bash startup' method and creates isolated environment
- Uses different ports (8081) to avoid conflicts
- Separate volumes and configs for Docker deployment
- Both bash startup and Docker can run side by side
- No interference with existing bot setups

 Files added/updated:
- requirements.txt (all missing dependencies)
- Docker setup (Dockerfile, docker-compose.yml, .env.sample)
- Deployment scripts (ubuntu_setup.sh, docker-deploy.sh, quick-start.sh)
- Safety scripts (safe-docker-setup.sh with isolation logic)
- Management tools (Makefile, health_check.sh, generate-session.sh)
- Documentation (SAFE_DOCKER_GUIDE.md, DOCKER_DEPLOYMENT.md, etc.)

Ready for production Ubuntu server deployment!
2025-06-18 20:42:10 +02:00

273 lines
10 KiB
Bash
Raw Blame History

#!/bin/bash
# Ultroid Docker Deployment Script
# Based on official Ultroid deployment guide
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
echo -e "${BLUE}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ 🚀 ULTROID DOCKER SETUP ║"
echo "║ Advanced Telegram UserBot Deployment ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
# Function to check if command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Check for Docker and Docker Compose
echo -e "${BLUE}🔍 Checking dependencies...${NC}"
if ! command_exists docker; then
echo -e "${RED}❌ Docker not found. Please install Docker first.${NC}"
echo "Installation: https://docs.docker.com/get-docker/"
exit 1
fi
if ! command_exists docker-compose && ! docker compose version &>/dev/null; then
echo -e "${RED}❌ Docker Compose not found. Please install Docker Compose first.${NC}"
echo "Installation: https://docs.docker.com/compose/install/"
exit 1
fi
echo -e "${GREEN}✅ Docker found: $(docker --version)${NC}"
echo -e "${GREEN}✅ Docker Compose found${NC}"
# Setup environment
echo -e "\n${BLUE}📋 Setting up environment...${NC}"
if [ ! -f ".env" ]; then
echo -e "${YELLOW}📝 Creating .env file from template...${NC}"
cp .env.sample .env
echo -e "${YELLOW}⚠️ Please edit .env file with your configuration before starting!${NC}"
echo -e "\n${PURPLE}📖 Required variables to fill in .env:${NC}"
echo -e " ${YELLOW}SESSION${NC} - Get from @SessionGeneratorBot"
echo -e " ${YELLOW}API_ID${NC} - Get from https://my.telegram.org/apps"
echo -e " ${YELLOW}API_HASH${NC} - Get from https://my.telegram.org/apps"
echo -e " ${YELLOW}BOT_TOKEN${NC} - Optional assistant bot token"
echo -e " ${YELLOW}OWNER_ID${NC} - Your Telegram user ID"
read -p "Press Enter to continue after editing .env file..."
else
echo -e "${GREEN}✅ .env file found${NC}"
fi
# Check if SESSION is configured
if ! grep -q "SESSION=.\+" .env; then
echo -e "${RED}❌ SESSION not configured in .env file${NC}"
echo -e "${YELLOW}💡 Generate session string first!${NC}"
read -p "Do you want to generate session string using Docker? (y/n): " generate_session
if [[ $generate_session =~ ^[Yy]$ ]]; then
echo -e "${BLUE}🔑 Generating session string...${NC}"
mkdir -p session_output
docker-compose --profile session run --rm session-gen
echo -e "${GREEN}✅ Session generated! Add it to your .env file.${NC}"
exit 0
else
echo -e "${YELLOW}📝 Please generate session string manually:${NC}"
echo " 1. Go to @SessionGeneratorBot"
echo " 2. Or run: wget -O session.py https://git.io/JY9JI && python3 session.py"
echo " 3. Add the session string to .env file"
exit 1
fi
fi
# Create necessary directories
echo -e "\n${BLUE}📁 Creating directories...${NC}"
mkdir -p downloads uploads logs resources/session session_output
# Database selection
echo -e "\n${BLUE}🗄️ Database Configuration${NC}"
echo "Choose your database:"
echo "1. Redis (Recommended, included in docker-compose)"
echo "2. MongoDB (Alternative, included in docker-compose)"
echo "3. External Database (PostgreSQL/MongoDB)"
read -p "Select database (1-3): " db_choice
case $db_choice in
1)
echo -e "${GREEN}✅ Using Redis database${NC}"
# Update .env to use Redis
sed -i 's/^#.*REDIS_URI=/REDIS_URI=/' .env
sed -i 's/^#.*REDIS_PASSWORD=/REDIS_PASSWORD=/' .env
;;
2)
echo -e "${GREEN}✅ Using MongoDB database${NC}"
# Update .env to use MongoDB
sed -i 's/^REDIS_URI=/#REDIS_URI=/' .env
sed -i 's/^REDIS_PASSWORD=/#REDIS_PASSWORD=/' .env
sed -i 's/^#.*MONGO_URI=/MONGO_URI=/' .env
;;
3)
echo -e "${YELLOW}⚠️ Please configure external database in .env file${NC}"
;;
*)
echo -e "${GREEN}✅ Using default Redis configuration${NC}"
;;
esac
# Optional features
echo -e "\n${BLUE}🔧 Optional Features${NC}"
read -p "Enable Google Drive features? (y/n): " enable_gdrive
if [[ $enable_gdrive =~ ^[Yy]$ ]]; then
if [ ! -f "credentials.json" ]; then
echo -e "${YELLOW}📝 Google Drive credentials.json not found${NC}"
echo " 1. Go to https://console.developers.google.com/"
echo " 2. Create a project and enable Google Drive API"
echo " 3. Download credentials.json to this directory"
read -p "Continue without Google Drive? (y/n): " continue_without
if [[ ! $continue_without =~ ^[Yy]$ ]]; then
exit 1
fi
else
echo -e "${GREEN}✅ Google Drive credentials found${NC}"
fi
fi
# Safety check for existing bot setup
echo -e "${BLUE}🔍 Checking for existing bot setup...${NC}"
EXISTING_SETUP=false
STARTUP_METHOD=""
# Check for existing .env file with session
if [ -f ".env" ] && grep -q "SESSION=.\+" .env; then
EXISTING_SETUP=true
STARTUP_METHOD="Environment file (.env)"
fi
# Check for existing session files
if [ -f "resources/session/"* ] 2>/dev/null || [ -f "*.session" ] 2>/dev/null; then
EXISTING_SETUP=true
STARTUP_METHOD="${STARTUP_METHOD}, Session files"
fi
# Check for running processes (including startup script and multi_client)
if pgrep -f "pyUltroid\|startup\|multi_client" > /dev/null 2>&1; then
EXISTING_SETUP=true
STARTUP_METHOD="${STARTUP_METHOD}, Running bot process"
fi
# Check if startup script exists and is executable (bash startup method)
if [ -f "startup" ] && [ -x "startup" ]; then
EXISTING_SETUP=true
STARTUP_METHOD="${STARTUP_METHOD}, Startup script (bash startup)"
fi
if [ "$EXISTING_SETUP" = true ]; then
echo -e "${YELLOW}⚠️ EXISTING BOT SETUP DETECTED!${NC}"
echo ""
echo -e "${BLUE}<EFBFBD> Detected method:${STARTUP_METHOD}${NC}"
echo -e "${RED}🛑 Found evidence of existing Ultroid setup${NC}"
echo ""
echo -e "${YELLOW}📋 Choose your deployment method:${NC}"
echo "1. Safe Docker Setup (Recommended) - Creates isolated environment"
echo "2. Replace existing setup (DANGEROUS - will overwrite)"
echo "3. Cancel deployment"
echo ""
read -p "Select option (1-3): " safety_choice
case $safety_choice in
1)
echo -e "${GREEN}✅ Switching to safe Docker setup...${NC}"
echo -e "${BLUE}Your 'bash startup' method will remain untouched!${NC}"
exec ./safe-docker-setup.sh
exit 0
;;
2)
echo -e "${RED}⚠️ WARNING: This will overwrite your existing setup!${NC}"
echo -e "${YELLOW}This includes your current 'bash startup' configuration!${NC}"
read -p "Are you absolutely sure? Type 'YES' to continue: " confirm
if [ "$confirm" != "YES" ]; then
echo "Deployment cancelled for safety."
exit 0
fi
echo -e "${YELLOW}🔄 Proceeding with replacement...${NC}"
;;
3)
echo "Deployment cancelled."
exit 0
;;
*)
echo -e "${RED}❌ Invalid selection${NC}"
exit 1
;;
esac
fi
# Build and start services
echo -e "\n${BLUE}🚀 Starting Ultroid services...${NC}"
echo -e "${YELLOW}📦 Building Docker image...${NC}"
docker-compose build
case $db_choice in
1)
echo -e "${BLUE}🚀 Starting Redis + Ultroid...${NC}"
docker-compose up -d redis ultroid
;;
2)
echo -e "${BLUE}🚀 Starting MongoDB + Ultroid...${NC}"
docker-compose up -d mongodb ultroid
;;
*)
echo -e "${BLUE}🚀 Starting Ultroid only...${NC}"
docker-compose up -d ultroid
;;
esac
# Wait for services to start
echo -e "${YELLOW}⏳ Waiting for services to start...${NC}"
sleep 10
# Check service status
echo -e "\n${BLUE}📊 Service Status:${NC}"
docker-compose ps
# Show logs
echo -e "\n${BLUE}📝 Recent logs:${NC}"
docker-compose logs --tail=20 ultroid
# Success message
echo -e "\n${GREEN}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ 🎉 DEPLOYMENT COMPLETE! ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
echo -e "${GREEN}✅ Ultroid is now running in Docker!${NC}"
echo -e "\n${BLUE}📋 Management Commands:${NC}"
echo -e " ${YELLOW}View logs:${NC} docker-compose logs -f ultroid"
echo -e " ${YELLOW}Restart bot:${NC} docker-compose restart ultroid"
echo -e " ${YELLOW}Stop bot:${NC} docker-compose down"
echo -e " ${YELLOW}Update bot:${NC} git pull && docker-compose build && docker-compose up -d"
echo -e " ${YELLOW}Shell access:${NC} docker-compose exec ultroid bash"
echo -e "\n${BLUE}🔍 Service URLs:${NC}"
if [[ $db_choice == "1" ]]; then
echo -e " ${YELLOW}Redis:${NC} localhost:6379"
fi
if [[ $db_choice == "2" ]]; then
echo -e " ${YELLOW}MongoDB:${NC} localhost:27017"
fi
echo -e "\n${PURPLE}💡 Next Steps:${NC}"
echo -e " 1. Check logs to ensure bot is working: ${YELLOW}docker-compose logs -f ultroid${NC}"
echo -e " 2. Send ${YELLOW}.alive${NC} command to your bot to test"
echo -e " 3. Configure additional features in .env if needed"
echo -e " 4. Add more plugins from addons/ directory"
echo -e "\n${GREEN}🎊 Happy botting!${NC}"