Skip to main content

MalinaKod Deploy System — клиентский TUI оркестратор с GitHub-синхронизацией

Project description

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 — клиентский пакет (ставится у клиента)

pip install malinakod
malinakod

При первом запуске попросит лицензионный ключ (выдаёт студия). Дальше:

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

В фоне (пока запущен malinakod):

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

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

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:

{
  "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 (бесплатно для ≤100 устройств).

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

  1. Tailscale: https://tailscale.com/download/windows → установить → залогиниться через Google/Microsoft.
  2. OpenSSH-сервер на Windows (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)

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

Студия

pip install malinakod-admin
malinakod-admin

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

Клиент

pip install malinakod
malinakod

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

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

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

Версия

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

malinakod-0.4.1.tar.gz (42.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

malinakod-0.4.1-py3-none-any.whl (50.4 kB view details)

Uploaded Python 3

File details

Details for the file malinakod-0.4.1.tar.gz.

File metadata

  • Download URL: malinakod-0.4.1.tar.gz
  • Upload date:
  • Size: 42.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for malinakod-0.4.1.tar.gz
Algorithm Hash digest
SHA256 3d3b37de8acc10b2c205619cf92618dc6437f8bc7fe2e0d8f56bd5d989faf117
MD5 384d1c92d5becc776833d097ff0e2e2f
BLAKE2b-256 f6ed4c4deab3693912d958e48fa6eb500b82d94ea2631c66f2e22a5339e7e62f

See more details on using hashes here.

File details

Details for the file malinakod-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: malinakod-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 50.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for malinakod-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 797e78ffbce8f097ac5cbed0cae646df270648b2466b08b3b9b7926433723fd5
MD5 4f0ea87ed7e367fa6ab58ebcda754209
BLAKE2b-256 dcebb3e3fca1ed70f1a29cff9753aa2ebf31438914ecc0584557cd6fa6980680

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page