תמיד מעודכנים!
RSS

הגדרות השרתים שלי (או zero-downtime deploys with capistrano, nginx and unicorn)

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

לאחרונה העברתי את הלקוח שלנו למערך שרתים באמאזון, ובדרך גם שינינו את כל הדרך בה השרתים עולים. במקום להשתמש ב-passenger החלטנו להשתמש ב-unicorn. לשרת ה-web בחרנו ב-nginx. בחרנו בשני אלה בגלל שביחד הם מספקים פתרון מאוד אלגנטי לבעיית החלפת הקוד – עד היום, כשהחלפנו קוד על השרתים, היו 10-30 שניות בהן השרתים לא הגיבו. כדי לפתור את זה עשינו דברים מכוערים כמו rolling restart (ריסט של שרת אחד, ורק אחריו השרת הבא) או פתרונות אחרים. unicorn מגיע עם אפשרות להגדרה אלגנטית מאוד – ברגע שהוא מקבל פקודת "USR2", הוא משנה את השם שלו, מקים שרת חדש, וכשהשרת החדש מוכן לפעולה, מפסיק לשרת בקשות ומת כשהוא מסיים את העבודה שלו.

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

על מנת להגדיר את השרתים, הסתמכנו רבות על ההגדרות ש-github פרסמו, ונראה שהן עובדות נהדר.

זהו קובץ ההגדרות בו אנחנו משתמשים, מינוס כמה שורות שרלוונטיות לפרוייקט הספציפי. שימו לב לבלוק ה-before_fork, שם יש את כל הקסם שמאפשר לנו להגיע לריסט "חי". קובץ ההגדרות של unicorn, בצירוף אל קובץ הגדרות מינימליסטי במיוחד של nginx מאפשר לבצע את כל הקסם:

עכשיו, איך מבצעים deploy?

פשוט, קובץ ה-deploy.rb שלנו נראה בערך כך:

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

שייך לקטגוריות: בניית אתרים, ריילס, תכנות | השאר תגובה

קצת על Continuous Integration, או: באמאשלכם, תדאגו שהטסטים הארורים יעבדו, ומהר!

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

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

יש כל מיני כלי CI שונים שניתן להשתמש בהם, החל משירותים כמו Travis Pro (או סתם, אם הפרוייקט שלכם הוא בקוד פתוח), דרך תוכנות כמו Jenkins שניתן להתקין על שרתים או סתם על מכונה שיושבת במשרד, וכלה בפתרונות יותר מותאמים שנכתבים בתוך הארגון (בחיי, לא ברור לי למה לעשות דברים כאלו, אבל יש מי שעושה אותם)

אני עובד בחברת ייעוץ, ואצל הלקוח הנוכחי הקמתי סביבת CI עם Jenkins על מכונה מקומית שנמצאת במשרד. בינתיים יצא לי ללמוד דבר או שניים:

  1. יותר זה יותר. יותר זכרון, מעבד חזק יותר ודיסק SSD, כולם חשובים מאין כמוהם – אחרי שהוספתי 8GB ו-SSD על המכונה הזו (i7 עם שמונה ליבות, מכונה חזקה) הורדתי את זמן הריצה של הטסטים שלנו מ-3 דקות לדקה ו-20 שניות. זה לא נשמע חשוב, אבל כמה שהטסטים רצים יותר מהר, כך הפידבק שהמפתח מקבל יותר זריז. וכרגע אלו הטסטים הראשונים (כ-300). כשיהיו הרבה יותר, בהחלט נראה שיותר כוח מחשוב חשוב מאוד :)
  2. להתקין את jenkins זה ממש קל על אובונטו. פשוט תתקינו אובונטו על המכונה, אתם לא תצטערו.
  3. Rspec ו-Capybara משום מה לא ממש עובדים יפה ביחד. אם טסטים נכשלים ובתוכם נמצא טסט Capybara, משום מה Rspec יצהיר למערכת ההפעלה (ול-CI) שהכל עבר כמו שצריך, ואנחנו לא רוצים את זה. אני הפרדתי בין השניים עד שיימצא פתרון.
  4. כרגע יש עדיין בעייה עם הפלאגין של ג'נקינס שאמור להריץ טסטים על כל pull request שעולה. המפתח מודע לבעייה וזה בטיפול.
  5. רציתי לכתוב שחבל שאין כלי CI טוב ברובי, אבל נראה שאני טמבל, ויש את Travis שניתן להריץ native. לא ברור לי עדיין אם הוא עובד עם private repositories, אבל אם כן, אולי אעבור לשם, כי זה הרבה יותר כיף כשיש כלי שאני יכול לכתוב לו תוספות.

בקיצור, CI זה מגניב, אם אין לכם, תדאגו שיהיה. זה שווה :)

שייך לקטגוריות: ריילס, תכנות | תוייג | השאר תגובה

חיפוש עם thinking sphinx בעברית – פשוט, אבל צריך להגדיר אותו כראוי

