
HTTPS موثوق لـ localhost — شهادة CA محلية، /etc/hosts، مشاركة mDNS عبر الشبكة المحلية، بروكسي عكسي. يربط https://name.local → localhost:port
HTTPS حقيقي للتطوير المحلي — مع واجهة TUI ومشاركة الشبكة المحلية (LAN).
mkdev يدير HTTPS موثوقًا على *.local. ملف ثنائي واحد بلغة Go: سلطة التصديق + وكيل عكسي + /etc/hosts + بث mDNS + واجهة TUI كاملة.
ما يجعله مختلفًا:
https://app.local من هاتفك أو أي جهاز على نفس شبكة Wi-Fi.mkdev بدون معاملات يفتحها لك.sudo قبل أي استدعاء برفع صلاحيات (internal/safeexec). لا تظليل يعتمد على PATH، ولا اختصارات قابلة للكتابة للمجموعة.knownHost. ليست شهادة wildcard، ولا معدّة مسبقًا.mkdev install # CA + الثقة + خدمة الخفيّة + بدء شريط القوائم تلقائيًا
mkdev add myapp localhost:3000 # يوجه https://myapp.local ← localhost:3000
curl https://myapp.local # 200 من تطبيقك المحلي
install هي عملية لمرة واحدة: ينشئ CA، ويثق به في مخزن النظام، ويُثبت ويفعّل خدمة الخفيّة للمستخدم (launchd / systemd)، ويسجّل شريط القوائم ليبدأ عند تسجيل الدخول، ويُشغّل الشريط فورًا عند وجود جلسة GUI. الخفيّة تمتلك الوكيل؛ وواجهة TUI (mkdev بدون معاملات) وأوامر mkdev add | remove | list تتواصل معها عبر ~/.mkdev/daemon.sock.

