אמנם כתבתי על זה בעבר, אבל אפילו אני פאקיונר לא קטן, השבוע גסס לי דיסק, והצלתי ממנו מידע בעור שיני (מה זה אומר לעזאזל? אין לי עור על השיניים!). הבעיה נפתרה אחרי הרבה העתקה איטית וזהירה תחת עינו הפקוחה של מזגן ובסוף כל המידע הועתק יפה מהדיסק למעט קובץ אחד שיש לי מקור אחר בשבילו. במקביל אני קורא כי רק לפני יומיים הלכו הפורומים של אובונטו ישראל בגלל שדרוג חסר אחריות, וצוות האתר לא מבין שיש לו מחויבות לשחזר. וואטסאפ הפליגו עם כותרת מאוד צהובה וכבר הכריזו "מותה של קהילה". אני לא הייתי באמת נשאר אצל צוות הנהלה שיורק בקשת (איזראל סטייל) על מה שכתבו משתתפים בפורום ועונים להם בחוצפה כשהם מבקשים את החומר חזרה באתר. למרות ששם זה נראה שזה נעשה מתוך הובריס ילדותי מכוון ולא בשל תקלה.
לבסוף לפני שעתיים כתבה לי טליה בבהלה שהיא מחקה לעצמה בטעות את הבלוג. אחרי שנרגעה טיפה ושיחזרה את הרוב (עזרתי עם איזה קובצון או שניים), החלטתי להתיישב ולכתוב howto פשוט, איך לגבות שרת גנו או יוניקס מרוחק בלי לגעת בו. אני מביא כאן את הסקריפט שאיתו אני מגבה את השרת שלי ועושה התאמות לגיבוי של ספרית בית של משתמש שאין לו גישת root, אנא בדקו אחרי שלא פישלתי בכלום, כי אחרי כל השינויים אני לא מתכוון להעביר את זה QA:
1. צרו סקריפט שיגבה את כל ספרית הבית שלכם, וכל טבלה דרושה ממסד הנתונים:
#!/bin/bash
# a generic hack to make a backup tarball of a homedir on a server
# and back it up to a home machine.
# This hack is public domain, and may not be useful to YOU if you don't
# customize it to the bone.
# The design is simple - stick everything in a single directory and rsync it out.
# We keep three days of material back, you still need to
# use rsync to take it home.
mkdir -p ~/backup ; cd ~/backup
mkdir -p current back.1 back.2 # add as necessary!
## first, rotate the directories
mv back.1/* back.2
mv current/* back.1
## set up dates for the backup filenames
TODAY=$(date +%Y-%m-%d)
THISMONTH=$(date --date="$TODAY -1 days" +%Y-%m)
ARCHSINCE=$(date --date="$TODAY -1 days" +%Y-%m-1)
## now dump MySQL, you must edit this to reflect YOUR db names!
for db in db1 db2 ${USER}_db ; do
nice mysqldump -e --add-drop-table --add-locks \
--user=USERNAME --password=PASS --single-transaction -q $db | \
nice gzip -c --rsyncable > current/$(hostname)_sql_$db.gz
done
## Did you notice? I always use gzip --rsyncable so the tarballs are, well, rsync-able!
## Latest web logs - only incremental of this month
( tar --newer-mtime ${ARCHSINCE} -cf - ~/weblogs | nice gzip -c --rsyncable \
> current/$(hostname)-weblogs-${THISMONTH}.tgz ) 2> /dev/null
## I run several sites
for site in ~/sites/* ; do
sitename=$(basename ${site})
( tar -C ~/sites/ -cf - ${sitename} | nice gzip -c --rsyncable \
> current/${USER}-${sitename}.tgz ) 2> /dev/null
done
## Backup all the rest of the homedir:
( tar --exclude=weblogs --exclude=sites --exclude=backup -cf - ~/. | nice gzip -c --rsyncable \
> current/$(hostname)-${USER}home.tgz ) 2> /dev/null
## AGAIN: this script makes a lot of assumptions, many not right for your setup.
## go over it, understand what it does and edit it to YOUR needs with
## YOUR directory names.
2. הריצו אותו כל לילה בשעות הכי פנויות בcron
crontab -e
(this opens an editor and you add in a line to run your script)
MAILTO=yourmail@yourdomain.com
30 3 * * * ~/bin/nightly-backup
3. במחשב הביתי שלכם, בנו סקריפט קטן שימשוך את הדלתא של העדכון. אם אתן לא מריצות גנו/לינוקס או מאק, אתן יכולות להתקין cygwin כי אני לא מכיר דרך יותר נוחה להשתמש בrsync מחלונות (הקוראות מוזמנות להאיר את עיני)
while ! nice rsync -av SERVER:backup/current/ ~/backups/SERVER/ ; do sleep 1 ; done
4. הכניסו גם אותו לcron. כאן אני מניח שלא יקח יותר משעה לגבות את כל האמור לעיל, אבל אם אצלכם זה שונה, שנו את המספרים לשעה יותר מאוחרת.
crontab -e
(this opens an editor and you add in a line to run your script)
MAILTO=yourmail@yourdomain.com
30 4 * * * ~/bin/rsync-nightly-backup | tail -2
אני לא דואג לפרט כאן איך למשוך RSYNC משרת רחוק בלי לשבת ליד המקלדת ולהכניס סיסמא כל פעם, אבל אם תהיה מספיק דרישה אני אוסיף עוד howto קטן בנושא. בינתיים רמז: SSH עם מפתח פרטי וציבורי, כאשר אין passphrase או שאתם דואגים לssh-agent רץ וזמין לפעולת הcron.
ושוב כאמור, כתבתי את כל הנ"ל חפיף, נא לתקן אותי אם שכחתי או פישלתי במשהו.