Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Platform

Açıklama

Sunucu açılışı ve uygulama fabrikası

python -m cluster_erp.server.main ve server/asgi.py'nin FastAPI uygulamasını create_app ile nasıl kurduğu ve lifespan'in açılışta ve kapanışta ne yaptığı.

Bu sayfa Cluster ERP sunucu sürecinin nasıl başladığını anlatır: iki giriş noktası server/main.py ve server/asgi.py, server/app.py içindeki create_app fabrikası ve açılışta ve kapanışta çalışan lifespan bağlamı. Geliştiriciler ve işletmeciler içindir. Ara katman sırası istek hattı ve ara katmanlar sayfasında, servis birimleri ve gunicorn ayarları işletim bölümündedir.

Kısaca

  • python -m cluster_erp.server.main, uvicorn.run("cluster_erp.server.app:create_app", factory=True,...) çağrısını yapar (src/cluster_erp/server/main.py:39-58).
  • cluster_erp.server.asgi:app, bir süreç yöneticisi için create_app() ile oluşturulan modül düzeyinde bir uygulamadır (src/cluster_erp/server/asgi.py:1-19).
  • create_app, Settings okur, FastAPI nesnesini kurar, hata işleyicilerini ve ara katmanları yükler, ortak rotaları ve web uygulamasını bağlar ve uygulamayı döndürür (src/cluster_erp/server/app.py:1287-1646).
  • lifespan bağlamı veritabanı tutamacını, EventBus'ı, ModuleRegistry'yi ve depolama arka ucunu oluşturur, ardından etkin her modülü yükler (src/cluster_erp/server/app.py:58-140).
  • Kapanışta lifespan PDF oluşturucuyu kapatır, arka plan görevlerini iptal eder, her modülü kapatır ve veritabanını kapatır (src/cluster_erp/server/app.py:196-224).

Nasıl çalışır

Giriş noktaları

İki giriş noktası vardır.

Giriş noktası Kullanım Davranış Kaynak
python -m cluster_erp.server.main (konsol betiği cluster-erp-server) Geliştirme ve tek süreçli çalıştırma Uvicorn'u fabrikayla çalıştırır; debug açıkken yeniden yüklemeyi açar; değer 1'den büyükse ve yeniden yükleme kapalıysa server_workers kadar süreç kullanır src/cluster_erp/server/main.py:12-58, pyproject.toml:87
cluster_erp.server.asgi:app Uvicorn işçileriyle gunicorn Uygulamayı içe aktarma anında, işçi başına bir kez oluşturur src/cluster_erp/server/asgi.py:1-19

main.py, Windows'ta 1'den büyük server_workers değerini yok sayar ve bir uyarı yazar (src/cluster_erp/server/main.py:27-35). Vekil başlık ayarlarını, erişim günlüğü anahtarını ve keep-alive süresini uvicorn'a iletir (src/cluster_erp/server/main.py:50-55). Bu ayarlar için ayarlar başvurusu sayfasına bakın.

Fabrika

create_app(settings=None) şu adımları sırayla çalıştırır:

  1. Ayar verilmemişse Settings() oluşturur (src/cluster_erp/server/app.py:1288-1289).
  2. Günlüğü DEBUG ya da INFO düzeyinde yapılandırır (src/cluster_erp/server/app.py:1291-1294).
  3. "Cluster ERP" başlığı, 0.1.0 sürümü ve lifespan bağlamıyla FastAPI nesnesini kurar. /api/docs ve /api/redoc sayfaları yalnızca debug açıkken vardır (src/cluster_erp/server/app.py:1296-1303).
  4. Ayarları app.state.settings üzerinde saklar (src/cluster_erp/server/app.py:1304).
  5. Süreç geneli üç ayarı uygular: değişiklik geçmişi gizleme sütunları, yetkilendirme önbelleği süresi ve liste sayım tavanı (src/cluster_erp/server/app.py:1307-1313).
  6. Hata işleyicilerini yükler (src/cluster_erp/server/app.py:1314). Bkz. hatalar ve istisnalar.
  7. Beş ara katman ekler (src/cluster_erp/server/app.py:1317-1430). Bkz. istek hattı ve ara katmanlar.
  8. Sekiz ortak yönlendiriciyi, çok kiracılı kipte ayrıca signup ve vendor yönlendiricilerini ekler (src/cluster_erp/server/app.py:1432-1450). Bkz. ortak sunucu rotaları.
  9. Yedi satır içi rota tanımlar: GET /api/v1/signup/ (yalnızca tek kiracılı), /.well-known/security.txt, /health, /ready, /api/v1/modules, /api/v1/_meta ve /api/v1/_switches (src/cluster_erp/server/app.py:1451-1572).
  10. webapp/ varsa web uygulamasını /app/v ve /app yollarına bağlar (src/cluster_erp/server/app.py:1633-1644). Bkz. önbellek ve varlık damgası.

Modül rotalarını create_app eklemez. Her modül, lifespan onu yüklediğinde kendi rotalarını ekler.

Açılışta lifespan

Sıra şeması lifespan bağlamının açılış yolunu gösterir.

sequenceDiagram
 participant U as uvicorn veya gunicorn
 participant L as lifespan
 participant R as ModuleRegistry
 participant M as Module
 participant D as Database
 U->>L: uygulamayı başlat
 L->>D: Database(settings)
 L->>L: EventBus(), ModuleRegistry(), create_storage_backend()
 L->>R: load_all(app, bus, database, enabled_modules)
 R->>M: initialize, register_routes, register_events
 L->>D: sıralar, izinler, kullanımdan kaldırma sütunları tohumlanır
 L->>L: arka plan görevlerini başlat
 L-->>U: yield (istekleri sun)

