רשימת בדיקה לעלייה לאוויר

לפני ששרת self-hosted עולה לאוויר, עוברים על מה שבדרך כלל נשבר ראשון. כל סעיף אומר מה לבדוק, נותן פקודת קריאה להריץ על השרת, מסביר למה זה חשוב ומקשר לכלי באתר שעוזר. הסימונים נשמרים בקישור, ולא נשלחים לשום מקום.

הסימונים נשארים בעמוד הזה ובקישור אחרי ה-#, שדפדפנים אף פעם לא שולחים לשרת. שום דבר לא נשמר.

בפקודות, מחליפים את <domain>, ‏<image> ו-<backup-dir> בערכים שלכם.

התקדמות

0 מתוך 33 סעיפים סומנו.

גיבוי ושחזור 0 מתוך 3

  • מה לבדוק
    טיימר או cron מריצים את הגיבוי, והעותק נשמר במכונה אחרת או ב-object storage, לא רק על הדיסק הזה.
    איך לבדוק
    פקודת קריאה בלבד
    systemctl list-timers --all --no-pager; crontab -l
    למה זה חשוב
    דיסק שנכשל, VM שנמחק או ransomware לוקחים איתם כל עותק שיושב על אותו שרת.
  • מה לבדוק
    כל named volume ו-bind mount שמחזיקים נתונים נכללים בגיבוי, וכל מסד נתונים נשמר בכלי ה-dump שלו (למשל pg_dump), לא בהעתקת הקבצים שלו בזמן שהוא רץ.
    איך לבדוק
    פקודת קריאה בלבד
    docker volume ls; docker ps --format '{{.Names}}: {{.Mounts}}'
    למה זה חשוב
    קבצים שמסד נתונים כותב אליהם יכולים להיות מועתקים במצב לא עקבי, והשחזור נכשל בדיוק כשצריך אותו.
  • מה לבדוק
    גיבוי עדכני שוחזר במכונה אחרת והאפליקציה עלתה עם הנתונים שלה. רשמו את התאריך וכמה זמן זה לקח.
    איך לבדוק
    פקודת קריאה בלבד
    ls -lt <backup-dir> | head
    למה זה חשוב
    גיבוי שאף פעם לא שוחזר לא נבדק. שחזור אחד מראה מה חסר וכמה זמן השירות יהיה למטה.

עדכוני אבטחה 0 מתוך 3

  • מה לבדוק
    החבילה unattended-upgrades מותקנת ופעילה, וההרצה היומית שלה מופעלת.
    איך לבדוק
    פקודת קריאה בלבד
    systemctl is-enabled unattended-upgrades; cat /etc/apt/apt.conf.d/20auto-upgrades
    למה זה חשוב
    תיקון שפורסם מגן על השרת רק אחרי שהוא מותקן. עדכוני אבטחה אוטומטיים מתקינים אותו בלי לחכות שתתחברו.
    כלים באתר
  • מה לבדוק
    אין עדכון של kernel או של ספרייה שממתין להפעלה מחדש. מתכננים הפעלות מחדש בחלון תחזוקה.
    איך לבדוק
    פקודת קריאה בלבד
    cat '/var/run/reboot-required.pkgs' 2>/dev/null || echo 'nothing pending'
    למה זה חשוב
    תיקון kernel שהותקן לא מגן על כלום עד שהשרת עולה איתו.
  • מה לבדוק
    אתם יודעים בן כמה כל image שרץ, ועוקבים אחרי גרסאות האבטחה של כל אפליקציה.
    איך לבדוק
    פקודת קריאה בלבד
    docker image ls --format '{{.Repository}}:{{.Tag}} {{.CreatedSince}}'
    למה זה חשוב
    ‏unattended-upgrades לא נוגע בקונטיינרים: image שומר את הספריות שאיתן נבנה עד שמושכים גרסה חדשה.
    כלים באתר

פורטים חשופים ו-firewall 0 מתוך 4

  • מה לבדוק
    כל socket על 0.0.0.0 או [::] הוא כזה שהתכוונתם לחשוף. מסדי נתונים ופאנלי ניהול מאזינים על 127.0.0.1 או ברשת פרטית.
    איך לבדוק
    פקודת קריאה בלבד
    sudo ss -tulpn
    למה זה חשוב
    כתובות ציבוריות נסרקות כל הזמן. מה שלא מאזין כלפי חוץ אי אפשר להשיג מבחוץ.
    כלים באתר
  • מה לבדוק
    תעבורה נכנסת נחסמת כברירת מחדל, ורק SSH והפורטים של ה-reverse proxy מותרים.
    איך לבדוק
    פקודת קריאה בלבד
    sudo ufw status verbose
    למה זה חשוב
    ‏firewall שחוסם כברירת מחדל מונע משירות שתפעילו בהמשך להיות נגיש בטעות.
    כלים באתר
  • מה לבדוק
    כל פורט מפורסם קשור ל-127.0.0.1, אלא אם הוא חייב להיות ציבורי. ‏8080:80 לבד מאזין על כל הכתובות.
    איך לבדוק
    פקודת קריאה בלבד
    docker ps --format '{{.Names}}: {{.Ports}}'
    למה זה חשוב
    ‏Docker כותב חוקי iptables משלו, ולכן פורטים שהוא מפרסם נגישים גם כש-ufw חוסם אותם.
    כלים באתר
  • מה לבדוק
    בהגדרות ה-SSH בפועל, passwordauthentication הוא no ו-permitrootlogin הוא no או prohibit-password.
    איך לבדוק
    פקודת קריאה בלבד
    sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin) '
    למה זה חשוב
    ניחוש סיסמאות מול SSH לא נעצר אף פעם בכתובת ציבורית. עם מפתחות בלבד, סיסמה שנוחשה לא פותחת כלום.
    כלים באתר

