Metadata-Version: 2.4
Name: malinakod
Version: 0.4.1
Summary: MalinaKod Deploy System — клиентский TUI оркестратор с GitHub-синхронизацией
Author: MalinaKod Studio
License: Proprietary
Keywords: deploy,telegram,bot,orchestrator,malinakod,tui
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: Microsoft :: Windows
Classifier: Environment :: Console
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: rich>=13.7
Requires-Dist: questionary>=2.0
Requires-Dist: httpx>=0.27
Requires-Dist: psutil>=5.9
Requires-Dist: cryptography>=42
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == "dev"
Requires-Dist: ruff>=0.4; extra == "dev"

# MalinaKod Deploy System v0.4

Система развёртывания и управления сервисами клиентов студии **MalinaKod**.
Полностью menu-driven TUI, без CLI-команд. GitHub-репо `Medenchi/Malinacode-releases`
используется как контрол-плейн.

## Архитектура

```
┌──────────────────┐                                 ┌─────────────────────┐
│  Студия (admin)  │                                 │ Клиент (Windows /   │
│                  │                                 │ Linux / macOS)      │
│ malinakod-admin  │ ─PUT─▶  ┌──────────────────┐   │                     │
│ (TUI с паролем)  │         │ Medenchi/        │   │ malinakod (TUI)     │
│                  │  GET ◀─│ Malinacode-      │◀──┐│                     │
│                  │         │ releases (priv)  │   ││ • git-like sync 30с │
│                  │         │ /clients/<id>/   │   ││ • запускает сервисы │
└──────────────────┘         │   manifest.json  │   ││   из manifest.json  │
                             │   files/         │   ││ • выполняет команды │
                             │   commands/      │   │└─────────────────────┘
                             │   output/        │   │
                             │   status.json    │◀──┘ heartbeat
                             └──────────────────┘
```

## Два пакета на PyPI

### `malinakod` — клиентский пакет (ставится у клиента)

```bash
pip install malinakod
malinakod
```

При первом запуске попросит лицензионный ключ (выдаёт студия). Дальше:
- 📊 Статус (синхронизация, сервисы)
- 🔄 Принудительная синхронизация
- 📋 Логи
- 🖥️ Информация о машине
- ⚙️ Настройки

В фоне (пока запущен `malinakod`):
- Каждые 30 сек скачивает изменения из `clients/<id>/` своей папки в репо
- Применяет `manifest.json` — запускает / перезапускает / останавливает сервисы
- Каждую минуту пишет heartbeat (`status.json`) обратно в репо
- Каждые 5 сек проверяет `commands/` на новые команды от админа, исполняет, кладёт результат в `output/`

### `malinakod-admin` — пакет студии (ставится у вас)

```bash
pip install malinakod-admin
malinakod-admin
```

При первом запуске:
1. Создаёт зашифрованное хранилище (`~/.malinakod-admin/vault.json`)
2. Просит мастер-пароль
3. Просит GitHub Personal Access Token (Fine-grained, права Contents: Read and write на `Medenchi/Malinacode-releases`)
4. Просит мастер-секрет для подписи лицензий (или генерирует случайный)

Дальше TUI с меню:
- 👥 Клиенты (список с маркером "manifest есть/нет")
- ➕ Создать клиента (автоматически создаёт `clients/<id>/` в репо + выдаёт ключ)
- 📂 Открыть папку клиента в браузере (для drag-and-drop загрузки файлов)
- 📊 Статус клиента (читает heartbeat)
- 💻 Послать команду клиенту (записывает в `commands/`, ждёт ответа в `output/`)
- ⚙️ Настройки

## Загрузка файлов клиенту

Через **веб-интерфейс GitHub** (без команд):

1. В админ-TUI: «Открыть папку клиента в GitHub» → откроется браузер
2. Перейти в `files/`
3. Перетащить файлы в браузер (drag-and-drop) или кнопка **Add file → Upload files**
4. GitHub коммитит автоматически
5. Клиент подхватывает в течение 30 секунд

## manifest.json — описание сервисов

Загрузить через GitHub-веб в `clients/<id>/manifest.json`:

```json
{
  "services": [
    {
      "name": "telegram-bot",
      "run": "python main.py",
      "cwd": "bot",
      "visible": true,
      "port": 8080,
      "env": {"TG_TOKEN": "..."}
    },
    {
      "name": "tg-api",
      "run": "telegram-bot-api.exe --local",
      "cwd": "tg-api",
      "visible": true,
      "port": 8081
    }
  ]
}
```

`cwd` — относительно `files/` (так что `cwd: "bot"` указывает на `files/bot/`).
`visible: false` — сервис скрыт от клиента в TUI.

## Команды от админа

В админ-TUI: «Послать команду клиенту» → ввести shell-команду →
файл создаётся в `clients/<id>/commands/cmd_<ts>.txt` →
клиент исполняет в течение ~30 сек →
результат появится в `clients/<id>/output/cmd_<ts>.log` →
админ TUI прочитает и покажет.

Полезно для:
- Установки зависимостей: `pip install -r files/bot/requirements.txt`
- Сбора инфы: `python --version`, `dir files`, `tasklist`
- Принудительного рестарта: `python -c "import os; os.kill(...)"`

## SSH к клиенту через Tailscale (v0.4+)

Чтобы админ мог делать настоящий SSH к Windows-клиенту без открытых портов и публичного IP — используется [Tailscale](https://tailscale.com) (бесплатно для ≤100 устройств).

### Что нужно поставить на клиента (один раз):

1. **Tailscale**: https://tailscale.com/download/windows → установить → залогиниться через Google/Microsoft.
2. **OpenSSH-сервер** на Windows (PowerShell от админа):
   ```powershell
   Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
   Start-Service sshd
   Set-Service -Name sshd -StartupType Automatic
   New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
   ```
3. Перезапустить `python -m malinakod` — клиент опубликует свой Tailscale IP в `clients/<id>/status.json`.

### Что нужно поставить на студии (один раз):

1. **Tailscale**: https://tailscale.com/download — установить, залогиниться **под тем же аккаунтом** что клиент.
2. **OpenSSH-клиент** (на Windows 10+ предустановлен; если нет — Settings → Apps → Optional features → "OpenSSH Client").

### Использование:

В `python -m malinakod_admin` → меню `🔌 SSH к клиенту` → выбираешь клиента → попадаешь в полноценный SSH-сеанс.

Никаких портов не открывается — Tailscale прокидывает peer-to-peer соединение через NAT.

## Безопасность

- Хранилище админа шифруется паролем (PBKDF2 + Fernet)
- Лицензионные ключи подписаны HMAC-SHA256
- GitHub-репо приватный, доступ только по PAT
- Heartbeat и логи — только в приватном репо
- SSH-доступ через Tailscale mesh (приватная сеть, не зависит от публичного IP)

## Установка с нуля

### Студия

```bash
pip install malinakod-admin
malinakod-admin
```

Следуйте инструкциям первого запуска. После настройки — создавайте клиентов из меню.

### Клиент

```bash
pip install malinakod
malinakod
```

Введите ключ который выдала студия. Готово.

## Связанные репозитории

- `Medenchi/Malinacode-Deploy-system` — этот репо (исходники)
- `Medenchi/Malinacode-releases` — приватный репо для контрол-плейна (создаётся вручную)

## Версия

- `malinakod 0.2.0` (клиент)
- `malinakod-admin 0.1.0` (админка)
