RoutineOps

module
v0.0.0-...-d555a40 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 6, 2026 License: Apache-2.0

README

RoutineOps

RoutineOps

English summary: README.en.md

RoutineOps — self-hosted MDM/RMM для парка Windows-, macOS- и Linux-устройств: агенты держат постоянный gRPC/mTLS-канал с вашим сервером и работают через интернет без VPN. Версия продукта (сервер+веб) — файл VERSION; версия агента — файл AGENT_VERSION (агент версионируется и выпускается отдельно).

image

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

Любой пользователь, заинтересовавшийся подобным продуктом, задаст вопрос по безопасности, потому что это основа и первое, о чём необходимо беспокоиться. В отличие от подобных конкурирующих продуктов, которые предоставляют «pay to secure», RoutineOps таким не является. Первое правило, которого мы придерживались при разработке: «безопасность не продаётся».

Подробно с самим функционированием и моделью безопасности вы можете ознакомиться в следующих файлах: ARCHITECTURE.md и SECURITY.md.

От себя кратко могу назвать наш стек по безопасности: mTLS (TLS 1.3) с пиннингом приватного CA на всём канале агентов и идентичностью по сертификату (device_id = CN, тело сообщений серверу не доверяется); RBAC; admin-сессии на JWT и lockout'ом по IP и по аккаунту; одноразовые enroll-токены; Ed25519-подпись самообновления агентов с проверкой sha256 и anti-rollback; журнал аудита всех действий администраторов; secure-by-default — обязательный сильный JWT_SECRET, security-заголовки (HSTS/CSP), rate-limit и cap на размер запроса. В моём понимании это максимум для self-hosted продукта. Но для полного понимания настоятельно советую обратиться к файлам, указанным выше.

Возможности

  • Агенты для Windows, macOS и Linux — Windows ставится универсальным MSI, macOS — .pkg, Linux — systemd-юнитом через сгенерированный installer-скрипт (инвентарь ПО берётся у dpkg/rpm/pacman/apk).
  • Запрос админ прав — пользователь может на своем устройстве прямо из трея отправить заявку на админ права.
  • Инвентаризация — hostname, ОС, CPU/RAM/диск, IP, серийный номер, версия агента, события процессов, пользователь за консолью, владелец устройства. По каждому приложению: издатель, путь установки, архитектура, идентификатор для снятия и признак «на машину / в профиль пользователя» (на Windows видны и профильные установки — именно ими обходили запрет ПО).
  • Скрипты — разовый запуск на устройство или группу; политики по расписанию (cron), при подключении агента и по событию; библиотека скриптов и просмотр результатов.
  • Группы устройств — членство, цвет группы, фильтр списка устройств по группе, привязка скрипт- и софт-политик, запуск скрипта на всю группу.
  • Политики ПО — правила allowed/forbidden по устройству, группе или платформе.
  • Комплаенс политик — по каждой софт- и скрипт-политике видно, на сколько устройств она распространяется и сколько из них Pass / Fail.
  • Блокировка устройства — полноэкранный overlay с паролем (Windows и macOS), разблокировка работает и офлайн. Снять блокировку может только служба: попытка пометить устройство разблокированным в обход неё возвращает лок на место и уезжает в ИБ отдельным событием.
  • Удалённая перезагрузка — одной машины или всей группы (окно обслуживания). Сотрудник получает отсрочку на сохранение работы, отсчитывает её сама ОС; панель говорит «запланирована», а не «перезагружено».
  • Владельцы устройств — карточка человека (ФИО + почта) заводится прямо в карточке устройства. Владельцу НЕ нужен вход в панель и приглашение: аккаунты нужны тем, кто в панель ходит.
  • События и алертыagent_unreachable (устройство пропало с радаров), запрещённое ПО, несанкционированная установка/изменение настроек, попытка обхода блокировки; группировка по типу со счётчиком неподтверждённых; уведомления в Telegram.
  • Журнал аудита — все действия администраторов, retention настраивается (AUDIT_RETENTION_DAYS, по умолчанию 365 дней).
  • RBAC — роли it_admin (полный доступ) и viewer (только чтение); приглашения по email — для тех, кому нужен вход в панель (администраторы, поддержка), а не для владельцев устройств.
  • Self-update агентов — подписанные ed25519-релизы, проверка sha256 и подписи манифеста, защита от отката версии.
  • Каналы обновлений и канареечная выкатка — у группы устройств есть канал (stable / beta), у релиза тоже. Обкатали новую версию на канареечной группе — перевели релиз в stable, и его подхватывает весь парк. Экран «Выкатка» показывает, какие версии где стоят.
  • Интерфейс на русском и английском — переключатель в профиле, язык запоминается; серверные сообщения и подписи действий журнала тоже переведены. Полноту словарей стережёт гейт: пропущенный ключ роняет сборку, а не всплывает у пользователя.
  • Вывод из эксплуатации — кнопка в карточке устройства: агент полностью сносит себя (файлы, ключи, автозагрузка, запись установщика). Удаление из инвентаря отзывает сертификат устройства — «воскрешение» пустой записью невозможно.
  • Конфигурация-как-код — скрипты, политики и группы в YAML: routineops export / apply, конфигурация парка в git.
  • API-токены — выпуск и отзыв из панели (роль, срок жизни) для автоматизации через REST API.
  • mTLS — агент аутентифицируется клиентским сертификатом, сервер выпускает его при enrollment.