Lifespan sırasıyla şunları yapar:

  1. Database(settings), EventBus(), ModuleRegistry() ve depolama arka ucunu oluşturur ve app.state üzerinde saklar (src/cluster_erp/server/app.py:60-92).
  2. AnonymiseSubject olayına, anonimleştirilen hesabın önbellekteki kullanıcı adlarını silen bir işleyici abone eder (src/cluster_erp/server/app.py:80-90).
  3. Çok kiracılı kipte varsayılan veritabanını oluşturur ve günceller, TenantRegistry'yi açar ve ilk operatörü güvenceye alır. Tek kiracılı kipte bağlantı bütçesini denetler (src/cluster_erp/server/app.py:100-129). Kiracılık çok kiracılılık sayfasında belgelenir.
  4. enabled_modules içinde listelenen modülleri yükler (src/cluster_erp/server/app.py:140). Bkz. modül yaşam döngüsü.
  5. Her alt tablo sekmesinin sütunları olan bir varlığı gösterdiğini doğrular; aksi halde açılışı durdurur (src/cluster_erp/server/app.py:146, src/cluster_erp/server/app.py:547-589).
  6. Kod sıralarını tohumlar (src/cluster_erp/server/app.py:148, src/cluster_erp/server/app.py:1058-1066). Bkz. temel model ve kimlikler.
  7. Her modülün metadata'sından kiracı alanı tanımlarını kurar (src/cluster_erp/server/app.py:151). Bkz. kiracı alanları.
  8. Metadata'dan izinleri tohumlar, eksik kullanımdan kaldırma sütunlarını ekler ve kullanımdan kaldırma kaydını kurar (src/cluster_erp/server/app.py:152-154).
  9. Üç veri uzlaştırma geçişi çalıştırır: CRM müşterilerinden taraflara, taraf rol bayrakları ve yarım kalmış MRP çalışmaları (src/cluster_erp/server/app.py:155-157).
  10. Bir günlük saklama geçişi çalıştırır, denetim günlüğü gizleme dolgusunu görev olarak başlatır ve silme defterini yeniden oynatır (src/cluster_erp/server/app.py:160-168).
  11. Arka plan görevlerini başlatır: saklama temizliği, abonelik taraması, analitik özet yenilemesi ve çok kiracılı kipte üyelik süresi döngüsü (src/cluster_erp/server/app.py:170-194).
  12. Yield eder; sunucu artık istekleri sunar (src/cluster_erp/server/app.py:196).

Günlük arka plan döngüleri her geçişten önce 24 saat uyur (src/cluster_erp/server/app.py:384, src/cluster_erp/server/app.py:424, src/cluster_erp/server/app.py:521). Analitik döngüsü yapılandırılmış bir aralık kadar uyur (src/cluster_erp/server/app.py:483). Periyodik bir geçişi yalnızca PostgreSQL danışma kilidini (advisory lock) alan işçi çalıştırır (src/cluster_erp/server/app.py:357-369).

Kapanışta lifespan

Yield'den sonra lifespan ortak PDF oluşturucuyu kapatır, arka plan görevlerini iptal edip bekler, registry.shutdown_all() çağırır, kiracı kaydını kapatır ve veritabanını kapatır (src/cluster_erp/server/app.py:198-224).

Neden böyle kurulmuştur

  • Projenin yazılı mühendislik kuralları sunucunun uvicorn fabrika desenini kullandığını belirtir.
  • asgi.py belge dizgisi üretimin neden uvicorn işçileriyle gunicorn kullandığını belirtir: SIGHUP ile gunicorn güncel kodu içe aktaran yeni işçiler başlatır ve eskileri durdurur; bu da kesintisiz güncelleme sağlar. Uygulama işçi başına oluşturulur, böylece yeniden yükleme yeni kodu yükler (src/cluster_erp/server/asgi.py:3-12).
  • Bir yorum, main.py'nin Windows'ta tek süreç tuttuğunu, çünkü orada paylaşılan soketin daha yavaş ölçüldüğünü belirtir (src/cluster_erp/server/main.py:27-34).
  • Yukarıdakilerin ötesinde fabrikanın kendisi için gerekçe koddan belirlenemez.

Kurallar ve sınırlar

  • Settings() oluşturulurken doğrulama yapar ve güvensiz birleşimleri reddeder; örneğin debug açıkken çok kiracılı kip (src/cluster_erp/config/settings.py:766-770). Bu durumda sunucu başlamaz. Bkz. ayarlar başvurusu.
  • Sütunsuz bir alt tablo sekmesi açılışı hatayla durdurur (src/cluster_erp/server/app.py:547-589).

Diğer parçalarla etkileşim

Sınırlar ve açık noktalar

  • Tek kiracılı bir açılışın Alembic göçlerini uygulayıp uygulamadığı server/app.py içinde belirtilmez; lifespan upgrade_database_to_head çağrısını yalnızca çok kiracılı kipte yapar (src/cluster_erp/server/app.py:100-113). Göç yönetimi veritabanı göçleri sayfasında belgelenir.
  • Açılış geçişlerinin çoğu başarısız olduğunda bir uyarı yazar ve devam eder; örneğin _seed_sequences (src/cluster_erp/server/app.py:1058-1066).

Tanıtılan terimler

Terim Kod tanımlayıcısı Tanım Türkçe terim Kaynak
app factory create_app FastAPI uygulamasını kurup döndüren işlev. uygulama fabrikası src/cluster_erp/server/app.py:1287
lifespan lifespan Sunmaya başlamadan önce açılış işini, sonra temizliği çalıştıran async bağlam. yaşam süresi bağlamı src/cluster_erp/server/app.py:58-59

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13