vm:nginx:04-nginx_menu

Nginx Proxy Manager - Скрипт управления

Скрипт для удобного управления nginx-proxy инстансом с Let's Encrypt через интерактивное меню.

Расположение: /opt/nginx/nginx-manager.sh

Контейнеры:

  • nginx_proxy - основной прокси-сервер
  • nginx_letsencrypt - управление SSL сертификатами
# Переходим в директорию nginx-proxy
cd /opt/nginx
 
# Создаем файл скрипта
nano nginx-manager.sh

Содержимое файла nginx-manager.sh:

#!/bin/bash
 
# Путь к папке с docker-compose.yml
NGINX_PATH="/opt/nginx"
COMPOSE_FILE="$NGINX_PATH/docker-compose.yml"
 
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
 
# Функция для отображения заголовка
show_header() {
    clear
    echo -e "${BLUE}╔══════════════════════════════════════════════════════════════════╗${NC}"
    echo -e "${BLUE}║                    NGINX PROXY MANAGER                           ║${NC}"
    echo -e "${BLUE}║                        v1.0                                      ║${NC}"
    echo -e "${BLUE}╚══════════════════════════════════════════════════════════════════╝${NC}"
    echo ""
}
 
# Функция для проверки статуса контейнеров
check_status() {
    echo -e "${CYAN}Статус контейнеров:${NC}"
    echo "─────────────────────────────────────────────────────────"
 
    # Проверяем nginx_proxy
    if docker ps --filter "name=nginx_proxy" --filter "status=running" -q | grep -q .; then
        echo -e "nginx_proxy:      ${GREEN}${NC} Запущен"
    else
        echo -e "nginx_proxy:      ${RED}${NC} Остановлен"
    fi
 
    # Проверяем nginx_letsencrypt
    if docker ps --filter "name=nginx_letsencrypt" --filter "status=running" -q | grep -q .; then
        echo -e "nginx_letsencrypt: ${GREEN}${NC} Запущен"
    else
        echo -e "nginx_letsencrypt: ${RED}${NC} Остановлен"
    fi
 
    echo "─────────────────────────────────────────────────────────"
    echo ""
}
 
# Функция для запуска сервисов
start_services() {
    echo -e "${YELLOW}Запуск сервисов...${NC}"
    cd "$NGINX_PATH" || exit 1
    docker-compose up -d
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ Сервисы успешно запущены${NC}"
    else
        echo -e "${RED}✗ Ошибка при запуске сервисов${NC}"
    fi
    read -p "Нажмите Enter для продолжения..."
}
 
# Функция для остановки сервисов
stop_services() {
    echo -e "${YELLOW}Остановка сервисов...${NC}"
    cd "$NGINX_PATH" || exit 1
    docker-compose stop
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ Сервисы успешно остановлены${NC}"
    else
        echo -e "${RED}✗ Ошибка при остановке сервисов${NC}"
    fi
    read -p "Нажмите Enter для продолжения..."
}
 
# Функция для перезагрузки сервисов
restart_services() {
    echo -e "${YELLOW}Перезагрузка сервисов...${NC}"
    cd "$NGINX_PATH" || exit 1
    docker-compose restart
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ Сервисы успешно перезагружены${NC}"
    else
        echo -e "${RED}✗ Ошибка при перезагрузке сервисов${NC}"
    fi
    read -p "Нажмите Enter для продолжения..."
}
 
# Функция для просмотра логов nginx_proxy
view_nginx_logs() {
    echo -e "${CYAN}Логи nginx_proxy (последние 50 строк):${NC}"
    echo "─────────────────────────────────────────────────────────"
    docker logs --tail 50 nginx_proxy
    echo "─────────────────────────────────────────────────────────"
    read -p "Нажмите Enter для продолжения..."
}
 
# Функция для просмотра логов nginx_letsencrypt
view_letsencrypt_logs() {
    echo -e "${CYAN}Логи nginx_letsencrypt (последние 50 строк):${NC}"
    echo "─────────────────────────────────────────────────────────"
    docker logs --tail 50 nginx_letsencrypt
    echo "─────────────────────────────────────────────────────────"
    read -p "Нажмите Enter для продолжения..."
}
 