Быстрый старт

  1. Сервер. Linux (Ubuntu 22.04+ / Debian 12+), Docker + Compose v2, открытые порты 80/443 (веб, enrollment, загрузки) и 50051 (gRPC агентов). До 50 устройств хватит 1 vCPU / 2 GB RAM / 20 GB SSD. Достаточно статического IP, домен не обязателен. Подробнее: docs/install.md.

  2. Установка. Скопируйте шаблон конфигурации, заполните его и запустите — так все параметры уходят в установку сразу и наверняка:

    cp install.env.example install.env
    nano install.env      # PUBLIC_ADDR (внешний IP/домен) + ADMIN_EMAIL / ADMIN_PASSWORD
    ./install.sh
    

    Скрипт сгенерирует TLS-сертификаты, .env.prod с секретами, ключ подписи релизов, поднимет compose-стек (миграции накатываются автоматически) и соберёт+опубликует агентов для Windows/Linux/macOS. PUBLIC_ADDR — адрес, по которому к серверу ходят агенты и браузеры извне (внешний IP или домен): за NAT/VPN укажите его явно, иначе enroll по внешнему адресу упадёт на TLS (адрес обязан быть в SAN сертификата; внутренний IP хоста добавляется в SAN автоматически). Запускайте без sudo, от пользователя в группе docker — иначе root-owned .git и .env.prod сломают следующий ./update.sh (docs/install.md). Подробнее: docs/self-hosted-deploy.md.

  3. Первый вход: https://<IP-или-домен> с кредами ADMIN_EMAIL/ADMIN_PASSWORD. Пароль обязан пройти политику сложности (минимум 8 символов, 3 из 4 классов) — со слабым паролем админ не будет создан (в логе сервера — seed admin failed).

  4. Агенты уже опубликованы шагом 2 и доступны с сервера (/downloads/...). Обновление в дальнейшем: запустить ./update.sh — он подтянет новый релиз (git pull), пересоберёт сервер и переопубликует агентов, а парк подтянет новую версию сам (по умолчанию раз в 6 часов). Подробнее: docs/self-update.md.

    Кнопки «Скачать MSI/PKG» в UI отдают releases/RoutineOps-agent.{msi,pkg} (по /downloads/). Эти установщики обновляют и install.sh, и update.sh — оба копируют их из build/msi/RoutineOps-agent.msi и build/pkg/RoutineOps-agent.pkg (внутри build-контейнера, чтобы права были читаемы сервером). Значит чтобы выложить новый установщик, достаточно положить свежесобранный файл в build/msi/RoutineOps-agent.msi / build/pkg/RoutineOps-agent.pkg (MSI собирается на Windows — build/msi/build-msi.ps1, PKG на macOS) и закоммитить/подтянуть его в репо на сервере: следующий ./update.sh (или ./install.sh) сам скопирует его в releases/. Отдельный ручной sudo cp … releases/ нужен только на сервере со старыми скриптами (до июля 2026, когда update.sh установщики не обновлял).

  5. Подключение устройства: в веб-интерфейсе «Устройства» → «Добавить устройство» — получите одноразовый токен (TTL 24 часа) и готовую команду установки. Windows — универсальный MSI: msiexec /i RoutineOps-agent.msi /qn ENROLL_URL=... ENROLL_TOKEN=... CA_URL=... CA_SHA256=... SERVER_ADDR=... (все пять свойств обязательны: CA не вшит в MSI, агент качает его по CA_URL и пинит по CA_SHA256). macOS — .pkg с сервера (sudo installer -pkg RoutineOps-agent.pkg -target /, пакет не подписан — двойной клик заблокирует Gatekeeper). Linux/macOS — сгенерированный инсталлер sudo bash install-mdm.sh. Подробнее: docs/install.md и docs/enrollment.md.