בזבזתי עכשיו שעתיים בחיפוש אחרי הסיבה שהאינדקסים שלי לא מוגדרים ע"י ספינקס, עד שהבנתי שצריך היה להגדיר את התווים שספינקס מקבל כשהוא מאנדקס. אז לעברית זה מוגדר כך בקובץ sphinx.yml:

development:
charset_table: "0..9, A..Z->a..z, _, a..z, \
U+410..U+42F->U+430..U+44F, U+430..U+44F, \
U+FB1D->U+05D9, U+FB1F->U+05F2, U+FB20->U+05E2, U+FB21->U+05D0, U+FB22->U+05D3, U+FB23->U+05D4, \
U+FB24->U+05DB, U+FB25->U+05DC, U+FB26->U+05DD, U+FB27->U+05E8, U+FB28->U+05EA, U+FB2A->U+05E9, \
U+FB2B->U+05E9, U+FB2C->U+05E9, U+FB2D->U+05E9, U+FB2E->U+05D0, U+FB2F->U+05D0, U+FB30->U+05D0, \
U+FB31->U+05D1, U+FB32->U+05D2, U+FB33->U+05D3, U+FB34->U+05D4, U+FB35->U+05D5, U+FB36->U+05D6, \
U+FB38->U+05D8, U+FB39->U+05D9, U+FB3A->U+05DA, U+FB3B->U+05DB, U+FB3C->U+05DC, U+FB3E->U+05DE, \
U+FB40->U+05E0, U+FB41->U+05E1, U+FB43->U+05E3, U+FB44->U+05E4, U+FB46->U+05E6, U+FB47->U+05E7, \
U+FB48->U+05E8, U+FB49->U+05E9, U+FB4A->U+05EA, U+FB4B->U+05D5, U+FB4C->U+05D1, U+FB4D->U+05DB, \
U+FB4E->U+05E4, U+FB4F->U+05D0, U+05D0..U+05F2"


זו ההגדרה לעברית, לשפות אחרות שאינן אנגלית\עברית ניתן למצוא את ההגדרה כאן
שייך לקטגוריות: כללי | השאר תגובה

טוב, קצת סדר בבלאגן – מה זה בניית אתרים? איך בונים אתרים? מה צריך בשביל ללמוד לבנות אתרים? ולמה?!

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

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

דבר ראשון – אתר אינטרנט מוצג ללקוח באמצעות שלושה דברים:

  1. HTML - בעברית – שפת תגיות לסימון טקסט – השפה מכילה בה תוכן (טקסט) שנמצא בתוך תגיות שונות. התגיות מלמדות על סוג התוכן שנמצא בתוכן, לדוגמא <table> היא תגית פתיחה של טבלא, ומסבירה שהמידע שיהיה בפנים הינו מידע טבלאי, ובדומה – <strong> היא תגית שמסמנת שהטקסט שבתוכה חשוב יותר מהטקסט שלידו. לתגיות אפשר לקרוא גם "אלמנטים". לרשומה המלאה
שייך לקטגוריות: בניית אתרים, כללי, מה זה | תוייג , | 5 תגובות

ריילס 3 – מנועים

טוב, סוף סוף, אחרי יותר מידי זמן, אני כותב פוסט, ואחרי יותר מידי זמן התחלתי להשתמש בריילס 3. המעבר לא קל, כי המון המון דברים השתנו מגרסה 2.3.5 בה אני השתמשתי עד עתה. אז במקום לשדרג את הפרוייקטים הקיימים (המון עבודה וכרגע לא נראה שאוכל לעשות את זה) אני החלטתי לבנות מחדש את אתר ההכרויות שלי. נגיד את זה כך – עם ריילס 3 אחרי 7 שעות עבודה בערך סיימתי את כל הלוגיקה במודלים, כולל רוב המתודות, יישמתי התחברות למערכת ע"י facebook connet, twitter, google וכו' (מאוד פשוט, אכתוב על זה פוסט בקרוב, בעיקר על השגיאות שעשיתי, כדי שאחרים לא יחזרו עליהן)

לרשומה המלאה

שייך לקטגוריות: בניית אתרים, ריילס, תכנות | תוייג , , | השאר תגובה

קצת מיתוסים על אדסנס (והניפוץ שלהם)

טוב, יש כמה מיתוסים וטעויות נפוצות על השרות של גוגל – adsense – שמשלם לבעלי אתרים על לחיצות על מודעות גוגל שבעלי האתרים שמים באתרים שלהם, כשגוגל דואג לשים פרסומות רלוונטיות.

מיתוס #1 – רק אתרים גדולים יכולים להרוויח מפרסומות של גוגל

טעות בידכם! גם אתרים קטנים יכולים להרוויח מאדסנס. אמנם לא הרבה, אבל זה בהחלט יכול לכסות את הוצאות האכסון של האתר ולהשאיר קצת רווח בידיים. אתרים שלי מכניסים לי בממוצע 20-30$ בחודש, כשבאף אחד מהם אין יותר מ-40 כניסות ביום, ואין שום סיבה שגם אתם לא תרוויחו ככה.

