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.3.tar.gz (46.6 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.3-py3-none-any.whl (55.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: malinakod-0.4.3.tar.gz
  • Upload date:
  • Size: 46.6 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.3.tar.gz
Algorithm Hash digest
SHA256 35812d2f8ee9e7ed84c45efae3152aa5d19191e4a35825c737e3ab8cda1d9d2b
MD5 bf85ab3e138ea45f3efd35bc6790cc00
BLAKE2b-256 0d901b4ce825c654b3eb2ad7f57963659442d1a76ee457336a07313affb5b084

See more details on using hashes here.

File details

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

File metadata

  • Download URL: malinakod-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 55.2 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 67511968c85a4870b5250a37a3e1c0447754ff22f746b67a7eb2c821b711978e
MD5 9da9c7c29343c3a37331752b625b3227
BLAKE2b-256 6d4a512501a969464a7e1214b2ed419455822631579416c0ecae3726fbabfd18

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