# Функция для просмотра логов nginx_proxy в реальном времени
follow_nginx_logs() {
    echo -e "${CYAN}Логи nginx_proxy в реальном времени (Ctrl+C для выхода):${NC}"
    echo "─────────────────────────────────────────────────────────"
    docker logs -f nginx_proxy
}
 
# Функция для просмотра логов nginx_letsencrypt в реальном времени
follow_letsencrypt_logs() {
    echo -e "${CYAN}Логи nginx_letsencrypt в реальном времени (Ctrl+C для выхода):${NC}"
    echo "─────────────────────────────────────────────────────────"
    docker logs -f nginx_letsencrypt
}
 
# Функция для показа дополнительной информации
show_info() {
    echo -e "${CYAN}Дополнительная информация:${NC}"
    echo "─────────────────────────────────────────────────────────"
    echo -e "Путь к конфигурации: ${YELLOW}$NGINX_PATH${NC}"
    echo -e "Docker Compose файл: ${YELLOW}$COMPOSE_FILE${NC}"
    echo ""
    echo -e "${CYAN}Статистика контейнеров:${NC}"
    docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" nginx_proxy nginx_letsencrypt 2>/dev/null || echo "Контейнеры не запущены"
    echo ""
    echo -e "${CYAN}Порты:${NC}"
    echo "HTTP:  80"
    echo "HTTPS: 443"
    echo ""
    echo -e "${CYAN}Полезные команды:${NC}"
    echo "• Проверка nginx конфигурации: docker exec nginx_proxy nginx -t"
    echo "• Перезагрузка nginx: docker exec nginx_proxy nginx -s reload"
    echo "• Просмотр сертификатов: ls -la $NGINX_PATH/certs/"
    echo "─────────────────────────────────────────────────────────"
    read -p "Нажмите Enter для продолжения..."
}
 
# Основное меню
show_menu() {
    show_header
    check_status
 
    echo -e "${CYAN}Выберите действие:${NC}"
    echo ""
    echo -e "  ${GREEN}1)${NC} Запустить сервисы"
    echo -e "  ${RED}2)${NC} Остановить сервисы" 
    echo -e "  ${YELLOW}3)${NC} Перезагрузить сервисы"
    echo ""
    echo -e "  ${BLUE}4)${NC} Просмотр логов nginx_proxy"
    echo -e "  ${BLUE}5)${NC} Просмотр логов nginx_letsencrypt"
    echo ""
    echo -e "  ${CYAN}6)${NC} Логи nginx_proxy в реальном времени"
    echo -e "  ${CYAN}7)${NC} Логи nginx_letsencrypt в реальном времени"
    echo ""
    echo -e "  ${YELLOW}8)${NC} Дополнительная информация"
    echo ""
    echo -e "  ${RED}0)${NC} Выход"
    echo ""
    echo -n "Ваш выбор: "
}
 
# Основной цикл программы
main() {
    # Проверяем существование docker-compose файла
    if [ ! -f "$COMPOSE_FILE" ]; then
        echo -e "${RED}Ошибка: Docker Compose файл не найден по пути $COMPOSE_FILE${NC}"
        echo "Убедитесь, что файл существует и путь указан правильно."
        exit 1
    fi
 
    while true; do
        show_menu
        read -r choice
 
        case $choice in
            1)
                start_services
                ;;
            2)
                stop_services
                ;;
            3)
                restart_services
                ;;
            4)
                view_nginx_logs
                ;;
            5)
                view_letsencrypt_logs
                ;;
            6)
                follow_nginx_logs
                ;;
            7)
                follow_letsencrypt_logs
                ;;
            8)
                show_info
                ;;
            0)
                echo -e "${GREEN}До свидания!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}Неверный выбор. Попробуйте еще раз.${NC}"
                sleep 2
                ;;
        esac
    done
}
 
# Запуск основной функции
main
# Делаем файл исполняемым  
chmod +x nginx-manager.sh
 
