דרישות התקנה

Edge for Private Cloud גרסה 4.19.01

דרישות חומרה

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

בסרטון הבא מוסבר איך לבחור את הגודל המתאים להתקנה:

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

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

רכיב ההתקנה RAM מעבד (CPU) כונן קשיח מינימלי
Cassandra 16GB 8 ליבות אחסון מקומי בנפח 250GB עם SSD שתומך ב-2,000 IOPS
מעבד בקשות/נתב באותו מחשב 16GB 8 ליבות ‫100GB
מעבד בקשות (עצמאי) 16GB 8 ליבות ‫100GB
נתב (עצמאי) 16GB 8 ליבות ‫100GB
‫Analytics – ‏Postgres/Qpid באותו שרת ‫16GB‏* 8 ליבות* אחסון ברשת*** בנפח 500GB עד 1TB**, רצוי עם קצה עורפי של SSD, שתומך ב-1,000 IOPS או יותר*
‫Analytics – ראשי או המתנה (עצמאי) של Postgres ‫16GB‏* 8 ליבות* אחסון ברשת*** בנפח 500GB עד 1TB**, רצוי עם קצה עורפי של SSD, שתומך ב-1,000 IOPS או יותר*
Analytics - Qpid standalone 16GB 8 ליבות אחסון מקומי בנפח 30GB עד 50GB עם SSD

גודל ברירת המחדל של התור ב-Qpid הוא 1GB, ואפשר להגדיל אותו ל-2GB. אם צריך קיבולת נוספת, מוסיפים עוד צומתי Qpid.

שרת OpenLDAP/ממשק משתמש/ניהול 4GB 2 ליבות 60GB
שרת ממשק משתמש/ניהול 4GB 2 ליבות 60GB
‫OpenLDAP (עצמאי) 4GB 2 ליבות 60GB

* התאמת דרישות המערכת של Postgres על סמך הקיבולת:

  • פחות מ-250 TPS: אפשר לשקול 8GB,‏ 4 ליבות עם אחסון מנוהל ברשת*** שתומך ב-1,000 IOPS או יותר
  • יותר מ-250 TPS‏: 16GB,‏ 8 ליבות, אחסון מנוהל ברשת*** שתומך ב-1,000 IOPS או יותר
  • יותר מ-1,000 TPS‏: 16GB,‏ 8 ליבות, אחסון מנוהל ברשת*** שתומך ב-2,000 IOPS או יותר
  • יותר מ-2,000 טרנזקציות לשנייה: 32GB,‏ 16 ליבות, אחסון מנוהל ברשת*** שתומך ב-2,000 פעולות קלט/פלט לשנייה או יותר
  • ‫יותר מ-4,000 טרנזקציות לשנייה: 64GB,‏ 32 ליבות, אחסון מנוהל ברשת*** שתומך ב-4,000 פעולות קלט/פלט לשנייה או יותר

‫** הערך של הדיסק הקשיח של Postgres מבוסס על ניתוח הנתונים המובנה שמתבצע על ידי Edge. אם מוסיפים ערכים מותאמים אישית לנתוני הניתוח, צריך להגדיל את הערכים האלה בהתאם. כדי להעריך את נפח האחסון הנדרש, אפשר להשתמש בנוסחה הבאה:

