SSD Nodes Learn Hosting plans →
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-08-27

איך להתקין Actual Budget על שרת VPS עם Docker

מדריך מלא להרצת Actual Budget בשרת פרטי. למדו איך להגדיר Docker Compose, למה HTTPS הוא חובה עבור Web Crypto API, איך לבצע גיבויים לקבצי ה-SQLite ואיך להגדיר סנכרון נתונים.

מה אתם בונים

Actual Budget הוא יישום לניהול תקציב בשיטת המעטפות שניתן לארח באופן עצמי, והוא מהווה את התשובה המקובלת עבור מי שמחפש חלופה ל-YNAB שניתן להריץ על שרת פרטי. השרת מורכב ממכולה (container) אחת, נפח נתונים (data volume) אחד ושם מתחם HTTPS אחד. כל מה שדרוש לניהול תקציב סטנדרטי פועל ללא קושי על ה-VPS הקטן ביותר שניתן לשכור, כיוון שהשרת משמש בעיקר לאחסון קבצים ולסנכרון שלהם.

כדאי להבין את הארכיטקטורה לפני שמתחילים להקליד פקודות. התקציב עצמו הוא מסד נתונים מסוג SQLite שנשמר בתוך הדפדפן שלכם ובתוך כל יישום מובייל. השרת שאתם עומדים להתקין משמש כנקודת קצה לסנכרון: הוא מחזיק את רשימת החשבונות, את קובצי התקציב ואת יומן השינויים המאפשר לטלפון ולמחשב הנייד להישאר מסונכרנים. זו הסיבה שהיישום ממשיך לעבוד גם כשהשרת מושבת, וזו הסיבה שאובדן השרת אינו גורר אובדן של התקציב שלכם, כל עוד לאחד הלקוחות (clients) נותר עותק של הנתונים.

מדוע השרת זקוק ל-HTTPS

Actual דורש HTTPS, ואין מדובר בפורמליות בלבד. דפדפנים חושפים את ה-Web Crypto API, הממשק שבו Actual משתמש עבור הצפנה מקצה לקצה, רק בהקשרים שהמפרט מגדיר כמאובטחים (secure context). הקשר מאובטח הוא https:// או http://localhost. אם תטענו את היישום מ-http://203.0.113.10:5006 בדפדפן במכונה אחרת, התכונות הללו פשוט לא יהיו זמינות, כיוון שהדפדפן לא סיפק אותן לדף. גם גרסאות המובייל הרשמיות מסרבות לעבוד עם כתובת שרת ב-http:// רגיל.

לפיכך, קיימות שתי תצורות עבודה אפשריות. האחת היא הצבת תעודה אמיתית עבור שם מתחם אמיתי לפני המכולה, וזהו הפתרון שבו עוסק מדריך זה. השנייה היא מתן תעודה בחתימה עצמית לשרת באמצעות ACTUAL_HTTPS_KEY ו-ACTUAL_HTTPS_CERT, כפי שמתועד בפרויקט, תוך קבלת אזהרת דפדפן בכל מכשיר. תעודה חינמית מ-Let's Encrypt דורשת חמש דקות עבודה בלבד, לכן מומלץ לבחור באפשרות הראשונה.

התקנת Actual Budget באמצעות Docker Compose

התקינו תחילה את Docker אם השרת חדש. אם תחביר הקובץ Compose אינו מוכר לכם, המדריך יסודות Docker Compose עבור VPS מכסה את השדות שבהם נעשה שימוש להלן.

sudo install -d -m 755 /opt/actual
sudo install -d -m 700 /opt/actual/data

צרו את /opt/actual/docker-compose.yml:

services:
  actual:
    image: actualbudget/actual-server:latest
    container_name: actual
    restart: unless-stopped
    ports:
      - '127.0.0.1:5006:5006'
    volumes:
      - ./data:/data

שלושה פרטים בקובץ זה הם בעלי חשיבות.

ה־image הוא actualbudget/actual-server:latest, אשר מופץ על ידי הפרויקט ל-Docker Hub ומשוכפל ב-ghcr.io/actualbudget/actual. קיים תג latest-alpine עבור מכונות בעלות הספק נמוך.

המכולה כותבת את כל הנתונים תחת /data. בתוכה תמצאו את server-files, המכיל את account.sqlite עם פרטי ההתחברות ואסימוני ההפעלה שלכם, ואת user-files, המכיל את קובצי התקציב עצמם. עגנו (mount) נתיב זה, אחרת docker compose pull יגרום לאובדן התקציב שלכם. ACTUAL_DATA_DIR יכול להעביר אותו למקום אחר, אך ברירת המחדל תקינה.