TLS ו-DNS 0 מתוך 3

  • מה לבדוק
    רשומת A (ורשומת AAAA, אם יש) של כל דומיין מחזיקה את הכתובת של השרת הזה. רשומת AAAA ישנה מוחקים, לא משאירים מצביעה למקום אחר.
    איך לבדוק
    פקודת קריאה בלבד
    dig +short A <domain>; dig +short AAAA <domain>
    למה זה חשוב
    רשומה ישנה שולחת חלק מהמבקרים למכונה אחרת, ואימות התעודה יכול להיכשל ב-IPv6.
    כלים באתר
  • מה לבדוק
    התעודה מכסה את הדומיין, תאריך הסיום שלה רחוק בשבועות, וה-proxy (או טיימר) מחדש אותה בלעדיכם.
    איך לבדוק
    פקודת קריאה בלבד
    openssl s_client -connect <domain>:443 -servername <domain> </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
    למה זה חשוב
    תעודות של Let's Encrypt קצרות טווח; כשהחידוש נשבר בשקט, הדפדפנים חוסמים את האתר ביום שהיא פגה.
    כלים באתר
  • מה לבדוק
    בקשה ב-HTTP רגיל מקבלת הפניה קבועה (301 או 308) לכתובת ה-HTTPS.
    איך לבדוק
    פקודת קריאה בלבד
    curl -sI http://<domain>/ | head -n 3
    למה זה חשוב
    בלי ההפניה, התחברויות ו-cookies יכולים לעבור לא מוצפנים מקישורים ומסימניות ישנות.
    כלים באתר

סודות 0 מתוך 3

  • מה לבדוק
    סיסמאות, tokens ומפתחות מגיעים מקובץ .env או מ-Compose secrets, ואפשר לשתף את קובץ ה-Compose או לעשות לו commit כמו שהוא.
    איך לבדוק
    פקודת קריאה בלבד
    grep -nEi '(password|secret|token|api_?key)[^:=]*[:=]' docker-compose.yml
    למה זה חשוב
    קובץ Compose מודבק ב-issues, בצ'אטים וב-repositories; סוד שבתוכו דולף יחד איתו.
    כלים באתר
  • מה לבדוק
    ל-.env יש הרשאות 600, הוא שייך למשתמש הפריסה ומופיע ב-.gitignore.
    איך לבדוק
    פקודת קריאה בלבד
    stat -c '%a %U %n' .env; git check-ignore -v .env
    למה זה חשוב
    אחרת כל חשבון על השרת, וכל גיבוי של התיקייה, יכולים לקרוא את הסודות.
    כלים באתר
  • מה לבדוק
    אף ARG או ENV בהיסטוריית הבנייה לא מחזיקים סוד; סודות בזמן בנייה עוברים ב-secret mount.
    איך לבדוק
    פקודת קריאה בלבד
    docker history --no-trunc <image>
    למה זה חשוב
    כל מי שיכול למשוך את ה-image יכול לקרוא את השכבות שלו ואת היסטוריית הבנייה.
    כלים באתר

משאבים ו-limits 0 מתוך 4

  • מה לבדוק
    בעומס רגיל נשאר זיכרון פנוי, ודיסק הנתונים רחוק מלהתמלא.
    איך לבדוק
    פקודת קריאה בלבד
    free -h; df -h
    למה זה חשוב
    דיסק מלא עוצר מסדי נתונים מלכתוב; כשנגמר הזיכרון ה-kernel הורג תהליך, לעתים קרובות את הגדול ביותר.
    כלים באתר
  • מה לבדוק
    לכל קונטיינר מוצגת מגבלה נמוכה מהזיכרון של השרת, כך ששירות אחד שיצא משליטה לא מפיל את האחרים.
    איך לבדוק
    פקודת קריאה בלבד
    docker stats --no-stream --format '{{.Name}}: {{.MemUsage}}'
    למה זה חשוב
    בלי מגבלה, דליפה גדלה עד שה-OOM killer של ה-kernel בוחר קורבן, ואולי זה מסד הנתונים.
    כלים באתר
  • מה לבדוק
    ‏images ישנים, קונטיינרים שנעצרו ו-build cache לא ממלאים את הדיסק; ניקוי רץ לפי לוח זמנים שבחרתם.
    איך לבדוק
    פקודת קריאה בלבד
    docker system df
    למה זה חשוב
    כל עדכון משאיר מאחור את ה-image הקודם; בדיסק קטן זה מצטבר תוך חודשים.
  • מה לבדוק
    בשרתים קטנים יש קצת swap כחיץ; אתם יודעים מה הגודל שלו ושהוא לא בשימוש קבוע.
    איך לבדוק
    פקודת קריאה בלבד
    cat /proc/swaps; vmstat 1 5
    למה זה חשוב
    מעט swap סופג שיאים קצרים; swapping קבוע אומר שהשרת קטן מדי לעומס שלו.
    כלים באתר