bytes of storage needed =

  (# bytes of analytics data/request) *

  (requests/second) *

  (seconds/hour) *

  (hours of peak usage/day) *

  (days/month) *

  (months of data retention)

לדוגמה:

(2K bytes) * (100 req/sec) * (3600 secs/hr) * (18 peak hours/day) * (30 days/month) * (3 months retention)

= 1,194,393,600,000 bytes or 1194.4 GB of storage needed

*** מומלץ להשתמש באחסון ברשת למסד נתונים של Postgresql כי:

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

בנוסף, ברשימה הבאה מפורטות דרישות החומרה להתקנת שירותי Monetization (לא נתמכים בהתקנת All-in-One):

רכיב עם מונטיזציה RAM מעבד (CPU) כונן קשיח
שרת ניהול (עם שירותי מונטיזציה) 8GB 4 ליבות 60GB
‫Analytics – ‏Postgres/Qpid באותו שרת 16GB 8 ליבות אחסון ברשת בנפח 500GB עד 1TB, רצוי עם קצה עורפי של SSD, שתומך ב-1,000 פעולות קלט/פלט לשנייה או יותר, או להשתמש בכלל מהטבלה שלמעלה.
‫Analytics – מאסטר או המתנה עצמאיים של Postgres 16GB 8 ליבות אחסון ברשת בנפח 500GB עד 1TB, רצוי עם קצה עורפי של SSD, שתומך ב-1,000 פעולות קלט/פלט לשנייה או יותר, או להשתמש בכלל מהטבלה שלמעלה.
Analytics - Qpid standalone 8GB 4 ליבות אחסון מקומי בנפח 40GB עד 500GB עם SSD או HDD מהיר

בהתקנות עם יותר מ-250 TPS, מומלץ להשתמש ב-HDD עם אחסון מקומי שתומך ב-1,000 IOPS.

דרישות מערכת ההפעלה ותוכנות צד שלישי

הוראות ההתקנה האלה וקובצי ההתקנה שסופקו נבדקו במערכות ההפעלה ובתוכנות הצד השלישי שמפורטות בקטע תוכנות נתמכות וגרסאות נתמכות.

יצירת המשתמש "apigee"

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

ספריית ההתקנה

כברירת מחדל, תוכנית ההתקנה כותבת את כל הקבצים בספרייה /opt/apigee. אי אפשר לשנות את המיקום של הספרייה הזו. אי אפשר לשנות את הספרייה הזו, אבל אפשר ליצור קישור סימבולי כדי למפות את /opt/apigee למיקום אחר, כמו שמתואר בקטע יצירת קישור סימבולי מ-‎ /opt/apigee.

בהוראות שבמדריך הזה, ספריית ההתקנה מצוינת בתור /opt/apigee.

לפני שיוצרים את הקישור הסימבולי, צריך ליצור משתמש וקבוצה בשם "apigee". זו אותה קבוצה ואותו משתמש שנוצרו על ידי תוכנת ההתקנה של Edge.

כדי ליצור את הקישור הסימבולי, מבצעים את השלבים הבאים לפני שמורידים את הקובץ bootstrap_4.19.01.sh. צריך לבצע את כל השלבים האלה כמשתמש root:

  1. יוצרים את המשתמש והקבוצה "apigee":
    groupadd -r apigee > useradd -r -g apigee -d /opt/apigee -s /sbin/nologin -c "Apigee platform user" apigee
  2. יוצרים קישור סימבולי מ-/opt/apigee אל ספריית הבסיס הרצויה להתקנה:
    ln -Ts /srv/myInstallDir /opt/apigee

    כאשר /srv/myInstallDir הוא המיקום הרצוי של קובצי Edge.

  3. משנים את הבעלות על תיקיית הבסיס של ההתקנה והקישור הסימבולי למשתמש apigee:
    chown -h apigee:apigee /srv/myInstallDir /opt/apigee

Java

לפני ההתקנה, צריך להתקין גרסה נתמכת של Java 1.8 בכל מכונה. ערכות ה-JDK הנתמכות מפורטות בקטע תוכנות נתמכות וגרסאות נתמכות.

מוודאים שמשתנה הסביבה JAVA_HOME מפנה לשורש של ה-JDK של המשתמש שמבצע את ההתקנה.

SELinux

בהתאם להגדרות של SELinux, יכול להיות שיהיו בעיות בהתקנה ובהפעלה של רכיבי Edge. במקרה הצורך, אפשר להשבית את SELinux או להגדיר אותו למצב מתירני במהלך ההתקנה, ואז להפעיל אותו מחדש אחרי ההתקנה. מידע נוסף זמין במאמר התקנת כלי השירות apigee-setup של Edge.

הגדרת רשת

מומלץ לבדוק את הגדרות הרשת לפני ההתקנה. תוכנת ההתקנה מצפה שלכל המכונות יהיו כתובות IP קבועות. כדי לאמת את ההגדרה, משתמשים בפקודות הבאות:

  • ‫hostname מחזירה את שם המכונה
  • ‫hostname -i מחזירה את כתובת ה-IP של השם המארח שאפשר לפנות אליו ממכונות אחרות.

בהתאם לסוג ולגרסה של מערכת ההפעלה, יכול להיות שתצטרכו לערוך את /etc/hosts ואת /etc/sysconfig/network אם שם המארח לא מוגדר בצורה נכונה. למידע נוסף, עיינו במסמכי התיעוד של מערכת ההפעלה הספציפית שלכם.

אם לשרת יש כמה כרטיסי ממשק, הפקודה "hostname -i" מחזירה רשימה של כתובות IP שמופרדות ברווחים. כברירת מחדל, תוכנת ההתקנה של Edge משתמשת בכתובת ה-IP הראשונה שמוחזרת, ויכול להיות שהיא לא תהיה נכונה בכל המצבים. לחלופין, אפשר להגדיר את המאפיין הבא בקובץ התצורה של ההתקנה:

ENABLE_DYNAMIC_HOSTIP=y

כשהמאפיין הזה מוגדר כ-"y", תוכנית ההתקנה מבקשת מכם לבחור את כתובת ה-IP שבה תשתמשו כחלק מההתקנה. ערך ברירת המחדל הוא "n". מידע נוסף זמין בחומר עזר בנושא קובץ תצורה של Edge.

‫TCP Wrappers

‫TCP Wrappers יכול לחסום תקשורת של יציאות מסוימות ולהשפיע על ההתקנה של OpenLDAP,‏ Postgres ו-Cassandra. בצמתים האלה, בודקים את /etc/hosts.allow ואת /etc/hosts.deny כדי לוודא שאין הגבלות על היציאות הנדרשות של OpenLDAP,‏ Postgres ו-Cassandra.

iptables

מוודאים שאין כללי מדיניות של iptables שמונעים קישוריות בין צמתים ביציאות הנדרשות של Edge. אם צריך, אפשר לעצור את iptables במהלך ההתקנה באמצעות הפקודה:

sudo/etc/init.d/iptables stop

ב-CentOS 7.x:

systemctl stop firewalld

גישה לספרייה

בטבלה הבאה מפורטות ספריות בצומתי Edge שיש להן דרישות מיוחדות מתהליכי Edge:

שירות ספרייה תיאור
נתב /etc/rc.d/init.d/functions

הנתב של Edge משתמש בנתב Nginx ודורש גישת קריאה אל /etc/rc.d/init.d/functions.

אם תהליך האבטחה מחייב הגדרת הרשאות ב-/etc/rc.d/init.d/functions, אל תגדירו אותן ל-700, אחרת הנתב לא יופעל.

אפשר להגדיר את ההרשאות ל-744 כדי לאפשר גישת קריאה ל-/etc/rc.d/init.d/functions.

מטפל בגן חיות /dev/random ספריית הלקוח של Zookeeper דורשת גישת קריאה למחולל המספרים האקראיים /dev/random. אם /dev/random חסום לקריאה, יכול להיות ששירות Zookeeper לא יופעל.

Cassandra

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

‫Cassandra מתאימה באופן אוטומטי את גודל ה-Java heap בהתאם לזיכרון הזמין. למידע נוסף, קראו את המאמר כוונון משאבי Java במקרה של פגיעה בביצועים או צריכת זיכרון גבוהה.

אחרי שמתקינים את Edge for Private Cloud, אפשר לבדוק אם Cassandra מוגדרת כמו שצריך באמצעות הקובץ /opt/apigee/apigee-cassandra/conf/cassandra.yaml. לדוגמה, מוודאים שסקריפט ההתקנה של Edge for Private Cloud הגדיר את המאפיינים הבאים:

  • cluster_name
  • initial_token
  • partitioner
  • seeds
  • listen_address
  • rpc_address
  • snitch

מסד נתונים של PostgreSQL

אחרי שמתקינים את Edge, אפשר לשנות את ההגדרות הבאות של מסד הנתונים של PostgreSQL בהתאם לכמות ה-RAM שזמינה במערכת:

conf_postgresql_shared_buffers = 35% of RAM      # min 128kB
conf_postgresql_effective_cache_size = 45% of RAM
conf_postgresql_work_mem = 512MB       # min 64kB

כדי להגדיר את הערכים האלה:

  1. עורכים את הקובץ postgresql.properties:
    vi /opt/apigee/customer/application/postgresql.properties

    אם הקובץ לא קיים, יוצרים אותו.

  2. מגדירים את המאפיינים שמפורטים למעלה.
  3. שומרים את השינויים.
  4. מפעילים מחדש את מסד הנתונים של PostgreSQL:
    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql restart

מגבלות מערכת

מוודאים שהגדרתם את מגבלות המערכת הבאות בצומתי Cassandra ובצומתי מעבד הבקשות:

  • בצמתים של Cassandra, מגדירים מגבלות רכות וקשות ל-memlock, ל-nofile ולמרחב הכתובות (as) למשתמש ההתקנה (ברירת המחדל היא "apigee") ב-/etc/security/limits.d/90-apigee-edge-limits.conf, כמו שמוצג בהמשך:
    apigee soft memlock unlimited
    apigee hard memlock unlimited
    apigee soft nofile 32768
    apigee hard nofile 65536
    apigee soft as unlimited
    apigee hard as unlimited
  • בצמתים של מעבד הבקשות, מגדירים את המספר המקסימלי של תיאורי קבצים פתוחים ל-64K ב-/etc/security/limits.d/90-apigee-edge-limits.conf, כמו שמוצג בהמשך:
    apigee soft nofile 32768
    apigee hard nofile 65536

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

שירותי אבטחת רשת (NSS)

‫Network Security Services‏ (NSS) היא קבוצה של ספריות שתומכות בפיתוח של אפליקציות מאובטחות ללקוחות ולשרתים. חשוב לוודא שמותקנת גרסה 3.19 ומעלה של NSS.

כדי לבדוק את הגרסה הנוכחית:

yum info nss

כדי לעדכן את NSS:

yum update nss

מידע נוסף זמין במאמר הזה של RedHat.

השבתת חיפוש DNS ב-IPv6 כשמשתמשים ב-NSCD (‏Name Service Cache Daemon)

אם התקנתם והפעלתם את NSCD (Name Service Cache Daemon), מעבדי הבקשות מבצעים שני חיפושי DNS: אחד ל-IPv4 ואחד ל-IPv6. כשמשתמשים ב-NSCD, צריך להשבית את חיפוש ה-DNS ב-IPv6.

כדי להשבית את חיפוש ה-DNS ב-IPv6:

  1. בכל צומת של מעבד בקשות, עורכים את /etc/nscd.conf
  2. מגדירים את המאפיין הבא:
    enable-cache hosts no

השבתת IPv6 ב-Google Cloud Platform ל-RedHat/CentOS 7

אם אתם מתקינים את Edge ב-RedHat 7 או ב-CentOS 7 ב-Google Cloud Platform, אתם צריכים להשבית את IPv6 בכל צומתי Qpid.

כדי להשבית את IPv6, עיינו במסמכי התיעוד של RedHat או CentOS לגרסת מערכת ההפעלה הספציפית שלכם. לדוגמה, אתם יכולים:

  1. פותחים את /etc/hosts בכלי לעריכת טקסט.
  2. מוסיפים את התו "#" בעמודה הראשונה של השורה הבאה כדי להפוך אותה להערה:
    #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  3. שומרים את הקובץ.

AWS AMI

אם אתם מתקינים את Edge ב-AWS Amazon Machine Image (AMI)‎ ל-Red Hat Enterprise Linux 7.x, קודם צריך להריץ את הפקודה הבאה:

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

כלים

תוכנת ההתקנה משתמשת בכלי UNIX הבאים בגרסה הרגילה, כפי שסופקו על ידי EL5 או EL6.

awk

expr

libxslt

סיבובים לדקה

חילוץ ZIP

basename

grep

lua-socket

rpm2cpio

useradd

bash

hostname

ls

sed

wc

bc

id [מזהה]

net-tools

sudo

wget

curl

libaio

perl (מ-procps)

tar

xerces-c

cyrus-sasl libdb4 ‫pgrep (מ-procps) tr טעים

תאריך

libdb-cxx

ps

uuid

chkconfig

dirname libibverbs pwd uname  
echo librdmacm python    

ntpdate

ב-Apigee מומלץ לסנכרן את השעונים של השרתים. אם עדיין לא הגדרתם את זה, אתם יכולים להשתמש בכלי ntpdate כדי לוודא שהשרתים מסונכרנים מבחינת הזמן. אפשר להשתמש ב-yum install ntp כדי להתקין את הכלי. האפשרות הזו שימושית במיוחד לשכפול הגדרות של OpenLDAP. שימו לב שאתם מגדירים את אזור הזמן של השרת לפי UTC.

openldap 2.4

ההתקנה המקומית דורשת את OpenLDAP 2.4. אם לשרת יש חיבור לאינטרנט, סקריפט ההתקנה של Edge מוריד ומתקין את OpenLDAP. אם לשרת אין חיבור לאינטרנט, צריך לוודא ש-OpenLDAP כבר מותקן לפני שמריצים את סקריפט ההתקנה של Edge. ב-RHEL/CentOS, אפשר להריץ את yum install openldap-clients openldap-servers כדי להתקין את OpenLDAP.

בהתקנות של 13 מארחים ובהתקנות של 12 מארחים עם שני מרכזי נתונים, נדרש שכפול של OpenLDAP כי יש כמה צמתים שמארחים את OpenLDAP.

חומות אש ומארחים וירטואליים

המונח virtual משמש לעיתים קרובות למטרות שונות בתחום ה-IT, וכך גם בפריסה של Apigee Edge for Private Cloud ובמארחים וירטואליים. כדי להבהיר, יש שני שימושים עיקריים למונח virtual:

  • מכונות וירטואליות (VM): לא נדרשות, אבל בחלק מהפריסות נעשה שימוש בטכנולוגיית VM כדי ליצור שרתים מבודדים לרכיבי Apigee. למארחי מכונות וירטואליות, כמו למארחים פיזיים, יכולים להיות ממשקי רשת וחומות אש.
  • מארחים וירטואליים: נקודות קצה באינטרנט, בדומה למארח וירטואלי של Apache.

נתב במכונה וירטואלית יכול לחשוף כמה מארחים וירטואליים (כל עוד הם שונים זה מזה בכינוי המארח או ביציאת הממשק שלהם).

לדוגמה, בשרת פיזי אחד A יכולות לפעול שתי מכונות וירטואליות, שנקראות VM1 ו-VM2. נניח ש-VM1 חושפת ממשק אתרנט וירטואלי, שנקרא eth0 בתוך המכונה הווירטואלית, ומוקצית לו כתובת ה-IP‏ 111.111.111.111 על ידי מכונות הווירטואליזציה או שרת DHCP ברשת. נניח גם ש-VM2 חושפת ממשק אתרנט וירטואלי שנקרא גם eth0, ומוקצית לו כתובת ה-IP‏ 111.111.111.222.

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

הנתב של Apigee ב-VM1 חושף שלושה מארחים וירטואליים בממשק eth0 שלו (שיש לו כתובת IP ספציפית), api.mycompany.com:80, api.mycompany.com:443 ו-test.mycompany.com:80.

הנתב ב-VM2 חושף את api.mycompany.com:80 (אותו שם ואותה יציאה שנחשפו על ידי VM1).

יכול להיות שלמערכת ההפעלה של המארח הפיזי יש חומת אש ברשת. אם כן, צריך להגדיר את חומת האש הזו כך שתעביר תנועת TCP שמיועדת ליציאות שנחשפות בממשקים הווירטואליים (111.111.111.111:{80, 443} ו-111.111.111.222:80). בנוסף, יכול להיות שמערכת ההפעלה של כל מכונה וירטואלית מספקת חומת אש משלה בממשק eth0, וגם חומות האש האלה צריכות לאפשר לתנועה ביציאות 80 ו-443 להתחבר.

נתיב הבסיס הוא הרכיב השלישי שמעורב בניתוב קריאות ל-API לשרתי proxy שונים של API שאולי פרסתם. חבילות של שרתי proxy ל-API יכולות לשתף נקודת קצה (endpoint) אם יש להן נתיבי בסיס שונים. לדוגמה, אפשר להגדיר נתיב בסיס אחד בתור http://api.mycompany.com:80/ ונתיב בסיס אחר בתור http://api.mycompany.com:80/salesdemo.

במקרה כזה, צריך מאזן עומסים או מנהל תנועה כלשהו שיפצל את התנועה של http://api.mycompany.com:80/ ‎ בין שתי כתובות ה-IP (111.111.111.111 ב-VM1 ו-111.111.111.222 ב-VM2). הפונקציה הזו ספציפית להתקנה שלכם, ומוגדרת על ידי קבוצת הרשת המקומית.

נתיב הבסיס מוגדר כשפורסים API. בדוגמה שלמעלה, אתם יכולים לפרוס שני ממשקי API,‏ mycompany ו-testmycompany, לארגון mycompany-org עם המארח הווירטואלי שיש לו את כינוי המארח api.mycompany.com והיציאה מוגדרת ל-80. אם לא תצהירו על נתיב בסיס בפריסה, הנתב לא יידע לאיזה API לשלוח את הבקשות הנכנסות.

עם זאת, אם פורסים את ה-API‏ testmycompany עם כתובת ה-URL הבסיסית /salesdemo, המשתמשים ניגשים ל-API הזה באמצעות http://api.mycompany.com:80/salesdemo. אם פורסים את ה-API ‏mycompany עם כתובת ה-URL הבסיסית /, המשתמשים ניגשים ל-API באמצעות כתובת ה-URL ‏http://api.mycompany.com:80/.

רישוי

לכל התקנה של Edge נדרש קובץ רישיון ייחודי שמקבלים מ-Apigee. במהלך ההתקנה של שרת הניהול, תצטרכו לספק את הנתיב לקובץ הרישיון, לדוגמה: /tmp/license.txt.

ההתקנה מעתיקה את קובץ הרישיון אל /opt/apigee/customer/conf/license.txt.

אם קובץ הרישיון תקין, שרת הניהול מאמת את התפוגה ואת מספר מעבדי הבקשות (MP) המותרים. אם פג התוקף של אחת מהגדרות הרישיון, אפשר למצוא את היומנים במיקום הבא: /opt/apigee/var/log/edge-management-server/logs. במקרה כזה, אתם יכולים לפנות לתמיכה של Apigee Edge כדי לקבל פרטים על ההעברה.

אם עדיין אין לכם רישיון, פנו למחלקת המכירות של Apigee.