הפורט מפורסם ב-127.0.0.1 בלבד. ציון 5006:5006 בלבד יגרום לפרסום בכל הממשקים, ו-Docker כותב חוקים משלו לפני אלו של ufw, כך שהיישום יהיה חשוף לאינטרנט גם אם מוגדר firewall שחוסם הכל. הפתעה זו מוסברת ב-מדוע פורטים שמפורסמים על ידי Docker עוקפים את ufw. קישור ל-loopback מבטיח שרק ה-reverse proxy שעל אותו שרת יוכל להגיע אליו.

הפעילו את השירות:

cd /opt/actual
docker compose up --detach
docker compose logs -f actual

הלוג יתייצב ברגע שהשרת ידווח שהוא מאזין בפורט 5006. בדקו זאת מקומית לפני שתגעו ב-DNS:

curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5006/

קבלת 200 מציינת שהיישום פעיל. curl: (7) Failed to connect מציין שהמכולה אינה רצה, ו-docker compose ps יציג שהיא יצאה (exited). הסיבה הנפוצה לכך היא בעיית הרשאות בנפח (volume) המעוגן, שניתן לראות כשורת EACCES בלוג.

הצבת תעודה ושם מתחם אמיתי

הצביעו עם רשומת A אל ה-VPS, budget.example.com, והמתינו עד שהיא תתעדכן. לאחר מכן, התקינו את nginx והנפיקו את התעודה. המדריך Certbot ב-Ubuntu 24.04 עם nginx מכסה את תהליך ההנפקה ואת טיימר החידוש במלואו.

בלוק ה-proxy:

server {
    listen 443 ssl;
    http2 on;
    server_name budget.example.com;

    ssl_certificate     /etc/letsencrypt/live/budget.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/budget.example.com/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:5006;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

client_max_body_size היא השורה שאנשים נוטים לשכוח. קובץ התקציב מועלה בשלמותו במהלך סנכרון מלא. ברירת המחדל של Nginx היא גודל גוף בקשה של 1 MB, לכן ברגע שהקובץ גדל מעבר לכך, הסנכרון נכשל עם 413 Request Entity Too Large בלוג הגישה של nginx, בעוד היישום מציג רק שגיאת סנכרון כללית. לשרת יש מגבלות נפרדות משלו: ACTUAL_UPLOAD_FILE_SYNC_SIZE_LIMIT_MB מוגדר כברירת מחדל ל-20 ו-ACTUAL_UPLOAD_SYNC_ENCRYPTED_FILE_SYNC_SIZE_LIMIT_MB מוגדר כברירת מחדל ל-50, לכן הגדירו את המגבלה ב-nginx לערך גבוה מזה שרלוונטי עבורכם.

בצעו טעינה מחדש ובדיקה:

sudo nginx -t && sudo systemctl reload nginx
curl -fsS -o /dev/null -w '%{http_code}\n' https://budget.example.com/

הרצה ראשונה: סיסמה וקובץ התקציב הראשון שלכם

פתחו את https://budget.example.com בדפדפן. המסך הראשון יבקש מכם להגדיר סיסמה לשרת. סיסמה יחידה זו מאבטחת את השרת כולו, לכן צרו סיסמה אקראית וארוכה ושמרו אותה במקום נגיש, כגון מנהל סיסמאות Vaultwarden בניהול עצמי. אין צורך ליצור חשבונות משתמש. השרת של Actual מתוכנן לעבוד עם סיסמה אחת בלבד, כך ששיתוף תקציב משמעו שיתוף הסיסמה הזו.

לאחר מכן, צרו קובץ תקציב. Actual תשאל אם להפעיל הצפנה מקצה לקצה (end-to-end encryption). בחרו בחיוב; השרת יאחסן רק טקסט מוצפן, וזו הבחירה הנכונה עבור נתונים פיננסיים המאוחסנים על שרת שכור. למחיר הזה יש משמעות: סיסמת ההצפנה לעולם אינה מגיעה לשרת, ולכן אם תאבדו אותה, הקובץ יאבד ולא ניתן יהיה לשחזר אותו. רשמו את הסיסמה לפני שתמשיכו מעבר למסך זה.

הגדירו את יתרות הפתיחה שלכם לפי הנתונים העדכניים מהבנק, במקום לייבא היסטוריה של שנים. תקצוב לפי מעטפות (envelope budgeting) עובד קדימה מהכסף שברשותכם כעת, כך שאין כל חיסרון בהתחלה ללא היסטוריה.

ייבוא עסקאות

כאן הכנות חשובה יותר מהתלהבות, שכן תהליך הייבוא הוא הסיבה העיקרית לכך שאנשים נוטשים פתרונות תקציב בניהול עצמי.

הזנה ידנית היא בסיס העבודה והיא תמיד עובדת. עבור שיטת המעטפות, ניתן לטעון שזהו העיקר, שכן הקלדת רכישה היא הפעולה שגורמת לך לשים לב אליה.

ייבוא קבצים מטפל בנפח העבודה העיקרי. Actual קורא קובצי CSV, QIF, OFX ו-QFX, וכל בנק מייצא לפחות אחד מהפורמטים הללו. בצעו ייבוא לכל חשבון ממסך החשבונות, בצעו מיפוי עמודות פעם אחת, ו-Actual יזכור את המבנה עבור אותו חשבון.

סנכרון בנקאי אוטומטי קיים, והוא דורש שירות צד-שלישי מכיוון שהשרת אינו יכול לתקשר עם בנקים באופן עצמאי. Actual תומך ב-SimpleFIN Bridge עבור בנקים בצפון אמריקה, ב-Enable Banking עבור אירופה, ב-Akahu עבור ניו זילנד וב-Pluggy.ai עבור ברזיל. GoCardless עדיין נתמך אך אינו מקבל חשבונות חדשים. עליכם להירשם אצל הספק בעצמכם, להפיק אישורי גישה (credentials) ולהוסיף אותם לשרת. נכון ליולי 2026, SimpleFIN Bridge גובה 15 דולר ארה"ב לשנה עבור עד 25 מוסדות, והאחרים מתומחרים באופן שונה.

יש לקבל שתי מגבלות לפני שמסתמכים על כך. אישורי ה-API מאוחסנים על השרת ואינם מוגנים בהצפנה מקצה-לקצה (end-to-end encryption), כיוון שהשרת חייב להשתמש בהם. בנוסף, Actual אינו מבצע סקר (poll) אוטומטי: הסנכרון הוא פעולה שמתבצעת בלחיצת כפתור, ולא כמשימת רקע.

גיבויים, כיוון שמדובר בקבצים בלבד

כל המידע שחשוב לכם נמצא תחת /opt/actual/data. אין צורך בשלב ייצוא או בביצוע dump של מסד הנתונים באמצעות סקריפט.

המלכודת היחידה היא SQLite. העתקה של account.sqlite בזמן שהשרת כותב אליו עלולה לתעד טרנזקציה שלא הושלמה, ולא תדעו זאת עד שתנסו לשחזר. עצרו את ה-container לכמה שניות שנדרשות להעתקה:

cd /opt/actual
docker compose stop
restic -r sftp:backup@backup.example.com:/srv/restic backup /opt/actual/data
docker compose start

הגדירו זאת בלוח זמנים לפי הגישה ב-גיבויי restic ב-VPS, המכסה את הגדרת ה-repository, שמירת גרסאות (retention) ותרגול שחזור. בצעו תרגול שחזור. גיבוי שמעולם לא שוחזר הוא בגדר ניחוש בלבד.

הגיבויים בצד הלקוח של Actual הם עניין נפרד שכדאי להכיר. הדפדפן שומר עותקים עדכניים של קובץ התקציב, הנגישים מתפריט הקבצים. זה מאפשר לטפל במקרים של "מחקתי קטגוריה בטעות" מבלי לגעת בשרת כלל.

עדכון השרת

cd /opt/actual
docker compose pull
docker compose up --detach

Compose יוצר מחדש את המכולה מה־image החדש ומחבר אליה מחדש את אותו volume, ולכן הנתונים נשמרים. עדכנו גם את הלקוחות. גרסאות השרת והיישום אמורות להישאר קרובות זו לזו, ולקוח שגרסתו ישנה בהרבה מגרסת השרת עלול לסרב להסתנכרן ולהציג הודעה על אי־התאמת גרסאות. צרו גיבוי לפני מעבר לגרסה ראשית חדשה, משום שהמיגרציות פועלות בהפעלה הראשונה ואין אפשרות לחזור לגרסה קודמת. Actual סלחני לגבי תג latest צף, משום שהמצב שלו הוא תיקייה של קבצים. יישום שמכיל מסד נתונים אמיתי אינו כזה, והמאמר אירוח עצמי של Chatwoot מפרט את התגים המקובעים ואת ה־dump שיש ליצור לפני השדרוג, כפי שנדרש בתהליך זה.

מה משתבש ומה תראה

היישום נטען אך הסנכרון לעולם לא מסתיים. בדוק את ה-access log של Nginx עבור 413. המשמעות היא ש-client_max_body_size מוגדר נמוך מדי. לעומת זאת, 502 מציין ש-Nginx פעיל אך המכולה אינה פעילה.

אפשרויות הצפנה חסרות, או שהאפליקציה לנייד מסרבת לקבל את ה-URL. הדף אינו נמצא בהקשר מאובטח. שורת הכתובת תציג http:// עם כתובת IP או שם מארח שאינו localhost. תקן את התעודה במקום לנסות לעקוף את הבעיה.

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

המכולה מבצעת אתחול בלולאה. קרא את docker compose logs actual. שגיאת הרשאות ב-/data משמעותה שהספרייה המעוגנת (mounted) אינה ניתנת לכתיבה על ידי המשתמש של המכולה. שגיאת address-in-use מציינת שתהליך אחר כבר תופס את פורט 5006 ב-loopback.

הטעינה הראשונית מרגישה איטית. כל קובץ התקציב יורד לדפדפן בעת הפתיחה. מדובר בהעברה אחת גדולה, ולאחריה קריאות מקומיות. זו אינה בעיה של גודל שרת, והוספת RAM לא תשנה זאת.

FAQ

האם Actual Budget מחייב HTTPS כדי לעבוד?

כן, בפועל. ההצפנה מקצה-לקצה של Actual משתמשת ב-Web Crypto API של הדפדפן, ודפדפנים חושפים ממשק זה רק בהקשר מאובטח, כלומר https:// או http://localhost. בחיבור HTTP רגיל ממכונה אחרת, תכונות אלו אינן זמינות, והאפליקציות הרשמיות לנייד מסרבות לעבוד עם כתובת שרת ב-HTTP. השתמשו בתעודת Let's Encrypt עבור שם מתחם אמיתי, או בתעודה בחתימה עצמית עם ACTUAL_HTTPS_KEY ו-ACTUAL_HTTPS_CERT אם אתם משתמשים אך ורק בדפדפן שולחני.

האם Actual יכול לייבא את תנועות הבנק שלי באופן אוטומטי?

רק באמצעות שירות צד-שלישי שעליו תירשמו בעצמכם: SimpleFIN Bridge בצפון אמריקה, Enable Banking באירופה, Akahu בניו זילנד, או Pluggy.ai בברזיל. GoCardless נתמך אך אינו מקבל חשבונות חדשים. פרטי הגישה ל-API הללו נשמרים על השרת שלכם ואינם מוגנים על ידי ההצפנה מקצה-לקצה. הסנכרון הוא ידני, כך שעליכם ללחוץ על כפתור ואין תהליך שסורק נתונים ברקע. ייבוא קובצי CSV, QIF, OFX ו-QFX אינו דורש שירות צד-שלישי כלל.

מה בדיוק עליי לגבות?

את תיקיית הנתונים המותקנת (mounted), שהיא /opt/actual/data במדריך זה. היא מכילה את server-files/account.sqlite עם פרטי ההתחברות והסשנים, ואת user-files עם קובצי התקציב. עצרו את המכולה לפני ההעתקה, שכן העתקת מסד נתונים SQLite פעיל עלולה לתפוס כתיבה חלקית. שום דבר אחר על השרת אינו מחזיק מצב (state).

מה קורה אם אאבד את סיסמת ההצפנה?

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

כמה משאבי שרת דורש Actual Budget?

מעט מאוד. המכולה מגישה קבצים סטטיים, וחישובי התקציב מתבצעים בדפדפן. vCPU משותף אחד עם 1 GB של RAM מריץ את השירות ללא בעיות, ותיקיית הנתונים עבור תקציב משפחתי עם היסטוריה של כמה שנים נשארת בטווח של עשרות מגה-בייטים. העומס על הדיסק נובע מהגיבויים שלכם ומהמכולות האחרות, לא מ-Actual. אם אתם מתכננים שרת שיריץ במקביל שירותים תובעניים יותר, שרת תמונות הוא בדרך כלל מה שקובע את הרף, לכן בדקו כמה RAM דורשים בפועל PhotoPrism ו-Immich לפני שתבחרו תוכנית אירוח.