الميزة الرئيسية لـ mkdev. شارك مسارًا مع أي جهاز على نفس Wi-Fi مع TLS حقيقي — بدون تحذيرات، بدون خدمة نفق.
s لتحويل عمود SHARE إلى LAN.<name>.local ← عنوان IP للجهاز على الشبكة المحلية.https://<name>.local. بمجرد أن يثق الجهاز في CA الخاص بـ mkdev (مرة واحدة)، لن تظهر تحذيرات..local تُبث عبر mDNS. الامتدادات الأخرى لا تزال تُوكَل ولكن لا يمكن الوصول إليها عبر LAN بالاسم.s هو حي — إعلان mDNS وقائمة التحكم في الوصول على 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/ # أو /usr/local/bin
يتطلب Go 1.25+.
mkdev install # CA، الثقة، خدمة الخفيّة، بدء الشريط تلقائيًا — أمر واحد
mkdev # تشغيل TUI
بعد install، تعمل الخفيّة في الخلفية ويظهر شريط القوائم (macOS، Linux GNOME/KDE، Windows). يُظهر الشريط حالة الخفيّة، قائمة المسارات، ومفاتيح التمكين / مشاركة LAN لكل مسار؛ Quit يُخرج من الشريط دون إيقاف الخفيّة.
الشريط هو واجهة المستخدم الدائمة. يوجد في علبة النظام ويتواصل مع الخفيّة عبر ~/.mkdev/daemon.sock. يبدأ عند تسجيل الدخول (تم تسجيل التشغيل التلقائي بواسطة install)؛ يمكن أيضًا تشغيله في الواجهة الأمامية باستخدام mkdev bar.
ما يُظهره:
mkdev v0.4.0 + معرف عملية الخفيّة + وقت التشغيل + منفذ الوكيل المستمع.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 unit للخفيّة وإدخال بدء الشريط التلقائي للإشارة إلى الملف الثنائي الجديد، ويعيد تأكيد /etc/hosts للمسارات المفعّلة، ويعيد الثقة في CA إذا تم إسقاطها. تظهر مطالبات sudo داخلية. إذا كان لديك فقط الخفيّة قيد التشغيل ولم تستخدم CLI، فإن الخفيّة تقوم بالأجزاء الآمنة (بدون sudo) بنفسها عند بدء التشغيل وتنتظر الباقي حتى أمر CLI التالي.
إعادة تشغيل mkdev install تفعل نفس الشيء بشكل صريح وهي آمنة دائمًا — كل خطوة هي idempotent.
توزيعات 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
بالنسبة للمصادر upstream HTTPS (مثل GitLab خاص على VPN شركة)، يجب التحقق من شهادة TLS الخاصة بالمصدر upstream مقابل مخزن الثقة للنظام. تحتاج CAs الخاصة إلى إضافة جذرها إلى سلسلة مفاتيح النظام.
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" # يُلحق بالأسماء المجردة في `add`
proxy_port = 443 # ربط :443 يتطلب sudo عند الخدمة
theme = "auto" # محجوز لواجهة TUI المستقبلية
log_retention = "7d" # محجوز
log_max_size = "100MB" # محجوز
تجاوز دليل الإعدادات بـ --home <path> أو MKDEV_HOME=....
~/.mkdev/ca/. المفتاح الخاص هو وضع 0o400.security)، دليل حزمة CA في Linux + update-ca-*، مخزن ROOT في Windows عبر crypt32.dll. تكامل مخزن الثقة مقتبس من mkcert (BSD-3) — انظر LICENSE-MKCERT.add، تكتب الخفيّة مسارًا في مخزن KV bbolt في ~/.mkdev/state.db وتُلحق سطرًا 127.0.0.1 <name>.<tld> في /etc/hosts عبر أمر مساعد يُستدعى بـ sudo.0.0.0.0:<proxy_port>، حسب الطلب باستخدام جذر CA، وتُوكّل عكسيًا إلى المصدر upstream المُعد.هذه الأداة تُثبت CA خاص في مخزن الثقة لنظامك. أي شخص لديه حق الوصول للقراءة إلى ~/.mkdev/ca/rootCA-key.pem يمكنه إصدار شهادات TLS سيثق بها جهازك. يتم إنشاء المفتاح بـ 0o400 (القراءة فقط للمالك).
0.0.0.0، ولكن قائمة التحكم في الوصول بناءً على مصدر الاتصال ترد بـ 403 على طلبات LAN لأي مسار غير مميز صراحة بـ مشاركة. الحلقة المحلية دائمًا مسموح بها.add / remove تستدعي sudo لتعديل /etc/hosts. انظر SECURITY.md لنموذج التهديد وحدود معروفة حول مسارات المساعد التي تم حلها بواسطة os.Executable().mkdev uninstall # يوقف ويعطّل الخفيّة، يزيل الثقة من CA، يمسح /etc/hosts،
# يحذف خدمة الخفيّة وبدء الشريط التلقائي، ويمسح ~/.mkdev/
إذا علق شيء، افتح Keychain Access.app، وابحث عن mkdev، واحذف يدويًا. ثم grep mkdev /etc/hosts ونظف أي بقايا.
الخفيّة تمتلك الوكيل ومخزن المسارات. تعرض API HTTP محلي على ~/.mkdev/daemon.sock (للمالك فقط 0600). واجهة TUI، وأوامر CLI الفرعية، وشريط القوائم كلها عملاء للخفيّة — فقط الخفيّة تحمل قفل bbolt.
mkdev install تُثبت الخفيّة كخدمة مستخدم (launchd LaunchAgent على macOS، systemd --user على Linux) وتفعلها. تعمل في الخلفية وتتحمل الخروج / تسجيل الدخول.
mkdev daemon status # مثبّتة / مفعّلة / قيد التشغيل
mkdev daemon stop # إيقاف + تعطيل (يمنع إعادة التشغيل)
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 يدويًا من خلال الإعدادات → الخصوصية والأمان → الشهادات → عرض الشهادات → السلطات → استيراد.proxy_port = 8443 في ~/.mkdev/config.toml واستخدم https://name.local:8443.mkdev add يستمر في طلب sudo. ذاكرة التخزين المؤقت لجلسة sudo تنتهي صلاحيتها (افتراضي 5 دقائق). استخدم علامة TUI Domains بدلاً من ذلك — ترفع الصلاحيات عبر osascript (موجه macOS GUI) أو pkexec (Polkit Linux)./etc/hosts يحتوي بالفعل على إدخال لذلك الاسم. mkdev add هو idempotent ويضيف فقط عندما لا يوجد إدخال مُدار بواسطة mkdev. أزل الإدخال السابق يدويًا أو اختر اسمًا مختلفًا.انظر CONTRIBUTING.md.
تكامل مخزن الثقة في mkdev — Keychain/security على macOS، حزمة CA + update-ca-* على Linux، مخزن ROOT crypt32.dll على Windows، والمسارات المجاورة لـ NSS — مقتبس من mkcert بواسطة Filippo Valsorda، BSD-3. بدون هذا العمل السابق، لكان هذا المشروع أصعب بكثير. انظر LICENSE-MKCERT للترخيص الأصلي.
واجهة TUI مبنية باستخدام Charmbracelet's Bubble Tea / Bubbles / Lipgloss. mDNS عبر hashicorp/mdns. مخزن KV محلي عبر bbolt.
MIT LICENSE.
| المنصة | مخزن الثقة | رفع الصلاحيات |
|---|
| macOS | سلسلة مفاتيح النظام (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 | شغّل الخفيّة في الواجهة الأمامية (عادةً ما تكون مدفوعة بوحدة الخدمة). |
daemon stop | أوقف الخفيّة الجارية وعطّل خدمة المستخدم. |
daemon status | أبلغ عن حالة الخدمة: مثبّتة / مفعّلة / قيد التشغيل. |
bar | شغّل تطبيق شريط القوائم. يتم تشغيله تلقائيًا بواسطة install. |
uninstall | أزل الثقة من CA، واحذف إدخالات /etc/hosts، وألغِ تثبيت الخفيّة وبدء الشريط التلقائي، وامسح ~/.mkdev/. |
version | اطبع الإصدار، الالتزام، تاريخ البناء. |
completion <bash|zsh|fish|powershell> | أصدر سكريبت إكمال الأوامر. |
hosts-helper | مخفي. يُستدعى عبر sudo لتعديل /etc/hosts بشكل ذري. |
| العلامة / البيئة | التأثير |
|---|
--home <path> | تجاوز دليل الحالة ~/.mkdev. |
--verbose, -v | تسجيل مستوى التصحيح إلى stderr. |
--version | اطبع الإصدار واخرج. |
MKDEV_HOME=<path> | مكافئ لـ --home. |
| الحقل | الافتراضي | ملاحظات |
|---|
tld | .local | يُلحق تلقائيًا عندما لا يحتوي <name> في add على نقطة. |
proxy_port | 443 | اضبطه إلى 8443 إذا كانت منصتك لا تسمح لخدمة المستخدم بربط :443. |
theme | auto | محجوز لواجهة TUI القادمة. |
log_retention | 7d | محجوز. |
log_max_size | 100MB | محجوز. |
add / remove، بدون إعادة تشغيل.0.0.0.0، ولكن الطلبات غير القادمة من الحلقة المحلية تُرد بـ 403 ما لم يكن المسار المطابق مميزًا بـ مشاركة — انظر مشاركة LAN.Location و Set-Cookie Domain إلى مجال الوكيل حتى لا تُسقط العملاء بيانات الاعتماد.