English · Русский
A DevOps engineer's workspace in one window: a terminal with an AI panel and a local model, an AI agent that investigates hosts under your rules, Kubernetes, databases, an IDE with git, Grafana/ArgoCD/GitLab in tabs, alerts, notes with tasks and reminders, KeePass and Passbolt, SSH, host monitoring, files between hosts, Yandex Cloud and MikroTik — in one native app for Linux, Windows and macOS.
🌐 Website with an overview and a guide: https://leoalecksey.github.io/opsdeck/en/ (Русский)
Stack: Rust + Tauri 2 (backend), TypeScript + Vite (UI), xterm.js (terminal), kube-rs (Kubernetes), llama.cpp (local AI).
- Tabs and splits, a real shell (bash/zsh/PowerShell, WSL and Git Bash on Windows), colour schemes.
- Command blocks: every command gets an exit code and duration, an action bar (copy command/output, save as a snippet, send to AI), an "ask AI" bar on failure, jumping between commands.
- AI panel on the right: Claude Code, Codex, Gemini, Aider or OpenCode in their own terminal (up to three side by side); a selection or a command's output goes there with one key.
- Claude Code IDE integration:
claudestarted inside OpsDeck connects to it by itself (MCP over WebSocket on 127.0.0.1) — it sees the selection in notes and gets links to them. - Resource line at the bottom: CPU, load, RAM, disk — of this machine or of the remote one in the active SSH session.
- Session recording to a text file with the ⏺ button.
- Command palette
Ctrl+Shift+P: sections, clusters, hosts, notes, passwords, command history, snippets with{{name}}parameters. - Fish-style suggestions while typing: the rest of the command in grey from bash/zsh history and code blocks in notes,
→accepts. - Ctrl+click on a path in the output opens the file at the line; on an address (
http://0.0.0.0:8000, a short host name, a private IP inside an SSH session) OpsDeck opens it, raising anssh -Ltunnel when needed. - "Open folder in web": serves the current folder of an SSH session with
python3 -m http.serveron the host's 127.0.0.1 and opens it through anssh -Ltunnel — pick up files without sftp. - Highlighting of the command being typed and of output (ERROR/WARN, pod statuses, IPs, links), a files panel with git status.
- Font and right mouse button (menu, PuTTY-style paste, or Windows Terminal-style "copy selection, otherwise paste") — ⚙ → Terminal.
Ctrl+Shift+K: describe what to do in words and get a command that takes your notes and history into account.- Runs on llama.cpp, installed from Settings if you want it, works offline: the light Qwen2.5-Coder 1.5B (≈1.1 GB) by default, Qwen3.5 4B/9B, Qwen3.8 27B and Qwen3.6 35B-A3B for powerful machines, or your own
.gguf. Settings show for each model whether this computer can run it (★ the strongest that fits, ⚠ tight on memory or slow without a GPU, ✕ won't run) and refuse to start a download that won't fit on disk. GPU acceleration: Vulkan on Linux/Windows, Metal on Mac. Context size is selectable (16384 tokens by default). - Or your own server with an OpenAI-compatible API — Ollama, vLLM, LM Studio (the key is kept in the system password store).
- Knowledge base: built-in cheat sheets for kubectl, helm, docker, systemd, terraform, git, ssh, jq, networking, disks, nginx, PostgreSQL, MySQL, ClickHouse, Kafka, Redis, Vault, PromQL, ansible, Yandex Cloud and certificates (23 topics, over 250 commands). When a request matches a topic, the verified commands go into the model's prompt — real flags, not made-up ones. Your own commands go into
knowledge.mdnext to the settings and come first. - Chat with the local AI in the AI panel: up to 8 tabs, each can be bound to a terminal tab (its folder and shell) or to a server from the SSH list. Conversations are kept between launches on this computer only (
ai-chats.json, mode0600; can be turned off in ⚙ → Local AI).
- The agent goes to the host itself: picks a command, runs it, reads the output and takes the next step — until it reaches a conclusion or runs out of steps. Every step is visible: host, command, "read" or "change", exit code and output. Started from the AI panel with the Investigation checkbox, "Stop" interrupts between steps.
- Access level per host: stay away / read only / change with permission / change freely. On a read-only host a changing command doesn't run at all; a change is shown as the exact command line and goes nowhere without a click.
- Never runs, at any level: redirections and compound commands (
>,;,&&, backticks), interpreters (sh,bash,python,awk,nc) and the irreversible (rm,dd,mkfs,reboot,passwd). Arguments are checked too:sysctl -w,ip link set,sort -ocount as changes.sudois off by a separate checkbox. - Your own rules in three lists (count as reading, always ask, forbid completely) and a log of every command run. The backend re-checks the policy right before
ssh, and output from hosts is treated as data, not instructions. - AI context for hosts: a note on what runs on a server and what matters ("PostgreSQL 16, orders DB; backups at 03:00; don't restart without approval") goes to the agent and the chat as information.
- The agent's model is chosen separately: the chat's model or your own external server.
- Its own kubeconfig store (your
~/.kube/configis not changed): import selected contexts, paste YAML, drag & drop files. - Live tables (watch), CPU/RAM from metrics-server, requests/limits next to usage, any CRD with columns like
kubectl get, label filter likekubectl -l. - Problems and checks: two tables at the top of the list — what is broken now (CrashLoopBackOff, OOMKilled, image pull errors, unschedulable pods, missing Secrets and ConfigMaps) and what is configured unsafely, with a "how to fix" hint. Nothing has to be installed in the cluster.
- Pod logs and logs of all pods of a Deployment/StatefulSet/DaemonSet/Job at once, with filters, a timeline chart of errors and warnings and saving to a file; a "Details" tab with links to related objects; the object's pods as a tab; YAML with server-side apply.
- Shell, node shell (
kubectl debug), port-forward, scale, restart, delete; multi-select and bulk delete; several namespaces as chips; Helm releases (values, history, rollback) and Argo CD Applications (sync/refresh). Keyboard navigation. - Read-only mode for production contexts — the backend blocks changes. A lost connection is shown as such, not passed off as fresh data.
- PostgreSQL, MySQL/MariaDB, ClickHouse, Redis, MongoDB: connect by address and port, password from keyring, KeePass or Passbolt, TLS.
- Structure tree (databases → schemas → tables → columns and indexes), a query editor with history, a results table, copy to CSV/JSON.
- Read-only mode for production databases: PostgreSQL and ClickHouse forbid writes on the server side.
- Editor with highlighting (Terraform/HCL, YAML, JSON, TS/JS, Python, Go, Rust, SQL, Shell, Dockerfile…), file icons, project tree; several projects as chips, each with its own tabs.
- YAML/JSON/Terraform errors right in the code,
terraform fmton save; project-wide search (Ctrl+Shift+F), text or regex. - Pipeline graph for
.gitlab-ci.ymland.github/workflows: stages and jobs; pick the event, branch, changed files and variables and see what will run, what is manual and what won't run — before you push.include: local,extends, YAML anchors and!referenceare resolved. - Git panel: commit graph of all branches, diffs, branches (switch, create, merge, delete), fetch/pull/push, commit; lines not yet pushed are marked. A mini console in the project folder.
- Grafana, ArgoCD, GitLab and any sites — as tabs inside the window with automatic login (password from keyring, KeePass or Passbolt).
- Alerts 🔔: OpsDeck polls Grafana Alerting, Prometheus Alertmanager, Zabbix 6.0+ and JSON feeds of your AI analyzers itself — nothing has to be exposed to your machine. Desktop notifications, history, links to dashboards/silences, alert analysis in AI.
- Your own AI analyzer of logs and alerts can push findings to
127.0.0.1with a token — the app has a ready guide and acurlexample.
- SSH: profiles (key, jump host, password from KeePass or Passbolt), hosts from
~/.ssh/config, groups, double click connects, a warning and a one-click fix when ssh would reject a key because of its permissions. - Host monitoring: a board of SSH hosts — CPU, load, RAM, disk, uptime, coloured by the worst value; metrics are taken by key or through an already open session, one connection per host.
- Files on hosts: two panes — this machine or a host over SSH; download, upload, create a folder, rename, delete. Host → host goes through
scp -3, OpsDeck holds both connections. Uses systemsftpandscp, so~/.ssh/config, ProxyJump and keys apply; key login only. - Yandex Cloud: instances (state, configuration, addresses, start/stop/restart, SSH in one click), networks and subnets, security groups with readable rules, public addresses, service accounts with roles and billing accounts. Works through the
ycCLI and its profiles (yc init) — OpsDeck stores no tokens or service account keys. - MikroTik: WinBox and SSH in one click, import of saved routers from WinBox.
- Network and DNS: ping, mtr, traceroute, dig, nslookup; a host port scan (open/closed/filtered and what answers) and the ports this machine listens on, with processes.
- Modules: the ⊞ button in the left column turns sections on and off — keep only what you need. A new install has Terminal, Kubernetes, SSH, KeePass and Notes on; disabled sections are not loaded.
- Separate windows: any section opens in its own window (right click on its icon, ↗ or the palette); a terminal tab moves between windows together with its live session — same shell, same
cd, a runningsshortopstays. - KeePass (.kdbx): read only, the database lives in memory only; stays open until OpsDeck closes (or auto-locks) and picks up file changes. Passwords are copied with automatic clipboard clearing and serve every section.
- Passbolt (5.x): read only — login with an account kit, TOTP or Yubikey as the second factor, records with folders and search, copy login and password, palette. A password is requested from the server only when used (Passbolt logs every access), decrypted data lives in memory until lock.
- Notes: several vaults (your own or an Obsidian vault), folder tree with drag and drop, tags, search, a Markdown editor.
- Tasks and reminders: tasks as lines in notes (Obsidian Tasks format) with a description and subtasks, a combined list by due date, a calendar, reminder pop-ups with "snooze".
- Moving to another computer: ⚙ → export/import of settings, hosts, panels, databases, snippets, kubeconfig and notes into an archive (passwords are not included).
Every section has a ! button — built-in help: how it works, what to click, hotkeys.
Interface languages: English and Russian (⚙ → Language; defaults to the system language).
| OS | Versions | Notes |
|---|---|---|
| Linux (x64, ARM64) | Ubuntu 22.04+ (Mint 21+, Pop!_OS 22.04+), Debian 12+, Fedora 36+, openSUSE Tumbleweed, Arch/Manjaro | Needs glibc 2.35+ and WebKitGTK 4.1. Not supported: Ubuntu 20.04, Debian 11, RHEL/Alma/Rocky 9 (glibc 2.34). |
| Windows (x64) | Windows 10 and 11 | Needs WebView2: Windows 11 and an updated Windows 10 already have it, otherwise the installer downloads it. Windows 7/8 are not supported. |
| macOS | Intel: 10.13 High Sierra+; Apple Silicon (M1–M4): 11 Big Sur+ | Builds are not signed yet — see below. |
The local AI (optional, installed from ⚙) uses llama.cpp builds and may need a newer system; if it doesn't start, the rest of OpsDeck works as usual. Models take from ≈1.1 GB (the default one, ≈1.5 GB of free memory while running) to ≈22 GB of disk; Settings show whether a model suits this computer.
Installers for Linux (.deb, .rpm, .AppImage), Windows (.msi, .exe) and macOS (.dmg) are published in Releases and built by GitHub Actions for every v* tag (see CI builds).
macOS builds are not signed with an Apple certificate yet. If macOS says the app is "damaged" and offers to move it to the Bin, it isn't damaged — this is Gatekeeper's quarantine for downloaded unsigned apps. Drag OpsDeck to Applications and run in Terminal:
xattr -cr /Applications/OpsDeck.appIf macOS says it can't verify the developer: System Settings → Privacy & Security → "Open Anyway" at the bottom (on macOS 15+ right click → "Open" no longer helps).
You need Rust (stable) and Node.js 20+.
git clone https://github.com/LeoAlecksey/opsdeck.git && cd opsdeckLinux (Debian/Ubuntu) — system libraries:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-dev librsvg2-dev libayatana-appindicator3-dev build-essentialWindows — WebView2 (built into Windows 10/11) and Visual Studio Build Tools (C++). macOS — Xcode Command Line Tools.
npm install
npm run tauri dev # development mode
npm run tauri build # installers → src-tauri/target/release/bundle/Optional external programs: kubectl, helm, ssh/sftp/scp, yc, mtr/traceroute/dig, WinBox, KeePassXC, claude/codex/gemini/aider/opencode — OpsDeck uses them if they are installed.
- Kubernetes: section ☸ → + → tick the contexts you need from
~/.kube/config. Turn on 🔒 for production. - Grafana and alerts: section ◎ → + Add → type Grafana, URL, "token" auth (a service account with the Viewer role) → Save and check. Alerts appear in 🔔.
- Terminal + AI:
Ctrl+Shift+Iopens the AI panel,Ctrl+Shift+Asends the selection,Ctrl+Shift+Pis the palette,Ctrl+Shift+Kis the local AI. - Local AI and agent: ⚙ → Local AI → pick a model → "Install"; for investigations turn on the "AI agent" module in ⊞ and set access levels for hosts.
- KeePass, notes, WinBox: paths are picked up automatically, check them in ⚙.
OpsDeck updates itself: on launch (or with the button in ⚙ → Updates) it checks GitHub Releases, and if there is a new version ↑ appears on ⚙; "Update and restart" downloads it, verifies the signature and installs it (Windows, macOS, Linux: AppImage, .deb, .rpm — for packages the system asks for a password). In ⚙ → Updates → "Other versions" you can go back to any previous version.
A release takes two steps (master accepts changes only through a pull request):
# 1. on dev: bump the version in package.json, tauri.conf.json, Cargo.toml and Cargo.lock, commit and push dev
npm run release -- 0.9.0
# then a PR dev → master, checks, merge
# 2. on master: an annotated tag v0.9.0 with the release notes
npm run release -- 0.9.0 @docs/releases/0.9.0.mdGitHub Actions builds every platform, signs the updates and publishes the release with latest.json — installed copies see it on their next check. Release notes are written in advance in docs/releases/.
Signing: updates are signed with a private key (minisign) from the repository secrets TAURI_SIGNING_PRIVATE_KEY and TAURI_SIGNING_PRIVATE_KEY_PASSWORD; the public key is embedded in tauri.conf.json, and the app won't install a file with someone else's signature. The key is created with npx tauri signer generate -w ~/.tauri/opsdeck.key. Keep the key and its password safe (for example, in KeePass): without them you can't release an update for already installed copies.
.github/workflows/build.yml builds on native runners — each platform on its own OS and architecture:
| Runner | Output |
|---|---|
ubuntu-22.04 (x64), ubuntu-22.04-arm (arm64) |
.deb, .rpm, .AppImage |
windows-2025 (x64) |
.msi, NSIS installer .exe |
macos-26 (Apple Silicon; the Intel build is made there too, with --target x86_64-apple-darwin) |
.dmg, .app |
- Push to
main/master(happens only on a release): checks and a build of every platform without publishing — it also fills the Rust cache the next release uses. - Pull request to
master: checks (TypeScript,npm audit,cargo audit) and a quick linux-x64 build; the installer is in the run's artifacts. - The
devbranch isn't built by itself; a manual run (Run workflow) builds linux-x64 or, with a checkbox, every platform. - A
v*tag: every platform; the release is assembled as a draft and published (with all installers, signed updates andlatest.json) only after the checks, all builds and all tests have passed. - Tests (on tags, pushes to master, PRs to master and manual runs): Rust tests on Linux, Windows and macOS (
cargo test --lib); UI tests — vitest (npm test) and Playwright on demo data (npm run test:ui); end-to-end tests of the real app through tauri-driver on Linux and Windows (tests/e2e). Failed tests leave the release a draft. - Windows on ARM isn't built: there are too few such users.
- Linux arm64 runners are free for public repositories; a private one may not have them on your plan — then remove
linux-arm64from the platform list in theplanjob. - Emergency rollback: Actions → "Отозвать версию" (Withdraw version) → version number. The release becomes a pre-release, the previous stable one becomes "latest" again, and copies with the withdrawn version offer to go back to it.
- Dependabot (
.github/dependabot.yml) sends monthly grouped dependency PRs todev(major versions by hand).
src/ UI (TypeScript, no framework)
main.ts shell: list of sections, left column, mounting on demand, single-section windows
modules/ sections: terminal, k8s, code, db, connectors (web panels), alerts, aichat, ai-agents, …
src-tauri/src/ Rust backend, a module per section
pty.rs terminals (portable-pty) + shell integration (OSC 133)
k8s.rs Kubernetes (kube-rs): lists, watch, logs, Helm, CRD
ai.rs, aichat.rs local AI (llama.cpp): models, command suggestions, chat
agent.rs AI agent: the command policy, re-checked right before ssh
embed.rs web panels embedded in tabs
alerts.rs alert and AI-finding collection
ide.rs bridge for Claude Code (MCP over WebSocket, 127.0.0.1)
store.rs JSON in ~/.config/opsdeck + secrets in the OS keyring
keepass.rs, passbolt.rs, ssh.rs, sftp.rs, yc.rs, db.rs, notes.rs, tasks.rs, …
User data: ~/.config/opsdeck/ (modes 600/700, atomic writes), secrets — in the system store (Secret Service / Keychain / Credential Manager).
- Secrets live only in the system store or KeePass/Passbolt; the KeePass database and Passbolt records are decrypted in memory only; passwords in the clipboard are wiped after 30 s.
- OpsDeck doesn't listen on external interfaces: the Claude Code bridge and the AI-findings receiver are
127.0.0.1only, with a token, protected from browser requests and DNS rebinding. - Embedded web pages have no access to the app's API; auto-login works only on the connector's address.
- A strict UI CSP, escaping of all external data, Markdown through DOMPurify.
- External programs are started without a shell, arguments are validated; importing a kubeconfig with
execshows the commands it will run. - The AI agent runs only what its policy allows; the policy is checked again in the backend before
ssh, and output from hosts and models is data, not instructions. - In CI —
npm auditandcargo auditon every build, CodeQL, Dependabot for dependencies.
Found a vulnerability? See SECURITY.md.
- Web panels are native webviews on top of the UI: while focus is inside a panel, OpsDeck hotkeys don't work. If embedding misbehaves, start with
OPSDECK_NO_EMBED=1— panels will open in separate windows. - SSO login (Keycloak, Google) and 2FA in web panels are done by hand once.
- Command blocks work in bash and zsh; in PowerShell the terminal works without blocks. Windows usually has no
mtranddig. - WinBox accepts a password only as a command-line argument — while it runs, the password is visible in your user's process list.
- Files on hosts and monitoring need key-based SSH login.
Issues and pull requests are welcome — how to build, test and send changes is in CONTRIBUTING.md. Pull requests go to the dev branch.
- The author's Telegram channel: @sys_admin_expert
- If OpsDeck is useful to you, you can support the project (YooMoney). Thank you!
MIT © 2026 LeoAlecksey
English · Русский
Единая рабочая панель DevOps-инженера: терминал с AI рядом и локальной моделью, ИИ-агент, который сам расследует проблемы на хостах по вашим правилам, Kubernetes, базы данных, IDE с git, Grafana/ArgoCD/GitLab во вкладках, алерты, заметки с задачами и напоминаниями, KeePass и Passbolt, SSH, мониторинг хостов, файлы между хостами, Yandex Cloud и MikroTik — в одном нативном приложении для Linux, Windows и macOS.
🌐 Сайт с обзором и инструкцией: https://leoalecksey.github.io/opsdeck/ (English)
Стек: Rust + Tauri 2 (бэкенд), TypeScript + Vite (интерфейс), xterm.js (терминал), kube-rs (Kubernetes), llama.cpp (локальный ИИ).
- Вкладки и сплиты, настоящий shell (bash/zsh/PowerShell, на Windows — WSL и Git Bash), цветовые схемы.
- Блоки команд: у каждой команды — код выхода и время, панель действий (скопировать команду/вывод, сохранить как сниппет, отправить в AI), плашка «спросить AI» при ошибке, навигация по командам.
- AI-панель справа: Claude Code, Codex, Gemini, Aider или OpenCode в своём терминале (до трёх рядом); выделенный текст или вывод команды отправляется туда одной клавишей.
- Интеграция с Claude Code как IDE:
claude, запущенный в OpsDeck, подключается к нему сам (MCP по WebSocket на 127.0.0.1) — видит выделение в заметках и получает ссылки на них. - Строка ресурсов внизу: CPU, load, RAM, диск — этой машины или удалённой в активной SSH-сессии.
- Запись сессии в текстовый файл кнопкой ⏺.
- Палитра команд
Ctrl+Shift+P: разделы, кластеры, хосты, заметки, пароли, история команд, сниппеты с параметрами{{имя}}. - Подсказка при наборе, как в fish: продолжение команды серым из истории bash/zsh и блоков кода в заметках,
→— принять. - Ctrl+клик по пути в выводе открывает файл на строке; по адресу (
http://0.0.0.0:8000, короткое имя хоста, частный IP внутри SSH-сессии) — открывает его, при необходимости поднимая туннельssh -L. - «Открыть папку в web»: текущая папка SSH-сессии раздаётся
python3 -m http.serverна 127.0.0.1 хоста и открывается через туннельssh -L— забрать файлы без sftp. - Подсветка команды при наборе и вывода (ERROR/WARN, статусы подов, IP, ссылки), панель файлов с git-статусом.
- Шрифт и правая кнопка мыши (меню, вставка как в PuTTY или «копировать выделение, иначе вставить», как в Windows Terminal) — ⚙ → Терминал.
Ctrl+Shift+K: опишите словами, что сделать, — получите команду с учётом ваших заметок и истории.- Работает на llama.cpp, ставится из настроек по желанию и работает без интернета: лёгкая Qwen2.5-Coder 1.5B (≈1,1 ГБ) по умолчанию, Qwen3.5 4B/9B, Qwen3.8 27B и Qwen3.6 35B-A3B для мощных ПК или свой файл
.gguf. В настройках у каждой модели видно, потянет ли её этот компьютер (★ самая сильная из подходящих, ⚠ памяти впритык или медленно без видеокарты, ✕ не потянет), а загрузка, которой не хватит места на диске, не начнётся. Ускорение на видеокарте: Vulkan на Linux/Windows, Metal на Mac. Размер контекста выбирается (по умолчанию 16384 токена). - Или свой сервер с OpenAI-совместимым API — Ollama, vLLM, LM Studio (ключ хранится в системном хранилище паролей).
- База знаний: встроенные шпаргалки по kubectl, helm, docker, systemd, terraform, git, ssh, jq, сетям, дискам, nginx, PostgreSQL, MySQL, ClickHouse, Kafka, Redis, Vault, PromQL, ansible, Yandex Cloud и сертификатам (23 темы, больше 250 команд). Когда запрос похож на тему, проверенные команды уходят в подсказку модели — флаги настоящие, а не выдуманные. Свои команды дописываются в
knowledge.mdрядом с настройками и идут первыми. - Чат с локальным ИИ в AI-панели: до 8 вкладок, каждую можно привязать к вкладке терминала (её папка и оболочка) или к серверу из списка SSH. Разговоры сохраняются между запусками только на этом компьютере (
ai-chats.json, права0600; выключается в ⚙ → Локальный ИИ).
- Агент сам ходит на хост: выбирает команду, выполняет её, читает вывод и делает следующий шаг — до итога или до конца отведённых шагов. Каждый шаг виден: хост, команда, «чтение» или «изменение», код возврата и вывод. Запускается из AI-панели галочкой Расследование, «Стоп» прерывает между шагами.
- Уровень доступа на каждый хост: не ходить / только чтение / менять с разрешения / менять без вопросов. На хосте «только чтение» изменяющая команда не выполнится вовсе; изменение показывается точной строкой и без нажатия не идёт никуда.
- Не выполнится ни при каком уровне: перенаправления и составные команды (
>,;,&&, обратные кавычки), интерпретаторы (sh,bash,python,awk,nc) и необратимое (rm,dd,mkfs,reboot,passwd). Аргументы тоже проверяются:sysctl -w,ip link set,sort -oсчитаются изменением.sudoвыключен отдельной галочкой. - Свои правила тремя списками (считать чтением, спрашивать всегда, запретить) и журнал каждой выполненной команды. Бэкенд проверяет политику ещё раз прямо перед
ssh, а вывод с хостов считается данными, а не указаниями. - Контекст для ИИ у хостов: что на сервере крутится и что важно («PostgreSQL 16, база заказов; бэкапы в 03:00; без согласования не перезапускать») — уходит агенту и чату как сведения.
- Модель агента выбирается отдельно: та же, что у чата, или свой внешний сервер.
- Собственное хранилище kubeconfig (ваш
~/.kube/configне меняется): импорт выбранных контекстов, вставка YAML, drag & drop файлов. - Живые таблицы (watch), CPU/RAM из metrics-server, requests/limits рядом с потреблением, любые CRD с колонками как у
kubectl get, фильтр по меткам как уkubectl -l. - Проблемы и проверки: две таблицы в начале списка — что сломано сейчас (CrashLoopBackOff, OOMKilled, образ не скачивается, под не назначается, ссылки на несуществующие Secret и ConfigMap) и что сделано небезопасно, с подсказкой «как исправить». В кластер ничего ставить не нужно.
- Логи пода и сразу всех подов Deployment/StatefulSet/DaemonSet/Job с фильтрами, графиком ошибок и предупреждений по времени и сохранением в файл; вкладка «Детали» со ссылками на связанные объекты; поды объекта отдельной вкладкой; YAML с server-side apply.
- Shell, shell на узле (
kubectl debug), port-forward, scale, restart, delete; мультивыбор и массовое удаление; несколько namespace плашками; Helm-релизы (values, история, rollback) и Argo CD Applications (sync/refresh). Управление с клавиатуры. - Режим «только чтение» для продовых контекстов — изменения блокирует бэкенд. Обрыв связи с кластером виден, прежний снимок не выдаётся за свежий.
- PostgreSQL, MySQL/MariaDB, ClickHouse, Redis, MongoDB: подключение по адресу и порту, пароль из keyring, KeePass или Passbolt, TLS.
- Дерево структуры (базы → схемы → таблицы → колонки и индексы), редактор запросов с историей, таблица результатов, копирование в CSV/JSON.
- Режим «только чтение» для прод-баз: PostgreSQL и ClickHouse запрещают запись на стороне сервера.
- Редактор с подсветкой (Terraform/HCL, YAML, JSON, TS/JS, Python, Go, Rust, SQL, Shell, Dockerfile…), свои иконки файлов, дерево проекта; несколько проектов плашками, у каждого свои вкладки.
- Ошибки YAML/JSON/Terraform прямо в коде,
terraform fmtпри сохранении; поиск по всему проекту (Ctrl+Shift+F), текст или регулярное выражение. - Граф пайплайна для
.gitlab-ci.ymlи.github/workflows: стадии и задачи; выберите событие, ветку, изменённые файлы и переменные — и видно, что запустится, что только вручную, а что нет, ещё до пуша. Раскрываютсяinclude: local,extends, якоря YAML и!reference. - Панель git: граф коммитов всех веток, диффы, ветки (переключить, создать, слить, удалить), fetch/pull/push, коммит; строки, ещё не отправленные в удалённую ветку, помечены. Мини-консоль в папке проекта.
- Grafana, ArgoCD, GitLab и любые сайты — вкладками внутри окна с автоматическим входом (пароль из keyring, KeePass или Passbolt).
- Алерты 🔔: OpsDeck сам опрашивает Grafana Alerting, Prometheus Alertmanager, Zabbix 6.0+ и JSON-ленты ваших AI-анализаторов — на машину ничего не нужно пробрасывать. Уведомления на рабочем столе, история, ссылки на панели/silence, разбор алерта в AI.
- Свой AI-анализатор логов и алертов может присылать находки на
127.0.0.1по токену — в приложении есть готовая инструкция и примерcurl.
- SSH: профили (ключ, jump-хост, пароль из KeePass или Passbolt), хосты из
~/.ssh/config, группы, подключение двойным кликом, предупреждение и исправление в один клик, если ssh отвергнет ключ из-за прав на файл. - Мониторинг хостов: доска SSH-хостов — CPU, load, RAM, диск, аптайм, цвет по худшему показателю; метрики снимаются по ключу или через уже открытую сессию, одно соединение на хост.
- Файлы на хостах: две панели — своя машина или хост по SSH; скачать, загрузить, создать папку, переименовать, удалить. Перенос хост → хост идёт через
scp -3, оба соединения ведёт OpsDeck. Работает системнымиsftpиscp, то есть с~/.ssh/config, ProxyJump и ключами; вход только по ключу. - Yandex Cloud: машины (состояние, конфигурация, адреса, включить/выключить/перезагрузить, SSH в один клик), сети и подсети, группы безопасности с правилами по-человечески, публичные адреса, сервисные аккаунты с правами и платёжные аккаунты. Работает через CLI
ycи его профили (yc init) — ни токенов, ни ключей сервисных аккаунтов OpsDeck не хранит. - MikroTik: WinBox и SSH в один клик, импорт сохранённых роутеров из WinBox.
- Сеть и DNS: ping, mtr, traceroute, dig, nslookup; скан портов хоста (открыт/закрыт/фильтруется и что отвечает) и список портов, которые слушает эта машина, с процессами.
- Модули: кнопка ⊞ в колонке слева включает и выключает разделы галочками — оставьте только нужные. В новой установке включены Терминал, Kubernetes, SSH, KeePass и Заметки; выключенные разделы не загружаются.
- Отдельные окна: любой раздел открывается в своём окне (правый клик по иконке, ↗ или палитра); вкладка терминала переезжает между окнами вместе с живой сессией — та же оболочка, тот же
cd, запущенныйsshилиtopостаются. - KeePass (.kdbx): только чтение, база лишь в памяти; остаётся открытой до закрытия OpsDeck (или автоблокировка) и сама подтягивает изменения файла. Пароли копируются с автоочисткой буфера и служат источником для всех разделов.
- Passbolt (5.x): только чтение — вход по account kit, второй фактор TOTP или Yubikey, список записей с папками и поиском, копирование логина и пароля, палитра. Пароль запрашивается с сервера только при использовании (Passbolt пишет каждое обращение в журнал), расшифрованное — лишь в памяти до блокировки.
- Заметки: несколько хранилищ (свои или Obsidian vault), дерево папок с перетаскиванием, теги, поиск, редактор Markdown.
- Задачи и напоминания: задачи строками в заметках (формат Obsidian Tasks) с описанием и подзадачами, общий список по срокам, календарь, всплывающие напоминания с «отложить».
- Перенос на другой компьютер: ⚙ → экспорт и импорт настроек, хостов, панелей, баз, сниппетов, kubeconfig и заметок архивом (пароли в него не попадают).
В каждом разделе есть кнопка ! — встроенная подсказка: как работает, что где нажимать, горячие клавиши.
Языки интерфейса: русский и английский (⚙ → Язык; по умолчанию — как в системе).
| ОС | Версии | Примечания |
|---|---|---|
| Linux (x64, ARM64) | Ubuntu 22.04+ (Mint 21+, Pop!_OS 22.04+), Debian 12+, Fedora 36+, openSUSE Tumbleweed, Arch/Manjaro | Нужны glibc 2.35+ и WebKitGTK 4.1. Не подходят: Ubuntu 20.04, Debian 11, RHEL/Alma/Rocky 9 (glibc 2.34). |
| Windows (x64) | Windows 10 и 11 | Нужен WebView2: в Windows 11 и обновлённой Windows 10 он уже есть, иначе установщик скачает его сам. Windows 7/8 не поддерживаются. |
| macOS | Intel: 10.13 High Sierra+; Apple Silicon (M1–M4): 11 Big Sur+ | Сборки пока не подписаны — см. ниже. |
Локальный ИИ (необязательный, ставится из ⚙) использует сборки llama.cpp и может требовать систему новее; если он не запустится, остальное OpsDeck работает как обычно. Модели занимают от ≈1,1 ГБ на диске (модель по умолчанию, ≈1,5 ГБ свободной памяти во время работы) до ≈22 ГБ; подходит ли модель этому компьютеру, видно в настройках.
Установщики для Linux (.deb, .rpm, .AppImage), Windows (.msi, .exe) и macOS (.dmg) публикуются в Releases и собираются GitHub Actions на каждый тег v* (см. Сборка в CI).
macOS-сборки пока не подписаны сертификатом Apple. Если при запуске macOS пишет, что приложение «повреждено» и предлагает переместить его в корзину, — оно не повреждено, это карантин Gatekeeper для скачанных неподписанных программ. Перетащите OpsDeck в «Программы» и выполните в Терминале:
xattr -cr /Applications/OpsDeck.appЕсли macOS пишет, что не может проверить разработчика: «Системные настройки» → «Конфиденциальность и безопасность» → внизу «Всё равно открыть» (на macOS 15+ правый клик → «Открыть» больше не помогает).
Нужны Rust (stable) и Node.js 20+.
git clone https://github.com/LeoAlecksey/opsdeck.git && cd opsdeckLinux (Debian/Ubuntu) — системные библиотеки:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-dev librsvg2-dev libayatana-appindicator3-dev build-essentialWindows — WebView2 (есть в Windows 10/11) и Visual Studio Build Tools (C++). macOS — Xcode Command Line Tools.
npm install
npm run tauri dev # режим разработки
npm run tauri build # установщики → src-tauri/target/release/bundle/Необязательные внешние программы: kubectl, helm, ssh/sftp/scp, yc, mtr/traceroute/dig, WinBox, KeePassXC, claude/codex/gemini/aider/opencode — OpsDeck использует их, если они установлены.
- Kubernetes: раздел ☸ → + → отметьте нужные контексты из
~/.kube/config. Для прода включите 🔒. - Grafana и алерты: раздел ◎ → + Добавить → тип Grafana, URL, авторизация «токен» (Service account с ролью Viewer) → Сохранить и проверить. Алерты появятся в 🔔.
- Терминал + AI:
Ctrl+Shift+Iоткрывает AI-панель,Ctrl+Shift+Aотправляет выделение,Ctrl+Shift+P— палитра,Ctrl+Shift+K— локальный ИИ. - Локальный ИИ и агент: ⚙ → Локальный ИИ → выберите модель → «Установить»; для расследований включите модуль «ИИ-агент» в ⊞ и задайте уровни доступа хостам.
- KeePass, заметки, WinBox: пути подхватываются автоматически, проверить можно в ⚙.
OpsDeck обновляется сам: при запуске (или кнопкой в ⚙ → «Обновления») проверяет GitHub Releases, и если есть новая версия — на ⚙ появляется ↑, а кнопка «Обновить и перезапустить» скачивает, проверяет подпись и ставит обновление (Windows, macOS, Linux: AppImage, .deb, .rpm — для пакетов система спросит пароль). В ⚙ → Обновления → «Другие версии» можно вернуться на любую прошлую.
Выпуск версии — в два шага (в master изменения попадают только через pull request):
# 1. на dev: поднять версию в package.json, tauri.conf.json, Cargo.toml и Cargo.lock, закоммитить и запушить dev
npm run release -- 0.9.0
# дальше PR dev → master, проверки, вливание
# 2. на master: аннотированный тег v0.9.0 с заметками к релизу
npm run release -- 0.9.0 @docs/releases/0.9.0.mdGitHub Actions собирает все платформы, подписывает обновления и публикует релиз с latest.json — установленные копии увидят его при следующей проверке. Заметки к релизу пишутся заранее в docs/releases/.
Подпись: обновления подписываются приватным ключом (minisign) из секретов репозитория TAURI_SIGNING_PRIVATE_KEY и TAURI_SIGNING_PRIVATE_KEY_PASSWORD; публичный ключ зашит в tauri.conf.json, и приложение не установит файл с чужой подписью. Ключ создаётся командой npx tauri signer generate -w ~/.tauri/opsdeck.key. Храните ключ и пароль в надёжном месте (например, в KeePass): без них выпустить обновление для уже установленных копий нельзя.
.github/workflows/build.yml собирает на нативных раннерах — каждая платформа на своей ОС и архитектуре:
| Раннер | Что получается |
|---|---|
ubuntu-22.04 (x64), ubuntu-22.04-arm (arm64) |
.deb, .rpm, .AppImage |
windows-2025 (x64) |
.msi, установщик NSIS .exe |
macos-26 (Apple Silicon; сборка для Intel — там же, с --target x86_64-apple-darwin) |
.dmg, .app |
- Пуш в
main/master(бывает только при релизе): проверки и сборка всех платформ без публикации — она же заполняет кэш Rust, из которого следующий релиз берёт уже собранные зависимости. - Pull request в
master: проверки (TypeScript,npm audit,cargo audit) и быстрая сборка только linux-x64; установщик — в артефактах запуска (Actions → запуск → Artifacts). - Ветка
devсама не собирается; ручной запуск (Run workflow) собирает linux-x64 или, с галкой, все платформы. - Тег
v*: все платформы, релиз собирается черновиком и публикуется (со всеми установщиками, подписанными обновлениями иlatest.json) только после того, как прошли проверки, все сборки и все тесты. - Тесты (на тегах, пушах в master, PR в master и ручном запуске): тесты Rust на Linux, Windows и macOS (
cargo test --lib); тесты интерфейса — vitest (npm test) и Playwright на демо-данных (npm run test:ui); сквозные тесты настоящего приложения через tauri-driver на Linux и Windows (tests/e2e). Упали тесты — релиз остаётся черновиком. - Windows на ARM не собирается: таких пользователей слишком мало.
- arm64-раннеры Linux бесплатны для публичных репозиториев; в приватном их может не быть на вашем тарифе — тогда уберите
linux-arm64из списка платформ в jobplan. - Аварийный откат: если версия вышла с критической ошибкой — Actions → «Отозвать версию» → номер версии. Релиз становится pre-release, «последним» снова становится предыдущий стабильный; установленные копии с отозванной версией предложат вернуться на него.
- Dependabot (
.github/dependabot.yml) раз в месяц присылает вdevобщие PR с обновлениями зависимостей (мажорные версии — вручную).
src/ интерфейс (TypeScript, без фреймворка)
main.ts каркас: список разделов, колонка слева, монтирование по требованию, окна одного раздела
modules/ разделы: terminal, k8s, code, db, connectors (веб-панели), alerts, aichat, ai-agents, …
src-tauri/src/ бэкенд на Rust, модуль на раздел
pty.rs терминалы (portable-pty) + интеграция shell (OSC 133)
k8s.rs Kubernetes (kube-rs): списки, watch, логи, Helm, CRD
ai.rs, aichat.rs локальный ИИ (llama.cpp): модели, подсказка команд, чат
agent.rs ИИ-агент: политика команд, проверяется ещё раз прямо перед ssh
embed.rs встраивание веб-панелей во вкладки
alerts.rs сбор алертов и находок AI
ide.rs мост для Claude Code (MCP по WebSocket, 127.0.0.1)
store.rs JSON в ~/.config/opsdeck + секреты в keyring ОС
keepass.rs, passbolt.rs, ssh.rs, sftp.rs, yc.rs, db.rs, notes.rs, tasks.rs, …
Данные пользователя: ~/.config/opsdeck/ (права 600/700, атомарная запись), секреты — в системном хранилище (Secret Service / Keychain / Credential Manager).
- Секреты — только в системном хранилище или KeePass/Passbolt; база KeePass и записи Passbolt расшифрованы лишь в памяти; пароли в буфере стираются через 30 с.
- OpsDeck не слушает внешние интерфейсы: мост для Claude Code и приём находок AI — только
127.0.0.1, по токену, с защитой от запросов из браузера и DNS rebinding. - Встроенные веб-страницы не имеют доступа к API приложения; автологин работает только на адресе коннектора.
- Строгая CSP интерфейса, экранирование всех внешних данных, Markdown через DOMPurify.
- Внешние программы запускаются без shell, аргументы валидируются; при импорте kubeconfig с
execпоказываются запускаемые им команды. - ИИ-агент выполняет только то, что разрешает политика; она проверяется ещё раз в бэкенде перед
ssh, а вывод с хостов и от моделей — данные, а не указания. - В CI —
npm auditиcargo auditна каждую сборку, CodeQL, Dependabot для зависимостей.
Нашли уязвимость? См. SECURITY.md.
- Веб-панели — нативные webview поверх интерфейса: пока фокус внутри панели, горячие клавиши OpsDeck не срабатывают. Если встраивание ведёт себя странно, запустите с
OPSDECK_NO_EMBED=1— панели будут открываться отдельными окнами. - SSO-вход (Keycloak, Google) и 2FA в веб-панелях проходятся вручную один раз.
- Блоки команд работают в bash и zsh; в PowerShell терминал работает без блоков. На Windows обычно нет
mtrиdig. - WinBox принимает пароль только аргументом командной строки — пока он запущен, пароль виден в списке процессов вашего пользователя.
- Файлам на хостах и мониторингу нужен вход по SSH-ключу.
Issues и pull requests приветствуются — как собрать, проверить и прислать изменения, написано в CONTRIBUTING.md. PR принимаются в ветку dev.
- Telegram-канал автора: @sys_admin_expert
- Если OpsDeck пригодился — можно поддержать проект (ЮMoney). Спасибо!
MIT © 2026 LeoAlecksey