הגדרת Docker Container עבור 1C-Bitrix: מתוהו ליציבות
לעתים קרובות אנו רואים Bitrix מורץ ב-Docker עם docker-compose up פשוט. אבל פעולה יציבה בסביבת production—עם מדיניות restart נכונה, הרשאות, רוטציית לוגים ועדכונים חלקים—היא המומחיות שלנו. סטטיסטיקות: 90% מהפניות לעזרה כוללות Bitrix שכותב קבצים כמשתמש אחד בעוד nginx קורא אותם כמשתמש אחר; OPcache לא רואה שינויי קוד; agents לא רצים בגלל חוסר cron בתוך הקונטיינר. בואו נפתור את אלה עם דוגמאות מעשיות שחוסכות עד 40% מזמן התחזוקה.
בעיות שנפתרות על ידי הגדרת Docker נכונה עבור Bitrix
ללא הגדרה נכונה, קונטיינרים של Bitrix ב-production הופכים לכאב ראש. הנה מה שאנו נתקלים בו לרוב:
- הרשאות קבצים: קבצים שנוצרו על ידי משתמשים שונים, גורמים לשגיאות 403 או 500. מקרה: לקוח איבד יומיים בניסיון למצוא את הסיבה עד שהגדרנו UID דרך build-arg. מיפוי UID אמין פי 10 מאשר chmod ידני אחרי כל deploy.
- השבתה במהלך עדכונים: ללא אסטרטגיית עדכון מתגלגל (rolling update), כל release משמעותו דקות של חוסר זמינות. עבור חנות אונליין עם מחזור מכירות משמעותי, זהו הפסד גדול אפילו עבור כמה דקות של השבתה.
- גלישת דיסק: לוגים של קונטיינר ללא רוטציה גדלים ל-5 GB בשבוע. בעוד שעלות SSD ניתנת לניהול, הסיכון לכשל בגלל דיסק מלא הוא אמיתי.
הגדרת הרשאות קבצים ב-Docker עבור Bitrix
בעיה קלאסית: PHP-FPM בתוך הקונטיינר רץ כ-www-data (UID 33), בעוד שקבצים על ה-volume בבעלות root או משתמש host אחר. Bitrix לא יכול לכתוב cache או לשמור קבצים שהועלו.
אנו פותרים זאת על ידי הגדרה מפורשת של UID ב-Dockerfile:
FROM php:8.1-fpm-alpine
ARG HOST_UID=1000
RUN addgroup -g $HOST_UID bitrix && adduser -u $HOST_UID -G bitrix -D bitrix
RUN sed -i 's/user = www-data/user = bitrix/g' /usr/local/etc/php-fpm.d/www.conf \
&& sed -i 's/group = www-data/group = bitrix/g' /usr/local/etc/php-fpm.d/www.confב-FROM php:8.1-fpm-alpine ARG HOST_UID=1000 RUN addgroup -g $HOST_UID bitrix && adduser -u $HOST_UID -G bitrix -D bitrix RUN sed -i 's/user = www-data/user = bitrix/g' /usr/local/etc/php-fpm.d/www.conf \ && sed -i 's/group = www-data/group = bitrix/g' /usr/local/etc/php-fpm.d/www.conf העבירו את הארגומנט:
php-fpm: build: context: ./docker/php args: HOST_UID: ${HOST_UID:-1000} התיעוד הרשמי של 1С-Bitrix ממליץ על מיפוי UID עבור קונטיינרים של Docker.
השוואה: עם docker-compose.yml ברירת מחדל מקבלים שגיאות 403 בכל מקום; עם מיפוי UID—תאימות מלאה להרשאות ה-host. לאבטחה, אנו גם חוסמים גישה לתיקיות שירות של Bitrix דרך nginx.
הגדרת nginx ל-Production
server {
listen 80;
server_name _;
root /var/www/html;
index index.php;
charset utf-8;
client_max_body_size 256m;
location ~* /\.ht {
deny all;
}
location ~* /bitrix/modules {
deny all;
}
location ~* /bitrix/php_interface {
deny all;
}
location ~* /bitrix/tools {
deny all;
}
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri =404;
}
location / {
try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
}
location = /bitrix/urlrewrite.php {
fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$$fastcgi_script_name;
include fastcgi_params;
}
} Healthcheck ומדיניות Restart
הוסיפו healthcheck כדי לוודא את מצב הקונטיינר:
---
healthcheck:
test: ["CMD-SHELL", "php-fpm -t && kill -0 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
זה בודק תקינות קונפיגורציה וחיות תהליך. כפי שצוין ב-Docker, healthcheck הוא חובה ל-production.
בחרו מדיניות restart:
| מדיניות | התנהגות | המלצה |
|---|---|---|
php-fpm: build: context: ./docker/php args: HOST_UID: ${HOST_UID:-1000} |
תמיד מאתחל מחדש—אחרי קריסה, אתחול Docker, אפילו אחרי www-data. |
עבור MySQL: מבטיח שה-DB יתחיל בכל פעם שה-daemon עולה. |
server { listen 80; server_name _; root /var/www/html; index index.php; charset utf-8; client_max_body_size 256m; location ~* /\.ht { deny all; } location ~* /bitrix/modules { deny all; } location ~* /bitrix/php_interface { deny all; } location ~* /bitrix/tools { deny all; } location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff2)$ { expires 30d; add_header Cache-Control "public, no-transform"; try_files $uri =404; } location / { try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } location ~ \.php$ { fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_read_timeout 300; fastcgi_send_timeout 300; } location = /bitrix/urlrewrite.php { fastcgi_pass php-fpm:9000; fastcgi_param SCRIPT_FILENAME $document_root$$fastcgi_script_name; include fastcgi_params; } } |
מאתחל מחדש אחרי קריסה ואתחול Docker, אבל לא אחרי healthcheck: test: ["CMD-SHELL", "php-fpm -t && kill -0 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s . |
עבור nginx ו-php-fpm: נותן שליטה—אם הופסק ידנית, הייתה סיבה. |
השוואת בעיות ופתרונות נפוצים
| בעיה | פתרון | יעילות |
|---|---|---|
| הרשאות קבצים | מיפוי UID ב-Dockerfile | חיסול 100% של שגיאות 403 |
| גלישת דיסק | רוטציית לוגים (max-size, max-file) | חיסכון של עד 80% בשטח דיסק |
| השבתה במהלך עדכונים | עדכון מתגלגל דרך --no-deps | עדכון ללא השבתה, 0 שניות downtime |
למה רוטציית לוגים חשובה
ללא רוטציה, לוגים יכולים לאכול עשרות ג'יגה-בייט בשבוע. הגדירו ב-restart: always:
---
services:
nginx:
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
php-fpm:
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
או גלובלית דרך docker stop. חיסכון בשטח דיסק עד 80%.
איך לעדכן קונטיינרים של Bitrix ללא השבתה
השתמשו באסטרטגיה שמעדכנת רק את php-fpm, ומשאירה את nginx ללא שינוי:
-
restart: unless-stopped -
docker stop
זה לוקח שניות—nginx ממשיך לקבל בקשות ומנתב אותן לקונטיינר הישן בזמן שהחדש עולה. עבור פרויקטים גדולים עם replicas, עדכנו אותם אחד אחד. קונפיגורציה מתקדמת יכולה להשיג 100% זמינות במהלך עדכונים.
מה כלול בהתקנה סוהר
- הגדרת nginx, PHP-FPM, MySQL עם כיוונון ספציפי לפלטפורמה.
- פתרון הרשאות קבצים דרך מיפוי UID.
- Healthcheck ומדיניות restart לכל השירותים.
- רוטציית לוגים וגיבוי (מסד נתונים + קבצים).
- תיעוד deployment ותחזוקה.
- 30 ימי תמיכה חינם לאחר ההשקה.
אסטרטגיית גיבוי
לאמינות, אנו משתמשים בסקריפט שמבצע dump למסד הנתונים ומאחסן קבצים. הסקריפט רץ דרך cron של ה-host ושומר גיבויים ל-7 הימים האחרונים.
אנו נעריך את הפרויקט שלכם ביום עסקים אחד—ללא תשלום מראש. צרו קשר כדי לדון בפרטים. הזמינו את ההתקנה—ותשכחו מבעיות קונטיינר.