Документация

  • ARCHITECTURE.md — компоненты системы, каналы связи, границы доверия.
  • docs/openapi.yamlспецификация REST API (OpenAPI 3): все ручки панели, роли и коды ответов. Открывается любым просмотрщиком OpenAPI (Swagger UI, Redoc) или читается как есть.
  • docs/install.md — полная установка: требования, сертификаты, порты, публикация агентов.
  • docs/self-hosted-deploy.mdinstall.sh / update.sh, бэкапы, миграции, откат.
  • docs/enrollment.md — подключение устройств: одноразовые токены, выпуск сертификатов.
  • docs/agent-cli.md — команды, флаги и env-переменные бинарника агента.
  • docs/config-as-code.md — группы, скрипты и политики в YAML: routineops export / apply, конфигурация парка в git.
  • docs/self-update.md — самообновление агентов: подписанные релизы, публикация версии, anti-rollback.
  • docs/operations.md — эксплуатация: бэкапы и восстановление, типовые операции.
  • docs/field-troubleshooting.md — диагностика агента на устройстве (agent diag), типовые причины «агент не выходит на связь».
  • docs/tamper-protection.md — защита агента от удаления пользователем (Windows: SafeBoot + реестр; macOS: флаг schg; на Linux — нет), процедура штатного снятия.
  • docs/jwt-secret-rotation.md — ротация JWT_SECRET (корень доверия admin-сессий).
  • SECURITY.md — модель доверия и обязанности оператора при self-hosted развёртывании.
  • docs/ROADMAP.md — что уже готово, что в работе и что осознанно не делается.
  • CHANGELOG.md — изменения по выпускам, глазами оператора.

Что обязательно бэкапить: дамп PostgreSQL, каталог certs/ (особенно ca.key), release_ed25519.pem (потеря = парк больше не получит обновлений), .env.prod. Детали — в docs/self-hosted-deploy.md.

Стек

Компонент Технология
Агент Go
Сервер Go (монолит)
Связь агент ↔ сервер gRPC + Protocol Buffers + mTLS
База данных PostgreSQL 16
Очередь доставки задач агентам Redis + Asynq
Веб-интерфейс React + TypeScript (Vite), раздаётся nginx-контейнером (web в compose)

Локальная разработка

# Поднять Postgres + Redis
docker compose up -d

# Запустить тесты
TEST_POSTGRES_DSN="postgres://mdm:mdm@localhost:55432/mdm?sslmode=disable" go test ./...

# Запустить тесты с детектором гонок
TEST_POSTGRES_DSN="postgres://mdm:mdm@localhost:55432/mdm?sslmode=disable" go test -race ./...

Postgres слушает на хост-порту 55432 (внутри контейнера — 5432), пароль mdm.

Enterprise

Enterprise-редакция добавляет к возможностям выше:

Возможность Статус
FileVault-эскроу ключей восстановления (macOS)
Принудительная FileVault-блокировка устройства
Настройка FileVault из админки (диалог сотруднику в трее, без визита к машине)
Каталог пользователей (LDAP / Active Directory): синхронизация и авто-привязка владельца устройства
Вход в панель по паролю каталога (LDAP/AD)
Уровни критичности алертов и маршрутизация
Tamper-evident аудит (хеш-цепочка журнала)
Удаление ПО с устройства из интерфейса
Мультитенантность (отдельные тенанты со своими политиками)
SSO: OIDC и SAML, оба настраиваются из панели
MFA / TOTP с кодами восстановления, политика тенанта «требовать второй фактор»
SCIM-провижининг пользователей из IdP
Экспорт журнала в SIEM (syslog/CEF, webhook) + архив журнала перед чисткой
Дашборд соответствия и выгрузка отчёта
Сканирование установленного ПО на уязвимости (CVE)
Удалённое подключение к рабочему столу (просмотр экрана, запись сеанса) 🔄 реализовано, полевая приёмка не пройдена
HA / несколько узлов 📐 спроектировано

