├── 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 |
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 |
--------------------------------------------------------------------------------