Скрипт для удобного управления 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>