# Автоматизация публикации локального приложения через SSH-туннель и NGINX ## Описание задачи Необходимо реализовать функционал, позволяющий пользователю локального веб-приложения в один клик опубликовать своё приложение в интернете по собственному домену. Для этого используется внешний сервер (VPS) с белым IP и доменом, на котором автоматически настраиваются: - Установка и настройка NGINX для проксирования домена на SSH-туннель - Выпуск и установка SSL-сертификата (Let's Encrypt) - SSH reverse-туннель с сервера на локальное приложение пользователя - (Опционально) Автоматическая установка NGINX и certbot на сервере по SSH силами локального агента Пользователь заполняет форму с необходимыми данными, после чего система автоматически выполняет все шаги по настройке инфраструктуры. --- ## Архитектура решения 1. **Локальное приложение** работает в Docker-контейнере на ПК пользователя (порт 5173 проброшен наружу). 2. **Локальный агент** (Node.js-приложение) устанавливается на ПК пользователя и позволяет фронтенду запускать команды (например, поднять SSH-туннель, а также настраивать NGINX/SSL на сервере по SSH) в один клик. 3. **Агент по SSH подключается к серверу (VPS)** и: - Устанавливает NGINX и certbot (если не установлены) - Создаёт или обновляет конфиг NGINX для указанного домена (проксирует на порт 9000) - Перезапускает NGINX - Выпускает SSL-сертификат через certbot - Проверяет доступность домена по HTTPS - Запускает SSH reverse-туннель (9000:localhost:5173) 4. **NGINX** на сервере проксирует домен на порт туннеля (9000). --- ## Необходимые данные для формы - Домен (например, myapp.example.com) - Host/IP сервера - Пользователь SSH - SSH-ключ (или пароль) - E-mail для SSL (Let's Encrypt) **Поля "Локальный порт приложения", "Порт на сервере для туннеля" и "Порт SSH" скрыты и всегда используются значения по умолчанию:** - Локальный порт: 5173 - Порт на сервере: 9000 - Порт SSH: 22 --- ## UX-поток с локальным агентом (финальный порядок) 1. Пользователь заходит в локальное веб-приложение и заполняет форму публикации (домен, SSH и т.д.). 2. Нажимает кнопку "Опубликовать". 3. Агент автоматически скачивается, устанавливается и запускается (без дополнительных действий пользователя). 4. После запуска агента фронтенд отправляет параметры публикации на локальный агент (порты и порт SSH подставляются автоматически). 5. Агент по SSH подключается к серверу и: - Устанавливает NGINX и certbot (если не установлены) - Создаёт или обновляет конфиг NGINX для домена - Перезапускает NGINX - Выпускает SSL-сертификат через certbot - Запускает SSH reverse-туннель (9000:localhost:5173, порт SSH всегда 22) 6. После успешного запуска туннеля приложение становится доступно по домену из интернета. --- ## План выполнения ### 1. Фронтенд - [ ] Добавить на страницу настроек интерфейса блок "WEB SSH" с кнопкой "Подробнее" - [ ] Создать отдельную страницу - [ ] Реализовать отправку формы на локальный агент (поля с портами и портом SSH скрыты, используются значения по умолчанию) - [ ] После успешной настройки — отобразить пользователю статус публикации с ссылкой на домен ### 2. Локальный агент - [ ] Реализовать Node.js-приложение (Web SSH Agent), слушающее локальный порт - [ ] API: запуск/остановка SSH-туннеля, статус, логирование - [ ] Автоматическая установка и настройка NGINX, выпуск SSL-сертификата на сервере по SSH - [ ] Безопасность: принимать команды только с localhost, авторизация по токену - [ ] Инструкция по установке для пользователя (Windows, Mac, Linux) - [ ] (Опционально) Автообновление агента ### 3. Бэкенд (опционально) - [ ] Реализовать API для логирования, аудита, хранения истории публикаций (если требуется) - [ ] Возвращать статус выполнения и сообщения об ошибках (если используется) ### 4. Инфраструктура/DevOps - [ ] Проверить, что на сервере открыт порт 9000 для туннеля - [ ] Проверить, что домен указывает на сервер - [ ] Проверить, что на сервере установлен NGINX и certbot - [ ] (Опционально) Добавить systemd unit для автозапуска туннеля --- ## Важные замечания - Для полной автоматизации публикации в один клик требуется локальный агент, который запускает команды на ПК пользователя и может настраивать сервер по SSH. - В браузере без агента можно только сгенерировать команду для ручного запуска SSH-туннеля. - Все действия на сервере должны выполняться только для авторизованных пользователей (лучше — только для админов) - Необходимо реализовать валидацию всех полей формы - **Используется именно проброшенный наружу порт из Docker (5173)** - **Порт SSH всегда 1024 (по умолчанию), пользователь не видит это поле** --- приложение остаётся локально — туннель обязателен --- ## Пример команды для SSH-туннеля ```bash ssh -i /path/to/key -p 22 -R 9000:localhost:5173 user@ваш-сервер ``` --- ## С локальным агентом публикация действительно становится "в один клик"!