# Создаем символическую ссылку для глобального доступа
sudo ln -sf /opt/nginx/nginx-manager.sh /usr/local/bin/nginx-manager
cd /opt/nginx
./nginx-manager.sh
nginx-manager
Пункт меню Действие Описание
1 Запустить сервисы Выполняет docker-compose up -d
2 Остановить сервисы Выполняет docker-compose stop
3 Перезагрузить сервисы Выполняет docker-compose restart
Пункт меню Действие Описание
4 Логи nginx_proxy Показывает последние 50 строк
5 Логи nginx_letsencrypt Показывает последние 50 строк
6 Real-time nginx_proxy Отслеживание в реальном времени
7 Real-time nginx_letsencrypt Отслеживание в реальном времени
Пункт меню Действие Описание
8 Информация Статистика, порты, полезные команды
0 Выход Завершение работы скрипта
  • Цветовая схема: Зеленый = активен, красный = остановлен
  • Статус в реальном времени: Отображается при каждом открытии меню
  • Обработка ошибок: Уведомления об успешных/неуспешных операциях
  • Навигация: Простые цифровые команды
# Создаем файл сервиса
sudo nano /etc/systemd/system/nginx-proxy.service
[Unit]
Description=Nginx Proxy with Let's Encrypt
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/nginx
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose stop
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
# Перезагружаем systemd
sudo systemctl daemon-reload
 
# Включаем автозапуск
sudo systemctl enable nginx-proxy.service
 
# Запускаем сервис
sudo systemctl start nginx-proxy.service
 
# Проверяем статус
sudo systemctl status nginx-proxy.service
# Алиасы для nginx-proxy
alias nginx-start='cd /opt/nginx && docker-compose up -d'
alias nginx-stop='cd /opt/nginx && docker-compose stop'
alias nginx-restart='cd /opt/nginx && docker-compose restart'
alias nginx-logs='docker logs nginx_proxy'
alias nginx-logs-ssl='docker logs nginx_letsencrypt'
alias nginx-menu='/opt/nginx/nginx-manager.sh'
source ~/.bashrc
# Все запущенные контейнеры
docker ps
 
# Все контейнеры (включая остановленные)
docker ps -a
 
# Только nginx контейнеры
docker ps --filter "name=nginx"
# Логи nginx-proxy
docker logs nginx_proxy
 
# Логи Let's Encrypt
docker logs nginx_letsencrypt
 
# Логи в реальном времени
docker logs -f nginx_proxy
# Тест nginx конфигурации
docker exec nginx_proxy nginx -t
 
# Перезагрузка nginx без перезапуска контейнера
docker exec nginx_proxy nginx -s reload
 
# Просмотр активной конфигурации
docker exec nginx_proxy cat /etc/nginx/conf.d/default.conf
# Список сертификатов
ls -la /opt/nginx/certs/
 
# Проверка срока действия сертификата
openssl x509 -in /opt/nginx/certs/your-domain.com.crt -text -noout | grep "Not After"
/opt/nginx/
├── docker-compose.yml      # Основная конфигурация
├── nginx-manager.sh        # Скрипт управления
├── certs/                  # SSL сертификаты
├── vhost.d/               # Виртуальные хосты
├── html/                  # Веб-файлы
└── acme/                  # ACME данные

<note warning> Важно: Убедитесь, что скрипт доступен только авторизованным пользователям:

# Ограничение доступа к скрипту
chmod 750 /opt/nginx/nginx-manager.sh
 
# Создание группы для управления nginx
sudo groupadd nginx-admins
sudo usermod -a -G nginx-admins username

</note>

# Добавляем в crontab проверку каждые 5 минут
*/5 * * * * /usr/bin/docker ps | grep nginx_proxy || /opt/nginx/nginx-manager.sh start >/dev/null 2>&1
# Скрипт проверки статуса с уведомлениями
#!/bin/bash
if ! docker ps | grep -q nginx_proxy; then
    echo "Nginx Proxy не запущен!" | mail -s "Nginx Alert" admin@domain.com
fi
# Переходим в директорию
cd /opt/nginx
 
# Останавливаем сервисы
docker-compose stop
 
# Обновляем образы
docker-compose pull
 
# Запускаем с новыми образами
docker-compose up -d
 
# Удаляем старые образы
docker image prune -f

<note important> Всегда создавайте резервные копии перед обновлением:

# Резервная копия конфигураций
tar -czf nginx-backup-$(date +%Y%m%d).tar.gz /opt/nginx/

</note>

  • vm/nginx/04-nginx_menu.txt
  • Последнее изменение: 2025/08/29 12:32
  • admin