Health checks ו-restart 0 מתוך 4

  • מה לבדוק
    כל קונטיינר שרץ לאורך זמן משתמש ב-unless-stopped או ב-always, כך שהוא חוזר אחרי קריסה או הפעלה מחדש.
    איך לבדוק
    פקודת קריאה בלבד
    docker inspect --format '{{.Name}}: {{.HostConfig.RestartPolicy.Name}}' $(docker ps -q)
    למה זה חשוב
    ברירת המחדל היא no: אחרי הפעלה מחדש לעדכון kernel, השירות נשאר למטה עד שמישהו שם לב.
    כלים באתר
  • מה לבדוק
    לכל שירות ששירותים אחרים תלויים בו יש health check והוא מציג (healthy); התלויים מחכים ל-service_healthy.
    איך לבדוק
    פקודת קריאה בלבד
    docker ps --format '{{.Names}}: {{.Status}}'
    למה זה חשוב
    תהליך שרץ הוא לא שירות שעובד. ‏health check מראה ל-Docker ולכם את ההבדל.
    כלים באתר
  • מה לבדוק
    אף קונטיינר לא במצב restarting, ומספר ההפעלות מחדש נשאר אפס אחרי יום.
    איך לבדוק
    פקודת קריאה בלבד
    docker ps -a --filter status=restarting; docker inspect --format '{{.Name}}: {{.RestartCount}}' $(docker ps -aq)
    למה זה חשוב
    ‏restart policy מסתיר קריסה: השירות נראה למעלה רוב הזמן בזמן שהוא נכשל שוב ושוב.
    כלים באתר
  • מה לבדוק
    שירות ה-Docker מופעל באתחול, כך שהקונטיינרים חוזרים אחרי הפעלה מחדש.
    איך לבדוק
    פקודת קריאה בלבד
    systemctl is-enabled docker
    למה זה חשוב
    ‏restart policies חלים רק אחרי שה-daemon של Docker עצמו רץ.
    כלים באתר

לוגים ורוטציה 0 מתוך 3

  • מה לבדוק
    ה-logging driver הוא local, או json-file עם max-size ו-max-file, שמוגדרים ב-/etc/docker/daemon.json או בכל שירות.
    איך לבדוק
    פקודת קריאה בלבד
    docker info --format '{{.LoggingDriver}}'; cat /etc/docker/daemon.json
    למה זה חשוב
    ה-driver ברירת המחדל json-file לא עושה רוטציה אף פעם: קונטיינר רועש אחד יכול למלא את הדיסק.
    כלים באתר
  • מה לבדוק
    השימוש של ה-journal בדיסק ידוע ומוגבל (SystemMaxUse ב-journald.conf, או החלק ברירת המחדל מהדיסק).
    איך לבדוק
    פקודת קריאה בלבד
    journalctl --disk-usage
    למה זה חשוב
    לוגים של המערכת גדלים עם כל ניסיון SSH ועם כל הפעלה מחדש של שירות; מגבלה מונעת מהם לדחוק את הנתונים שלכם.
  • מה לבדוק
    הלוגים מגיעים מספיק אחורה כדי לכסות תקלה שמגלים יום אחרי, עם חותמות זמן.
    איך לבדוק
    פקודת קריאה בלבד
    docker compose logs --timestamps --since 24h --tail 20
    למה זה חשוב
    רוטציה ששומרת מעט מדי מוחקת את הסיבה לפני שמישהו מסתכל.
    כלים באתר

ניטור והתראות 0 מתוך 3

  • מה לבדוק
    בדיקת זמינות ממכונה או משירות אחרים פונה לכל כתובת ציבורית כל כמה דקות.
    איך לבדוק
    פקודת קריאה בלבד
    curl -fsS -o /dev/null -w '%{http_code} %{time_total}s\n' https://<domain>/
    למה זה חשוב
    ניטור שרץ על אותו שרת נופל יחד איתו, ולא יכול לספר לכם שזה קרה.
    כלים באתר
  • מה לבדוק
    מדדים נאספים, וסף על מקום בדיסק, זיכרון ועומס שולח התראה לפני שהשרת נגמר.
    איך לבדוק
    פקודת קריאה בלבד
    uptime; df -h /
    למה זה חשוב
    דיסק שמתמלא במשך שבועות נותן הרבה אזהרה מראש, אבל רק למי שמסתכל.
    כלים באתר
  • מה לבדוק
    נשלחה התראת בדיקה והיא הגיעה לערוץ שמישהו קורא: מייל, צ'אט או טלפון.
    איך לבדוק
    פקודת קריאה בלבד
    systemctl list-units --type=service --state=running --no-pager | grep -Ei 'alert|monitor|exporter'
    למה זה חשוב
    התראה שאף אחד לא מקבל שווה לאין התראה.
    כלים באתר

תוכנית upgrade ו-rollback 0 מתוך 3

  • מה לבדוק
    אף שירות לא מריץ latest או image בלי tag; כל אחד מציין גרסה, או digest.
    איך לבדוק
    פקודת קריאה בלבד
    docker ps --format '{{.Names}}: {{.Image}}'
    למה זה חשוב
    עם latest, הפעלה מחדש יכולה למשוך גרסה ראשית חדשה שלא בחרתם, ואין גרסה ידועה לחזור אליה.
    כלים באתר
  • מה לבדוק
    אתם יודעים איזו גרסה רצה מכל אפליקציה ומה השתנה עד הגרסה הבאה, בעיקר migrations של מסד הנתונים ושינויים שוברים.
    איך לבדוק
    פקודת קריאה בלבד
    docker image inspect --format '{{index .RepoTags 0}} {{index .RepoDigests 0}}' <image>
    למה זה חשוב
    אפליקציות רבות מריצות migration למסד הנתונים בהפעלה הראשונה של גרסה חדשה; חלק מה-migrations אי אפשר לבטל.
    כלים באתר
  • מה לבדוק
    לפני כל upgrade: גיבוי טרי, הגרסה הקודמת רשומה, והצעדים לחזור אליה, כולל שחזור הנתונים.
    איך לבדוק
    פקודת קריאה בלבד
    docker image ls <image>
    למה זה חשוב
    אחרי migration, חזרה ל-image הישן לבד נכשלת לעתים קרובות; הדרך חזרה היא ה-image הישן יחד עם הגיבוי שנלקח לפני ה-upgrade.
    כלים באתר

