Última atividade 1752669988

Инсталатор за Docker приложения в Proxmox контейнери

proxmox-apps-installer.sh Bruto
1#!/bin/bash
2
3# Proxmox Apps Installer
4# Професионален инсталатор за Docker приложения в Proxmox контейнери
5# Автор: Федя Серафиев
6# Версия: 1.0
7
8set -e
9
10# Цветове за по-добра визуализация
11RED='\033[0;31m'
12GREEN='\033[0;32m'
13YELLOW='\033[1;33m'
14BLUE='\033[0;34m'
15PURPLE='\033[0;35m'
16CYAN='\033[0;36m'
17WHITE='\033[1;37m'
18NC='\033[0m' # No Color
19
20# Глобални променливи
21INSTALL_DIR="/opt/proxmox-apps"
22DATA_DIR="/var/lib/proxmox-apps"
23LOG_FILE="/var/log/proxmox-apps-installer.log"
24
25# Функция за лог
26log() {
27 echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
28}
29
30# Функция за показване на header
31show_header() {
32 clear
33 echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
34 echo -e "${CYAN}${WHITE}PROXMOX APPS INSTALLER${CYAN}${NC}"
35 echo -e "${CYAN}${YELLOW}Професионален Docker инсталатор${CYAN}${NC}"
36 echo -e "${CYAN}╠═══════════════════════════════════════════════════════════════════════════════╣${NC}"
37 echo -e "${CYAN}${NC} ${GREEN}${NC} Nginx Proxy Manager - Reverse Proxy & SSL Management ${CYAN}${NC}"
38 echo -e "${CYAN}${NC} ${GREEN}${NC} Dashy V3 - Personalized Dashboard ${CYAN}${NC}"
39 echo -e "${CYAN}${NC} ${GREEN}${NC} File Browser - Web File Manager ${CYAN}${NC}"
40 echo -e "${CYAN}${NC} ${GREEN}${NC} Droppy - Modern File Sharing ${CYAN}${NC}"
41 echo -e "${CYAN}${NC} ${GREEN}${NC} OpenGist - Self-hosted Pastebin ${CYAN}${NC}"
42 echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
43 echo ""
44}
45
46# Функция за почистване на проблемни repositories
47fix_repositories() {
48 log "Почистване на проблемни repositories..."
49
50 # Почистване на AnyDesk repository ако създава проблеми
51 if [[ -f /etc/apt/sources.list.d/anydesk-stable.list ]]; then
52 echo -e "${YELLOW}⚠️ Намерен AnyDesk repository, премахвам временно...${NC}"
53 mv /etc/apt/sources.list.d/anydesk-stable.list /etc/apt/sources.list.d/anydesk-stable.list.bak || true
54 fi
55
56 # Почистване на кеша
57 apt-get clean
58 rm -rf /var/lib/apt/lists/*
59
60 # Актуализиране на пакетите
61 apt-get update -qq
62
63 log "Repositories са почистени"
64}
65
66# Функция за проверка на системни изисквания
67check_requirements() {
68 log "Проверка на системни изисквания..."
69
70 # Почистване на repositories преди проверка
71 fix_repositories
72
73 # Проверка дали сме в Proxmox контейнер
74 if [[ ! -f /proc/1/cgroup ]] || ! grep -q "lxc" /proc/1/cgroup 2>/dev/null; then
75 echo -e "${YELLOW}⚠️ Предупреждение: Не се засича Proxmox LXC контейнер${NC}"
76 echo -e "${YELLOW} Скриптът ще продължи, но е оптимизиран за Proxmox${NC}"
77 echo ""
78 fi
79
80 # Проверка на свободно пространство
81 AVAILABLE_SPACE=$(df / | tail -1 | awk '{print $4}')
82 if [[ $AVAILABLE_SPACE -lt 5242880 ]]; then # 5GB в KB
83 echo -e "${RED}❌ Недостатъчно дисково пространство. Нужни са поне 5GB${NC}"
84 exit 1
85 fi
86
87 # Проверка на мрежова свързаност
88 if ! ping -c 1 8.8.8.8 &> /dev/null; then
89 echo -e "${RED}❌ Няма интернет връзка${NC}"
90 exit 1
91 fi
92
93 echo -e "${GREEN}✅ Системните изисквания са изпълнени${NC}"
94}
95
96# Функция за инсталиране на Docker
97install_docker() {
98 if command -v docker &> /dev/null; then
99 log "Docker вече е инсталиран"
100 return 0
101 fi
102
103 log "Инсталиране на Docker..."
104 echo -e "${BLUE}📦 Инсталиране на Docker и Docker Compose...${NC}"
105
106 # Актуализиране на пакетите
107 apt-get update -qq
108 apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common
109
110 # Определяне на правилната Ubuntu версия за Docker
111 UBUNTU_CODENAME=$(lsb_release -cs)
112
113 # Проверка дали версията е поддържана от Docker
114 case $UBUNTU_CODENAME in
115 "focal"|"jammy"|"mantic"|"noble")
116 DOCKER_CODENAME=$UBUNTU_CODENAME
117 ;;
118 *)
119 # Ако версията не е поддържана, използвай focal като fallback
120 echo -e "${YELLOW}⚠️ Ubuntu $UBUNTU_CODENAME не е официално поддържана, използвам focal${NC}"
121 DOCKER_CODENAME="focal"
122 ;;
123 esac
124
125 # Премахване на стари Docker инсталации
126 apt-get remove -y docker docker-engine docker.io containerd runc || true
127
128 # Добавяне на Docker GPG ключ
129 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
130
131 # Добавяне на Docker repository
132 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $DOCKER_CODENAME stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
133
134 # Актуализиране на пакетите
135 apt-get update -qq
136
137 # Инсталиране на Docker
138 apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
139
140 # Проверка на инсталацията
141 if ! docker --version &> /dev/null; then
142 log "Грешка при инсталирането на Docker"
143 exit 1
144 fi
145
146 # Стартиране на Docker
147 systemctl enable docker
148 systemctl start docker
149
150 # Инсталиране на Docker Compose standalone
151 DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
152 curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
153 chmod +x /usr/local/bin/docker-compose
154
155 # Проверка на Docker Compose
156 if ! docker-compose --version &> /dev/null; then
157 log "Грешка при инсталирането на Docker Compose"
158 exit 1
159 fi
160
161 log "Docker е инсталиран успешно"
162}
163
164# Функция за създаване на директории
165create_directories() {
166 log "Създаване на директории..."
167
168 mkdir -p "$INSTALL_DIR"
169 mkdir -p "$DATA_DIR"
170 mkdir -p "$DATA_DIR/nginx-proxy-manager"
171 mkdir -p "$DATA_DIR/dashy"
172 mkdir -p "$DATA_DIR/filebrowser"
173 mkdir -p "$DATA_DIR/droppy"
174 mkdir -p "$DATA_DIR/opengist"
175
176 log "Директориите са създадени"
177}
178
179# Функция за диагностика на проблеми
180diagnose_system() {
181 echo -e "${BLUE}🔍 Диагностика на системата...${NC}"
182
183 echo -e "${YELLOW}📋 Система:${NC}"
184 echo " OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
185 echo " Kernel: $(uname -r)"
186 echo " Architecture: $(dpkg --print-architecture)"
187 echo ""
188
189 echo -e "${YELLOW}📋 Мрежа:${NC}"
190 echo " IP адрес: $(ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}' 2>/dev/null || echo 'Неизвестен')"
191 echo " DNS: $(cat /etc/resolv.conf | grep nameserver | head -1 | awk '{print $2}' || echo 'Неизвестен')"
192 echo ""
193
194 echo -e "${YELLOW}📋 Репозитории:${NC}"
195 apt-get update -qq 2>&1 | grep -E "(ERROR|WARNING|W:|E:)" | head -5 || echo " Няма грешки"
196 echo ""
197
198 echo -e "${YELLOW}📋 Дисково пространство:${NC}"
199 df -h / | tail -1 | awk '{print " Използвано: " $3 "/" $2 " (" $5 ")"}'
200 echo ""
201
202 echo -e "${YELLOW}📋 Памет:${NC}"
203 free -h | grep Mem | awk '{print " Използвана: " $3 "/" $2}'
204 echo ""
205}
206
207# Функция за автоматично поправяне на проблеми
208auto_fix() {
209 log "Автоматично поправяне на проблеми..."
210
211 # Поправяне на времева зона
212 if [[ ! -f /etc/timezone ]] || [[ $(cat /etc/timezone) != "Europe/Sofia" ]]; then
213 echo -e "${BLUE}🕐 Настройка на времева зона...${NC}"
214 ln -sf /usr/share/zoneinfo/Europe/Sofia /etc/localtime
215 echo "Europe/Sofia" > /etc/timezone
216 dpkg-reconfigure -f noninteractive tzdata
217 fi
218
219 # Поправяне на locale
220 if ! locale -a | grep -q "bg_BG.UTF-8"; then
221 echo -e "${BLUE}🌍 Инсталиране на български locale...${NC}"
222 apt-get install -y locales
223 locale-gen bg_BG.UTF-8
224 update-locale LANG=bg_BG.UTF-8
225 fi
226
227 # Поправяне на DNS
228 if ! grep -q "8.8.8.8" /etc/resolv.conf; then
229 echo -e "${BLUE}🌐 Добавяне на резервен DNS...${NC}"
230 echo "nameserver 8.8.8.8" >> /etc/resolv.conf
231 echo "nameserver 8.8.4.4" >> /etc/resolv.conf
232 fi
233
234 log "Автоматичното поправяне е завършено"
235}
236
237# Функция за генериране на случайни пароли
238generate_password() {
239 openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
240}
241
242# Функция за инсталиране на Nginx Proxy Manager
243install_nginx_proxy_manager() {
244 log "Инсталиране на Nginx Proxy Manager..."
245
246 cat > "$INSTALL_DIR/nginx-proxy-manager.yml" << 'EOF'
247version: '3.8'
248services:
249 nginx-proxy-manager:
250 image: 'jc21/nginx-proxy-manager:latest'
251 container_name: nginx-proxy-manager
252 restart: unless-stopped
253 ports:
254 - '80:80'
255 - '443:443'
256 - '81:81'
257 volumes:
258 - /var/lib/proxmox-apps/nginx-proxy-manager:/data
259 - /var/lib/proxmox-apps/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
260 environment:
261 - DISABLE_IPV6=true
262 networks:
263 - proxy-network
264 healthcheck:
265 test: ["CMD", "curl", "-f", "http://localhost:81/api/"]
266 interval: 30s
267 timeout: 10s
268 retries: 3
269
270networks:
271 proxy-network:
272 name: proxy-network
273 driver: bridge
274EOF
275
276 cd "$INSTALL_DIR"
277 docker-compose -f nginx-proxy-manager.yml up -d
278
279 echo -e "${GREEN}✅ Nginx Proxy Manager е инсталиран${NC}"
280 echo -e "${YELLOW}📋 Администриране: http://your-ip:81${NC}"
281 echo -e "${YELLOW}📋 Потребител: [email protected]${NC}"
282 echo -e "${YELLOW}📋 Парола: changeme${NC}"
283 echo ""
284}
285
286# Функция за инсталиране на Dashy V3
287install_dashy() {
288 log "Инсталиране на Dashy V3..."
289
290 # Създаване на базова конфигурация
291 cat > "$DATA_DIR/dashy/conf.yml" << 'EOF'
292pageInfo:
293 title: 'Proxmox Dashboard'
294 description: 'Персонализиран Dashboard за Proxmox Apps'
295 logo: 'https://raw.githubusercontent.com/Lissy93/dashy/master/public/img/dashy.png'
296
297appConfig:
298 theme: 'dark'
299 layout: 'auto'
300 iconSize: 'medium'
301 language: 'bg'
302
303sections:
304 - name: 'Proxmox Services'
305 icon: 'fas fa-server'
306 items:
307 - title: 'Nginx Proxy Manager'
308 description: 'Reverse Proxy & SSL Management'
309 url: 'http://localhost:81'
310 icon: 'fas fa-shield-alt'
311 - title: 'File Browser'
312 description: 'Web File Manager'
313 url: 'http://localhost:8080'
314 icon: 'fas fa-folder'
315 - title: 'Droppy'
316 description: 'File Sharing'
317 url: 'http://localhost:8989'
318 icon: 'fas fa-cloud-upload-alt'
319 - title: 'OpenGist'
320 description: 'Code Snippets'
321 url: 'http://localhost:6157'
322 icon: 'fas fa-code'
323
324 - name: 'System Info'
325 icon: 'fas fa-info-circle'
326 widgets:
327 - type: 'system-info'
328 options:
329 hostname: true
330 uptime: true
331 memory: true
332 cpu: true
333EOF
334
335 cat > "$INSTALL_DIR/dashy.yml" << 'EOF'
336version: '3.8'
337services:
338 dashy:
339 image: 'lissy93/dashy:latest'
340 container_name: dashy
341 restart: unless-stopped
342 ports:
343 - '4000:80'
344 volumes:
345 - /var/lib/proxmox-apps/dashy/conf.yml:/app/public/conf.yml:ro
346 environment:
347 - NODE_ENV=production
348 - UID=1000
349 - GID=1000
350 networks:
351 - proxy-network
352 healthcheck:
353 test: ["CMD", "curl", "-f", "http://localhost:80"]
354 interval: 30s
355 timeout: 10s
356 retries: 3
357
358networks:
359 proxy-network:
360 external: true
361EOF
362
363 cd "$INSTALL_DIR"
364 docker-compose -f dashy.yml up -d
365
366 echo -e "${GREEN}✅ Dashy V3 е инсталиран${NC}"
367 echo -e "${YELLOW}📋 Достъп: http://your-ip:4000${NC}"
368 echo ""
369}
370
371# Функция за инсталиране на File Browser
372install_filebrowser() {
373 log "Инсталиране на File Browser..."
374
375 # Създаване на база данни
376 touch "$DATA_DIR/filebrowser/database.db"
377
378 cat > "$INSTALL_DIR/filebrowser.yml" << 'EOF'
379version: '3.8'
380services:
381 filebrowser:
382 image: 'filebrowser/filebrowser:latest'
383 container_name: filebrowser
384 restart: unless-stopped
385 ports:
386 - '8080:80'
387 volumes:
388 - /var/lib/proxmox-apps/filebrowser/database.db:/database.db
389 - /var/lib/proxmox-apps:/srv/proxmox-apps
390 - /opt/proxmox-apps:/srv/configs
391 environment:
392 - FB_DATABASE=/database.db
393 - FB_ROOT=/srv
394 - FB_LOG=stdout
395 - FB_NOAUTH=false
396 networks:
397 - proxy-network
398 healthcheck:
399 test: ["CMD", "curl", "-f", "http://localhost:80/health"]
400 interval: 30s
401 timeout: 10s
402 retries: 3
403
404networks:
405 proxy-network:
406 external: true
407EOF
408
409 cd "$INSTALL_DIR"
410 docker-compose -f filebrowser.yml up -d
411
412 echo -e "${GREEN}✅ File Browser е инсталиран${NC}"
413 echo -e "${YELLOW}📋 Достъп: http://your-ip:8080${NC}"
414 echo -e "${YELLOW}📋 Потребител: admin${NC}"
415 echo -e "${YELLOW}📋 Парола: admin${NC}"
416 echo ""
417}
418
419# Функция за инсталиране на Droppy
420install_droppy() {
421 log "Инсталиране на Droppy..."
422
423 mkdir -p "$DATA_DIR/droppy/config"
424 mkdir -p "$DATA_DIR/droppy/files"
425
426 cat > "$INSTALL_DIR/droppy.yml" << 'EOF'
427version: '3.8'
428services:
429 droppy:
430 image: 'silverwind/droppy:latest'
431 container_name: droppy
432 restart: unless-stopped
433 ports:
434 - '8989:8989'
435 volumes:
436 - /var/lib/proxmox-apps/droppy/config:/app/config
437 - /var/lib/proxmox-apps/droppy/files:/app/files
438 environment:
439 - NODE_ENV=production
440 - UID=1000
441 - GID=1000
442 networks:
443 - proxy-network
444 healthcheck:
445 test: ["CMD", "curl", "-f", "http://localhost:8989"]
446 interval: 30s
447 timeout: 10s
448 retries: 3
449
450networks:
451 proxy-network:
452 external: true
453EOF
454
455 cd "$INSTALL_DIR"
456 docker-compose -f droppy.yml up -d
457
458 echo -e "${GREEN}✅ Droppy е инсталиран${NC}"
459 echo -e "${YELLOW}📋 Достъп: http://your-ip:8989${NC}"
460 echo ""
461}
462
463# Функция за инсталиране на OpenGist
464install_opengist() {
465 log "Инсталиране на OpenGist..."
466
467 OPENGIST_SECRET=$(generate_password)
468
469 cat > "$INSTALL_DIR/opengist.yml" << EOF
470version: '3.8'
471services:
472 opengist:
473 image: 'ghcr.io/thomiceli/opengist:latest'
474 container_name: opengist
475 restart: unless-stopped
476 ports:
477 - '6157:6157'
478 volumes:
479 - /var/lib/proxmox-apps/opengist:/opengist
480 environment:
481 - OG_DB_TYPE=sqlite
482 - OG_DB_PATH=/opengist/opengist.db
483 - OG_SECRET_KEY=${OPENGIST_SECRET}
484 - OG_EXTERNAL_URL=http://localhost:6157
485 - OG_LOG_LEVEL=info
486 - OG_DISABLE_SIGNUP=false
487 - OG_REQUIRE_LOGIN=false
488 networks:
489 - proxy-network
490 healthcheck:
491 test: ["CMD", "curl", "-f", "http://localhost:6157"]
492 interval: 30s
493 timeout: 10s
494 retries: 3
495
496networks:
497 proxy-network:
498 external: true
499EOF
500
501 cd "$INSTALL_DIR"
502 docker-compose -f opengist.yml up -d
503
504 echo -e "${GREEN}✅ OpenGist е инсталиран${NC}"
505 echo -e "${YELLOW}📋 Достъп: http://your-ip:6157${NC}"
506 echo ""
507}
508
509# Функция за създаване на master Docker Compose файл
510create_master_compose() {
511 log "Създаване на master Docker Compose файл..."
512
513 cat > "$INSTALL_DIR/docker-compose.yml" << 'EOF'
514version: '3.8'
515
516services:
517 # Nginx Proxy Manager
518 nginx-proxy-manager:
519 image: 'jc21/nginx-proxy-manager:latest'
520 container_name: nginx-proxy-manager
521 restart: unless-stopped
522 ports:
523 - '80:80'
524 - '443:443'
525 - '81:81'
526 volumes:
527 - /var/lib/proxmox-apps/nginx-proxy-manager:/data
528 - /var/lib/proxmox-apps/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
529 environment:
530 - DISABLE_IPV6=true
531 networks:
532 - proxy-network
533 healthcheck:
534 test: ["CMD", "curl", "-f", "http://localhost:81/api/"]
535 interval: 30s
536 timeout: 10s
537 retries: 3
538
539 # Dashy Dashboard
540 dashy:
541 image: 'lissy93/dashy:latest'
542 container_name: dashy
543 restart: unless-stopped
544 ports:
545 - '4000:80'
546 volumes:
547 - /var/lib/proxmox-apps/dashy/conf.yml:/app/public/conf.yml:ro
548 environment:
549 - NODE_ENV=production
550 - UID=1000
551 - GID=1000
552 networks:
553 - proxy-network
554 healthcheck:
555 test: ["CMD", "curl", "-f", "http://localhost:80"]
556 interval: 30s
557 timeout: 10s
558 retries: 3
559
560 # File Browser
561 filebrowser:
562 image: 'filebrowser/filebrowser:latest'
563 container_name: filebrowser
564 restart: unless-stopped
565 ports:
566 - '8080:80'
567 volumes:
568 - /var/lib/proxmox-apps/filebrowser/database.db:/database.db
569 - /var/lib/proxmox-apps:/srv/proxmox-apps
570 - /opt/proxmox-apps:/srv/configs
571 environment:
572 - FB_DATABASE=/database.db
573 - FB_ROOT=/srv
574 - FB_LOG=stdout
575 - FB_NOAUTH=false
576 networks:
577 - proxy-network
578 healthcheck:
579 test: ["CMD", "curl", "-f", "http://localhost:80/health"]
580 interval: 30s
581 timeout: 10s
582 retries: 3
583
584 # Droppy File Sharing
585 droppy:
586 image: 'silverwind/droppy:latest'
587 container_name: droppy
588 restart: unless-stopped
589 ports:
590 - '8989:8989'
591 volumes:
592 - /var/lib/proxmox-apps/droppy/config:/app/config
593 - /var/lib/proxmox-apps/droppy/files:/app/files
594 environment:
595 - NODE_ENV=production
596 - UID=1000
597 - GID=1000
598 networks:
599 - proxy-network
600 healthcheck:
601 test: ["CMD", "curl", "-f", "http://localhost:8989"]
602 interval: 30s
603 timeout: 10s
604 retries: 3
605
606 # OpenGist
607 opengist:
608 image: 'ghcr.io/thomiceli/opengist:latest'
609 container_name: opengist
610 restart: unless-stopped
611 ports:
612 - '6157:6157'
613 volumes:
614 - /var/lib/proxmox-apps/opengist:/opengist
615 environment:
616 - OG_DB_TYPE=sqlite
617 - OG_DB_PATH=/opengist/opengist.db
618 - OG_SECRET_KEY=CHANGE_THIS_SECRET_KEY
619 - OG_EXTERNAL_URL=http://localhost:6157
620 - OG_LOG_LEVEL=info
621 - OG_DISABLE_SIGNUP=false
622 - OG_REQUIRE_LOGIN=false
623 networks:
624 - proxy-network
625 healthcheck:
626 test: ["CMD", "curl", "-f", "http://localhost:6157"]
627 interval: 30s
628 timeout: 10s
629 retries: 3
630
631networks:
632 proxy-network:
633 name: proxy-network
634 driver: bridge
635EOF
636
637 # Заместване на placeholder-a за OpenGist secret
638 OPENGIST_SECRET=$(generate_password)
639 sed -i "s/CHANGE_THIS_SECRET_KEY/${OPENGIST_SECRET}/g" "$INSTALL_DIR/docker-compose.yml"
640
641 log "Master Docker Compose файлът е създаден"
642}
643
644# Функция за създаване на управляващи скриптове
645create_management_scripts() {
646 log "Създаване на управляващи скриптове..."
647
648 # Скрипт за старт на всички услуги
649 cat > "$INSTALL_DIR/start-all.sh" << 'EOF'
650#!/bin/bash
651cd /opt/proxmox-apps
652echo "Стартиране на всички услуги..."
653docker-compose up -d
654echo "Всички услуги са стартирани!"
655EOF
656
657 # Скрипт за спиране на всички услуги
658 cat > "$INSTALL_DIR/stop-all.sh" << 'EOF'
659#!/bin/bash
660cd /opt/proxmox-apps
661echo "Спиране на всички услуги..."
662docker-compose down
663echo "Всички услуги са спрени!"
664EOF
665
666 # Скрипт за рестарт на всички услуги
667 cat > "$INSTALL_DIR/restart-all.sh" << 'EOF'
668#!/bin/bash
669cd /opt/proxmox-apps
670echo "Рестартиране на всички услуги..."
671docker-compose down
672docker-compose up -d
673echo "Всички услуги са рестартирани!"
674EOF
675
676 # Скрипт за проверка на статуса
677 cat > "$INSTALL_DIR/status.sh" << 'EOF'
678#!/bin/bash
679cd /opt/proxmox-apps
680echo "Статус на услугите:"
681docker-compose ps
682echo ""
683echo "Използване на ресурси:"
684docker stats --no-stream
685EOF
686
687 # Скрипт за бекъп
688 cat > "$INSTALL_DIR/backup.sh" << 'EOF'
689#!/bin/bash
690BACKUP_DIR="/var/backups/proxmox-apps"
691DATE=$(date +%Y%m%d_%H%M%S)
692BACKUP_FILE="$BACKUP_DIR/proxmox-apps-backup-$DATE.tar.gz"
693
694mkdir -p "$BACKUP_DIR"
695
696echo "Създаване на бекъп..."
697tar -czf "$BACKUP_FILE" -C /var/lib proxmox-apps -C /opt proxmox-apps
698
699echo "Бекъпът е създаден: $BACKUP_FILE"
700ls -lh "$BACKUP_FILE"
701EOF
702
703 # Скрипт за актуализиране
704 cat > "$INSTALL_DIR/update.sh" << 'EOF'
705#!/bin/bash
706cd /opt/proxmox-apps
707echo "Актуализиране на Docker образите..."
708docker-compose pull
709docker-compose up -d
710echo "Премахване на стари образи..."
711docker image prune -f
712echo "Актуализирането е завършено!"
713EOF
714
715 # Правене на скриптовете изпълними
716 chmod +x "$INSTALL_DIR"/*.sh
717
718 log "Управляващите скриптове са създадени"
719}
720
721# Функция за показване на меню
722show_menu() {
723 show_header
724 echo -e "${WHITE}Изберете опция:${NC}"
725 echo ""
726 echo -e "${GREEN}1)${NC} Инсталиране на Nginx Proxy Manager"
727 echo -e "${GREEN}2)${NC} Инсталиране на Dashy V3"
728 echo -e "${GREEN}3)${NC} Инсталиране на File Browser"
729 echo -e "${GREEN}4)${NC} Инсталиране на Droppy"
730 echo -e "${GREEN}5)${NC} Инсталиране на OpenGist"
731 echo -e "${GREEN}6)${NC} Инсталиране на всички приложения"
732 echo -e "${GREEN}7)${NC} Показване на статус"
733 echo -e "${GREEN}8)${NC} Рестарт на всички услуги"
734 echo -e "${GREEN}9)${NC} Спиране на всички услуги"
735 echo -e "${GREEN}10)${NC} Създаване на бекъп"
736 echo -e "${GREEN}11)${NC} Актуализиране на приложенията"
737 echo -e "${RED}0)${NC} Изход"
738 echo ""
739 echo -e "${YELLOW}Моля, въведете вашия избор [0-11]:${NC} "
740}
741
742# Главна функция
743main() {
744 # Създаване на лог файл
745 touch "$LOG_FILE"
746 log "Стартиране на Proxmox Apps Installer"
747
748 # Проверка дали скриптът се изпълнява като root
749 if [[ $EUID -ne 0 ]]; then
750 echo -e "${RED}❌ Този скрипт трябва да се изпълни като root${NC}"
751 exit 1
752 fi
753
754 # Проверка на системни изисквания
755 check_requirements
756
757 # Инсталиране на Docker ако не е инсталиран
758 install_docker
759
760 # Създаване на директории
761 create_directories
762
763 # Главно меню
764 while true; do
765 show_menu
766 read -r choice
767
768 case $choice in
769 1)
770 echo -e "${BLUE}Инсталиране на Nginx Proxy Manager...${NC}"
771 install_nginx_proxy_manager
772 read -p "Натиснете Enter за да продължите..."
773 ;;
774 2)
775 echo -e "${BLUE}Инсталиране на Dashy V3...${NC}"
776 install_dashy
777 read -p "Натиснете Enter за да продължите..."
778 ;;
779 3)
780 echo -e "${BLUE}Инсталиране на File Browser...${NC}"
781 install_filebrowser
782 read -p "Натиснете Enter за да продължите..."
783 ;;
784 4)
785 echo -e "${BLUE}Инсталиране на Droppy...${NC}"
786 install_droppy
787 read -p "Натиснете Enter за да продължите..."
788 ;;
789 5)
790 echo -e "${BLUE}Инсталиране на OpenGist...${NC}"
791 install_opengist
792 read -p "Натиснете Enter за да продължите..."
793 ;;
794 6)
795 echo -e "${BLUE}Инсталиране на всички приложения...${NC}"
796 create_master_compose
797 cd "$INSTALL_DIR"
798 docker-compose up -d
799 create_management_scripts
800 echo -e "${GREEN}✅ Всички приложения са инсталирани успешно!${NC}"
801 echo ""
802 echo -e "${YELLOW}📋 Достъп до приложенията:${NC}"
803 echo -e "${CYAN} • Nginx Proxy Manager: http://your-ip:81${NC}"
804 echo -e "${CYAN} • Dashy Dashboard: http://your-ip:4000${NC}"
805 echo -e "${CYAN} • File Browser: http://your-ip:8080${NC}"
806 echo -e "${CYAN} • Droppy: http://your-ip:8989${NC}"
807 echo -e "${CYAN} • OpenGist: http://your-ip:6157${NC}"
808 echo ""
809 echo -e "${YELLOW}🔧 Управляващи скриптове в $INSTALL_DIR:${NC}"
810 echo -e "${CYAN} • ./start-all.sh - Стартиране на всички услуги${NC}"
811 echo -e "${CYAN} • ./stop-all.sh - Спиране на всички услуги${NC}"
812 echo -e "${CYAN} • ./restart-all.sh - Рестарт на всички услуги${NC}"
813 echo -e "${CYAN} • ./status.sh - Проверка на статуса${NC}"
814 echo -e "${CYAN} • ./backup.sh - Създаване на бекъп${NC}"
815 echo -e "${CYAN} • ./update.sh - Актуализиране${NC}"
816 read -p "Натиснете Enter за да продължите..."
817 ;;
818 7)
819 echo -e "${BLUE}Показване на статус...${NC}"
820 if [[ -f "$INSTALL_DIR/status.sh" ]]; then
821 bash "$INSTALL_DIR/status.sh"
822 else
823 echo -e "${RED}❌ Статус скриптът не е намерен${NC}"
824 fi
825 read -p "Натиснете Enter за да продължите..."
826 ;;
827 8)
828 echo -e "${BLUE}Рестарт на всички услуги...${NC}"
829 if [[ -f "$INSTALL_DIR/restart-all.sh" ]]; then
830 bash "$INSTALL_DIR/restart-all.sh"
831 else
832 echo -e "${RED}❌ Рестарт скриптът не е намерен${NC}"
833 fi
834 read -p "Натиснете Enter за да продължите..."
835 ;;
836 9)
837 echo -e "${BLUE}Спиране на всички услуги...${NC}"
838 if [[ -f "$INSTALL_DIR/stop-all.sh" ]]; then
839 bash "$INSTALL_DIR/stop-all.sh"
840 else
841 echo -e "${RED}❌ Стоп скриптът не е намерен${NC}"
842 fi
843 read -p "Натиснете Enter за да продължите..."
844 ;;
845 10)
846 echo -e "${BLUE}Създаване на бекъп...${NC}"
847 if [[ -f "$INSTALL_DIR/backup.sh" ]]; then
848 bash "$INSTALL_DIR/backup.sh"
849 else
850 echo -e "${RED}❌ Бекъп скриптът не е намерен${NC}"
851 fi
852 read -p "Натиснете Enter за да продължите..."
853 ;;
854 11)
855 echo -e "${BLUE}Актуализиране на приложенията...${NC}"
856 if [[ -f "$INSTALL_DIR/update.sh" ]]; then
857 bash "$INSTALL_DIR/update.sh"
858 else
859 echo -e "${RED}❌ Актуализиращият скрипт не е намерен${NC}"
860 fi
861 read -p "Натиснете Enter за да продължите..."
862 ;;
863 12)
864 echo -e "${BLUE}Диагностика на системата...${NC}"
865 diagnose_system
866 read -p "Натиснете Enter за да продължите..."
867 ;;
868 13)
869 echo -e "${BLUE}Автоматично поправяне...${NC}"
870 auto_fix
871 echo -e "${GREEN}✅ Автоматичното поправяне е завършено${NC}"
872 read -p "Натиснете Enter за да продължите..."
873 ;;
874 0)
875 echo -e "${GREEN}Благодаря за използването на Proxmox Apps Installer!${NC}"
876 log "Инсталаторът е приключен"
877 exit 0
878 ;;
879 *)
880 echo -e "${RED}❌ Невалиден избор. Моля, опитайте отново.${NC}"
881 read -p "Натиснете Enter за да продължите..."
882 ;;
883 esac
884 done
885}
886
887# Функция за показване на информация за системата
888show_system_info() {
889 echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
890 echo -e "${CYAN}${WHITE}СИСТЕМНА ИНФОРМАЦИЯ${CYAN}${NC}"
891 echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
892 echo ""
893 echo -e "${YELLOW}📊 Система:${NC} $(hostnamectl | grep "Operating System" | cut -d: -f2 | xargs)"
894 echo -e "${YELLOW}🖥️ Хост:${NC} $(hostname)"
895 echo -e "${YELLOW}💾 Памет:${NC} $(free -h | grep Mem | awk '{print $3"/"$2}')"
896 echo -e "${YELLOW}💿 Диск:${NC} $(df -h / | tail -1 | awk '{print $3"/"$2" ("$5" използвани)"}')"
897 echo -e "${YELLOW}🐳 Docker:${NC} $(docker --version 2>/dev/null || echo "Не е инсталиран")"
898 echo -e "${YELLOW}🔧 Docker Compose:${NC} $(docker-compose --version 2>/dev/null || echo "Не е инсталиран")"
899 echo ""
900}
901
902# Функция за проверка на портове
903check_ports() {
904 echo -e "${BLUE}Проверка на портове...${NC}"
905
906 declare -A PORTS=(
907 ["80"]="HTTP (Nginx Proxy Manager)"
908 ["443"]="HTTPS (Nginx Proxy Manager)"
909 ["81"]="Nginx Proxy Manager Admin"
910 ["4000"]="Dashy Dashboard"
911 ["8080"]="File Browser"
912 ["8989"]="Droppy"
913 ["6157"]="OpenGist"
914 )
915
916 for port in "${!PORTS[@]}"; do
917 if ss -tuln | grep -q ":$port "; then
918 echo -e "${RED}❌ Порт $port (${PORTS[$port]}) е зает${NC}"
919 else
920 echo -e "${GREEN}✅ Порт $port (${PORTS[$port]}) е свободен${NC}"
921 fi
922 done
923 echo ""
924}
925
926# Функция за firewall конфигурация
927configure_firewall() {
928 log "Конфигуриране на firewall..."
929
930 if command -v ufw &> /dev/null; then
931 echo -e "${BLUE}Конфигуриране на UFW firewall...${NC}"
932
933 # Разрешаване на портове
934 ufw allow 80/tcp comment "HTTP"
935 ufw allow 443/tcp comment "HTTPS"
936 ufw allow 81/tcp comment "Nginx Proxy Manager"
937 ufw allow 4000/tcp comment "Dashy"
938 ufw allow 8080/tcp comment "File Browser"
939 ufw allow 8989/tcp comment "Droppy"
940 ufw allow 6157/tcp comment "OpenGist"
941
942 # Разрешаване на SSH
943 ufw allow 22/tcp comment "SSH"
944
945 echo -e "${GREEN}✅ UFW firewall е конфигуриран${NC}"
946 else
947 echo -e "${YELLOW}⚠️ UFW не е инсталиран. Моля, конфигурирайте firewall-а ръчно${NC}"
948 fi
949}
950
951# Функция за показване на полезни команди
952show_useful_commands() {
953 echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
954 echo -e "${CYAN}${WHITE}ПОЛЕЗНИ КОМАНДИ${CYAN}${NC}"
955 echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
956 echo ""
957 echo -e "${YELLOW}🐳 Docker команди:${NC}"
958 echo -e "${CYAN} docker ps${NC} - Показва работещите контейнери"
959 echo -e "${CYAN} docker logs <container-name>${NC} - Показва логове на контейнер"
960 echo -e "${CYAN} docker exec -it <container-name> /bin/bash${NC} - Влизане в контейнер"
961 echo -e "${CYAN} docker system prune -f${NC} - Почистване на неизползвани ресурси"
962 echo ""
963 echo -e "${YELLOW}🔧 Docker Compose команди:${NC}"
964 echo -e "${CYAN} docker-compose ps${NC} - Статус на услугите"
965 echo -e "${CYAN} docker-compose logs -f${NC} - Следене на логове"
966 echo -e "${CYAN} docker-compose pull${NC} - Актуализиране на образите"
967 echo -e "${CYAN} docker-compose restart <service>${NC} - Рестарт на услуга"
968 echo ""
969 echo -e "${YELLOW}📁 Важни директории:${NC}"
970 echo -e "${CYAN} $INSTALL_DIR${NC} - Конфигурационни файлове"
971 echo -e "${CYAN} $DATA_DIR${NC} - Данни на приложенията"
972 echo -e "${CYAN} $LOG_FILE${NC} - Лог файл на инсталатора"
973 echo ""
974}
975
976# Функция за генериране на SSL сертификати
977generate_ssl_info() {
978 echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
979 echo -e "${CYAN}${WHITE}SSL СЕРТИФИКАТИ${CYAN}${NC}"
980 echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
981 echo ""
982 echo -e "${YELLOW}🔐 За SSL сертификати използвайте Nginx Proxy Manager:${NC}"
983 echo -e "${CYAN} 1. Отворете http://your-ip:81${NC}"
984 echo -e "${CYAN} 2. Влезте с [email protected] / changeme${NC}"
985 echo -e "${CYAN} 3. Променете паролата при първо влизане${NC}"
986 echo -e "${CYAN} 4. Добавете домейни в 'Proxy Hosts'${NC}"
987 echo -e "${CYAN} 5. Активирайте 'Force SSL' и 'HTTP/2 Support'${NC}"
988 echo -e "${CYAN} 6. Nginx Proxy Manager автоматично ще генерира Let's Encrypt сертификати${NC}"
989 echo ""
990}
991
992# Функция за създаване на systemd службa
993create_systemd_service() {
994 log "Създаване на systemd служба..."
995
996 cat > "/etc/systemd/system/proxmox-apps.service" << 'EOF'
997[Unit]
998Description=Proxmox Apps Docker Compose
999Requires=docker.service
1000After=docker.service
1001
1002[Service]
1003Type=forking
1004RemainAfterExit=yes
1005WorkingDirectory=/opt/proxmox-apps
1006ExecStart=/usr/local/bin/docker-compose up -d
1007ExecStop=/usr/local/bin/docker-compose down
1008ExecReload=/usr/local/bin/docker-compose restart
1009TimeoutStartSec=0
1010
1011[Install]
1012WantedBy=multi-user.target
1013EOF
1014
1015 systemctl daemon-reload
1016 systemctl enable proxmox-apps.service
1017
1018 echo -e "${GREEN}✅ Systemd служба е създадена и активирана${NC}"
1019 echo -e "${YELLOW}📋 Използвайте: systemctl start|stop|restart proxmox-apps${NC}"
1020}
1021
1022# Trap функция за почистване при прекъсване
1023cleanup() {
1024 log "Почистване при прекъсване..."
1025 echo -e "${YELLOW}⚠️ Инсталацията е прекъсната${NC}"
1026 exit 130
1027}
1028
1029# Настройка на trap за SIGINT (Ctrl+C)
1030trap cleanup SIGINT
1031
1032# Функция за показване на help
1033show_help() {
1034 echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
1035 echo -e "${CYAN}${WHITE}ПОМОЩНА ИНФОРМАЦИЯ${CYAN}${NC}"
1036 echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
1037 echo ""
1038 echo -e "${YELLOW}📖 Използване:${NC}"
1039 echo -e "${CYAN} sudo ./proxmox-apps-installer.sh${NC}"
1040 echo ""
1041 echo -e "${YELLOW}🔧 Опции:${NC}"
1042 echo -e "${CYAN} --help${NC} - Показва тази помощна информация"
1043 echo -e "${CYAN} --version${NC} - Показва версията на скрипта"
1044 echo -e "${CYAN} --check${NC} - Проверява системните изисквания"
1045 echo -e "${CYAN} --ports${NC} - Проверява наличността на портове"
1046 echo ""
1047 echo -e "${YELLOW}📂 Структура на файлове:${NC}"
1048 echo -e "${CYAN} /opt/proxmox-apps/${NC} - Конфигурационни файлове"
1049 echo -e "${CYAN} /var/lib/proxmox-apps/${NC} - Данни на приложенията"
1050 echo -e "${CYAN} /var/log/proxmox-apps-installer.log${NC} - Лог файл"
1051 echo ""
1052 echo -e "${YELLOW}🌐 Портове по подразбиране:${NC}"
1053 echo -e "${CYAN} 80/443 - Nginx Proxy Manager (HTTP/HTTPS)${NC}"
1054 echo -e "${CYAN} 81 - Nginx Proxy Manager Admin${NC}"
1055 echo -e "${CYAN} 4000 - Dashy Dashboard${NC}"
1056 echo -e "${CYAN} 8080 - File Browser${NC}"
1057 echo -e "${CYAN} 8989 - Droppy${NC}"
1058 echo -e "${CYAN} 6157 - OpenGist${NC}"
1059 echo ""
1060}
1061
1062# Проверка на command line аргументи
1063case "${1:-}" in
1064 --help|-h)
1065 show_help
1066 exit 0
1067 ;;
1068 --version|-v)
1069 echo "Proxmox Apps Installer v1.0"
1070 exit 0
1071 ;;
1072 --check|-c)
1073 show_system_info
1074 check_requirements
1075 exit 0
1076 ;;
1077 --ports|-p)
1078 check_ports
1079 exit 0
1080 ;;
1081 --diagnose|-d)
1082 diagnose_system
1083 exit 0
1084 ;;
1085 --fix|-f)
1086 auto_fix
1087 exit 0
1088 ;;
1089 *)
1090 # Нормално изпълнение
1091 main "$@"
1092 ;;
1093esac