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!
273 lines
10 KiB
Bash
273 lines
10 KiB
Bash
#!/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}"
|