כזה ניסיתי: דיפלוימנט עם Kamal
אחד הרעיונות המרכזיים בגירסאות האחרונות של ריילס הוא המעבר לדיפלוימנט על שרת במקום להשתמש בשירותי ענן, אבל בלי להתפשר על חווית המפתחים. כשאנחנו פותחים פרויקט ריילס חדש היום הוא מגיע מוכן לדיפלוימנט בעזרת קמאל שמגיע מותקן עם הפרויקט. לקחתי שרת מ Digital Ocean והלכתי לבדוק איך זה עובד.
1. חווית הפיתוח
קמאל מבצע Deployment מבוסס קונטיינרים על שרת שלנו. לכן פרויקט ריילס חדש מגיע עם Dockerfile מוכן לפרודקשן והעלאה לפרודקשן אומרת:
קמאל בונה את האימג'.
קמאל דוחף את האימג' לרג'יסטרי.
קמאל מתחבר לשרת ומושך את האימג' העדכני מהרג'יסטרי.
קמאל מפעיל את הפרויקט עם דוקר.
הדיפלוימנט הוא Zero Downtime מהקופסה. קמאל מפעיל סרביס תקשורת על השרת שנקרא kamal-proxy שמחובר תמיד לפורט 80 ו 443, ובאופן אוטומטי מנתב כל הודעה שמגיעה לקונטיינר. בעת העלאת גירסה חדשה הוא ימשיך לנתב את ההודעות לקונטיינר הישן עד שהגירסה החדשה סיימה לעלות.
מבחינת הרג'יסטרי קמאל שומר 5 גירסאות אחורה של הפרויקט והדוקרפייל משתמש בשכבות וב Buils Stage כך שאימג'ים חדשים לא אמורים להיות גדולים מדי. סך הכל 5 גירסאות אחרונות בפרויקט דוגמה שלי לוקחות חצי ג'יגה בריפוסיטורי שזה בדיוק הנפח ש Digital Ocean נותנים בחינם.
בשביל להעלות גירסה אני צריך רק לכתוב משורת הפקודה:
kamal deploy
ויש לי בניה של אימג' חדש, דחיפה לרג'יסטרי ושינוי גירסה על השרת. יש גם תמיכה בחזרה אחורה ומספיק לכתוב kamal rollback
כדי לחזור גירסה. עוד כמה פקודות שימושיות היו:
# show all app images in the registry
kamal app images
# show application logs
kamal app logs
2. הקמת הסביבה
כדי להגיע לכל הטוב הזה הייתי צריך קצת לעבוד, במיוחד לקח לי זמן להבין איך עובד מנגנון ה Secrets של קמאל. בעיקרון לקמאל יש שני קבצי קונפיגורציה מרכזיים הראשון הוא config/deploy.yml
שמתאר את הפרויקט והשרתים ו .kamal/secrets
שמתאר איך להשיג את הסודות שקמאל צריך עבור הדיפלוימנט.
נתחיל עם config/deploy.yml
- תבנית בסיסית שלו יכולה להיראות כך:
service: hey
image: 37s/hey
servers:
- 192.168.0.1
- 192.168.0.2
registry:
username: registry-user-name
password:
- KAMAL_REGISTRY_PASSWORD
builder:
arch: amd64
env:
secret:
- RAILS_MASTER_KEY
הקובץ מפרט איך נקרא היישום, איך לקרוא לאימג', לאיזה שרתים להעלות את היישום, איפה ה registry ואיזה סודות היישום צריך. הקובץ השני נקרא .kamal/secrets
ושם אנחנו כותבים לקמאל איך לקבל את הסודות שמפורטים ברשימת הסודות בקובץ ה deploy. הנה הדוגמה מהתיעוד שלהם:
KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
RAILS_MASTER_KEY=$(cat config/master.key)
עכשיו הדוגמה הזאת בלבלה אותי כי השורה השנייה בה מתיחס לקובץ master.key של סביבת הפיתוח. בשביל שזה יעבוד בסביבת פרודקשן (אם יש לכם קובץ סודות שונה לפרודקשן) יש להחליף את השורה השנייה ולהשתמש במפתח config/credentials/production.key.
צריך לזכור שהסודות עצמם של יישום ריילס שמורים מוצפנים בקובץ credentials ולכן עולים לגיט וגם יישמרו בתוך האימג'. המפתח לקריאת הסודות הוא הדבר היחיד שצריך להישמר מחוץ לגיט ולכן הדבר היחיד שצריך להעביר לקמאל.
3. מחשבות להמשך
אהבתי שקמאל לקח שרת שלא היה עליו כלום והתקין כל מה שצריך כדי להריץ שם דוקר ואז התחבר לבד ל letsencrypt ולקח סרטיפיקטים לדומיין שלי. אהבתי גם שכל ההתקנה היא בקונטיינרים ולכן יהיה לי קל לשדרג את השרת כשאצטרך בלי לשבור את היישום.
בניסוי שלי לקחתי בסיס נתונים מנוהל על neon אז לא יצא לי לעבוד עם accessories, שזה מנגנון של קמאל לניהול בסיסי נתונים וסרביסים אחרים בדוקר.
הבנתי שיש אפשרות לחבר את קמאל שירוץ מתוך Github Action אחרי קומיט או אחרי קומיט עם tag מסוים.
סך הכל אני שמח שמנגנון הדיפלוימנט הופך להיות חלק מריילס והבחירה בקונטיינרים מאוד הגיונית. הדבר היחיד שיש לקטר עליו זה הגודל של הרג'יסטרי.
נקודה נוספת שהפריעה לי בקמאל היא הקפיצה מגירסה 1 לגירסה 2. לא שאכפת לי שיש גירסה ישנה אלא שכל ניסיון לקבל עזרה מ AI על קמאל גרם לו לייצר קונפיגורציה לגירסה 1 או קונפיגורציה מעורבבת שהוא המציא.
למידע נוסף על קמאל שווה לבקר אצלם בתיעוד בכתובת: https://kamal-deploy.org/