لماذا تزامن سجل أوامر الطرفية
العمل على أجهزة متعددة يجب أن يكون سلسًا. في الواقع، الأمر kubectl rollout undo deployment/api الذي كتبته على حاسوبك المحمول ليس موجودًا في طرفية خادم الـCI، والأمر docker compose exec من قبل ثلاثة أسابيع اختفى لأن دورة السجل مسحت الإدخالات القديمة.
يحل Atuin المشكلتين من الجذر: يخزن كل أمر في SQLite مع سياقه (الوقت، المدة، رمز الخروج، المجلد الحالي)، ويزامن هذه القاعدة بين أجهزتك عبر خادم تتحكم به. يعمل البحث محليًا — لا تأخير شبكي عند استدعاء أمر — والمزامنة تحدث في الخلفية. تصبح واجهة البحث (Ctrl+R) فهرسًا شاملًا لكل ما كتبته على أي جهاز منذ اليوم الأول.
الفوائد العملية لـAtuin المُستضاف ذاتيًا
- ابحث عن أي أمر كتبته على أي جهاز في أقل من ثانية عبر
Ctrl+R. - تشفير من جانب العميل (AES-256): لا يرى الخادم محتوى سجلك أبدًا.
- سياق غني لكل إدخال: رمز الخروج، مدة التنفيذ، المجلد الحالي، اسم الجهاز.
- لا بيانات تُرسل لأطراف خارجية — أنت تستضيف، أنت تتحكم.
- ثنائي Rust بلا تبعيات ثقيلة: يعمل على VPS Start ابتداءً من 99 درهم/شهر.
- دعم zsh وbash وfish وnushell وPowerShell — خادم واحد لكل أسطولك.
- إحصاءات استخدام مدمجة (
atuin stats): أكثر أوامرك تكرارًا، وأوقات نشاطك.
المتطلبات الأساسية
VPS: خادم Atuin هو ثنائي Rust مُجمَّع مع قاعدة بيانات SQLite مدمجة. يستهلك أقل من 50 ميغابايت من ذاكرة الوصول العشوائي في وضع الراحة، مما يجعله متوافقًا مع VPS Start. خصص 512 ميغابايت من ذاكرة الوصول العشوائي للنظام بالكامل (نظام التشغيل + عملية Atuin)، و5 غيغابايت من تخزين SSD للسجل طويل المدى. نواة Linux حديثة (Debian 12 أو Ubuntu 22.04+) تعمل بشكل مثالي.
يجب تثبيت Docker وDocker Compose على الـVPS — هذا هو أسلوب النشر الموصى به من المشروع. إن كان الـVPS جديدًا، ثبّت Docker عبر <a href="https://docs.docker.com/engine/install/">السكريبت الرسمي</a> أو قالب Docker من Marketplace لـServOrbit.
اسم نطاق يشير إلى الـVPS موصى به (atuin.your-domain.com، سجل A) للحصول على شهادة TLS تلقائية. الشهادة ضرورية: عميل Atuin يرفض المزامنة في نص واضح بشكل افتراضي.
تثبيت خادم Atuin على الـVPS
الاتصال بالـVPS وإنشاء مجلد العمل
اتصل عبر SSH بالـVPS الخاص بك:
ssh root@<ip-du-vps>أنشئ مجلدًا مخصصًا:
mkdir -p /opt/atuin && cd /opt/atuinكتابة ملف docker-compose.yml
أنشئ ملف التركيب:
cat > docker-compose.yml << 'EOF' services: atuin: image: ghcr.io/atuinsh/atuin:v18.23.0 command: server start volumes: - ./config:/config ports: - "8888:8888" environment: ATUIN_HOST: "0.0.0.0" ATUIN_PORT: "8888" ATUIN_OPEN_REGISTRATION: "true" ATUIN_DB_URI: "sqlite:///config/history.db" restart: unless-stopped EOFيستخدم هذا الإعداد SQLite (مدمجة، لا تبعيات خارجية) ويفتح التسجيل حتى تتمكن من إنشاء حسابك عند الاتصال الأول.
إنشاء مجلد الإعداد وتشغيل الحاوية
يحتاج Atuin إلى مجلد إعداد قابل للكتابة:
mkdir -p config && chown 1000:1000 configشغّل الخادم:
docker compose up -dتحقق من تشغيل الحاوية:
docker compose ps # NAME STATUS PORTS # atuin Up 2 minutes 0.0.0.0:8888->8888/tcpفتح المنفذ 8888 في جدار الحماية UFW
يجب أن يكون المنفذ 8888 متاحًا من أجهزتك العميلة. على Ubuntu/Debian مع UFW:
sudo ufw allow 8888/tcp sudo ufw status⚠️ إن تخطيت هذه الخطوة، سيعرض عميل atuin خطأ
Connection refusedأوFailed to sync historyعند المزامنة — وهو الخطأ الأكثر شيوعًا في عمليات النشر الذاتي.وضع وكيل عكسي HTTPS أمام الخادم
يتطلب عميل Atuin HTTPS بشكل افتراضي. ضع Caddy أمامه:
apt-get install -y caddyأنشئ
/etc/caddy/Caddyfile:atuin.your-domain.com { reverse_proxy localhost:8888 }أعد تشغيل Caddy (يحصل على شهادة Let's Encrypt تلقائيًا):
systemctl restart caddyتحقق من استجابة الخادم:
curl https://atuin.your-domain.com # {"msg":"Atuin server v18.23.0"}إغلاق التسجيل بعد إنشاء حسابك
بعد إنشاء حساباتك (انظر الخطوة التالية)، عطّل التسجيل العام لمنع الحسابات غير المرغوب فيها. عدّل
docker-compose.yml:ATUIN_OPEN_REGISTRATION: "false"أعد تشغيل الحاوية:
docker compose up -dبدلًا من ذلك، أنشئ
/opt/atuin/config/server.tomlللتحكم الدقيق:[server] host = "0.0.0.0" port = 8888 open_registration = false [server.db] db_uri = "sqlite:///config/history.db"
تثبيت وإعداد عميل Atuin
على كل جهاز من أجهزتك (حاسوب محمول، خادم تطوير، إلخ)، ثبّت Atuin باستخدام السكريبت الرسمي:
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | shيثبت السكريبت الثنائي في ~/.atuin/bin ويكتشف الشل الخاص بك.
تكامل الشل — أضف السطر المناسب لملف إعداد الشل:
# لـzsh (~/.zshrc)
eval "$(atuin init zsh)"
# لـbash (~/.bashrc)
eval "$(atuin init bash)"
# لـfish (~/.config/fish/config.fish)
atuin init fish | sourceأعد تحميل الشل: source ~/.zshrc (أو ما يعادله).
تسجيل حساب على خادمك:
atuin register \
--server https://atuin.your-domain.com \
-u your-username \
-e [email protected] \
-p your-passwordيُنشئ Atuin مفتاح تشفير محليًا — يظهر على الشاشة. دوّنه فورًا: ستحتاجه لتوصيل أجهزة أخرى، ولا يمكن إعادة إنشائه.
المزامنة الأولى:
atuin sync
# Syncing history...
# History synced!تسجيل الدخول من جهاز ثانٍ:
atuin login \
--server https://atuin.your-domain.com \
-u your-username \
-p your-password \
-k "<your-encryption-key>"
atuin syncالتأمين: جدار الحماية، التسجيل، والوكيل العكسي
ثلاثة إعدادات للتحقق منها بعد النشر الأولي:
1. open_registration: false فور إنشاء حساباتك. إن تركته true، يمكن لأي شخص يعرف الـURL إنشاء حساب واستخدام مساحة التخزين الخاصة بك.
2. لا تكشف المنفذ 8888 مباشرة — يجب أن يمر حركة المرور دائمًا عبر الوكيل العكسي HTTPS. قيّد UFW:
# حظر الوصول الخارجي المباشر للمنفذ 8888
sudo ufw delete allow 8888/tcp
# يتصل الوكيل العكسي المحلي (Caddy) به داخليًا3. احتِفظ بنسخة احتياطية من قاعدة بيانات SQLite بانتظام:
docker compose exec atuin sh -c "sqlite3 /config/history.db \".backup /config/history.backup.db\""تنمو قاعدة البيانات ببطء — بضعة عشرات من الميغابايت حتى بعد سنوات من الاستخدام المكثف.
استكشاف الأخطاء — الأخطاء الشائعة
بعض الأخطاء التي تُواجَه في النشر الذاتي وكيفية حلها.
Connection refused عند أول atuin sync
المنفذ 8888 غير مفتوح في UFW، أو الحاوية غير مشغّلة. تحقق بـ:
sudo ufw status | grep 8888
docker compose psSSL certificate problem: unable to get local issuer certificate
لم تُصدر Caddy شهادة TLS بعد. انتظر 30–60 ثانية بعد إعادة تشغيل Caddy وأعد atuin sync. تأكد أن DNS لـatuin.your-domain.com يشير لـIP الـVPS.
Invalid credentials عند atuin login
مفتاح التشفير غلط أو مقطوع. استرجعه من الجهاز الأصلي:
atuin keyالصق القيمة الكاملة (سلسلة base64 طويلة) بعد -k.
open_registration is disabled
أغلقت التسجيل قبل إنشاء جميع حساباتك. اضبط مؤقتًا ATUIN_OPEN_REGISTRATION: "true" في docker-compose.yml، أعد التشغيل، أنشئ الحساب، ثم ارجع إلى false.
السجل لا يتزامن بعد atuin sync
تحقق أن الخادم هو الهدف المُعيَّن في إعداد العميل:
cat ~/.config/atuin/config.toml | grep sync_address
# sync_address = "https://atuin.your-domain.com"إن كانت الخاصية غائبة، أضفها يدويًا إلى ~/.config/atuin/config.toml.
Atuin مقابل البدائل: أي أداة تختار
مرّر الجدول أفقيًا
| الأداة | تشفير E2E | مزامنة متعددة الأجهزة | استضافة ذاتية | بحث متقدم |
|---|---|---|---|---|
| **Atuin** | نعم (AES-256، مفتاح محلي) | نعم (خادم اختياري) | نعم (Docker، SQLite) | نعم (سياق، رمز الخروج، المدة) |
| McFly | لا | لا | غير متاح (محلي فقط) | نعم (شبكة عصبية، المجلد الحالي) |
| Histdb | لا | لا | غير متاح (محلي فقط) | جزئي (SQLite محلي، مكون إضافي لـzsh) |
| zsh_history الأصلي | لا | لا (rsync يدوي ممكن) | غير متاح | بسيط (grep، fzf اختياري) |
Atuin، أداة تنمو معك
يُعدّ Atuin v18.23.0 الحل الأكثر اكتمالًا للمطوّر الذي يعمل على أجهزة متعددة ويهتم بخصوصية بياناته. يستغرق الإعداد الأولي أقل من 30 دقيقة على VPS Start، والنتيجة سجل شامل ومشفّر قابل للبحث الفوري من أي طرفية.
بعد تشغيل الخادم، يمكنك التعمق أكثر: إعداد المزامنة التلقائية (atuin daemon)، واستخدام الإحصاءات الأسبوعية (atuin stats)، أو استكشاف واجهة البحث المتقدم مع التصفية حسب رمز الخروج أو اسم الجهاز. الأمر الذي تبحث عنه موجود دائمًا — بغض النظر عن الجهاز الذي كتبته عليه.