
Доверенный HTTPS для localhost — локальный CA, /etc/hosts, mDNS-обмен в LAN, обратный прокси. Преобразует https://name.local → localhost:port
Настоящий HTTPS для локальной разработки — с TUI и расшариванием в LAN.
mkdev запускает доверенный HTTPS на *.local. Один Go-бинарник: центр сертификации (CA) + обратный прокси + /etc/hosts + mDNS-вещание + полноценный TUI.
Что отличает его от других:
https://app.local с телефона или любого устройства в той же Wi-Fi-сети.mkdev без аргументов сразу открывает TUI.internal/safeexec). Никакой подмены через PATH, никаких group-writable лазеек.knownHost. Не wildcard, не предзаготовленные.mkdev install # CA + trust + daemon service + menu bar autostart
mkdev add myapp localhost:3000 # routes https://myapp.local → localhost:3000
curl https://myapp.local # 200 from your local app
install — разовая операция: генерирует CA, заносит его в системное хранилище доверия, устанавливает и включает пользовательский сервис демона (launchd / systemd), регистрирует автозапуск панели в строке меню при входе в систему и сразу запускает панель при наличии GUI-сессии. Демон владеет прокси; TUI (mkdev без аргументов) и mkdev add | remove | list общаются с ним через ~/.mkdev/daemon.sock.

