├── README.md └── ibsng.sh /README.md: -------------------------------------------------------------------------------- 1 | 📡 Ushkaya Net - IBSng Docker Management Script 2 | 3 |

یک راه‌حل جامع برای مدیریت IBSng در محیط داکر با قابلیت‌های پیشرفته

4 | 5 | 6 | 7 | 8 | | 🔴 توجه: عملیات نصب در سرورهای ایران به علت تحریم‌ها و نیاز به استفاده از DNS شکن 9 | 10 | | ممکن است نسبت به اینترنت سرور و ساعت استفاده، زمان‌گیر باشد. 11 | 12 | | 🟢 لطفاً در حین نصب صبور باشید و از قطع کردن فرآیند خودداری نمایید. 13 | 14 | | 🟠 پیشنهاد می‌شود در ساعات کم‌ترافیک (شبانه‌روز) اقدام به نصب نمایید. 15 | | 16 | 17 | 🌟 ویژگی‌های کلیدی 18 | 19 | 20 | 🚀 نصب خودکار با تشخیص هوشمند پیش‌نیازها 21 | 22 | 🔄 مدیریت کامل چرخه حیات (نصب، پشتیبان‌گیری، بازیابی، حذف) 23 | 24 | 🛡️ حل خودکار مشکلات تحریم با سیستم DNS شکن 25 | 26 | 📊 نمایش گرافیکی وضعیت و اطلاعات دسترسی 27 | 28 | ⚡ بهینه‌سازی شده برای سرورهای ایرانی 29 | 30 | ## 🛠️ نحوه استفاده 31 | 32 | ```bash 33 | bash <(curl -s https://raw.githubusercontent.com/aliamg1356/IBSng-manager/refs/heads/main/ibsng.sh --ipv4) 34 | 35 | ``` 36 | 37 | یوزر و پسورد پیش فرض 38 | 39 | username: system 40 | 41 | Pssword:admin 42 | ## 🖥️ منوهای اصلی 43 | 44 | 1. **نصب IBSng**: 45 | - بررسی و نصب خودکار داکر 46 | - دریافت پیکربندی‌های لازم 47 | - راه‌اندازی کانتینر 48 | 49 | 2. **پشتیبان‌گیری**: 50 | - ایجاد دامپ از دیتابیس 51 | - فشرده‌سازی و ذخیره پشتیبان 52 | - پاکسازی لاگ‌های قدیمی 53 | 54 | 3. **بازیابی**: 55 | - بازیابی دیتابیس از فایل پشتیبان 56 | - بازگردانی کامل سرویس 57 | 58 | 4. **حذف**: 59 | - توقف و حذف کانتینر 60 | - پاکسازی ایمیج‌های استفاده شده 61 | 62 | ## 🛡️ امنیت و قابلیت اطمینان 63 | 64 | - استفاده از مکانیزم‌های اعتبارسنجی در هر مرحله 65 | - حفظ امنیت اطلاعات حساس 66 | - امکان بازگردانی تغییرات در صورت بروز خطا 67 | - ثبت لاگ کامل از عملیات انجام شده 68 | 69 | ## 📌 نکات فنی 70 | 71 | - سازگار با سیستم‌های مبتنی بر لینوکس 72 | - پشتیبانی از Docker و Docker Compose 73 | - قابلیت اجرا روی سرورهای اختصاصی و مجازی 74 | 75 | 76 | ریستور بکاپ از IBSng 77 | 78 | اگر بکاپی از خود ibsng دارین برای ریستور به این دارک اول فایل دامپ رو به IBSng.bak تغییر نام داده و در /root کپی کنید بعد دستورات زیر رو به ترتیب وارد کنید(حتما دستورات رو یک به یک وارد کنید) 79 | ``` 80 | docker cp /root/IBSng.bak ibsng:/var/lib/pgsql/IBSng.bak 81 | 82 | docker exec -it ibsng /bin/bash 83 | service IBSng stop 84 | su - postgres 85 | dropdb IBSng 86 | createdb IBSng 87 | createlang plpgsql IBSng 88 | psql IBSng < IBSng.bak 89 | exit 90 | service IBSng start 91 | ``` 92 | بعد با ctrl+d از محیط کانتینر خارج شوید 93 | 94 | 95 | ## 💰 حمایت مالی 96 | 97 | ما از حمایت شما برای توسعه و بهبود مستمر پروژه قدردانی می‌کنیم: 98 | 99 |
100 | 101 | | شبکه | نوع ارز | آدرس کیف پول | آیکون | 102 | |--------------|--------------|------------------------------------------|------------| 103 | | **Tron** | TRX (TRC20) | `TMXRpCsbz8PKzqN4koXiErawdLXzeinWbQ` | | 104 | | **Ethereum** | USDT (ERC20) | `0xD4cEBA0cFf6769Fb9EFE4606bE59C363Ff85BF76` | | 105 | 106 |
107 | 108 |
109 |

