added desktop and rust version
This commit is contained in:
913
desktop/USAGE_GUIDE.md
Normal file
913
desktop/USAGE_GUIDE.md
Normal file
@@ -0,0 +1,913 @@
|
||||
# Руководство по использованию Desktop приложения
|
||||
|
||||
## Обзор
|
||||
|
||||
Desktop версия knocker-приложения предоставляет полный функционал порт-простукивания (port knocking) в виде автономного Electron приложения. Поддерживает как работу через внешний API сервер, так и локальное простукивание через Node.js.
|
||||
|
||||
## Содержание
|
||||
|
||||
1. [Установка и запуск](#установка-и-запуск)
|
||||
2. [Режимы работы](#режимы-работы)
|
||||
3. [Конфигурация](#конфигурация)
|
||||
4. [API контракты](#api-контракты)
|
||||
5. [Локальное простукивание](#локальное-простукивание)
|
||||
6. [Интерфейс пользователя](#интерфейс-пользователя)
|
||||
7. [Примеры использования](#примеры-использования)
|
||||
8. [Устранение неполадок](#устранение-неполадок)
|
||||
9. [Разработка](#разработка)
|
||||
|
||||
---
|
||||
|
||||
## Установка и запуск
|
||||
|
||||
### Предварительные требования
|
||||
|
||||
- **Node.js** v18+
|
||||
- **npm** v8+
|
||||
- **Операционная система**: Windows, macOS, Linux
|
||||
|
||||
### Установка зависимостей
|
||||
|
||||
```bash
|
||||
cd desktop
|
||||
npm install
|
||||
```
|
||||
|
||||
### Режимы запуска
|
||||
|
||||
#### Разработка
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
#### Сборка для продакшена
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
#### Создание исполняемых файлов
|
||||
|
||||
```bash
|
||||
npm run dist
|
||||
```
|
||||
|
||||
#### Упаковка для конкретной платформы
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
npm run dist:win
|
||||
|
||||
# macOS
|
||||
npm run dist:mac
|
||||
|
||||
# Linux
|
||||
npm run dist:linux
|
||||
```
|
||||
|
||||
### Переменные окружения
|
||||
|
||||
```bash
|
||||
# Базовый URL API (опционально)
|
||||
export KNOCKER_DESKTOP_API_BASE="http://localhost:8080/api/v1"
|
||||
|
||||
# Запуск в режиме разработки
|
||||
npm run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Режимы работы
|
||||
|
||||
### 1. API режим (по умолчанию)
|
||||
|
||||
Приложение подключается к внешнему HTTP API серверу для выполнения операций простукивания.
|
||||
|
||||
**Активация:**
|
||||
|
||||
- Установить корректный `apiBase` URL в настройках
|
||||
- Например: `http://localhost:8080/api/v1`
|
||||
|
||||
**Возможности:**
|
||||
|
||||
- ✅ HTTP API простукивание
|
||||
- ✅ Шифрование/расшифровка YAML
|
||||
- ✅ Полная функциональность backend сервера
|
||||
|
||||
### 2. Локальный режим
|
||||
|
||||
Приложение выполняет простукивание напрямую через Node.js сокеты без внешнего API.
|
||||
|
||||
**Активация:**
|
||||
|
||||
- Установить `apiBase` в `""` (пустая строка)
|
||||
- Или установить `apiBase` в `"internal"`
|
||||
|
||||
**Возможности:**
|
||||
|
||||
- ✅ TCP простукивание
|
||||
- ✅ UDP простукивание
|
||||
- ❌ Шифрование/расшифровка (недоступно)
|
||||
- ✅ Автономная работа
|
||||
|
||||
#### Локальное простукивание с gateway (Rust/Go helper)
|
||||
- Если указано `gateway` (IP или имя интерфейса), Electron автоматически запускает встроенный helper из папки `bin/`:
|
||||
- `knock-local-rust` (Rust) — используется приоритетно, если присутствует
|
||||
- `knock-local` (Go) — используется как fallback, если Rust-бинарь отсутствует
|
||||
- Оба helper-а на Linux используют `SO_BINDTODEVICE` для надежной привязки к интерфейсу и обхода VPN/WireGuard.
|
||||
- Если `gateway` не указан — используется встроенная Node-реализация без привязки к интерфейсу.
|
||||
|
||||
Требования при разработке:
|
||||
- Для Rust-хелпера ничего дополнительно не требуется (собирается скриптом `npm run rust:build`).
|
||||
- Для Go-хелпера должен быть установлен Go toolchain (скрипт `npm run go:build`).
|
||||
В релизных сборках оба бинаря включаются автоматически.
|
||||
|
||||
Важно (TCP): привязка интерфейса (`SO_BINDTODEVICE`) устанавливается до `connect()`. Это гарантирует, что исходящее TCP-соединение пойдёт через указанный интерфейс, а не в туннель.
|
||||
|
||||
### 3. Переключение между режимами
|
||||
|
||||
**API → Локальный:**
|
||||
|
||||
1. Открыть настройки (Ctrl/Cmd + ,)
|
||||
2. Установить `apiBase: ""` или `apiBase: "internal"`
|
||||
3. Сохранить настройки
|
||||
4. Перезапустить приложение
|
||||
|
||||
**Локальный → API:**
|
||||
|
||||
1. Открыть настройки
|
||||
2. Установить корректный `apiBase` URL
|
||||
3. Сохранить настройки
|
||||
4. Перезапустить приложение
|
||||
|
||||
---
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Файл конфигурации
|
||||
|
||||
Конфигурация сохраняется в: `~/.config/[app-name]/config.json`
|
||||
|
||||
**Структура конфигурации:**
|
||||
|
||||
```json
|
||||
{
|
||||
"apiBase": "http://localhost:8080/api/v1",
|
||||
"gateway": "default-gateway",
|
||||
"inlineTargets": "tcp:127.0.0.1:22;tcp:192.168.1.1:80",
|
||||
"delay": "1s"
|
||||
}
|
||||
```
|
||||
|
||||
### Поля конфигурации
|
||||
|
||||
| Поле | Тип | Описание | По умолчанию |
|
||||
|------|-----|----------|--------------|
|
||||
| `apiBase` | string | URL API сервера или "internal" | `http://localhost:8080/api/v1` |
|
||||
| `gateway` | string | Шлюз по умолчанию | `""` |
|
||||
| `inlineTargets` | string | Цели в inline формате | `""` |
|
||||
| `delay` | string | Задержка между целями | `"1s"` |
|
||||
|
||||
### Редактирование конфигурации
|
||||
|
||||
**Через интерфейс:**
|
||||
|
||||
1. Меню → Настройки
|
||||
2. Редактирование JSON в текстовом поле
|
||||
3. Кнопка "Сохранить"
|
||||
|
||||
**Программно:**
|
||||
|
||||
```javascript
|
||||
// Получить значение
|
||||
const apiBase = await window.api.getConfig('apiBase');
|
||||
|
||||
// Установить значение
|
||||
await window.api.setConfig('apiBase', 'http://new-api.com');
|
||||
|
||||
// Получить всю конфигурацию
|
||||
const config = await window.api.getAllConfig();
|
||||
|
||||
// Установить всю конфигурацию
|
||||
await window.api.setAllConfig(newConfig);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API контракты
|
||||
|
||||
### HTTP API Endpoints (для API режима)
|
||||
|
||||
#### 1. Выполнение простукивания
|
||||
|
||||
**POST** `/api/v1/knock-actions/execute`
|
||||
|
||||
**Headers:**
|
||||
|
||||
``` text
|
||||
Content-Type: application/json
|
||||
Authorization: Basic <base64(username:password)>
|
||||
```
|
||||
|
||||
**Body (YAML режим):**
|
||||
|
||||
```json
|
||||
{
|
||||
"config_yaml": "targets:\n - protocol: tcp\n host: 127.0.0.1\n ports: [22, 80]\ndelay: 1s"
|
||||
}
|
||||
```
|
||||
|
||||
**Body (Inline режим):**
|
||||
|
||||
```json
|
||||
{
|
||||
"targets": "tcp:127.0.0.1:22;tcp:192.168.1.1:80",
|
||||
"delay": "1s",
|
||||
"verbose": true,
|
||||
"waitConnection": false,
|
||||
"gateway": "gateway.com"
|
||||
}
|
||||
```
|
||||
|
||||
**Body (Form режим):**
|
||||
|
||||
```json
|
||||
{
|
||||
"targets": "tcp:127.0.0.1:22;tcp:192.168.1.1:80",
|
||||
"delay": "2s",
|
||||
"verbose": true,
|
||||
"waitConnection": true
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Knocking completed successfully"
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. Шифрование YAML
|
||||
|
||||
**POST** `/api/v1/knock-actions/encrypt`
|
||||
|
||||
**Headers:**
|
||||
|
||||
``` text
|
||||
Content-Type: application/json
|
||||
Authorization: Basic <base64(username:password)>
|
||||
```
|
||||
|
||||
**Body:**
|
||||
|
||||
```json
|
||||
{
|
||||
"yaml": "targets:\n - protocol: tcp\n host: 127.0.0.1\n ports: [22]"
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"encrypted": "ENCRYPTED:base64-encoded-data"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. Расшифровка YAML
|
||||
|
||||
**POST** `/api/v1/knock-actions/decrypt`
|
||||
|
||||
**Headers:**
|
||||
|
||||
``` text
|
||||
Content-Type: application/json
|
||||
Authorization: Basic <base64(username:password)>
|
||||
```
|
||||
|
||||
**Body:**
|
||||
|
||||
```json
|
||||
{
|
||||
"encrypted": "ENCRYPTED:base64-encoded-data"
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"yaml": "targets:\n - protocol: tcp\n host: 127.0.0.1\n ports: [22]"
|
||||
}
|
||||
```
|
||||
|
||||
### IPC API (для локального режима)
|
||||
|
||||
#### Локальное простукивание
|
||||
|
||||
**Channel:** `knock:local`
|
||||
|
||||
**Request:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
targets: string[], // ["tcp:127.0.0.1:22", "udp:192.168.1.1:53"]
|
||||
delay: string, // "1s", "2m", "500ms"
|
||||
verbose: boolean, // true/false
|
||||
gateway: string // "192.168.1.1" (опционально)
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
success: boolean,
|
||||
results: [
|
||||
{
|
||||
target: string,
|
||||
success: boolean,
|
||||
message: string
|
||||
}
|
||||
],
|
||||
summary: {
|
||||
total: number,
|
||||
successful: number,
|
||||
failed: number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Локальное простукивание _
|
||||
|
||||
### Поддерживаемые протоколы
|
||||
|
||||
- **TCP** - создание соединения и немедленное закрытие
|
||||
- **UDP** - отправка пакета данных (fire-and-forget)
|
||||
|
||||
### Формат целей
|
||||
|
||||
``` text
|
||||
protocol:host:port[:gateway]
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
|
||||
- `tcp:127.0.0.1:22`
|
||||
- `udp:192.168.1.1:53`
|
||||
- `tcp:example.com:80:gateway.com`
|
||||
|
||||
### Поддержка Gateway
|
||||
|
||||
Gateway можно указать двумя способами:
|
||||
|
||||
1. **В строке цели**: `tcp:host:port:gateway_ip`
|
||||
2. **Глобально через поле Gateway**: используется для всех целей, если не указан в самой цели
|
||||
|
||||
**Приоритет gateway:**
|
||||
|
||||
- Gateway из строки цели имеет приоритет над глобальным
|
||||
- Если gateway не указан, используется системный маршрут по умолчанию
|
||||
|
||||
**Примеры использования gateway:**
|
||||
|
||||
``` text
|
||||
tcp:192.168.1.100:22:192.168.1.1 # Через конкретный gateway
|
||||
tcp:127.0.0.1:22 # Системный маршрут
|
||||
udp:example.com:53 # Системный маршрут
|
||||
```
|
||||
|
||||
### Формат задержек
|
||||
|
||||
- `1s` - 1 секунда
|
||||
- `500ms` - 500 миллисекунд (не поддерживается, используйте `0.5s`)
|
||||
- `2m` - 2 минуты
|
||||
- `1h` - 1 час
|
||||
|
||||
### Таймауты
|
||||
|
||||
- **TCP**: 5 секунд по умолчанию
|
||||
- **UDP**: 5 секунд по умолчанию
|
||||
|
||||
### Примеры локального простукивания
|
||||
|
||||
```javascript
|
||||
// Простое TCP простукивание
|
||||
const result = await window.api.localKnock({
|
||||
targets: ["tcp:127.0.0.1:22"],
|
||||
delay: "1s",
|
||||
verbose: true
|
||||
});
|
||||
|
||||
// Множественные цели
|
||||
const result = await window.api.localKnock({
|
||||
targets: [
|
||||
"tcp:127.0.0.1:22",
|
||||
"udp:192.168.1.1:53",
|
||||
"tcp:example.com:80"
|
||||
],
|
||||
delay: "2s",
|
||||
verbose: false
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Интерфейс пользователя
|
||||
|
||||
### Главное окно
|
||||
|
||||
#### Поля конфигурации _
|
||||
|
||||
- **API URL** - адрес API сервера или "internal" для локального режима
|
||||
- **Gateway** - шлюз по умолчанию
|
||||
- **Password** - пароль для аутентификации
|
||||
|
||||
#### Режимы работы _
|
||||
|
||||
1. **Inline** - простой текстовый формат целей
|
||||
2. **YAML** - структурированная YAML конфигурация
|
||||
3. **Form** - графический редактор целей
|
||||
|
||||
#### Inline режим
|
||||
|
||||
- **Targets** - цели в формате `protocol:host:port;protocol:host:port`
|
||||
- **Delay** - задержка между целями
|
||||
- **Verbose** - подробный вывод
|
||||
- **Wait Connection** - ожидание соединения
|
||||
- **Gateway** - шлюз
|
||||
|
||||
#### YAML режим
|
||||
|
||||
- **Config YAML** - YAML конфигурация
|
||||
- **Server File Path** - путь к файлу на сервере
|
||||
- **Encrypt/Decrypt** - шифрование/расшифровка
|
||||
|
||||
#### Form режим
|
||||
|
||||
- **Targets List** - список целей с возможностью редактирования
|
||||
- **Add Target** - добавление новой цели
|
||||
- **Remove** - удаление цели
|
||||
|
||||
### Меню приложения
|
||||
|
||||
#### Файл
|
||||
|
||||
- **Открыть файл** - загрузка YAML конфигурации
|
||||
- **Сохранить как** - сохранение текущей конфигурации
|
||||
- **Выход** - закрытие приложения
|
||||
|
||||
#### Настройки
|
||||
|
||||
- **Настройки** - открытие окна конфигурации
|
||||
|
||||
#### Справка
|
||||
|
||||
- **О программе** - информация о версии
|
||||
- **Документация** - ссылки на документацию
|
||||
|
||||
### Окно настроек
|
||||
|
||||
#### Редактирование конфигурации _
|
||||
|
||||
- **JSON Editor** - многострочное поле для редактирования
|
||||
- **Save** - сохранение изменений
|
||||
- **Return** - возврат к главному окну
|
||||
|
||||
#### Валидация
|
||||
|
||||
- Автоматическая проверка JSON синтаксиса
|
||||
- Отображение ошибок валидации
|
||||
- Предотвращение сохранения некорректных данных
|
||||
|
||||
---
|
||||
|
||||
## Примеры использования
|
||||
|
||||
### Пример 1: Базовое простукивание SSH
|
||||
|
||||
**Цель:** Открыть SSH доступ к серверу
|
||||
|
||||
**Конфигурация:**
|
||||
|
||||
```json
|
||||
{
|
||||
"apiBase": "internal",
|
||||
"gateway": "",
|
||||
"inlineTargets": "tcp:192.168.1.100:22",
|
||||
"delay": "1s"
|
||||
}
|
||||
```
|
||||
|
||||
**Шаги:**
|
||||
|
||||
1. Установить режим "Inline"
|
||||
2. Ввести цель: `tcp:192.168.1.100:22`
|
||||
3. Установить задержку: `1s`
|
||||
4. Нажать "Выполнить"
|
||||
|
||||
### Пример 2: Множественные цели
|
||||
|
||||
**Цель:** Простучать несколько сервисов
|
||||
|
||||
**Конфигурация:**
|
||||
|
||||
``` text
|
||||
tcp:server1.com:22;tcp:server1.com:80;udp:server2.com:53
|
||||
```
|
||||
|
||||
**Задержка:** `2s`
|
||||
|
||||
### Пример 3: YAML конфигурация
|
||||
|
||||
**Файл конфигурации:**
|
||||
|
||||
```yaml
|
||||
targets:
|
||||
- protocol: tcp
|
||||
host: 127.0.0.1
|
||||
ports: [22, 80, 443]
|
||||
wait_connection: true
|
||||
- protocol: udp
|
||||
host: 192.168.1.1
|
||||
ports: [53, 123]
|
||||
delay: 1s
|
||||
path: /etc/knocker/config.yaml
|
||||
```
|
||||
|
||||
### Пример 4: Шифрование конфигурации
|
||||
|
||||
**Шаги:**
|
||||
|
||||
1. Создать YAML конфигурацию
|
||||
2. Установить пароль
|
||||
3. Нажать "Зашифровать"
|
||||
4. Сохранить зашифрованный файл
|
||||
|
||||
### Пример 5: Локальный режим с множественными целями
|
||||
|
||||
**Конфигурация для локального режима:**
|
||||
|
||||
```json
|
||||
{
|
||||
"apiBase": "internal",
|
||||
"inlineTargets": "tcp:127.0.0.1:22;tcp:127.0.0.1:80;udp:127.0.0.1:53",
|
||||
"delay": "1s"
|
||||
}
|
||||
```
|
||||
|
||||
### Пример 6: Использование Gateway
|
||||
|
||||
**Простукивание через определенный интерфейс:**
|
||||
|
||||
```json
|
||||
{
|
||||
"apiBase": "internal",
|
||||
"gateway": "192.168.1.1",
|
||||
"inlineTargets": "tcp:192.168.1.100:22",
|
||||
"delay": "1s"
|
||||
}
|
||||
```
|
||||
|
||||
**Смешанное использование gateway:**
|
||||
|
||||
``` text
|
||||
tcp:127.0.0.1:22;tcp:192.168.1.100:22:192.168.1.1;udp:example.com:53
|
||||
```
|
||||
|
||||
- Первая цель: без gateway (системный маршрут)
|
||||
- Вторая цель: через gateway 192.168.1.1
|
||||
- Третья цель: без gateway
|
||||
|
||||
Замечания по ошибкам:
|
||||
- Если указан несуществующий интерфейс в `gateway`, helper вернёт критическую ошибку и код выхода 1.
|
||||
- При `waitConnection: false` сетевые отказы соединения трактуются как предупреждения, но ошибки привязки к интерфейсу — всегда ошибки.
|
||||
|
||||
---
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
### Общие проблемы
|
||||
|
||||
#### Проблема: "API URL не доступен"
|
||||
|
||||
**Симптомы:**
|
||||
|
||||
- Ошибки подключения к API
|
||||
- Таймауты при выполнении операций
|
||||
|
||||
**Решения:**
|
||||
|
||||
1. Проверить доступность API сервера
|
||||
2. Проверить правильность URL
|
||||
3. Проверить настройки файрвола
|
||||
4. Переключиться в локальный режим
|
||||
|
||||
#### Проблема: "Неправильный пароль"
|
||||
|
||||
**Симптомы:**
|
||||
|
||||
- HTTP 401 ошибки
|
||||
- Отказ в доступе при шифровании
|
||||
|
||||
**Решения:**
|
||||
|
||||
1. Проверить правильность пароля
|
||||
2. Убедиться в корректности base64 кодирования
|
||||
3. Проверить настройки аутентификации на сервере
|
||||
|
||||
#### Проблема: "Файл не найден"
|
||||
|
||||
**Симптомы:**
|
||||
|
||||
- Ошибки при открытии файлов
|
||||
- "File not found" при сохранении
|
||||
|
||||
**Решения:**
|
||||
|
||||
1. Проверить права доступа к файлам
|
||||
2. Убедиться в существовании директорий
|
||||
3. Проверить путь к файлу
|
||||
|
||||
### Проблемы локального режима
|
||||
|
||||
#### Проблема: "No targets provided"
|
||||
|
||||
**Причина:** Не удалось извлечь цели из конфигурации
|
||||
|
||||
**Решение:**
|
||||
|
||||
1. Проверить заполнение поля targets
|
||||
2. Убедиться в корректности формата
|
||||
3. Проверить режим работы (inline/yaml/form)
|
||||
|
||||
#### Проблема: "Unsupported protocol"
|
||||
|
||||
**Причина:** Использован неподдерживаемый протокол
|
||||
|
||||
**Решение:**
|
||||
|
||||
- Использовать только `tcp` или `udp`
|
||||
- Проверить синтаксис: `protocol:host:port`
|
||||
|
||||
#### Проблема: "Connection timeout"
|
||||
|
||||
**Причина:** Цель недоступна или заблокирована
|
||||
|
||||
**Решение:**
|
||||
|
||||
1. Проверить доступность цели
|
||||
2. Проверить настройки файрвола
|
||||
3. Убедиться в правильности IP/порта
|
||||
|
||||
### Проблемы конфигурации
|
||||
|
||||
#### Проблема: "Invalid JSON"
|
||||
|
||||
**Симптомы:**
|
||||
|
||||
- Ошибки при сохранении настроек
|
||||
- Невозможность загрузить конфигурацию
|
||||
|
||||
**Решения:**
|
||||
|
||||
1. Проверить синтаксис JSON
|
||||
2. Использовать валидатор JSON
|
||||
3. Проверить экранирование специальных символов
|
||||
|
||||
#### Проблема: "Настройки не сохраняются"
|
||||
|
||||
**Причина:** Проблемы с правами доступа
|
||||
|
||||
**Решение:**
|
||||
|
||||
1. Проверить права записи в директорию конфигурации
|
||||
2. Запустить от имени администратора (если необходимо)
|
||||
3. Проверить свободное место на диске
|
||||
|
||||
### Диагностика
|
||||
|
||||
#### Логи приложения
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
%APPDATA%/[app-name]/logs/
|
||||
|
||||
# macOS
|
||||
~/Library/Logs/[app-name]/
|
||||
|
||||
# Linux
|
||||
~/.config/[app-name]/logs/
|
||||
```
|
||||
|
||||
#### DevTools
|
||||
|
||||
1. Открыть DevTools (F12)
|
||||
2. Проверить Console на ошибки
|
||||
3. Проверить Network для API запросов
|
||||
4. Проверить Application → Local Storage
|
||||
|
||||
#### Командная строка
|
||||
|
||||
```bash
|
||||
# Запуск с отладкой
|
||||
npm run dev -- --enable-logging
|
||||
|
||||
# Проверка переменных окружения
|
||||
echo $KNOCKER_DESKTOP_API_BASE
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Разработка _
|
||||
|
||||
### Структура проекта
|
||||
|
||||
``` text
|
||||
desktop/
|
||||
├── src/
|
||||
│ ├── main/ # Main процесс
|
||||
│ │ └── main.js # Основная логика
|
||||
│ ├── preload/ # Preload скрипты
|
||||
│ │ └── preload.js # IPC мост
|
||||
│ └── renderer/ # Renderer процесс
|
||||
│ ├── index.html # Главная страница
|
||||
│ ├── renderer.js # UI логика
|
||||
│ ├── settings.html # Страница настроек
|
||||
│ └── settings.js # Логика настроек
|
||||
├── package.json # Зависимости и скрипты
|
||||
├── electron-builder.yml # Конфигурация сборки
|
||||
└── README.md # Документация
|
||||
```
|
||||
|
||||
### Ключевые файлы
|
||||
|
||||
#### `src/main/main.js`
|
||||
|
||||
- Создание и управление окнами
|
||||
- IPC обработчики
|
||||
- Локальное простукивание
|
||||
- Файловые операции
|
||||
|
||||
#### `src/preload/preload.js`
|
||||
|
||||
- Безопасный мост между процессами
|
||||
- Экспорт API в renderer
|
||||
|
||||
#### `src/renderer/renderer.js`
|
||||
|
||||
- UI логика
|
||||
- Обработка пользовательского ввода
|
||||
- HTTP запросы к API
|
||||
|
||||
### Добавление новых функций
|
||||
|
||||
#### 1. Новый IPC метод
|
||||
|
||||
**В main.js:**
|
||||
|
||||
```javascript
|
||||
ipcMain.handle('new:method', async (_e, payload) => {
|
||||
// Логика метода
|
||||
return { success: true, data: result };
|
||||
});
|
||||
```
|
||||
|
||||
**В preload.js:**
|
||||
|
||||
```javascript
|
||||
contextBridge.exposeInMainWorld('api', {
|
||||
// ... существующие методы
|
||||
newMethod: async (payload) => ipcRenderer.invoke('new:method', payload)
|
||||
});
|
||||
```
|
||||
|
||||
**В renderer.js:**
|
||||
|
||||
```javascript
|
||||
const result = await window.api.newMethod(data);
|
||||
```
|
||||
|
||||
#### 2. Новый UI элемент
|
||||
|
||||
**В index.html:**
|
||||
|
||||
```html
|
||||
<button id="newButton">Новая функция</button>
|
||||
```
|
||||
|
||||
**В renderer.js:**
|
||||
|
||||
```javascript
|
||||
qsi('#newButton')?.addEventListener('click', async () => {
|
||||
// Логика обработки
|
||||
});
|
||||
```
|
||||
|
||||
### Тестирование
|
||||
|
||||
#### Unit тесты
|
||||
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
#### Интеграционные тесты
|
||||
|
||||
```bash
|
||||
npm run test:integration
|
||||
```
|
||||
|
||||
#### E2E тесты
|
||||
|
||||
```bash
|
||||
npm run test:e2e
|
||||
```
|
||||
|
||||
### Сборка и деплой
|
||||
|
||||
#### Локальная сборка
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
#### Создание дистрибутивов
|
||||
|
||||
```bash
|
||||
npm run dist
|
||||
```
|
||||
|
||||
#### Автоматические релизы
|
||||
|
||||
```bash
|
||||
npm run release
|
||||
```
|
||||
|
||||
### Отладка
|
||||
|
||||
#### DevTools _
|
||||
|
||||
- **Main процесс**: `--inspect` флаг
|
||||
- **Renderer процесс**: F12 в приложении
|
||||
|
||||
#### Логирование
|
||||
|
||||
```javascript
|
||||
console.log('Debug info:', data);
|
||||
console.error('Error:', error);
|
||||
```
|
||||
|
||||
#### Профилирование
|
||||
|
||||
```bash
|
||||
npm run dev -- --enable-profiling
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Рекомендации
|
||||
|
||||
1. **Пароли**: Используйте сильные пароли для аутентификации
|
||||
2. **Сеть**: Ограничьте доступ к API серверу
|
||||
3. **Файлы**: Не храните пароли в открытом виде
|
||||
4. **Обновления**: Регулярно обновляйте приложение
|
||||
|
||||
### Ограничения
|
||||
|
||||
- Локальное простукивание выполняется с правами пользователя
|
||||
- Не требует root/administrator прав
|
||||
- Подчиняется системным ограничениям сетевого доступа
|
||||
|
||||
---
|
||||
|
||||
## Поддержка
|
||||
|
||||
### Контакты
|
||||
|
||||
- **Документация**: [LOCAL_KNOCKING.md](./LOCAL_KNOCKING.md)
|
||||
- **Исходный код**: [GitHub Repository]
|
||||
- **Issues**: [GitHub Issues]
|
||||
|
||||
### Версии
|
||||
|
||||
- **Текущая версия**: 1.0
|
||||
- **Electron**: v28+
|
||||
- **Node.js**: v18+
|
||||
|
||||
### Лицензия
|
||||
|
||||
[Указать лицензию]
|
||||
|
||||
---
|
||||
|
||||
**Версия документации**: 1.0
|
||||
**Дата создания**: 2024
|
||||
**Совместимость**: Electron Desktop App v1.0+
|
Reference in New Issue
Block a user