Files
DLE/md/WEB_SSH_TUNNEL_PLAN.md

111 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Автоматизация публикации локального приложения через 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@ваш-сервер
```
---
## С локальным агентом публикация действительно становится "в один клик"!