Фирменная функция mkdev. Расшарьте маршрут на любое устройство в той же Wi-Fi-сети с настоящим TLS — без предупреждений и туннельных сервисов.
s, чтобы переключить колонку SHARE в LAN.<name>.local → LAN-IP этой машины.https://<name>.local. После того как устройство один раз доверится CA mkdev, предупреждений не будет..local. Другие TLD тоже проксируются, но недоступны в LAN по имени.s происходит на лету — mDNS-анонс и ACL со стороны LAN обновятся при следующем запросе. Без перезапуска.brew install venkatkrishna07/tap/mkdev
Обновление позже:
brew update
brew upgrade mkdev
go install github.com/venkatkrishna07/mkdev/cmd/mkdev@latest
Обновление до конкретной версии:
go install github.com/venkatkrishna07/mkdev/cmd/[email protected]
Готовые бинарники для macOS (Intel + Apple Silicon), Linux (amd64 + arm64) и Windows (amd64) публикуются на странице релизов. Каждый релиз включает checksums.txt и бесключевую подпись cosign (checksums.txt.sig + .pem) — команду проверки см. в SECURITY.md#verifying-releases.
На macOS, если Gatekeeper блокирует бинарник, скачанный напрямую:
xattr -d com.apple.quarantine ./mkdev
git clone https://github.com/venkatkrishna07/mkdev.git
cd mkdev
task build
cp bin/mkdev ~/bin/ # or /usr/local/bin
Требуется Go 1.25+.
mkdev install # CA, trust, daemon service, bar autostart — one command
mkdev # launch TUI
После install демон работает в фоне, а в строке меню появляется панель (macOS, Linux GNOME/KDE, Windows). Панель показывает статус демона, список маршрутов и переключатели включения / расшаривания в LAN для каждого маршрута; Quit закрывает панель, не останавливая демон.
Панель — это постоянно доступный UI. Она живёт в системном трее и общается с демоном через ~/.mkdev/daemon.sock. Запускается при входе в систему (автозапуск регистрируется install); также запускается в foreground командой mkdev bar.
Что показывает:
mkdev v0.4.0 + PID демона + время работы + порт прослушивания прокси.name.tld → target и суффикс-бейджи ( · disabled, · LAN).Что делает (клик по маршруту):
https://name.tld системным обработчиком по умолчанию.pbcopy / wl-copy / xclip / clip.exe).Enabled маршрута. Выключенные маршруты остаются в хранилище, но перестают проксироваться.Действия панели в целом:
DisableUnit, чтобы launchd / systemd KeepAlive не поднял его снова, затем отправляет команду завершения через сокет.Заметки:
mkdev daemon stop) корректно останавливают демон под наблюдением — прямое убийство процесса демона приведёт к его повторному запуску через launchd / systemd.Замените бинарник (brew upgrade / go install ...@latest / новая загрузка). При следующем запуске любой подкоманды mkdev бинарник синхронизирует всё, что живёт вне него: перепишет plist демона / systemd-юнит и запись автозапуска панели, чтобы они указывали на новый бинарник, повторно пропишет /etc/hosts для включённых маршрутов и заново добавит CA в доверенные, если его оттуда удалили. Запросы sudo появляются прямо в терминале. Если у вас запущен только демон и вы не трогаете CLI, демон сам выполнит безопасные (без sudo) шаги при своём старте, а остальные поставит в очередь до следующей команды CLI.
Повторный запуск mkdev install делает то же самое явно и всегда безопасен — каждый шаг идемпотентен.
Обнаруживаемые дистрибутивы Linux: Debian/Ubuntu (/usr/local/share/ca-certificates), RHEL/Fedora (/etc/pki/ca-trust/source/anchors), Arch (/etc/ca-certificates/trust-source/anchors), openSUSE (/usr/share/pki/trust/anchors).
Firefox использует собственное хранилище NSS и пока не покрыт — системные Chrome/Safari/Edge/curl/wget работают.
<target> принимает любой из:
host:port e.g. localhost:3000
http://host[:port]/path e.g. http://localhost:3000/api
https://host[:port]/path e.g. https://gitlab.example.com
Для HTTPS-апстримов (например, приватный GitLab в корпоративном VPN) TLS-сертификат апстрима должен проверяться системным хранилищем доверия. Для приватных CA нужно добавить их корневой сертификат в системную связку ключей ОС.
hosts-helper не предназначен для прямого вызова. add / remove перезапускают тот же бинарник через sudo для выполнения привилегированной записи в /etc/hosts.
Заметка про TLD. Для маршрутов
.localнужен mDNS-резолвер (всегда включён на macOS, доступен на Linux при установленномnss-mdns)..test/.dev/.localhostработают везде только через/etc/hosts. Задайтеtldв конфиге под себя.
Конфиг находится в ~/.mkdev/config.toml. Значения по умолчанию:
tld = ".local" # appended to bare names in `add`
proxy_port = 443 # binding :443 requires sudo on serve
theme = "auto" # reserved for future TUI
log_retention = "7d" # reserved
log_max_size = "100MB" # reserved
Переопределите каталог конфигурации через --home <path> или MKDEV_HOME=....
~/.mkdev/ca/. Приватный ключ имеет режим 0o400.security), каталог CA-бандла Linux + update-ca-*, хранилище ROOT Windows через crypt32.dll. Интеграция с хранилищем доверия адаптирована из mkcert (BSD-3) — см. LICENSE-MKCERT.add демон записывает маршрут в bbolt KV ~/.mkdev/state.db и добавляет строку 127.0.0.1 <name>.<tld> в /etc/hosts через хелпер-подкоманду, вызываемую через sudo.Этот инструмент устанавливает приватный CA в системное хранилище доверия. Любой, у кого есть доступ на чтение к ~/.mkdev/ca/rootCA-key.pem, сможет выпускать TLS-сертификаты, которым ваша машина доверяет. Ключ создаётся с режимом 0o400 (чтение только владельцем).
0.0.0.0, но ACL по источнику соединения отдаёт 403 на LAN-запросы к любому маршруту, не помеченному явно как shared. Loopback всегда проходит.add / remove вызывают sudo для изменения /etc/hosts. Модель угроз и известное ограничение вокруг путей к хелперу, разрешаемых через os.Executable(), описаны в SECURITY.md.mkdev uninstall # stops + disables daemon, untrusts CA, clears /etc/hosts,
# removes daemon service + bar autostart, wipes ~/.mkdev/
Если что-то зависло, откройте Keychain Access.app, найдите mkdev и удалите вручную. Затем grep mkdev /etc/hosts и вычистите остатки.
Демон владеет прокси и хранилищем маршрутов. Он открывает локальный HTTP API на ~/.mkdev/daemon.sock (только для владельца, 0600). TUI, CLI-подкоманды и панель в строке меню — все являются клиентами демона; только демон держит блокировку bbolt.
mkdev install устанавливает демон как пользовательский сервис (launchd LaunchAgent на macOS, systemd --user на Linux) и включает его. Он работает в фоне и переживает выход из системы и повторный вход.
mkdev daemon status # installed / enabled / running
mkdev daemon stop # stop + disable (prevents respawn)
curl --unix-socket ~/.mkdev/daemon.sock http://x/v1/status
curl --unix-socket ~/.mkdev/daemon.sock http://x/v1/routes
curl --unix-socket ~/.mkdev/daemon.sock -X POST http://x/v1/routes \
-H 'Content-Type: application/json' \
-d '{"name":"foo","target":"localhost:3000"}'
curl --unix-socket ~/.mkdev/daemon.sock -X DELETE http://x/v1/routes/foo
В ближайших планах:
/api → 8080, /ws → 9000 на одном домене).~/.mkdev/ca/rootCA.pem вручную: Settings → Privacy & Security → Certificates → View Certificates → Authorities → Import.proxy_port = 8443 в ~/.mkdev/config.toml и используйте https://name.local:8443.mkdev add постоянно просит sudo. Кэш sudo на сессию истекает (по умолчанию 5 минут). Используйте вместо этого вкладку Domains в TUI — она повышает привилегии через osascript (графический запрос macOS) или pkexec (Linux Polkit)./etc/hosts уже есть запись для этого имени. mkdev add идемпотентен и добавляет запись, только если управляемой mkdev записи ещё нет. Удалите прежнюю запись вручную или выберите другое имя.См. CONTRIBUTING.md.
Интеграция mkdev с хранилищами доверия — Keychain/security на macOS, CA-бандл + update-ca-* на Linux, хранилище ROOT через crypt32.dll на Windows и смежные пути NSS — адаптирована из mkcert Филиппо Вальсорды, лицензия BSD-3. Без этого задела проект был бы заметно сложнее. Лицензия апстрима — в LICENSE-MKCERT.
TUI построен на Charmbracelet Bubble Tea / Bubbles / Lipgloss. mDNS — через hashicorp/mdns. Локальное KV — через bbolt.
MIT LICENSE.
| Платформа | Хранилище доверия | Повышение привилегий |
|---|
| macOS | System Keychain (security add-trusted-cert) | sudo / osascript |
| Linux | update-ca-trust / update-ca-certificates / trust extract-compat | sudo / pkexec |
| Windows | системное хранилище ROOT через crypt32.dll | UAC (PowerShell RunAs) |
| Команда | Назначение |
|---|
install | Разовая операция: CA + доверие + сервис демона + автозапуск панели. Флаг --no-service — только CA. |
add <name> <target> | Добавить маршрут. Добавляет запись 127.0.0.1 в /etc/hosts. |
remove <name> | Удалить маршрут и его запись из /etc/hosts. |
list | Список маршрутов в хранилище. |
tui | Запустить TUI (также запускается по умолчанию без аргументов). |
daemon serve | Запустить демон в foreground (обычно управляется сервисным юнитом). |
daemon stop | Остановить работающий демон и отключить пользовательский сервис. |
daemon status | Сообщить состояние сервиса: установлен / включён / запущен. |
bar | Запустить приложение в строке меню. Автозапускается через install. |
uninstall | Убрать CA из доверенных, удалить записи /etc/hosts, деинсталлировать демон и автозапуск панели, стереть ~/.mkdev/. |
version | Вывести версию, коммит, дату сборки. |
completion <bash|zsh|fish|powershell> | Сгенерировать скрипт автодополнения для шелла. |
hosts-helper | Скрытая. Вызывается через sudo для атомарного изменения /etc/hosts. |
| Флаг / env | Эффект |
|---|
--home <path> | Переопределить каталог состояния ~/.mkdev. |
--verbose, -v | Отладочное логирование в stderr. |
--version | Вывести версию и выйти. |
MKDEV_HOME=<path> | Эквивалент --home. |
| Поле | По умолчанию | Примечания |
|---|
tld | .local | Автодобавляется, когда в add <name> нет точки. |
proxy_port | 443 | Поставьте 8443, если ваша платформа не даёт пользовательскому сервису занять :443. |
theme | auto | Зарезервировано под будущий TUI. |
log_retention | 7d | Зарезервировано. |
log_max_size | 100MB | Зарезервировано. |
0.0.0.0:<proxy_port>add / remove, без перезапуска.0.0.0.0, но запросы не с loopback получают 403, если соответствующий маршрут не помечен как shared — см. Расшаривание в LAN.Location и Set-Cookie Domain переписываются обратно на домен прокси, чтобы клиенты не теряли учётные данные.