🙏 از اعتماد و حمایت ارزشمند شما سپاسگزاریم

110 |

هر میزان کمک مالی، انگیزه‌ای برای توسعه و ارتقای پروژه خواهد بود

111 |
112 | 113 | 114 | 115 | 116 | ## 📞 پشتیبانی 117 | 118 | برای گزارش مشکلات یا پیشنهادات: 119 | - 120 |

Made with love Powered by Ushkaya Net

121 | -------------------------------------------------------------------------------- /ibsng.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Colors for better output 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[1;33m' 7 | BLUE='\033[0;34m' 8 | CYAN='\033[0;36m' 9 | PURPLE='\033[0;35m' 10 | NC='\033[0m' # No Color 11 | 12 | # Function to display progress bar 13 | function show_progress() { 14 | local current=$1 15 | local total=$2 16 | local message=$3 17 | local width=50 18 | local percent=$((current * 100 / total)) 19 | local progress=$((current * width / total)) 20 | 21 | # Calculate remaining time (simple estimation) 22 | local elapsed=$((SECONDS - start_time)) 23 | local remaining=$(( (elapsed * (total - current)) / (current > 0 ? current : 1) )) 24 | local mins=$((remaining / 60)) 25 | local secs=$((remaining % 60)) 26 | 27 | printf "\r${CYAN}[${PURPLE}%-${width}s${CYAN}] ${GREEN}%3d%%${CYAN} - %s ${YELLOW}(%02d:%02d remaining)${NC}" \ 28 | "$(printf '#%.0s' $(seq 1 $progress))" \ 29 | "$percent" \ 30 | "$message" \ 31 | "$mins" "$secs" 32 | } 33 | 34 | # Function to display logo 35 | function show_logo() { 36 | clear 37 | echo -e "${PURPLE}" 38 | echo " ██╗ ██╗███████╗██╗ ██╗██╗ ██╗ █████╗ ██╗ ██╗ █████╗ " 39 | echo " ██║ ██║██╔════╝██║ ██║██║ ██╔╝██╔══██╗╚██╗ ██╔╝██╔══██╗" 40 | echo " ██║ ██║███████╗███████║█████╔╝ ███████║ ╚████╔╝ ███████║" 41 | echo " ██║ ██║╚════██║██╔══██║██╔═██╗ ██╔══██║ ╚██╔╝ ██╔══██║" 42 | echo " ╚██████╔╝███████║██║ ██║██║ ██╗██║ ██║ ██║ ██║ ██║" 43 | echo " ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝" 44 | echo -e "${CYAN} USHKAYA NET IBSng manager ${NC}" 45 | echo -e "${BLUE}===================================================${NC}" 46 | echo 47 | } 48 | 49 | # Function to set Electro DNS 50 | function set_electro_dns() { 51 | echo -e "${YELLOW}[!] Temporarily setting Electro DNS...${NC}" 52 | OLD_RESOLV=$(cat /etc/resolv.conf) 53 | echo "nameserver 78.157.42.100" > /etc/resolv.conf 54 | echo "nameserver 78.157.42.101" >> /etc/resolv.conf 55 | } 56 | 57 | # Function to restore original DNS 58 | function restore_old_dns() { 59 | if [ -n "$OLD_RESOLV" ]; then 60 | echo -e "${YELLOW}[!] Restoring original DNS...${NC}" 61 | echo "$OLD_RESOLV" > /etc/resolv.conf 62 | fi 63 | } 64 | 65 | # Function to try Docker installation normally 66 | function try_normal_install() { 67 | echo -e "${BLUE}[i] Trying normal Docker installation...${NC}" 68 | if bash <(curl -sSL https://get.docker.com); then 69 | return 0 70 | else 71 | return 1 72 | fi 73 | } 74 | 75 | # Function to install Docker with Electro DNS 76 | function install_with_electro() { 77 | set_electro_dns 78 | echo -e "${BLUE}[i] Trying Docker installation with Electro DNS...${NC}" 79 | if bash <(curl -sSL https://get.docker.com); then 80 | restore_old_dns 81 | return 0 82 | else 83 | restore_old_dns 84 | return 1 85 | fi 86 | } 87 | 88 | # Function to install Docker manually 89 | function install_docker_manual() { 90 | start_time=$SECONDS 91 | total_steps=10 92 | 93 | # Try normal installation first 94 | show_progress 1 $total_steps "Attempting normal Docker install..." 95 | if try_normal_install; then 96 | echo -e "\n${GREEN}[✓] Docker installed successfully without Electro DNS${NC}" 97 | return 0 98 | fi 99 | 100 | # If normal install failed, ask to use Electro 101 | echo -e "\n${RED}[!] Docker installation failed - possible sanctions issue${NC}" 102 | read -p "Do you want to use Electro DNS for installation? (y/n): " -n 1 -r 103 | echo 104 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 105 | echo -e "${RED}[!] Installation aborted. Please install manually.${NC}" 106 | exit 1 107 | fi 108 | 109 | # Proceed with Electro DNS 110 | show_progress 2 $total_steps "Installing with Electro DNS..." 111 | if install_with_electro; then 112 | echo -e "\n${GREEN}[✓] Docker installed successfully with Electro DNS${NC}" 113 | else 114 | echo -e "\n${RED}[!] Docker installation failed even with Electro DNS.${NC}" 115 | exit 1 116 | fi 117 | 118 | # Install Docker Compose 119 | show_progress 3 $total_steps "Installing Docker Compose..." 120 | curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 121 | chmod +x /usr/local/bin/docker-compose 122 | 123 | # Start and enable Docker 124 | show_progress 4 $total_steps "Starting Docker service..." 125 | systemctl start docker 126 | 127 | show_progress 5 $total_steps "Enabling Docker on boot..." 128 | systemctl enable docker 129 | 130 | echo -e "\n${GREEN}[✓] Docker installed and configured successfully.${NC}" 131 | } 132 | 133 | # Function to check Docker installation and service 134 | function check_docker_installation() { 135 | start_time=$SECONDS 136 | total_steps=4 137 | 138 | # Check if Docker is installed 139 | if command -v docker &> /dev/null && command -v docker-compose &> /dev/null; then 140 | show_progress 1 $total_steps "Checking Docker installation..." 141 | echo -e "\n${GREEN}[✓] Docker and Docker Compose are already installed.${NC}" 142 | 143 | # Check if Docker service is running 144 | show_progress 2 $total_steps "Checking Docker service status..." 145 | if systemctl is-active --quiet docker; then 146 | echo -e "\n${GREEN}[✓] Docker service is already running.${NC}" 147 | return 0 148 | else 149 | show_progress 3 $total_steps "Starting Docker service..." 150 | if sudo systemctl start docker; then 151 | echo -e "\n${GREEN}[✓] Docker service started successfully.${NC}" 152 | return 0 153 | else 154 | echo -e "\n${RED}[!] Failed to start Docker service.${NC}" 155 | exit 1 156 | fi 157 | fi 158 | fi 159 | 160 | # If Docker is not installed, proceed with installation 161 | install_docker_manual 162 | } 163 | 164 | # Function to get public IP 165 | function get_public_ip() { 166 | start_time=$SECONDS 167 | total_steps=1 168 | show_progress 1 $total_steps "Getting server IP address..." 169 | 170 | MAIN_IP=$(ip route get 1 | awk '{print $7; exit}' 2>/dev/null) 171 | 172 | if [[ -z "$MAIN_IP" || "$MAIN_IP" =~ ^(127.|172.17.) ]]; then 173 | MAIN_IP=$(hostname -I | awk '{print $1}' 2>/dev/null) 174 | fi 175 | 176 | if [[ -z "$MAIN_IP" || "$MAIN_IP" =~ ^(127.|172.17.) ]]; then 177 | MAIN_IP=$(ip addr show | grep -E 'inet (192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)' | awk '{print $2}' | cut -d/ -f1 | head -n1) 178 | fi 179 | 180 | if [[ -z "$MAIN_IP" ]]; then 181 | echo -e "\n${YELLOW}[!] Could not determine server IP, using 'localhost'${NC}" 182 | MAIN_IP="localhost" 183 | else 184 | echo -e "\n${BLUE}[i] Server Main IP: ${MAIN_IP}${NC}" 185 | fi 186 | 187 | PUBLIC_IP=$MAIN_IP 188 | } 189 | 190 | # Function to get ports from user 191 | function get_ports() { 192 | start_time=$SECONDS 193 | total_steps=3 194 | 195 | show_progress 1 $total_steps "Getting web port..." 196 | read -p "Web Port (default 80): " WEB_PORT 197 | WEB_PORT=${WEB_PORT:-80} 198 | 199 | show_progress 2 $total_steps "Getting RADIUS auth port..." 200 | read -p "RADIUS Authentication Port (default 1812): " RADIUS_AUTH_PORT 201 | RADIUS_AUTH_PORT=${RADIUS_AUTH_PORT:-1812} 202 | 203 | show_progress 3 $total_steps "Getting RADIUS accounting port..." 204 | read -p "RADIUS Accounting Port (default 1813): " RADIUS_ACCT_PORT 205 | RADIUS_ACCT_PORT=${RADIUS_ACCT_PORT:-1813} 206 | } 207 | 208 | # Function to download and import Docker image 209 | function download_and_import_image() { 210 | start_time=$SECONDS 211 | total_steps=3 212 | 213 | show_progress 1 $total_steps "Downloading IBSng Docker image..." 214 | IMAGE_URL="https://github.com/aliamg1356/IBSng-manager/releases/download/v1.24/ushkayanet-ibsng.tar" 215 | TEMP_FILE="/tmp/ushkayanet-ibsng.tar" 216 | 217 | # Try normal download first 218 | if ! curl -L -o "$TEMP_FILE" "$IMAGE_URL"; then 219 | echo -e "\n${RED}[!] Download failed - trying with Electro DNS...${NC}" 220 | set_electro_dns 221 | if ! curl -L -o "$TEMP_FILE" "$IMAGE_URL"; then 222 | restore_old_dns 223 | echo -e "\n${RED}[!] Failed to download image even with Electro DNS.${NC}" 224 | exit 1 225 | fi 226 | restore_old_dns 227 | fi 228 | 229 | show_progress 2 $total_steps "Importing Docker image..." 230 | if ! docker load -i "$TEMP_FILE"; then 231 | echo -e "\n${RED}[!] Failed to import Docker image.${NC}" 232 | exit 1 233 | fi 234 | 235 | show_progress 3 $total_steps "Cleaning up..." 236 | rm -f "$TEMP_FILE" 237 | 238 | echo -e "\n${GREEN}[✓] Docker image imported successfully.${NC}" 239 | } 240 | 241 | # Function to create docker-compose file 242 | function create_docker_compose() { 243 | start_time=$SECONDS 244 | total_steps=2 245 | 246 | show_progress 1 $total_steps "Creating IBSng directory..." 247 | mkdir -p /opt/ibsng 248 | 249 | show_progress 2 $total_steps "Generating docker-compose file..." 250 | cat > /opt/ibsng/docker-compose.yml < /var/lib/pgsql/IBSng.bak' && \ 292 | tar czf /tmp/ibsng_backup.tar.gz /var/lib/pgsql/IBSng.bak" 293 | 294 | show_progress 3 $total_steps "Copying backup from container..." 295 | docker cp ibsng:/tmp/ibsng_backup.tar.gz $BACKUP_FILE 296 | 297 | show_progress 4 $total_steps "Cleaning up inside container..." 298 | docker exec ibsng /bin/bash -c "rm -f /tmp/ibsng_backup.tar.gz /var/lib/pgsql/IBSng.bak" 299 | 300 | if [ -f "$BACKUP_FILE" ]; then 301 | echo -e "\n${GREEN}[✓] Backup created successfully at: $BACKUP_FILE${NC}" 302 | echo -e "${BLUE}Backup size: $(du -h $BACKUP_FILE | cut -f1)${NC}" 303 | echo -e "${BLUE}Backup date: $(date -r $BACKUP_FILE)${NC}" 304 | else 305 | echo -e "\n${RED}[!] Backup failed!${NC}" 306 | exit 1 307 | fi 308 | } 309 | 310 | # Function to restore backup (improved version) 311 | function restore() { 312 | start_time=$SECONDS 313 | total_steps=6 314 | 315 | show_progress 1 $total_steps "Finding latest backup..." 316 | BACKUP_FILE=$(ls -t /root/ibsng_backup_*.tar.gz 2>/dev/null | head -n 1) 317 | 318 | if [ -z "$BACKUP_FILE" ]; then 319 | echo -e "\n${RED}[!] No backup files found in /root!${NC}" 320 | echo -e "${YELLOW}Backup files should start with 'ibsng_backup_' and be in /root directory.${NC}" 321 | exit 1 322 | fi 323 | 324 | echo -e "\n${BLUE}[i] Selected backup file: $BACKUP_FILE${NC}" 325 | echo -e "${BLUE}Backup date: $(stat -c %y $BACKUP_FILE)${NC}" 326 | echo -e "${BLUE}Backup size: $(du -h $BACKUP_FILE | cut -f1)${NC}" 327 | 328 | read -p "Are you sure you want to restore this backup? (y/n): " -n 1 -r 329 | echo 330 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 331 | echo -e "${YELLOW}[!] Restoration canceled.${NC}" 332 | exit 0 333 | fi 334 | 335 | show_progress 2 $total_steps "Extracting backup file..." 336 | TEMP_DIR=$(mktemp -d) 337 | tar xzf $BACKUP_FILE -C $TEMP_DIR 338 | 339 | show_progress 3 $total_steps "Copying backup to container..." 340 | docker cp $TEMP_DIR/var/lib/pgsql/IBSng.bak ibsng:/var/lib/pgsql/IBSng.bak 341 | 342 | show_progress 4 $total_steps "Cleaning up temp files..." 343 | rm -rf $TEMP_DIR 344 | 345 | show_progress 5 $total_steps "Restoring database inside container..." 346 | docker exec -it ibsng /bin/bash -c "\ 347 | service IBSng stop && \ 348 | su - postgres -c '\ 349 | dropdb IBSng && \ 350 | createdb IBSng && \ 351 | createlang plpgsql IBSng && \ 352 | psql IBSng < /var/lib/pgsql/IBSng.bak' && \ 353 | service IBSng start" 354 | 355 | show_progress 6 $total_steps "Final cleanup..." 356 | docker exec ibsng rm -f /var/lib/pgsql/IBSng.bak 357 | 358 | echo -e "\n${GREEN}[✓] Backup restored successfully from: $BACKUP_FILE${NC}" 359 | } 360 | 361 | # Function to remove container (improved version) 362 | function remove() { 363 | start_time=$SECONDS 364 | total_steps=4 365 | 366 | show_progress 1 $total_steps "Checking if IBSng container exists..." 367 | if ! docker ps -a --format '{{.Names}}' | grep -q '^ibsng$'; then 368 | echo -e "\n${RED}[!] IBSng container not found!${NC}" 369 | exit 1 370 | fi 371 | 372 | read -p "Are you sure you want to completely remove IBSng container? (y/n): " -n 1 -r 373 | echo 374 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 375 | echo -e "${YELLOW}[!] Removal canceled.${NC}" 376 | exit 0 377 | fi 378 | 379 | show_progress 2 $total_steps "Stopping and removing container..." 380 | cd /opt/ibsng 381 | docker compose down 382 | 383 | show_progress 3 $total_steps "Removing network..." 384 | docker network rm ibsng_net 2>/dev/null || true 385 | 386 | show_progress 4 $total_steps "Removing Docker image..." 387 | docker rmi ushkayanet-ibsng 2>/dev/null || true 388 | 389 | echo -e "\n${GREEN}[✓] IBSng container, network and image removed successfully!${NC}" 390 | } 391 | 392 | # Function to run container and show info 393 | function run_container_and_show_info() { 394 | start_time=$SECONDS 395 | total_steps=2 396 | 397 | cd /opt/ibsng 398 | 399 | show_progress 1 $total_steps "Starting IBSng container..." 400 | if ! docker compose up -d; then 401 | echo -e "\n${RED}[!] Container startup failed.${NC}" 402 | exit 1 403 | fi 404 | 405 | # Show access information 406 | echo -e "\n${GREEN}[✓] IBSng container started successfully.${NC}" 407 | echo -e "${CYAN}" 408 | echo "==============================================" 409 | echo " IBSng Access Information" 410 | echo "==============================================" 411 | echo -e "Management Panel: ${BLUE}http://${MAIN_IP}:${WEB_PORT}/IBSng/admin/${NC}" 412 | echo -e "Username: ${YELLOW}system${NC}" 413 | echo -e "Password: ${YELLOW}admin${NC}" 414 | echo "==============================================" 415 | echo -e "${NC}" 416 | } 417 | 418 | # Main function 419 | function main() { 420 | show_logo 421 | 422 | echo -e "${BLUE}Please select an option:${NC}" 423 | echo "1) Install IBSng" 424 | echo "2) Create Backup" 425 | echo "3) Restore Backup" 426 | echo "4) Remove Container" 427 | echo "5) Exit" 428 | 429 | read -p "Your choice (1-5): " choice 430 | 431 | case $choice in 432 | 1) 433 | check_docker_installation 434 | get_public_ip 435 | get_ports 436 | download_and_import_image 437 | create_docker_compose 438 | run_container_and_show_info 439 | ;; 440 | 2) 441 | backup 442 | ;; 443 | 3) 444 | restore 445 | ;; 446 | 4) 447 | remove 448 | ;; 449 | 5) 450 | echo -e "${GREEN}[✓] Exiting script.${NC}" 451 | exit 0 452 | ;; 453 | *) 454 | echo -e "${RED}[!] Invalid option!${NC}" 455 | exit 1 456 | ;; 457 | esac 458 | } 459 | 460 | # Execute main function 461 | main 462 | --------------------------------------------------------------------------------