לרשומה המלאה

שייך לקטגוריות: אתרים, בניית אתרים, עסקים מקוונים, פרסום, קידום אתרים | 4 תגובות

כמה דברים בסיסיים שצריך לזכור כשבונים אתר (ורוצים שמישהו ידע עליו)

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

בגדול, אנחנו מדברים על הדגשים הבאים:

  • קוד סמנטי
  • תאור טוב ואיכותי בכותרת העמוד ובטקסט העיקרי
  • מציאת תחליפים לתמונות שמכילות טקסט, עד כמה שאפשר
  • שימוש בתגיות alt בתמונות
  • קיצור שורת הכתובת למינימום ההכרחי
  • מבנה קישורים נכון ברחבי האתר – מבחינת הטקסט המקשר ומבחינת העמודים שמקשרים
  • וכמובן – תוכן.

ידוע שתוכן הוא המלך. זה ברור לכולנו. אבל חוץ מתוכן איכותי, ישנם כמה דברים חשובים מאוד בתהליך בניית אתר אינטרנט שרבים מאבדים בדרך

לרשומה המלאה

שייך לקטגוריות: בניית אתרים, קידום אתרים | תגובה אחת

כמה קשה זה להקים אתר חדש

בשעה טובה ומוצלחת הוצאתי לאוויר את sir.co.il – אתר הכרויות חינמי.

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

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

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

אבל מה אני לומד מכל העסק?

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

  1. להשיק לאט ובזהירות – המערכת יכולה להכיל באגים שפיספסנו. משתמשים שמסתובבים ברחבי האתר ומחפשים מה לעשות עם עצמם הם בהחלט גלאי הבאגים הטובים ביותר. רובם המכריע לא יטרח להגיד לנו על הבאג, אבל אם זה משהו ברמה של "השמיים נופלים ואני מקבל error 500" אז אפשר לראות את המקור לבאג בלוגים של המערכת.
  2. לקרוא את הלוגים – אני ישבתי וגירדתי את פדחתי כשהיו לי בערך 50 משתמשים רשומים ואף הודעה לא עברה ביניהם. אחרי שהורדתי את הלוגים הבנתי שפשוט שכחתי לבדוק אם משתנה כלשהו מכיל תאריך לפני שבדקתי שהתאריך לא רחוק מידי מהיום. קריאה קבועה של הלוגים ובדיקה של המקור לשגיאות בצד שרת יכולה לפתור הרבה בעיות.
  3. להקשיב לגולשים – המעט שטורחים להגיב ולהציע הצעות בדרך כלל נותנים הצעות מאוד טובות. כדאי להקשיב להם. כמובן שיש כמה כאלה, אבל רוב האנשים שמספיק נחמדים כדי להגיב שווים את זה.

אם נעשה את כל אלה, סביר להניח שהכל יסתדר באיזשהו שלב…

אני מקווה.

שייך לקטגוריות: אתרים, עסקים מקוונים | 2 תגובות

האקרים פלסטיניים שמאלנים – או: כמה קל זה לפרוץ לאתר?

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

קובץ ה-index שלו הוחלף לקובץ שבין השאר מכיל את התמונה הזו, משמאלנו, מה שמרמז על כך שההאקר שעשה את זה כנראה פלסטיני, אבל גם שמאלני, מה שמוזר אבל טוב. אגב, מי שעשה את זה היה מספיק נחמד כדי להעתיק את קובץ ה-index המקורי לקובץ בשם index-old וכך למעשה מנע את הנזק שיכל היה לקרות.
העניין שעניין אותי זו הקלות הבלתי נסבלת של הפריצה. הססמאות שהיו מוגדרות על החשבונות היו 123456 ו- t3r4e5 (שימו לב למיקום הנוח של האותיות והמספרים על המקלדת שהופך את הססמא השנייה לפופולרית מאוד) כך שכל מה שהוא היה צריך לעשות זה לנחש את שם המשתמש (שבמקרה היה שמו של הבחור, שמופיע בעמוד הראשי של שני האתרים) ולהתחיל לנחש ססמאות דביליות. אני מתאר לעצמי שזה לקח לא יותר מחמישה נסיונות…

מוסר ההשכל – גם אתרים שאין בהם יותר מידי חשיבות (לשני האתרים ביחד ישנם ביום טוב 60 מבקרים) מועדים לפורענות, ואסור להקל ראש בפרצות אבטחה אלמנטריות!

שייך לקטגוריות: אבטחה, בניית אתרים, כללי, תכנות | 2 תגובות

איך גיא קיוסאקי הוציא 5,000 דולר כדי לגרום לאשה בת 40 להידלק…

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

למי שמתעניין – שווה להירשם לבלוג שלו.

שייך לקטגוריות: כללי, עסקים מקוונים, פרסום | תגובה אחת