ייצוא

production-readiness-checklist.md
# רשימת בדיקה לעלייה לאוויר

0 מתוך 33 סעיפים סומנו.

מקור: https://anaroq.com/he/tools/production-readiness-checklist

## גיבוי ושחזור (0/3)

- [ ] **גיבוי רץ לפי לוח זמנים ויוצא מהשרת**
  - מה לבדוק: טיימר או cron מריצים את הגיבוי, והעותק נשמר במכונה אחרת או ב-object storage, לא רק על הדיסק הזה.
  - פקודה: `systemctl list-timers --all --no-pager; crontab -l`
  - למה: דיסק שנכשל, VM שנמחק או ransomware לוקחים איתם כל עותק שיושב על אותו שרת.
- [ ] **הגיבוי כולל את ה-volumes ואת מסדי הנתונים**
  - מה לבדוק: כל named volume ו-bind mount שמחזיקים נתונים נכללים בגיבוי, וכל מסד נתונים נשמר בכלי ה-dump שלו (למשל `pg_dump`), לא בהעתקת הקבצים שלו בזמן שהוא רץ.
  - פקודה: `docker volume ls; docker ps --format '{{.Names}}: {{.Mounts}}'`
  - למה: קבצים שמסד נתונים כותב אליהם יכולים להיות מועתקים במצב לא עקבי, והשחזור נכשל בדיוק כשצריך אותו.
- [ ] **שחזור נבדק בפועל**
  - מה לבדוק: גיבוי עדכני שוחזר במכונה אחרת והאפליקציה עלתה עם הנתונים שלה. רשמו את התאריך וכמה זמן זה לקח.
  - פקודה: `ls -lt <backup-dir> | head`
  - למה: גיבוי שאף פעם לא שוחזר לא נבדק. שחזור אחד מראה מה חסר וכמה זמן השירות יהיה למטה.

## עדכוני אבטחה (0/3)