В этой сборке enterprise-функции отсутствуют физически (например, lock_mode=filevault вернёт 409). Полный список и планы — в docs/ROADMAP.md.

По вопросам Enterprise-лицензии, багам и предложениям — пишите на charmander020104@gmail.com или в Telegram @flood_j, либо открывайте Issue в этом репозитории.

      RoutineOps

Directories

Path Synopsis
cmd
agent command
Command agent — MDM-агент.
Command agent — MDM-агент.
mockserver command
Command mockserver — ВРЕМЕННАЯ ЗАГЛУШКА под боевой сервер (Agent Gateway).
Command mockserver — ВРЕМЕННАЯ ЗАГЛУШКА под боевой сервер (Agent Gateway).
publish-escrow-recipient command
Команда публикует получателя эскроу, подписанного РЕЛИЗНЫМ ключом деплойера.
Команда публикует получателя эскроу, подписанного РЕЛИЗНЫМ ключом деплойера.
publish-release command
Command publish-release регистрирует новую сборку агента: считает sha256, подписывает дайджест ed25519-приватником релиза, копирует бинарь в releases-dir, вставляет запись в agent_releases.
Command publish-release регистрирует новую сборку агента: считает sha256, подписывает дайджест ed25519-приватником релиза, копирует бинарь в releases-dir, вставляет запись в agent_releases.
routineops command
routineops — CLI управления конфигурацией парка через YAML.
routineops — CLI управления конфигурацией парка через YAML.
routineops-license command
Open-core: вендор-тулинг лицензий отсутствует.
Open-core: вендор-тулинг лицензий отсутствует.
seeddev command
Команда seeddev — разовая наливка ДЕМОНСТРАЦИОННЫХ устройств в инсталляцию.
Команда seeddev — разовая наливка ДЕМОНСТРАЦИОННЫХ устройств в инсталляцию.
server command
internal
agent/admin
Package admin реализует агентскую сторону временных прав администратора (Этап 4): запрос прав сотрудником, поллинг статуса (FetchAdminStatus), применение/снятие прав через PrivilegeManager и отчёт серверу (ReportAdminAccess).
Package admin реализует агентскую сторону временных прав администратора (Этап 4): запрос прав сотрудником, поллинг статуса (FetchAdminStatus), применение/снятие прав через PrivilegeManager и отчёт серверу (ReportAdminAccess).
agent/applog
Package applog даёт файловый лог-синк для агента под службой.
Package applog даёт файловый лог-синк для агента под службой.
agent/collector
Package collector собирает сведения об устройстве.
Package collector собирает сведения об устройстве.
agent/command
Package command реализует Command Listener агента: приём Task из Connect-стрима, подтверждение доставки (AckTaskReceived), выполнение скрипта и durable-доставку результата: TaskResult ставится в устойчивую очередь outbox (переживает обрыв связи и рестарт агента), прямой unary ReportTaskResult остаётся фолбэком на случай недоступной очереди.
Package command реализует Command Listener агента: приём Task из Connect-стрима, подтверждение доставки (AckTaskReceived), выполнение скрипта и durable-доставку результата: TaskResult ставится в устойчивую очередь outbox (переживает обрыв связи и рестарт агента), прямой unary ReportTaskResult остаётся фолбэком на случай недоступной очереди.
agent/config
Package config загружает конфигурацию агента из флагов и переменных окружения.
Package config загружает конфигурацию агента из флагов и переменных окружения.
agent/decommission
Package decommission выполняет полное самоудаление агента по авторизованной команде сервера (вывод устройства из эксплуатации): снимает службу и tamper-защиту, удаляет mTLS-материал, конфиг и всё изменяемое состояние, затем удаляет собственный бинарь (на Windows — отложенно, запущенный .exe удалить нельзя).
Package decommission выполняет полное самоудаление агента по авторизованной команде сервера (вывод устройства из эксплуатации): снимает службу и tamper-защиту, удаляет mTLS-материал, конфиг и всё изменяемое состояние, затем удаляет собственный бинарь (на Windows — отложенно, запущенный .exe удалить нельзя).
agent/enroll
Package enroll реализует bootstrap-энроллмент агента (Этап 3): агент сам генерит ключевую пару и CSR, получает по одноразовому токену подписанный сервером сертификат (CN=device_id ставит сервер, ADR-1) и раскладывает mTLS-материал на диск.
Package enroll реализует bootstrap-энроллмент агента (Этап 3): агент сам генерит ключевую пару и CSR, получает по одноразовому токену подписанный сервером сертификат (CN=device_id ставит сервер, ADR-1) и раскладывает mTLS-материал на диск.
agent/filevault
Package filevault (FileVault dynamic-lock + escrow) — enterprise-фича.
Package filevault (FileVault dynamic-lock + escrow) — enterprise-фича.
agent/heartbeat
Package heartbeat реализует Heartbeat-горутину агента: периодический сигнал "я живой" + текущий IP в Connect-стрим (ADR-5).
Package heartbeat реализует Heartbeat-горутину агента: периодический сигнал "я живой" + текущий IP в Connect-стрим (ADR-5).
agent/inventory
Package inventory реализует Data Collector агента: периодически собирает полную инвентаризацию устройства и шлёт её unary-вызовом ReportInventory (ОТДЕЛЬНО от heartbeat-стрима — ADR-5).
Package inventory реализует Data Collector агента: периодически собирает полную инвентаризацию устройства и шлёт её unary-вызовом ReportInventory (ОТДЕЛЬНО от heartbeat-стрима — ADR-5).
agent/keystore
Package keystore выбирает источник mTLS-материала агента: файлы на диске (по умолчанию) или защищённое хранилище ОС (macOS Keychain / Windows Certificate Store).
Package keystore выбирает источник mTLS-материала агента: файлы на диске (по умолчанию) или защищённое хранилище ОС (macOS Keychain / Windows Certificate Store).
agent/lock
Package lock реализует «блокировку устройства» — запирание машины сотрудника по команде администратора (нарушение ИБ, увольнение): на экран выводится полноэкранный замок с полем пароля, и пользоваться машиной нельзя, пока не введён пароль разблокировки.
Package lock реализует «блокировку устройства» — запирание машины сотрудника по команде администратора (нарушение ИБ, увольнение): на экран выводится полноэкранный замок с полем пароля, и пользоваться машиной нельзя, пока не введён пароль разблокировки.
agent/lockui
Полноэкранный замок блокировки для Linux (X11).
Полноэкранный замок блокировки для Linux (X11).
agent/outbox
Package outbox реализует устойчивую к обрывам связи доставку отчётов агента.
Package outbox реализует устойчивую к обрывам связи доставку отчётов агента.
agent/policy
Package policy синхронизирует политики ПО с сервера (FetchPolicy) и хранит их локально для Security Monitor.
Package policy синхронизирует политики ПО с сервера (FetchPolicy) и хранит их локально для Security Monitor.
agent/reboot
Package reboot планирует перезагрузку устройства по команде оператора.
Package reboot планирует перезагрузку устройства по команде оператора.
agent/recipient
Package recipient — подписанный получатель эскроу, который агент берёт у сервера вместо вшитого в бинарь пина.
Package recipient — подписанный получатель эскроу, который агент берёт у сервера вместо вшитого в бинарь пина.
agent/screen
Package screen (захват экрана и интерактивный сеанс) — enterprise-фича: удалённое подключение к рабочему столу отнесено к Enterprise решением владельца (роадмап, Этап 2).
Package screen (захват экрана и интерактивный сеанс) — enterprise-фича: удалённое подключение к рабочему столу отнесено к Enterprise решением владельца (роадмап, Этап 2).
agent/scriptenc
Package scriptenc содержит общие хелперы кодировки для исполнения скриптов агентом: backstop валидации UTF-8 вывода и UTF-8-префикс для Windows PowerShell.
Package scriptenc содержит общие хелперы кодировки для исполнения скриптов агентом: backstop валидации UTF-8 вывода и UTF-8-префикс для Windows PowerShell.
agent/scripts
Package scripts реализует агентскую сторону скрипт-политик (Этап 5): поллинг эффективного набора политик (FetchScriptPolicies), их исполнение по триггерам (cron-расписание, событие ОС, on_connect) и отчёт о результате (ReportScriptResult) через устойчивую очередь outbox.
Package scripts реализует агентскую сторону скрипт-политик (Этап 5): поллинг эффективного набора политик (FetchScriptPolicies), их исполнение по триггерам (cron-расписание, событие ОС, on_connect) и отчёт о результате (ReportScriptResult) через устойчивую очередь outbox.
agent/security
Package security реализует Security Monitor агента (Этап 6): периодически смотрит запущенные процессы И установленное ПО и, если найдено запрещённое, шлёт ReportSecurityEvent.
Package security реализует Security Monitor агента (Этап 6): периодически смотрит запущенные процессы И установленное ПО и, если найдено запрещённое, шлёт ReportSecurityEvent.
agent/selfupdate
Package selfupdate реализует безопасное самообновление агента (Этап 7-8).
Package selfupdate реализует безопасное самообновление агента (Этап 7-8).
agent/service
Package service запускает агент как системную службу и ставит/снимает её.
Package service запускает агент как системную службу и ставит/снимает её.
agent/status
Package status хранит лёгкий снимок состояния агента в файле, который пишет служба (под LocalSystem) и читает трей (per-user процесс в сессии пользователя).
Package status хранит лёгкий снимок состояния агента в файле, который пишет служба (под LocalSystem) и читает трей (per-user процесс в сессии пользователя).
agent/tamper
Package tamper реализует защиту агента от удаления (tamper-protection), устойчивую к безопасному режиму Windows.
Package tamper реализует защиту агента от удаления (tamper-protection), устойчивую к безопасному режиму Windows.
agent/transport
Package transport отвечает за mTLS-соединение агента с сервером: постоянный gRPC Connect-стрим (heartbeat) с автопереподключением и общий Dialer, который переиспользуют редкие unary-вызовы (inventory) — см.
Package transport отвечает за mTLS-соединение агента с сервером: постоянный gRPC Connect-стрим (heartbeat) с автопереподключением и общий Dialer, который переиспользуют редкие unary-вызовы (inventory) — см.
agent/uninstall
Package uninstall снимает установленное ПО по команде оператора из карточки устройства (Task.uninstall).
Package uninstall снимает установленное ПО по команде оператора из карточки устройства (Task.uninstall).
agent/winsession
Package winsession запускает процессы в активной консольной сессии пользователя из контекста службы (Windows, session 0, LocalSystem).
Package winsession запускает процессы в активной консольной сессии пользователя из контекста службы (Windows, session 0, LocalSystem).
agent/x11ui
Package x11ui — общие примитивы рисования текста в X11 для окон, которые агент показывает сотруднику: замка блокировки (lockui) и плашки наблюдения за экраном (screen).
Package x11ui — общие примитивы рисования текста в X11 для окон, которые агент показывает сотруднику: замка блокировки (lockui) и плашки наблюдения за экраном (screen).
license
Open-core: enterprise-лицензирование отсутствует физически.
Open-core: enterprise-лицензирование отсутствует физически.
offline/shamir
Package shamir — enterprise-фича.
Package shamir — enterprise-фича.
screenframe
Package screenframe (формат кадра интерактивного сеанса) — enterprise-фича: удалённый рабочий стол.
Package screenframe (формат кадра интерактивного сеанса) — enterprise-фича: удалённый рабочий стол.
server/alerting
Package alerting хранит доменное знание о критичности алертов: сколько уровней бывает, какой уровень получает событие каждого типа и в каком порядке инциденты показываются оператору.
Package alerting хранит доменное знание о критичности алертов: сколько уровней бывает, какой уровень получает событие каждого типа и в каком порядке инциденты показываются оператору.
server/crypto
Package crypto (FileVault escrow age-seal) — enterprise-фича.
Package crypto (FileVault escrow age-seal) — enterprise-фича.
server/secretbox
Package secretbox — симметричное шифрование секретов at-rest, которые серверу ОБЯЗАНО быть можно расшифровать.
Package secretbox — симметричное шифрование секретов at-rest, которые серверу ОБЯЗАНО быть можно расшифровать.
server/siemsend
Package siemsend — доставка события журнала во внешний приёмник.
Package siemsend — доставка события журнала во внешний приёмник.
server/tenancy
Package tenancy хранит классификацию таблиц по отношению к тенанту.
Package tenancy хранит классификацию таблиц по отношению к тенанту.
version
Package version — сравнение версий агента.
Package version — сравнение версий агента.
scripts
internal/bcrypthash command
Печатает bcrypt-хеш пароля.
Печатает bcrypt-хеш пароля.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL