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