- [ ] **עדכוני אבטחה מותקנים אוטומטית**
  - מה לבדוק: החבילה unattended-upgrades מותקנת ופעילה, וההרצה היומית שלה מופעלת.
  - פקודה: `systemctl is-enabled unattended-upgrades; cat /etc/apt/apt.conf.d/20auto-upgrades`
  - למה: תיקון שפורסם מגן על השרת רק אחרי שהוא מותקן. עדכוני אבטחה אוטומטיים מתקינים אותו בלי לחכות שתתחברו.
  - ב-ANAROQ: [cloud-init Generator ל-Ubuntu 24.04](https://anaroq.com/he/tools/cloud-init-generator)
- [ ] **אין הפעלה מחדש שממתינה**
  - מה לבדוק: אין עדכון של kernel או של ספרייה שממתין להפעלה מחדש. מתכננים הפעלות מחדש בחלון תחזוקה.
  - פקודה: `cat '/var/run/reboot-required.pkgs' 2>/dev/null || echo 'nothing pending'`
  - למה: תיקון kernel שהותקן לא מגן על כלום עד שהשרת עולה איתו.
- [ ] **גם ה-images של הקונטיינרים מתעדכנים, לא רק מערכת ההפעלה**
  - מה לבדוק: אתם יודעים בן כמה כל image שרץ, ועוקבים אחרי גרסאות האבטחה של כל אפליקציה.
  - פקודה: `docker image ls --format '{{.Repository}}:{{.Tag}} {{.CreatedSince}}'`
  - למה: ‏unattended-upgrades לא נוגע בקונטיינרים: image שומר את הספריות שאיתן נבנה עד שמושכים גרסה חדשה.
  - ב-ANAROQ: [מעקב גרסאות](https://anaroq.com/he/self-host/releases)

## פורטים חשופים ו-firewall (0/4)

- [ ] **רק הפורטים שהתכוונתם לפתוח מאזינים כלפי חוץ**
  - מה לבדוק: כל socket על `0.0.0.0` או `[::]` הוא כזה שהתכוונתם לחשוף. מסדי נתונים ופאנלי ניהול מאזינים על `127.0.0.1` או ברשת פרטית.
  - פקודה: `sudo ss -tulpn`
  - למה: כתובות ציבוריות נסרקות כל הזמן. מה שלא מאזין כלפי חוץ אי אפשר להשיג מבחוץ.
  - ב-ANAROQ: [מפת פורטים](https://anaroq.com/he/self-host/ports), [פרסום פורטים ב-Docker: ‏127.0.0.1, ‏0.0.0.0 ו-ufw](https://anaroq.com/he/learn/docker-port-publishing)
- [ ] **ה-firewall פעיל וחוסם כברירת מחדל**
  - מה לבדוק: תעבורה נכנסת נחסמת כברירת מחדל, ורק SSH והפורטים של ה-reverse proxy מותרים.
  - פקודה: `sudo ufw status verbose`
  - למה: ‏firewall שחוסם כברירת מחדל מונע משירות שתפעילו בהמשך להיות נגיש בטעות.
  - ב-ANAROQ: [cloud-init Generator ל-Ubuntu 24.04](https://anaroq.com/he/tools/cloud-init-generator)
- [ ] **הפורטים ש-Docker מפרסם נבדקו**
  - מה לבדוק: כל פורט מפורסם קשור ל-`127.0.0.1`, אלא אם הוא חייב להיות ציבורי. ‏`8080:80` לבד מאזין על כל הכתובות.
  - פקודה: `docker ps --format '{{.Names}}: {{.Ports}}'`
  - למה: ‏Docker כותב חוקי iptables משלו, ולכן פורטים שהוא מפרסם נגישים גם כש-ufw חוסם אותם.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer), [פרסום פורטים ב-Docker: ‏127.0.0.1, ‏0.0.0.0 ו-ufw](https://anaroq.com/he/learn/docker-port-publishing)
- [ ] **‏SSH מקבל מפתחות בלבד, בלי התחברות כ-root**
  - מה לבדוק: בהגדרות ה-SSH בפועל, `passwordauthentication` הוא `no` ו-`permitrootlogin` הוא `no` או `prohibit-password`.
  - פקודה: `sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin) '`
  - למה: ניחוש סיסמאות מול SSH לא נעצר אף פעם בכתובת ציבורית. עם מפתחות בלבד, סיסמה שנוחשה לא פותחת כלום.
  - ב-ANAROQ: [מחולל SSH config ועוזר מפתחות](https://anaroq.com/he/tools/ssh-config-generator), [cloud-init Generator ל-Ubuntu 24.04](https://anaroq.com/he/tools/cloud-init-generator)

## TLS ו-DNS (0/3)

- [ ] **ה-DNS מצביע על השרת הזה, ורק עליו**
  - מה לבדוק: רשומת A (ורשומת AAAA, אם יש) של כל דומיין מחזיקה את הכתובת של השרת הזה. רשומת AAAA ישנה מוחקים, לא משאירים מצביעה למקום אחר.
  - פקודה: `dig +short A <domain>; dig +short AAAA <domain>`
  - למה: רשומה ישנה שולחת חלק מהמבקרים למכונה אחרת, ואימות התעודה יכול להיכשל ב-IPv6.
  - ב-ANAROQ: [מחולל תצורת reverse proxy: ‏Caddy, ‏Traefik ו-nginx](https://anaroq.com/he/tools/reverse-proxy-generator)
- [ ] **התעודה תקפה ומתחדשת לבד**
  - מה לבדוק: התעודה מכסה את הדומיין, תאריך הסיום שלה רחוק בשבועות, וה-proxy (או טיימר) מחדש אותה בלעדיכם.
  - פקודה: `openssl s_client -connect <domain>:443 -servername <domain> </dev/null 2>/dev/null | openssl x509 -noout -subject -dates`
  - למה: תעודות של Let's Encrypt קצרות טווח; כשהחידוש נשבר בשקט, הדפדפנים חוסמים את האתר ביום שהיא פגה.
  - ב-ANAROQ: [מחולל תצורת reverse proxy: ‏Caddy, ‏Traefik ו-nginx](https://anaroq.com/he/tools/reverse-proxy-generator)
- [ ] **‏HTTP מפנה ל-HTTPS**
  - מה לבדוק: בקשה ב-HTTP רגיל מקבלת הפניה קבועה (301 או 308) לכתובת ה-HTTPS.
  - פקודה: `curl -sI http://<domain>/ | head -n 3`
  - למה: בלי ההפניה, התחברויות ו-cookies יכולים לעבור לא מוצפנים מקישורים ומסימניות ישנות.
  - ב-ANAROQ: [מחולל תצורת reverse proxy: ‏Caddy, ‏Traefik ו-nginx](https://anaroq.com/he/tools/reverse-proxy-generator)

## סודות (0/3)

- [ ] **אף סוד לא כתוב בקובץ ה-Compose**
  - מה לבדוק: סיסמאות, tokens ומפתחות מגיעים מקובץ `.env` או מ-Compose secrets, ואפשר לשתף את קובץ ה-Compose או לעשות לו commit כמו שהוא.
  - פקודה: `grep -nEi '(password|secret|token|api_?key)[^:=]*[:=]' docker-compose.yml`
  - למה: קובץ Compose מודבק ב-issues, בצ'אטים וב-repositories; סוד שבתוכו דולף יחד איתו.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer), [Docker Compose Generator](https://anaroq.com/he/tools/compose-generator)
- [ ] **קובץ ה-.env קריא לבעלים שלו בלבד**
  - מה לבדוק: ל-`.env` יש הרשאות `600`, הוא שייך למשתמש הפריסה ומופיע ב-`.gitignore`.
  - פקודה: `stat -c '%a %U %n' .env; git check-ignore -v .env`
  - למה: אחרת כל חשבון על השרת, וכל גיבוי של התיקייה, יכולים לקרוא את הסודות.
  - ב-ANAROQ: [Docker Compose Generator](https://anaroq.com/he/tools/compose-generator)
- [ ] **אף סוד לא צרוב בתוך image**
  - מה לבדוק: אף `ARG` או `ENV` בהיסטוריית הבנייה לא מחזיקים סוד; סודות בזמן בנייה עוברים ב-secret mount.
  - פקודה: `docker history --no-trunc <image>`
  - למה: כל מי שיכול למשוך את ה-image יכול לקרוא את השכבות שלו ואת היסטוריית הבנייה.
  - ב-ANAROQ: [בודק Dockerfile](https://anaroq.com/he/tools/dockerfile-linter)

## משאבים ו-limits (0/4)

- [ ] **יש מרווח בזיכרון ובדיסק**
  - מה לבדוק: בעומס רגיל נשאר זיכרון פנוי, ודיסק הנתונים רחוק מלהתמלא.
  - פקודה: `free -h; df -h`
  - למה: דיסק מלא עוצר מסדי נתונים מלכתוב; כשנגמר הזיכרון ה-kernel הורג תהליך, לעתים קרובות את הגדול ביותר.
  - ב-ANAROQ: [Stack Sizer](https://anaroq.com/he/tools/stack-sizer)
- [ ] **לקונטיינרים יש מגבלת זיכרון**
  - מה לבדוק: לכל קונטיינר מוצגת מגבלה נמוכה מהזיכרון של השרת, כך ששירות אחד שיצא משליטה לא מפיל את האחרים.
  - פקודה: `docker stats --no-stream --format '{{.Name}}: {{.MemUsage}}'`
  - למה: בלי מגבלה, דליפה גדלה עד שה-OOM killer של ה-kernel בוחר קורבן, ואולי זה מסד הנתונים.
  - ב-ANAROQ: [Stack Sizer](https://anaroq.com/he/tools/stack-sizer), [מה תופס VRAM כשמריצים LLM](https://anaroq.com/he/learn/llm-vram)
- [ ] **השימוש של Docker בדיסק ידוע ומנוקה**
  - מה לבדוק: ‏images ישנים, קונטיינרים שנעצרו ו-build cache לא ממלאים את הדיסק; ניקוי רץ לפי לוח זמנים שבחרתם.
  - פקודה: `docker system df`
  - למה: כל עדכון משאיר מאחור את ה-image הקודם; בדיסק קטן זה מצטבר תוך חודשים.
- [ ] **‏swap מוגדר בכוונה**
  - מה לבדוק: בשרתים קטנים יש קצת swap כחיץ; אתם יודעים מה הגודל שלו ושהוא לא בשימוש קבוע.
  - פקודה: `cat /proc/swaps; vmstat 1 5`
  - למה: מעט swap סופג שיאים קצרים; swapping קבוע אומר שהשרת קטן מדי לעומס שלו.
  - ב-ANAROQ: [cloud-init Generator ל-Ubuntu 24.04](https://anaroq.com/he/tools/cloud-init-generator), [Stack Sizer](https://anaroq.com/he/tools/stack-sizer)

## Health checks ו-restart (0/4)

- [ ] **לכל שירות יש restart policy**
  - מה לבדוק: כל קונטיינר שרץ לאורך זמן משתמש ב-`unless-stopped` או ב-`always`, כך שהוא חוזר אחרי קריסה או הפעלה מחדש.
  - פקודה: `docker inspect --format '{{.Name}}: {{.HostConfig.RestartPolicy.Name}}' $(docker ps -q)`
  - למה: ברירת המחדל היא `no`: אחרי הפעלה מחדש לעדכון kernel, השירות נשאר למטה עד שמישהו שם לב.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer)
- [ ] **השירותים מדווחים על הבריאות שלהם**
  - מה לבדוק: לכל שירות ששירותים אחרים תלויים בו יש health check והוא מציג `(healthy)`; התלויים מחכים ל-`service_healthy`.
  - פקודה: `docker ps --format '{{.Names}}: {{.Status}}'`
  - למה: תהליך שרץ הוא לא שירות שעובד. ‏health check מראה ל-Docker ולכם את ההבדל.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer), [קונטיינר שמופעל מחדש שוב ושוב: מוצאים את הסיבה לפי קוד היציאה](https://anaroq.com/he/troubleshoot/container-restart-loop)
- [ ] **שום דבר לא נכנס ללולאת הפעלה מחדש**
  - מה לבדוק: אף קונטיינר לא במצב restarting, ומספר ההפעלות מחדש נשאר אפס אחרי יום.
  - פקודה: `docker ps -a --filter status=restarting; docker inspect --format '{{.Name}}: {{.RestartCount}}' $(docker ps -aq)`
  - למה: ‏restart policy מסתיר קריסה: השירות נראה למעלה רוב הזמן בזמן שהוא נכשל שוב ושוב.
  - ב-ANAROQ: [קונטיינר שמופעל מחדש שוב ושוב: מוצאים את הסיבה לפי קוד היציאה](https://anaroq.com/he/troubleshoot/container-restart-loop)
- [ ] **‏Docker עולה עם השרת**
  - מה לבדוק: שירות ה-Docker מופעל באתחול, כך שהקונטיינרים חוזרים אחרי הפעלה מחדש.
  - פקודה: `systemctl is-enabled docker`
  - למה: ‏restart policies חלים רק אחרי שה-daemon של Docker עצמו רץ.
  - ב-ANAROQ: [cloud-init Generator ל-Ubuntu 24.04](https://anaroq.com/he/tools/cloud-init-generator)

## לוגים ורוטציה (0/3)

- [ ] **הלוגים של הקונטיינרים עוברים רוטציה**
  - מה לבדוק: ה-logging driver הוא `local`, או `json-file` עם `max-size` ו-`max-file`, שמוגדרים ב-`/etc/docker/daemon.json` או בכל שירות.
  - פקודה: `docker info --format '{{.LoggingDriver}}'; cat /etc/docker/daemon.json`
  - למה: ה-driver ברירת המחדל `json-file` לא עושה רוטציה אף פעם: קונטיינר רועש אחד יכול למלא את הדיסק.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer)
- [ ] **ל-journal של המערכת יש מגבלת גודל**
  - מה לבדוק: השימוש של ה-journal בדיסק ידוע ומוגבל (`SystemMaxUse` ב-`journald.conf`, או החלק ברירת המחדל מהדיסק).
  - פקודה: `journalctl --disk-usage`
  - למה: לוגים של המערכת גדלים עם כל ניסיון SSH ועם כל הפעלה מחדש של שירות; מגבלה מונעת מהם לדחוק את הנתונים שלכם.
- [ ] **אפשר לקרוא את הלוגים של התקלה האחרונה**
  - מה לבדוק: הלוגים מגיעים מספיק אחורה כדי לכסות תקלה שמגלים יום אחרי, עם חותמות זמן.
  - פקודה: `docker compose logs --timestamps --since 24h --tail 20`
  - למה: רוטציה ששומרת מעט מדי מוחקת את הסיבה לפני שמישהו מסתכל.
  - ב-ANAROQ: [קונטיינר שמופעל מחדש שוב ושוב: מוצאים את הסיבה לפי קוד היציאה](https://anaroq.com/he/troubleshoot/container-restart-loop)

## ניטור והתראות (0/3)

- [ ] **משהו מחוץ לשרת בודק שהוא למעלה**
  - מה לבדוק: בדיקת זמינות ממכונה או משירות אחרים פונה לכל כתובת ציבורית כל כמה דקות.
  - פקודה: `curl -fsS -o /dev/null -w '%{http_code} %{time_total}s\n' https://<domain>/`
  - למה: ניטור שרץ על אותו שרת נופל יחד איתו, ולא יכול לספר לכם שזה קרה.
  - ב-ANAROQ: [Uptime Kuma](https://anaroq.com/he/self-host/uptime-kuma), [WordPress עם ניטור זמינות: WordPress, ‏MariaDB ו-Uptime Kuma](https://anaroq.com/he/self-host/stacks/wordpress-with-uptime-monitoring)
- [ ] **דיסק, זיכרון ועומס מעוררים התראות**
  - מה לבדוק: מדדים נאספים, וסף על מקום בדיסק, זיכרון ועומס שולח התראה לפני שהשרת נגמר.
  - פקודה: `uptime; df -h /`
  - למה: דיסק שמתמלא במשך שבועות נותן הרבה אזהרה מראש, אבל רק למי שמסתכל.
  - ב-ANAROQ: [Prometheus](https://anaroq.com/he/self-host/prometheus), [Grafana](https://anaroq.com/he/self-host/grafana)
- [ ] **התראות מגיעות לאדם שפועל לפיהן**
  - מה לבדוק: נשלחה התראת בדיקה והיא הגיעה לערוץ שמישהו קורא: מייל, צ'אט או טלפון.
  - פקודה: `systemctl list-units --type=service --state=running --no-pager | grep -Ei 'alert|monitor|exporter'`
  - למה: התראה שאף אחד לא מקבל שווה לאין התראה.
  - ב-ANAROQ: [Uptime Kuma](https://anaroq.com/he/self-host/uptime-kuma)

## תוכנית upgrade ו-rollback (0/3)

- [ ] **ה-images נעולים לגרסה**
  - מה לבדוק: אף שירות לא מריץ `latest` או image בלי tag; כל אחד מציין גרסה, או digest.
  - פקודה: `docker ps --format '{{.Names}}: {{.Image}}'`
  - למה: עם `latest`, הפעלה מחדש יכולה למשוך גרסה ראשית חדשה שלא בחרתם, ואין גרסה ידועה לחזור אליה.
  - ב-ANAROQ: [Docker Compose Analyzer](https://anaroq.com/he/tools/compose-analyzer), [מעקב גרסאות](https://anaroq.com/he/self-host/releases)
- [ ] **קוראים את ה-release notes לפני upgrade**
  - מה לבדוק: אתם יודעים איזו גרסה רצה מכל אפליקציה ומה השתנה עד הגרסה הבאה, בעיקר migrations של מסד הנתונים ושינויים שוברים.
  - פקודה: `docker image inspect --format '{{index .RepoTags 0}} {{index .RepoDigests 0}}' <image>`
  - למה: אפליקציות רבות מריצות migration למסד הנתונים בהפעלה הראשונה של גרסה חדשה; חלק מה-migrations אי אפשר לבטל.
  - ב-ANAROQ: [מעקב גרסאות](https://anaroq.com/he/self-host/releases)
- [ ] **יש דרך חזרה כתובה**
  - מה לבדוק: לפני כל upgrade: גיבוי טרי, הגרסה הקודמת רשומה, והצעדים לחזור אליה, כולל שחזור הנתונים.
  - פקודה: `docker image ls <image>`
  - למה: אחרי migration, חזרה ל-image הישן לבד נכשלת לעתים קרובות; הדרך חזרה היא ה-image הישן יחד עם הגיבוי שנלקח לפני ה-upgrade.
  - ב-ANAROQ: [מעקב גרסאות](https://anaroq.com/he/self-host/releases)

## מקורות

- [Docker Docs: Back up, restore, or migrate data volumes](https://docs.docker.com/engine/storage/volumes/#back-up-restore-or-migrate-data-volumes)
- [PostgreSQL Documentation: Backup and Restore](https://www.postgresql.org/docs/current/backup.html)
- [Ubuntu Server documentation: Automatic updates](https://documentation.ubuntu.com/server/how-to/software/automatic-updates/)
- [Debian Wiki: UnattendedUpgrades](https://wiki.debian.org/UnattendedUpgrades)
- [Docker Docs: Packet filtering and firewalls](https://docs.docker.com/engine/network/packet-filtering-firewalls/)
- [Ubuntu manpage: ufw(8)](https://manpages.ubuntu.com/manpages/noble/man8/ufw.8.html)
- [OpenSSH manual: sshd_config(5)](https://man.openbsd.org/sshd_config)
- [Let's Encrypt: Challenge Types](https://letsencrypt.org/docs/challenge-types/)
- [Caddy documentation: Automatic HTTPS](https://caddyserver.com/docs/automatic-https)
- [MDN: Strict-Transport-Security](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)
- [Docker Docs: Secrets in Compose](https://docs.docker.com/compose/how-tos/use-secrets/)
- [Docker Docs: Build secrets](https://docs.docker.com/build/building/secrets/)
- [Docker Docs: Resource constraints](https://docs.docker.com/engine/containers/resource_constraints/)
- [Compose Specification: deploy resources](https://docs.docker.com/reference/compose-file/deploy/#resources)
- [Docker Docs: docker system df](https://docs.docker.com/reference/cli/docker/system/df/)
- [Docker Docs: Start containers automatically](https://docs.docker.com/engine/containers/start-containers-automatically/)
- [Compose file reference: healthcheck](https://docs.docker.com/reference/compose-file/services/#healthcheck)
- [Dockerfile reference: HEALTHCHECK](https://docs.docker.com/reference/dockerfile/#healthcheck)
- [Docker Docs: JSON File logging driver](https://docs.docker.com/engine/logging/drivers/json-file/)
- [Docker Docs: Configure logging drivers](https://docs.docker.com/engine/logging/configure/)
- [systemd: journald.conf](https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html)
- [Prometheus: Overview](https://prometheus.io/docs/introduction/overview/)
- [Prometheus: Alerting overview](https://prometheus.io/docs/alerting/latest/overview/)
- [Uptime Kuma](https://github.com/louislam/uptime-kuma)
- [Docker Docs: Pull an image by digest](https://docs.docker.com/reference/cli/docker/image/pull/#pull-an-image-by-digest-immutable-identifier)
- [Docker Docs: docker compose pull](https://docs.docker.com/reference/cli/docker/compose/pull/)

העברה לסוכן

משימה ב-Markdown לסוכן קוד: הקבצים, הממצאים, המגבלות וגבולות בטיחות קבועים. ערכים שנראים כמו סודות ממוסכים. היא נבנית בעמוד הזה ולא נשלחת לשום מקום.

איך עובדת ההעברה לסוכן

מה הכלי עושה

רשימת בדיקות לשרת אחד שמריץ אפליקציות self-hosted עם Docker, מקובצת לפי נושא. את הפקודות מריצים בעצמכם, על השרת שלכם, ומסמנים מה שמתקיים. העמוד לא מתחבר לשרת שלכם אף פעם.

10 קטגוריות, 33 סעיפים. סעיף שאין לו עדיין כלי באתר מסביר איך לבדוק בלי קישור; כשכלי מתפרסם, הסעיף מקשר אליו.

איך זה עובד

  1. פותחים shell על השרת ועוברים על הקטגוריות לפי הסדר.
  2. מריצים את הפקודה של כל סעיף. היא רק קוראת ולא משנה שום דבר בשרת. קודם מחליפים את <domain>, ‏<image> ו-<backup-dir>.
  3. מסמנים סעיף כשמה שהוא מתאר מתקיים בשרת שלכם. הסימונים נכנסים לקישור אחרי ה-#.
  4. מעתיקים את קישור השיתוף כדי להמשיך אחר כך או להעביר את הבדיקה לעמית, מורידים את הרשימה כ-Markdown, או מעבירים את הסעיפים הפתוחים לסוכן קוד.

מגבלות

  • היא לא בודקת שום דבר בעצמה: הסימונים הם מה שאישרתם, לא סריקה של השרת.
  • היא מכסה שרת Linux אחד שמריץ Docker; ‏clusters, פלטפורמות מנוהלות ושרתי Windows דורשים יותר.
  • היא לא ביקורת אבטחה ולא מסגרת compliance; מעבר עליה לא הופך שרת למאובטח.
  • הפקודות מניחות Debian או Ubuntu עם systemd, ‏ufw ו-Docker Compose v2; במערכות אחרות צריך להתאים אותן.

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. Docker Docs: Back up, restore, or migrate data volumes
  2. PostgreSQL Documentation: Backup and Restore
  3. Ubuntu Server documentation: Automatic updates
  4. Debian Wiki: UnattendedUpgrades
  5. Docker Docs: Packet filtering and firewalls
  6. Ubuntu manpage: ufw(8)
  7. OpenSSH manual: sshd_config(5)
  8. Let's Encrypt: Challenge Types
  9. Caddy documentation: Automatic HTTPS
  10. MDN: Strict-Transport-Security
  11. Docker Docs: Secrets in Compose
  12. Docker Docs: Build secrets
  13. Docker Docs: Resource constraints
  14. Compose Specification: deploy resources
  15. Docker Docs: docker system df
  16. Docker Docs: Start containers automatically
  17. Compose file reference: healthcheck
  18. Dockerfile reference: HEALTHCHECK
  19. Docker Docs: JSON File logging driver
  20. Docker Docs: Configure logging drivers
  21. systemd: journald.conf
  22. Prometheus: Overview
  23. Prometheus: Alerting overview
  24. Uptime Kuma
  25. Docker Docs: Pull an image by digest
  26. Docker Docs: docker compose pull

עודכן

הצעד הבא

Docker Compose Analyzer

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה