proxmox-apps-installer.sh
· 36 KiB · Bash
Исходник
#!/bin/bash
# Proxmox Apps Installer
# Професионален инсталатор за Docker приложения в Proxmox контейнери
# Автор: Федя Серафиев
# Версия: 1.0
set -e
# Цветове за по-добра визуализация
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# Глобални променливи
INSTALL_DIR="/opt/proxmox-apps"
DATA_DIR="/var/lib/proxmox-apps"
LOG_FILE="/var/log/proxmox-apps-installer.log"
# Функция за лог
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Функция за показване на header
show_header() {
clear
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ ${WHITE}PROXMOX APPS INSTALLER${CYAN} ║${NC}"
echo -e "${CYAN}║ ${YELLOW}Професионален Docker инсталатор${CYAN} ║${NC}"
echo -e "${CYAN}╠═══════════════════════════════════════════════════════════════════════════════╣${NC}"
echo -e "${CYAN}║${NC} ${GREEN}✓${NC} Nginx Proxy Manager - Reverse Proxy & SSL Management ${CYAN}║${NC}"
echo -e "${CYAN}║${NC} ${GREEN}✓${NC} Dashy V3 - Personalized Dashboard ${CYAN}║${NC}"
echo -e "${CYAN}║${NC} ${GREEN}✓${NC} File Browser - Web File Manager ${CYAN}║${NC}"
echo -e "${CYAN}║${NC} ${GREEN}✓${NC} Droppy - Modern File Sharing ${CYAN}║${NC}"
echo -e "${CYAN}║${NC} ${GREEN}✓${NC} OpenGist - Self-hosted Pastebin ${CYAN}║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
}
# Функция за проверка на системни изисквания
check_requirements() {
log "Проверка на системни изисквания..."
# Проверка дали сме в Proxmox контейнер
if [[ ! -f /proc/1/cgroup ]] || ! grep -q "lxc" /proc/1/cgroup 2>/dev/null; then
echo -e "${YELLOW}⚠️ Предупреждение: Не се засича Proxmox LXC контейнер${NC}"
echo -e "${YELLOW} Скриптът ще продължи, но е оптимизиран за Proxmox${NC}"
echo ""
fi
# Проверка на свободно пространство
AVAILABLE_SPACE=$(df / | tail -1 | awk '{print $4}')
if [[ $AVAILABLE_SPACE -lt 5242880 ]]; then # 5GB в KB
echo -e "${RED}❌ Недостатъчно дисково пространство. Нужни са поне 5GB${NC}"
exit 1
fi
# Проверка на мрежова свързаност
if ! ping -c 1 google.com &> /dev/null; then
echo -e "${RED}❌ Няма интернет връзка${NC}"
exit 1
fi
echo -e "${GREEN}✅ Системните изисквания са изпълнени${NC}"
}
# Функция за инсталиране на Docker
install_docker() {
if command -v docker &> /dev/null; then
log "Docker вече е инсталиран"
return 0
fi
log "Инсталиране на Docker..."
echo -e "${BLUE}📦 Инсталиране на Docker и Docker Compose...${NC}"
# Актуализиране на пакетите
apt-get update -qq
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Добавяне на Docker GPG ключ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Добавяне на Docker repository
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
# Инсталиране на Docker
apt-get update -qq
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Стартиране на Docker
systemctl enable docker
systemctl start docker
# Инсталиране на Docker Compose standalone
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
log "Docker е инсталиран успешно"
}
# Функция за създаване на директории
create_directories() {
log "Създаване на директории..."
mkdir -p "$INSTALL_DIR"
mkdir -p "$DATA_DIR"
mkdir -p "$DATA_DIR/nginx-proxy-manager"
mkdir -p "$DATA_DIR/dashy"
mkdir -p "$DATA_DIR/filebrowser"
mkdir -p "$DATA_DIR/droppy"
mkdir -p "$DATA_DIR/opengist"
log "Директориите са създадени"
}
# Функция за генериране на случайни пароли
generate_password() {
openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
}
# Функция за инсталиране на Nginx Proxy Manager
install_nginx_proxy_manager() {
log "Инсталиране на Nginx Proxy Manager..."
cat > "$INSTALL_DIR/nginx-proxy-manager.yml" << 'EOF'
version: '3.8'
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- /var/lib/proxmox-apps/nginx-proxy-manager:/data
- /var/lib/proxmox-apps/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
environment:
- DISABLE_IPV6=true
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:81/api/"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
name: proxy-network
driver: bridge
EOF
cd "$INSTALL_DIR"
docker-compose -f nginx-proxy-manager.yml up -d
echo -e "${GREEN}✅ Nginx Proxy Manager е инсталиран${NC}"
echo -e "${YELLOW}📋 Администриране: http://your-ip:81${NC}"
echo -e "${YELLOW}📋 Потребител: [email protected]${NC}"
echo -e "${YELLOW}📋 Парола: changeme${NC}"
echo ""
}
# Функция за инсталиране на Dashy V3
install_dashy() {
log "Инсталиране на Dashy V3..."
# Създаване на базова конфигурация
cat > "$DATA_DIR/dashy/conf.yml" << 'EOF'
pageInfo:
title: 'Proxmox Dashboard'
description: 'Персонализиран Dashboard за Proxmox Apps'
logo: 'https://raw.githubusercontent.com/Lissy93/dashy/master/public/img/dashy.png'
appConfig:
theme: 'dark'
layout: 'auto'
iconSize: 'medium'
language: 'bg'
sections:
- name: 'Proxmox Services'
icon: 'fas fa-server'
items:
- title: 'Nginx Proxy Manager'
description: 'Reverse Proxy & SSL Management'
url: 'http://localhost:81'
icon: 'fas fa-shield-alt'
- title: 'File Browser'
description: 'Web File Manager'
url: 'http://localhost:8080'
icon: 'fas fa-folder'
- title: 'Droppy'
description: 'File Sharing'
url: 'http://localhost:8989'
icon: 'fas fa-cloud-upload-alt'
- title: 'OpenGist'
description: 'Code Snippets'
url: 'http://localhost:6157'
icon: 'fas fa-code'
- name: 'System Info'
icon: 'fas fa-info-circle'
widgets:
- type: 'system-info'
options:
hostname: true
uptime: true
memory: true
cpu: true
EOF
cat > "$INSTALL_DIR/dashy.yml" << 'EOF'
version: '3.8'
services:
dashy:
image: 'lissy93/dashy:latest'
container_name: dashy
restart: unless-stopped
ports:
- '4000:80'
volumes:
- /var/lib/proxmox-apps/dashy/conf.yml:/app/public/conf.yml:ro
environment:
- NODE_ENV=production
- UID=1000
- GID=1000
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
external: true
EOF
cd "$INSTALL_DIR"
docker-compose -f dashy.yml up -d
echo -e "${GREEN}✅ Dashy V3 е инсталиран${NC}"
echo -e "${YELLOW}📋 Достъп: http://your-ip:4000${NC}"
echo ""
}
# Функция за инсталиране на File Browser
install_filebrowser() {
log "Инсталиране на File Browser..."
# Създаване на база данни
touch "$DATA_DIR/filebrowser/database.db"
cat > "$INSTALL_DIR/filebrowser.yml" << 'EOF'
version: '3.8'
services:
filebrowser:
image: 'filebrowser/filebrowser:latest'
container_name: filebrowser
restart: unless-stopped
ports:
- '8080:80'
volumes:
- /var/lib/proxmox-apps/filebrowser/database.db:/database.db
- /var/lib/proxmox-apps:/srv/proxmox-apps
- /opt/proxmox-apps:/srv/configs
environment:
- FB_DATABASE=/database.db
- FB_ROOT=/srv
- FB_LOG=stdout
- FB_NOAUTH=false
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
external: true
EOF
cd "$INSTALL_DIR"
docker-compose -f filebrowser.yml up -d
echo -e "${GREEN}✅ File Browser е инсталиран${NC}"
echo -e "${YELLOW}📋 Достъп: http://your-ip:8080${NC}"
echo -e "${YELLOW}📋 Потребител: admin${NC}"
echo -e "${YELLOW}📋 Парола: admin${NC}"
echo ""
}
# Функция за инсталиране на Droppy
install_droppy() {
log "Инсталиране на Droppy..."
mkdir -p "$DATA_DIR/droppy/config"
mkdir -p "$DATA_DIR/droppy/files"
cat > "$INSTALL_DIR/droppy.yml" << 'EOF'
version: '3.8'
services:
droppy:
image: 'silverwind/droppy:latest'
container_name: droppy
restart: unless-stopped
ports:
- '8989:8989'
volumes:
- /var/lib/proxmox-apps/droppy/config:/app/config
- /var/lib/proxmox-apps/droppy/files:/app/files
environment:
- NODE_ENV=production
- UID=1000
- GID=1000
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8989"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
external: true
EOF
cd "$INSTALL_DIR"
docker-compose -f droppy.yml up -d
echo -e "${GREEN}✅ Droppy е инсталиран${NC}"
echo -e "${YELLOW}📋 Достъп: http://your-ip:8989${NC}"
echo ""
}
# Функция за инсталиране на OpenGist
install_opengist() {
log "Инсталиране на OpenGist..."
OPENGIST_SECRET=$(generate_password)
cat > "$INSTALL_DIR/opengist.yml" << EOF
version: '3.8'
services:
opengist:
image: 'ghcr.io/thomiceli/opengist:latest'
container_name: opengist
restart: unless-stopped
ports:
- '6157:6157'
volumes:
- /var/lib/proxmox-apps/opengist:/opengist
environment:
- OG_DB_TYPE=sqlite
- OG_DB_PATH=/opengist/opengist.db
- OG_SECRET_KEY=${OPENGIST_SECRET}
- OG_EXTERNAL_URL=http://localhost:6157
- OG_LOG_LEVEL=info
- OG_DISABLE_SIGNUP=false
- OG_REQUIRE_LOGIN=false
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:6157"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
external: true
EOF
cd "$INSTALL_DIR"
docker-compose -f opengist.yml up -d
echo -e "${GREEN}✅ OpenGist е инсталиран${NC}"
echo -e "${YELLOW}📋 Достъп: http://your-ip:6157${NC}"
echo ""
}
# Функция за създаване на master Docker Compose файл
create_master_compose() {
log "Създаване на master Docker Compose файл..."
cat > "$INSTALL_DIR/docker-compose.yml" << 'EOF'
version: '3.8'
services:
# Nginx Proxy Manager
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- /var/lib/proxmox-apps/nginx-proxy-manager:/data
- /var/lib/proxmox-apps/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
environment:
- DISABLE_IPV6=true
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:81/api/"]
interval: 30s
timeout: 10s
retries: 3
# Dashy Dashboard
dashy:
image: 'lissy93/dashy:latest'
container_name: dashy
restart: unless-stopped
ports:
- '4000:80'
volumes:
- /var/lib/proxmox-apps/dashy/conf.yml:/app/public/conf.yml:ro
environment:
- NODE_ENV=production
- UID=1000
- GID=1000
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
# File Browser
filebrowser:
image: 'filebrowser/filebrowser:latest'
container_name: filebrowser
restart: unless-stopped
ports:
- '8080:80'
volumes:
- /var/lib/proxmox-apps/filebrowser/database.db:/database.db
- /var/lib/proxmox-apps:/srv/proxmox-apps
- /opt/proxmox-apps:/srv/configs
environment:
- FB_DATABASE=/database.db
- FB_ROOT=/srv
- FB_LOG=stdout
- FB_NOAUTH=false
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 30s
timeout: 10s
retries: 3
# Droppy File Sharing
droppy:
image: 'silverwind/droppy:latest'
container_name: droppy
restart: unless-stopped
ports:
- '8989:8989'
volumes:
- /var/lib/proxmox-apps/droppy/config:/app/config
- /var/lib/proxmox-apps/droppy/files:/app/files
environment:
- NODE_ENV=production
- UID=1000
- GID=1000
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8989"]
interval: 30s
timeout: 10s
retries: 3
# OpenGist
opengist:
image: 'ghcr.io/thomiceli/opengist:latest'
container_name: opengist
restart: unless-stopped
ports:
- '6157:6157'
volumes:
- /var/lib/proxmox-apps/opengist:/opengist
environment:
- OG_DB_TYPE=sqlite
- OG_DB_PATH=/opengist/opengist.db
- OG_SECRET_KEY=CHANGE_THIS_SECRET_KEY
- OG_EXTERNAL_URL=http://localhost:6157
- OG_LOG_LEVEL=info
- OG_DISABLE_SIGNUP=false
- OG_REQUIRE_LOGIN=false
networks:
- proxy-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:6157"]
interval: 30s
timeout: 10s
retries: 3
networks:
proxy-network:
name: proxy-network
driver: bridge
EOF
# Заместване на placeholder-a за OpenGist secret
OPENGIST_SECRET=$(generate_password)
sed -i "s/CHANGE_THIS_SECRET_KEY/${OPENGIST_SECRET}/g" "$INSTALL_DIR/docker-compose.yml"
log "Master Docker Compose файлът е създаден"
}
# Функция за създаване на управляващи скриптове
create_management_scripts() {
log "Създаване на управляващи скриптове..."
# Скрипт за старт на всички услуги
cat > "$INSTALL_DIR/start-all.sh" << 'EOF'
#!/bin/bash
cd /opt/proxmox-apps
echo "Стартиране на всички услуги..."
docker-compose up -d
echo "Всички услуги са стартирани!"
EOF
# Скрипт за спиране на всички услуги
cat > "$INSTALL_DIR/stop-all.sh" << 'EOF'
#!/bin/bash
cd /opt/proxmox-apps
echo "Спиране на всички услуги..."
docker-compose down
echo "Всички услуги са спрени!"
EOF
# Скрипт за рестарт на всички услуги
cat > "$INSTALL_DIR/restart-all.sh" << 'EOF'
#!/bin/bash
cd /opt/proxmox-apps
echo "Рестартиране на всички услуги..."
docker-compose down
docker-compose up -d
echo "Всички услуги са рестартирани!"
EOF
# Скрипт за проверка на статуса
cat > "$INSTALL_DIR/status.sh" << 'EOF'
#!/bin/bash
cd /opt/proxmox-apps
echo "Статус на услугите:"
docker-compose ps
echo ""
echo "Използване на ресурси:"
docker stats --no-stream
EOF
# Скрипт за бекъп
cat > "$INSTALL_DIR/backup.sh" << 'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/proxmox-apps"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/proxmox-apps-backup-$DATE.tar.gz"
mkdir -p "$BACKUP_DIR"
echo "Създаване на бекъп..."
tar -czf "$BACKUP_FILE" -C /var/lib proxmox-apps -C /opt proxmox-apps
echo "Бекъпът е създаден: $BACKUP_FILE"
ls -lh "$BACKUP_FILE"
EOF
# Скрипт за актуализиране
cat > "$INSTALL_DIR/update.sh" << 'EOF'
#!/bin/bash
cd /opt/proxmox-apps
echo "Актуализиране на Docker образите..."
docker-compose pull
docker-compose up -d
echo "Премахване на стари образи..."
docker image prune -f
echo "Актуализирането е завършено!"
EOF
# Правене на скриптовете изпълними
chmod +x "$INSTALL_DIR"/*.sh
log "Управляващите скриптове са създадени"
}
# Функция за показване на меню
show_menu() {
show_header
echo -e "${WHITE}Изберете опция:${NC}"
echo ""
echo -e "${GREEN}1)${NC} Инсталиране на Nginx Proxy Manager"
echo -e "${GREEN}2)${NC} Инсталиране на Dashy V3"
echo -e "${GREEN}3)${NC} Инсталиране на File Browser"
echo -e "${GREEN}4)${NC} Инсталиране на Droppy"
echo -e "${GREEN}5)${NC} Инсталиране на OpenGist"
echo -e "${GREEN}6)${NC} Инсталиране на всички приложения"
echo -e "${GREEN}7)${NC} Показване на статус"
echo -e "${GREEN}8)${NC} Рестарт на всички услуги"
echo -e "${GREEN}9)${NC} Спиране на всички услуги"
echo -e "${GREEN}10)${NC} Създаване на бекъп"
echo -e "${GREEN}11)${NC} Актуализиране на приложенията"
echo -e "${RED}0)${NC} Изход"
echo ""
echo -e "${YELLOW}Моля, въведете вашия избор [0-11]:${NC} "
}
# Главна функция
main() {
# Създаване на лог файл
touch "$LOG_FILE"
log "Стартиране на Proxmox Apps Installer"
# Проверка дали скриптът се изпълнява като root
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}❌ Този скрипт трябва да се изпълни като root${NC}"
exit 1
fi
# Проверка на системни изисквания
check_requirements
# Инсталиране на Docker ако не е инсталиран
install_docker
# Създаване на директории
create_directories
# Главно меню
while true; do
show_menu
read -r choice
case $choice in
1)
echo -e "${BLUE}Инсталиране на Nginx Proxy Manager...${NC}"
install_nginx_proxy_manager
read -p "Натиснете Enter за да продължите..."
;;
2)
echo -e "${BLUE}Инсталиране на Dashy V3...${NC}"
install_dashy
read -p "Натиснете Enter за да продължите..."
;;
3)
echo -e "${BLUE}Инсталиране на File Browser...${NC}"
install_filebrowser
read -p "Натиснете Enter за да продължите..."
;;
4)
echo -e "${BLUE}Инсталиране на Droppy...${NC}"
install_droppy
read -p "Натиснете Enter за да продължите..."
;;
5)
echo -e "${BLUE}Инсталиране на OpenGist...${NC}"
install_opengist
read -p "Натиснете Enter за да продължите..."
;;
6)
echo -e "${BLUE}Инсталиране на всички приложения...${NC}"
create_master_compose
cd "$INSTALL_DIR"
docker-compose up -d
create_management_scripts
echo -e "${GREEN}✅ Всички приложения са инсталирани успешно!${NC}"
echo ""
echo -e "${YELLOW}📋 Достъп до приложенията:${NC}"
echo -e "${CYAN} • Nginx Proxy Manager: http://your-ip:81${NC}"
echo -e "${CYAN} • Dashy Dashboard: http://your-ip:4000${NC}"
echo -e "${CYAN} • File Browser: http://your-ip:8080${NC}"
echo -e "${CYAN} • Droppy: http://your-ip:8989${NC}"
echo -e "${CYAN} • OpenGist: http://your-ip:6157${NC}"
echo ""
echo -e "${YELLOW}🔧 Управляващи скриптове в $INSTALL_DIR:${NC}"
echo -e "${CYAN} • ./start-all.sh - Стартиране на всички услуги${NC}"
echo -e "${CYAN} • ./stop-all.sh - Спиране на всички услуги${NC}"
echo -e "${CYAN} • ./restart-all.sh - Рестарт на всички услуги${NC}"
echo -e "${CYAN} • ./status.sh - Проверка на статуса${NC}"
echo -e "${CYAN} • ./backup.sh - Създаване на бекъп${NC}"
echo -e "${CYAN} • ./update.sh - Актуализиране${NC}"
read -p "Натиснете Enter за да продължите..."
;;
7)
echo -e "${BLUE}Показване на статус...${NC}"
if [[ -f "$INSTALL_DIR/status.sh" ]]; then
bash "$INSTALL_DIR/status.sh"
else
echo -e "${RED}❌ Статус скриптът не е намерен${NC}"
fi
read -p "Натиснете Enter за да продължите..."
;;
8)
echo -e "${BLUE}Рестарт на всички услуги...${NC}"
if [[ -f "$INSTALL_DIR/restart-all.sh" ]]; then
bash "$INSTALL_DIR/restart-all.sh"
else
echo -e "${RED}❌ Рестарт скриптът не е намерен${NC}"
fi
read -p "Натиснете Enter за да продължите..."
;;
9)
echo -e "${BLUE}Спиране на всички услуги...${NC}"
if [[ -f "$INSTALL_DIR/stop-all.sh" ]]; then
bash "$INSTALL_DIR/stop-all.sh"
else
echo -e "${RED}❌ Стоп скриптът не е намерен${NC}"
fi
read -p "Натиснете Enter за да продължите..."
;;
10)
echo -e "${BLUE}Създаване на бекъп...${NC}"
if [[ -f "$INSTALL_DIR/backup.sh" ]]; then
bash "$INSTALL_DIR/backup.sh"
else
echo -e "${RED}❌ Бекъп скриптът не е намерен${NC}"
fi
read -p "Натиснете Enter за да продължите..."
;;
11)
echo -e "${BLUE}Актуализиране на приложенията...${NC}"
if [[ -f "$INSTALL_DIR/update.sh" ]]; then
bash "$INSTALL_DIR/update.sh"
else
echo -e "${RED}❌ Актуализиращият скрипт не е намерен${NC}"
fi
read -p "Натиснете Enter за да продължите..."
;;
0)
echo -e "${GREEN}Благодаря за използването на Proxmox Apps Installer!${NC}"
log "Инсталаторът е приключен"
exit 0
;;
*)
echo -e "${RED}❌ Невалиден избор. Моля, опитайте отново.${NC}"
read -p "Натиснете Enter за да продължите..."
;;
esac
done
}
# Функция за показване на информация за системата
show_system_info() {
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ ${WHITE}СИСТЕМНА ИНФОРМАЦИЯ${CYAN} ║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}📊 Система:${NC} $(hostnamectl | grep "Operating System" | cut -d: -f2 | xargs)"
echo -e "${YELLOW}🖥️ Хост:${NC} $(hostname)"
echo -e "${YELLOW}💾 Памет:${NC} $(free -h | grep Mem | awk '{print $3"/"$2}')"
echo -e "${YELLOW}💿 Диск:${NC} $(df -h / | tail -1 | awk '{print $3"/"$2" ("$5" използвани)"}')"
echo -e "${YELLOW}🐳 Docker:${NC} $(docker --version 2>/dev/null || echo "Не е инсталиран")"
echo -e "${YELLOW}🔧 Docker Compose:${NC} $(docker-compose --version 2>/dev/null || echo "Не е инсталиран")"
echo ""
}
# Функция за проверка на портове
check_ports() {
echo -e "${BLUE}Проверка на портове...${NC}"
declare -A PORTS=(
["80"]="HTTP (Nginx Proxy Manager)"
["443"]="HTTPS (Nginx Proxy Manager)"
["81"]="Nginx Proxy Manager Admin"
["4000"]="Dashy Dashboard"
["8080"]="File Browser"
["8989"]="Droppy"
["6157"]="OpenGist"
)
for port in "${!PORTS[@]}"; do
if ss -tuln | grep -q ":$port "; then
echo -e "${RED}❌ Порт $port (${PORTS[$port]}) е зает${NC}"
else
echo -e "${GREEN}✅ Порт $port (${PORTS[$port]}) е свободен${NC}"
fi
done
echo ""
}
# Функция за firewall конфигурация
configure_firewall() {
log "Конфигуриране на firewall..."
if command -v ufw &> /dev/null; then
echo -e "${BLUE}Конфигуриране на UFW firewall...${NC}"
# Разрешаване на портове
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
ufw allow 81/tcp comment "Nginx Proxy Manager"
ufw allow 4000/tcp comment "Dashy"
ufw allow 8080/tcp comment "File Browser"
ufw allow 8989/tcp comment "Droppy"
ufw allow 6157/tcp comment "OpenGist"
# Разрешаване на SSH
ufw allow 22/tcp comment "SSH"
echo -e "${GREEN}✅ UFW firewall е конфигуриран${NC}"
else
echo -e "${YELLOW}⚠️ UFW не е инсталиран. Моля, конфигурирайте firewall-а ръчно${NC}"
fi
}
# Функция за показване на полезни команди
show_useful_commands() {
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ ${WHITE}ПОЛЕЗНИ КОМАНДИ${CYAN} ║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}🐳 Docker команди:${NC}"
echo -e "${CYAN} docker ps${NC} - Показва работещите контейнери"
echo -e "${CYAN} docker logs <container-name>${NC} - Показва логове на контейнер"
echo -e "${CYAN} docker exec -it <container-name> /bin/bash${NC} - Влизане в контейнер"
echo -e "${CYAN} docker system prune -f${NC} - Почистване на неизползвани ресурси"
echo ""
echo -e "${YELLOW}🔧 Docker Compose команди:${NC}"
echo -e "${CYAN} docker-compose ps${NC} - Статус на услугите"
echo -e "${CYAN} docker-compose logs -f${NC} - Следене на логове"
echo -e "${CYAN} docker-compose pull${NC} - Актуализиране на образите"
echo -e "${CYAN} docker-compose restart <service>${NC} - Рестарт на услуга"
echo ""
echo -e "${YELLOW}📁 Важни директории:${NC}"
echo -e "${CYAN} $INSTALL_DIR${NC} - Конфигурационни файлове"
echo -e "${CYAN} $DATA_DIR${NC} - Данни на приложенията"
echo -e "${CYAN} $LOG_FILE${NC} - Лог файл на инсталатора"
echo ""
}
# Функция за генериране на SSL сертификати
generate_ssl_info() {
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ ${WHITE}SSL СЕРТИФИКАТИ${CYAN} ║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}🔐 За SSL сертификати използвайте Nginx Proxy Manager:${NC}"
echo -e "${CYAN} 1. Отворете http://your-ip:81${NC}"
echo -e "${CYAN} 2. Влезте с [email protected] / changeme${NC}"
echo -e "${CYAN} 3. Променете паролата при първо влизане${NC}"
echo -e "${CYAN} 4. Добавете домейни в 'Proxy Hosts'${NC}"
echo -e "${CYAN} 5. Активирайте 'Force SSL' и 'HTTP/2 Support'${NC}"
echo -e "${CYAN} 6. Nginx Proxy Manager автоматично ще генерира Let's Encrypt сертификати${NC}"
echo ""
}
# Функция за създаване на systemd службa
create_systemd_service() {
log "Създаване на systemd служба..."
cat > "/etc/systemd/system/proxmox-apps.service" << 'EOF'
[Unit]
Description=Proxmox Apps Docker Compose
Requires=docker.service
After=docker.service
[Service]
Type=forking
RemainAfterExit=yes
WorkingDirectory=/opt/proxmox-apps
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
ExecReload=/usr/local/bin/docker-compose restart
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable proxmox-apps.service
echo -e "${GREEN}✅ Systemd служба е създадена и активирана${NC}"
echo -e "${YELLOW}📋 Използвайте: systemctl start|stop|restart proxmox-apps${NC}"
}
# Trap функция за почистване при прекъсване
cleanup() {
log "Почистване при прекъсване..."
echo -e "${YELLOW}⚠️ Инсталацията е прекъсната${NC}"
exit 130
}
# Настройка на trap за SIGINT (Ctrl+C)
trap cleanup SIGINT
# Функция за показване на help
show_help() {
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ ${WHITE}ПОМОЩНА ИНФОРМАЦИЯ${CYAN} ║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}📖 Използване:${NC}"
echo -e "${CYAN} sudo ./proxmox-apps-installer.sh${NC}"
echo ""
echo -e "${YELLOW}🔧 Опции:${NC}"
echo -e "${CYAN} --help${NC} - Показва тази помощна информация"
echo -e "${CYAN} --version${NC} - Показва версията на скрипта"
echo -e "${CYAN} --check${NC} - Проверява системните изисквания"
echo -e "${CYAN} --ports${NC} - Проверява наличността на портове"
echo ""
echo -e "${YELLOW}📂 Структура на файлове:${NC}"
echo -e "${CYAN} /opt/proxmox-apps/${NC} - Конфигурационни файлове"
echo -e "${CYAN} /var/lib/proxmox-apps/${NC} - Данни на приложенията"
echo -e "${CYAN} /var/log/proxmox-apps-installer.log${NC} - Лог файл"
echo ""
echo -e "${YELLOW}🌐 Портове по подразбиране:${NC}"
echo -e "${CYAN} 80/443 - Nginx Proxy Manager (HTTP/HTTPS)${NC}"
echo -e "${CYAN} 81 - Nginx Proxy Manager Admin${NC}"
echo -e "${CYAN} 4000 - Dashy Dashboard${NC}"
echo -e "${CYAN} 8080 - File Browser${NC}"
echo -e "${CYAN} 8989 - Droppy${NC}"
echo -e "${CYAN} 6157 - OpenGist${NC}"
echo ""
}
# Проверка на command line аргументи
case "${1:-}" in
--help|-h)
show_help
exit 0
;;
--version|-v)
echo "Proxmox Apps Installer v1.0"
exit 0
;;
--check|-c)
show_system_info
check_requirements
exit 0
;;
--ports|-p)
check_ports
exit 0
;;
*)
# Нормално изпълнение
main "$@"
;;
esac
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 |