Bu sayfa bir Linux düğümünün Cluster ERP sunucusunu nasıl çalıştırdığını açıklar: systemd birimi deploy/cluster-erp.service, gunicorn yapılandırması deploy/gunicorn.conf.py ve iki giriş noktası src/cluster_erp/server/asgi.py ile src/cluster_erp/server/main.py. Sayfa bir işçinin açılış sırasıyla biter. Uygulamanın kendi açılışında ne yaptığı sunucu açılışı ve uygulama fabrikası sayfasında açıklanır.
Kapsam ve kaynak¶
- Tanımlandığı yer:
deploy/cluster-erp.service,deploy/gunicorn.conf.py,src/cluster_erp/server/asgi.py(app),src/cluster_erp/server/main.py(main). - Sayı: birim tablosu
[Unit],[Service]ve[Install]bölümlerinin her yönergesini; gunicorn tablosu yapılandırma dosyasının modül düzeyindeki her ayarını listeler.
Gerçek bir düğümün yolları değer olarak değil, birimin kendi adlarıyla (WorkingDirectory, EnvironmentFile, ReadWritePaths) yazılır.
Giriş noktaları¶
| Giriş noktası | Kullanan | Davranış | Kaynak |
|---|---|---|---|
cluster_erp.server.asgi:app |
Linux düğümünde gunicorn | create_app() ile kurulan modül düzeyinde bir uygulama; her işçi onu içe aktarır, hiçbir şey önceden yüklenmez. |
src/cluster_erp/server/asgi.py:1-19 |
python -m cluster_erp.server.main |
bir iş istasyonu | uvicorn'u create_app fabrikasıyla koşar; hata ayıklama kipinde yeniden yükleme; işçi süreçleri yalnız hata ayıklama kipi dışında ve hiçbir zaman Windows'ta değil. |
src/cluster_erp/server/main.py:12-58 |
main.py vekil sunucu ayarlarını uvicorn'a geçirir: trust_proxy_headers değerinden proxy_headers, trusted_proxy_ips değerinden forwarded_allow_ips, erişim günlüğü anahtarı ve keep-alive saniyeleri (src/cluster_erp/server/main.py:39-58).
Systemd birimi¶
| Yönerge | Birimdeki değer | Anlamı | Kaynak |
|---|---|---|---|
After, Wants |
ağ çevrim içi, PostgreSQL | Ağdan ve yerel PostgreSQL servisinden sonra başlar. | deploy/cluster-erp.service:7-8 |
Type |
simple |
Başlatılan süreç servisin kendisidir. | deploy/cluster-erp.service:11 |
User, Group |
servis kullanıcısı | Süreç root yetkisi olmadan koşar. | deploy/cluster-erp.service:12-13 |
WorkingDirectory |
çalışma kopyası | alembic.ini dosyasının bulunduğu depo kökü. |
deploy/cluster-erp.service:14 |
EnvironmentFile |
ortam dosyası | Ayar kaynağı; yalnız başlangıçta okunur. | deploy/cluster-erp.service:15 |
Environment |
PYTHONUNBUFFERED=1 |
Günlük satırları günlüğe hemen ulaşır. | deploy/cluster-erp.service:16-18 |
Environment |
PLAYWRIGHT_BROWSERS_PATH |
PDF oluşturucunun Chromium yapısının çalışma kopyası içindeki yeri. | deploy/cluster-erp.service:19-20 |
ExecStart |
deploy/gunicorn.conf.py ve cluster_erp.server.asgi:app ile gunicorn |
Ana süreci başlatır. | deploy/cluster-erp.service:25 |
ExecReload |
ana sürece kill -HUP |
gunicorn güncel kodla yeni işçiler başlatır ve eskileri emekliye ayırır. | deploy/cluster-erp.service:21-26 |
KillMode |
mixed |
Durdurma sinyalini ana süreç alır ve işçilerini durdurur. | deploy/cluster-erp.service:27-29 |
Restart, RestartSec |
always, 3 |
systemd servisi çıktıktan üç saniye sonra yeniden başlatır. | deploy/cluster-erp.service:30-31 |
LimitNOFILE |
65535 |
Birkaç işçinin havuzları ve soketleri için açık dosya sınırı. | deploy/cluster-erp.service:32-34 |
TimeoutStopSec |
30 |
Süreç öldürülmeden önce süren isteklere tanınan süre. | deploy/cluster-erp.service:35-36 |
ReadWritePaths |
yedek klasörü ve durum klasörü | Yazılabilir tek yollar: yedekler, posta kuyruğu, ek depolaması. | deploy/cluster-erp.service:37-38 |
NoNewPrivileges, PrivateTmp, ProtectSystem, ProtectHome |
true, true, full, true |
Standart systemd sertleştirmesi. | deploy/cluster-erp.service:39-43 |
WantedBy |
multi-user.target |
Etkinleştirildikten sonra açılışta başlar. | deploy/cluster-erp.service:45-46 |
Gunicorn yapılandırması¶
Her değer, uygulamanın okuduğu aynı ortam dosyasından gelir (deploy/gunicorn.conf.py:11-13, deploy/gunicorn.conf.py:22-23).
| Ayar | Değer | Anlamı | Kaynak |
|---|---|---|---|
bind |
CLUSTER_ERP_SERVER_HOST:CLUSTER_ERP_SERVER_PORT |
Ana sürecin adresi; varsayılan geri döngü adresidir. | deploy/gunicorn.conf.py:26 |
workers |
CLUSTER_ERP_SERVER_WORKERS veya 0 ya da ayarsızsa çekirdek başına bir, en çok sekiz |
İşçi süreci sayısı. | deploy/gunicorn.conf.py:27-30 |
worker_class |
uvicorn_worker.UvicornWorker |
Her işçi uvicorn koşar. | deploy/gunicorn.conf.py:31 |
preload_app |
False |
Yeniden yükleme yeni kodu yeni işçilerde içe aktarır. | deploy/gunicorn.conf.py:32-34 |
max_requests, max_requests_jitter |
5000, 500 |
Bir işçi bu kadar istekten ve sapmadan sonra yeniden başlar. | deploy/gunicorn.conf.py:35-38 |
graceful_timeout |
30 |
Yeniden yükleme veya durdurmada süren istekler için saniye; TimeoutStopSec ile eşleşir. |
deploy/gunicorn.conf.py:39-41 |
timeout |
120 |
Saniye cinsinden işçi zaman aşımı. | deploy/gunicorn.conf.py:42 |
keepalive |
CLUSTER_ERP_SERVER_KEEP_ALIVE_SECONDS, varsayılan 5 |
Vekil sunucu arkasında boşta keep-alive penceresi. | deploy/gunicorn.conf.py:43-46 |
forwarded_allow_ips, proxy_allow_ips |
CLUSTER_ERP_TRUSTED_PROXY_IPS, varsayılan geri döngü adresi |
İletilen başlıklarına güvenilen karşı uçlar. | deploy/gunicorn.conf.py:47-49 |
accesslog |
None |
gunicorn erişim günlüğü yok; uygulama kendi istek günlüğünü yazar. | deploy/gunicorn.conf.py:50-52 |
errorlog, loglevel, capture_output |
standart hata, info, True |
Çıktıyı günlük yakalar. | deploy/gunicorn.conf.py:53-56 |
Açılış sırası¶
Diyagram systemctl start komutundan bir işçinin hazır olmasına kadar olanları gösterir. Her işçi sıranın tamamını koşar; göç kilidi işçilerin şema adımında sırayla ilerlemesini sağlar.
flowchart TD
systemd["systemd cluster-erp.service"] --> master["gunicorn ana süreci"]
master --> w1["işçi 1 asgi:app içe aktarır"]
master --> w2["işçi N asgi:app içe aktarır"]
w1 --> life["lifespan başlar"]
w2 --> life
life --> mt{"multi_tenant"}
mt -- "evet" --> lock["migration_lock altında upgrade_database_to_head"]
lock --> ctl["TenantRegistry.ensure_schema ve ilk operatör"]
mt -- "hayır" --> budget["bağlantı bütçesi denetimi"]
ctl --> budget
budget --> load["registry.load_all ve tohumlar"]
load --> loops["arka plan döngüleri başlar"]
loops --> ready["GET /ready 200 döndürür"]Düz yazıyla:
- systemd gunicorn ana sürecini yapılandırma dosyasıyla başlatır (
deploy/cluster-erp.service:25). - Ana süreç işçileri başlatır; her biri
create_app()çağırancluster_erp.server.asgi:appmodülünü içe aktarır (src/cluster_erp/server/asgi.py:17-19). - Her işçinin
lifespanbağlamı başlar (src/cluster_erp/server/app.py:58-65). - Çok kiracılı kipte işçi gerekirse varsayılan veritabanını oluşturur ve onu danışma niteliğindeki göç kilidi içinde en yeni revizyona göç ettirir; ikinci bir işçi bekler ve sonra yapacak bir şey bulamaz (
src/cluster_erp/server/app.py:99-113,src/cluster_erp/core/tenancy.py:693-720). Ardından kontrol düzlemini ve ilk operatörü hazırlar (src/cluster_erp/server/app.py:114-118). Tek kiracılı bir işçi göç ettirmez. - İşçi en kötü durumdaki bağlantı talebini sunucunun
max_connectionsdeğeriyle karşılaştırır ve sığmadığındaPOOL BUDGETuyarısı yazar (src/cluster_erp/server/app.py:119-128,src/cluster_erp/server/app.py:610-631). - İşçi etkin her modülü yükler, dizileri ve yetkileri tohumlar, silme defterini yeniden oynatır ve arka plan döngülerini başlatır (
src/cluster_erp/server/app.py:139-194). - Bağlam yield eder;
/readyveritabanını ve çok kiracılı kipte kontrol düzlemini yoklar (src/cluster_erp/server/app.py:196,src/cluster_erp/server/app.py:1476-1504).
Yeniden yükleme ve yeniden başlatma¶
systemctl reloadbirHUPgönderir; uygulama önceden yüklenmediği için yeni işçiler güncel kodu içe aktarır (deploy/gunicorn.conf.py:3-10,deploy/gunicorn.conf.py:32-34).install.sh, ortam dosyası çalışan servisten yeniyse, birim değiştiyse veyarequirements.lockdeğiştiyse yeniden yükleme yerine yeniden başlatır. Yeniden yüklenen bir işçi ana sürecin önceden içe aktardığı paketleri devralır (deploy/install.sh:140-144,deploy/install.sh:228-246).
Kısıtlar ve doğrulama¶
- Windows'ta
main.pybirden büyükserver_workersdeğerini yok sayar ve bir uyarı yazar (src/cluster_erp/server/main.py:27-35). main.pyiçinde yeniden yükleme ve işçi süreçleri birbirini dışlar (src/cluster_erp/server/main.py:36-38).
Tutarsızlıklar¶
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| göç kilidi | migration_lock |
Bir veritabanında açılış göçünü aynı anda tek bir işçinin koşmasını sağlayan PostgreSQL danışma kilidi. | göç kilidi | src/cluster_erp/core/tenancy.py:707-720 |
| bağlantı bütçesi | _single_tenant_connection_budget |
İşçi sayısı çarpı havuz artı taşmanın max_connections içinde kaldığı denetimi. |
bağlantı bütçesi | src/cluster_erp/server/app.py:610-631 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.