Kendi sunucunda çalıştırma
Crewhall tek bir Linux sunucuda Docker Compose ile çalışır. Bu sayfa gerekenleri, yığını başlatmayı, ilk kurulum sihirbazını, isteğe bağlı servisleri ve yedekleme, geri yükleme ve güncellemeyi anlatır. Örneklerde hub.example.com kullanılır; kendi alan adınla değiştir.
Gereksinimler
- En az 2 vCPU, 4 GB RAM ve dosyalar için yeterli diski olan bir Linux sunucu.
- Docker Engine 24 ya da üstü ve Compose v2 (
docker compose version). - Sunucuyu gösteren DNS A/AAAA kayıtları:
hub.example.com: uygulama ve API.s3.example.com: dosya yükleme ve indirme. Tarayıcı bu adrese doğrudan bağlanır.- İsteğe bağlı:
docs.example.com(portal sitesi),lk.example.com(toplantılar) veoffice.example.com(Office belgeleri).
- İnternete açık 80 ve 443 portları.
- Giden e-posta için bir SMTP hesabı. Zorunlu değil ama önerilir.
Yığın
Yığın docker/compose.yml dosyasında tanımlıdır. Şu servisler her zaman çalışır:
| Servis | Görevi |
|---|---|
caddy | TLS ve yönlendirme. /api, /ws, /mcp, /dav ve OAuth yollarını backend'e, /collab'ı collab'a, gerisini web'e gönderir. |
web | Web uygulaması (statik dosyalar). |
backend | API, giriş, gerçek zamanlı olaylar (/ws) ve MCP sunucusu. |
worker | Arka plan işleri: önizleme, link kontrolü, push, e-posta özeti, gece temizliği. |
collab | Sayfa ve pano kartlarında ortak düzenleme. |
postgres | Veritabanı (PostgreSQL 17). |
seaweedfs | S3 uyumlu dosya deposu. |
backend, worker ve collab aynı imajı farklı komutlarla çalıştırır.
Ortam dosyasını hazırla
git clone https://github.com/Milvasoft/crewhall.git crewhall && cd crewhall
cp docker/.env.example docker/.env
docker/.env dosyasını düzenle. En önemli değerler:
| Değişken | Değer |
|---|---|
HUB_DOMAIN, S3_DOMAIN | İki alan adı, ör. hub.example.com ve s3.example.com. |
ACME_EMAIL | Sertifika uyarıları için e-posta adresi. |
POSTGRES_PASSWORD | Uzun, rastgele bir parola. |
AUTH_SECRET | openssl rand -base64 32 çıktısı. |
S3_ACCESS_KEY, S3_SECRET_KEY | Rastgele anahtar ve parola. SeaweedFS bunlarla açılır. |
SMTP_URL, MAIL_FROM | Ör. smtp://kullanici:[email protected]:587 ve gönderen adresi. |
SETUP_TOKEN | Boş kalabilir. Boşsa ilk açılışta rastgele bir anahtar üretilip loglara yazılır. |
AUTH_SECRET değişirse bütün oturumlar düşer ve kayıtlı 2FA sırları okunamaz. docker/.env dosyasını yedekle ve sürüm denetimine koyma.
80 ve 443 portları doluysa ya da önde başka bir ters vekil varsa HTTP_PORT ve HTTPS_PORT değerlerini, ayrıca HUB_URL, S3_PUBLIC_URL, COLLAB_PUBLIC_URL ve PORTAL_PUBLIC_URL genel adreslerini ayarla. Port 443 değilse adrese portu da yaz, ör. https://hub.example.com:8443.
Yığını başlat
docker compose -f docker/compose.yml --env-file docker/.env up -d --build
docker compose -f docker/compose.yml --env-file docker/.env ps
İlk açılışta imajlar derlenir, bu birkaç dakika sürer. Backend açılırken veritabanı migration'larını kendisi çalıştırır. Worker, backend sağlıklı olunca başlar. Hazır imaj kullanıyorsan CREWHALL_REGISTRY ve CREWHALL_VERSION değerlerini ayarla, --build yerine pull kullan.
Hazır olduğunu kontrol et:
curl -s https://hub.example.com/readyz
Yanıt {"status":"ready"} olmalıdır.
İlk kurulum sihirbazı
- Kurulum anahtarını loglardan al:
docker compose -f docker/compose.yml --env-file docker/.env logs backend | grep -i "setup" https://hub.example.comadresini aç. Sihirbaz önce kurulum anahtarını ister, sonra dört adımda ilerler: Kurum (ad, kimlik ve varsayılan dil), İlk yönetici (kurum sahibi hesabı), Ortak space'ler ve Ekibi davet et. Sistem kontrolü veritabanının, depolamanın ve e-postanın bağlı olup olmadığını gösterir.- Kurum sahibi ilk girişte iki adımlı doğrulamayı (TOTP ya da passkey) açmak zorundadır.
Kurulum bitince anahtar bir daha işe yaramaz. Kurum adı, logo ve renkleri sonradan Yönetim › Marka'dan değiştirebilirsin. Bkz. Yönetim.
DNS ve TLS
Caddy sertifikaları Let's Encrypt'ten kendisi alır. Bunun için DNS kayıtlarının sunucuyu göstermesi ve 80 ile 443 portlarının erişilebilir olması gerekir. Sertifika alınamıyorsa DNS'i ve güvenlik duvarını kontrol et, sonra docker compose ... logs caddy çıktısına bak.
Caddy'nin önüne başka bir vekil koyarsan /ws ve /collab yollarını WebSocket olarak geçirmeli (Upgrade başlığını iletmeli). Yoksa sohbet ve ortak düzenleme anlık güncellenmez.
Depolama
Dosyalar varsayılan olarak paketle gelen SeaweedFS'e gider. Yükleme ve indirmeler imzalı adreslerle yapılır, yani tarayıcı S3_DOMAIN ile doğrudan konuşur. Tarayıcıda https://s3.example.com açınca XML bir hata sayfası görünmesi normaldir.
Compose dosyasındaki S3_* ayarlarını değiştirerek başka bir S3 uyumlu servis kullanabilirsin. Kovanın CORS ayarı hub alan adına izin vermeli ve ETag başlığını açmalıdır.
E-posta
SMTP_URL ayarlıysa Crewhall davetleri, şifre sıfırlama ve bildirim e-postalarını gönderir. Ayarlı değilse davetler senin ileteceğin bağlantılar olarak gösterilir, şifre sıfırlama ve bildirim e-postaları gitmez. Yöneticiler Yönetim › Bildirim gönderimi'nden ayrı bir SMTP sunucusu da tanımlayabilir ve oradan test e-postası gönderebilir.
İsteğe bağlı profiller
Ek servisleri --profile ile açarsın. Her biri docker/.env içinde kendi ayarlarını ister.
| Profil | Servisler | Ne için |
|---|---|---|
meet | LiveKit, egress, coturn, Valkey | Görüntülü toplantı ve aramalar |
portal | Next.js portal sitesi | Herkese açık doküman ve blog sitesi |
office | Euro-Office belge sunucusu | Word, Excel ve PowerPoint düzenleme |
ai | Konuşma tanıma sunucusu | Toplantı notları ve dikte |
Toplantılar (meet)
LK_DOMAIN,LIVEKIT_API_KEY,LIVEKIT_API_SECRET,TURN_USERveTURN_PASSWORDdeğerlerini yaz. Kayıt içinMEET_EGRESS_ENABLED=trueyap. Egress 2-4 GB RAM ister.- 7881/tcp, 50000-60000/udp, 3478/udp ve 3478/tcp ile 49160-49200/udp portlarını aç.
--profile meetile başlat.
LiveKit'in DNS kaydı doğrudan sunucuyu göstermeli. Bir CDN vekili kullanıyorsan bu kayıtta vekili kapat, çünkü medya UDP kullanır. Anahtarlar boşken toplantılar kullanılamaz, geri kalan her şey çalışır. Bkz. Toplantılar.
Portal sitesi (portal)
- Portal › Ayarlar'da Next.js bağlantısı altından okuma anahtarını oluştur.
PORTAL_DOMAIN,PORTAL_CONTENT_TOKEN(okuma anahtarı) vePORTAL_REVALIDATE_SECRETdeğerlerini yaz.--profile portalile başlat. Yayınlanan değişiklikler birkaç saniyede sitede görünür. Bkz. Portal.
Office belgeleri (office)
Belge sunucusu kendi lisansıyla (AGPLv3) dağıtılan, değiştirilmemiş ayrı bir servistir. Crewhall onunla yalnız ağ üzerinden konuşur.
OFFICE_DOMAINveOFFICE_JWT_SECRET(32 ya da daha fazla rastgele karakter) değerlerini yaz.--profile officeile başlat. En az 4 GB bellek ister.- Yönetim › Entegrasyonlar › Office'te sunucu adresi olarak
https://office.example.com, iç adres olarakhttp://officeve aynı JWT sırrını gir. Bağlantıyı dene'yi seç, sonra Office düzenlemeyi aç.
Konuşma tanıma (ai)
ai profili OpenAI uyumlu API'si olan bir konuşma tanıma sunucusu çalıştırır. Yönetim › Yapay zekâ › Toplantı notları'nda konuşma tanıma sunucusunu http://whisper:8000/v1 yap ve bir model seç. Model ilk kullanımda indirilir.
Yedekleme, geri yükleme ve güncelleme
tools/crewhall içindeki crewhall komutu veritabanını ve dosyaları yedekler, geri yükler ve yığını günceller. Sunucuda, repo kökünde çalıştır.
tools/crewhall/crewhall backup
tools/crewhall/crewhall list
tools/crewhall/crewhall restore <kimlik>
tools/crewhall/crewhall export <kimlik> > crewhall-yedek.tar
tools/crewhall/crewhall import < crewhall-yedek.tar
tools/crewhall/crewhall prune --keep 14
- Yedekler
backupsDocker hacminde durur. Dosyalar içeriğe göre bir kez saklanır, her yedek yalnız değişenleri ekler. - Yedekleri
exportile düzenli olarak sunucu dışına kopyala. restoreuygulama servislerini durdurur, veritabanını ve dosyaları yedekteki hâline getirir ve servisleri yeniden açar.docker/.envvarsayılan olarak yedeğe girmez.--with-configile şifreli eklenir; parolaCREWHALL_BACKUP_PASSPHRASEortam değişkeninden okunur.- Geri yüklerken yedeğin alındığı kurulumun
AUTH_SECRETdeğerini kullan. - Kullanıyorsan
--profile meetya da--profile portalekle.
Gece yedeğini Yönetim › Yedekler'den de açabilirsin.
Güncellemek için:
tools/crewhall/crewhall update 1.5.0 # hazır imajlar
git pull && tools/crewhall/crewhall update --build # kaynaktan kurulum
Komut önce yedek alır, sonra yeni sürümü açar. Backend sağlıklı açılmazsa eski imajları, eski .env dosyasını ve yedeği geri koyar.
Log ve izleri OTEL_EXPORTER_OTLP_ENDPOINT ile herhangi bir OTLP alıcısına gönderebilirsin. Yoksa docker compose ... logs -f backend worker yeterlidir.