#NotusShip — kendi sunucunuzda
Hedef: 15 dakikada çalışır durumda. Gereken tek şey Docker kurulu bir sunucu.
İmaj private bir registry'de; erişimi Notussoft veriyor ve kurulumu genellikle Notussoft yapıyor. Yönetilen bir PostgreSQL kullanacaksanız bölüm 1b'ye bakın — paketle gelen veritabanı yerine kendi sunucunuzu vermek birkaç ayar değiştiriyor.
#1. Kurulum
#Gereksinimler
- Docker Engine 24+ ve Docker Compose v2
- 2 GB RAM, 10 GB disk (küçük bir ekip için fazlasıyla yeterli)
- Bir alan adı ve önünde TLS sonlandıran bir ters vekil (Caddy, nginx, Traefik, Coolify…)
#Adımlar
Bu adımları bugün Notussoft yürütür. Ürün private bir registry'den dağıtılıyor ve kurulum Notussoft tarafından, sizin sunucunuzda yapılıyor (docs/dagitim.md Aşama 1). Doküman yine de baştan sona yazılı: ne olduğunu görmek, kurulumu denetlemek ve bir gün kendiniz devralmak isteyebilirsiniz.
Kurulum için üç şey gerekir:
| Ne | Neden | Kimde |
|---|---|---|
docker-compose.yml ve .env.example | Paketin kendisi. Kaynak deposu private, yani bu dosyaları kendiniz indiremezsiniz | Notussoft gönderir |
| Registry kullanıcı adı ve jetonu | İmajı ghcr.io'dan çekmek için | Kurulum sırasında Notussoft kullanır; varsayılan olarak size verilmez |
| Lisans anahtarı (isteğe bağlı) | Olmadan kurulum 3 kullanıcılık ücretsiz kademede çalışır. Ücretsiz 30 günlük / 25 koltukluk deneme anahtarı isteyebilirsiniz | Notussoft üretir, talepten sonra 1 iş günü içinde |
Kimliği kendiniz istiyorsanız — kendi yükseltmelerinizi yapmak için — bu ayrıca konuşulur ve size özel, yalnızca okuma yetkili bir kimlik verilir (docs/dagitim.md Aşama 2). Varsayılan yol bu değil; yükseltme de bugün Notussoft'un işi (§3).
# 1) Notussoft'un gönderdiği iki dosyayı boş bir dizine koyun, sonra:
cp .env.example .env
# 2) Verilen bilgilerle registry'ye giriş yapın
# Bu adım atlanırsa 4. adım "unauthorized" ile düşer.
echo "<jeton>" | docker login ghcr.io -u "<kullanıcı-adı>" --password-stdin
# 3) .env içindeki üç zorunlu değeri doldurun
openssl rand -base64 24 # → POSTGRES_PASSWORD
openssl rand -base64 48 # → NotusShip__Jwt__SigningKey
# → NotusShip__BaseUrl=https://notusship.sirketiniz.com
# 4) Başlatın
docker compose up -d
# 5) Hazır olmasını bekleyin (yaklaşık 15 saniye)
docker compose ps
.env'i ilk başlatmadan ÖNCE doldurun. PostgreSQL şifreyi yalnızca veri dizinini ilk kurduğunda yazar; yanlış bir değerle başlatıp sonra düzeltirseniz eski şifre kalır ve uygulama bağlanamaz. Çıkış yolu 6. bölümde.
STATUS sütununda healthy gördüğünüzde adresinizi tarayıcıda açın.
#İlk kullanıcı
Tarayıcıda açılan kurulum ekranı üç adımdır: hesap → organizasyon → ilk proje. Board'unuz üç örnek issue ile açılır.
Kayıt ilk kullanıcıdan sonra kapanır. İnternete açık bir kurulumda herkesin kayıt olup verinizi görmesini istemiyoruz. Ekibinizi bölüm 2'deki komutla eklersiniz.
#Ters vekil
Uygulama düz HTTP olarak 8080 portunda konuşur; TLS'i vekil sonlandırır.
Port yalnızca 127.0.0.1'e bağlıdır ve bu bir güvenlik koşuludur, tercih değil. İki sebep: uygulama TLS konuşmuyor, ve hız sınırı vekilin yazdığı X-Forwarded-For başlığına güveniyor — uygulamaya doğrudan ulaşabilen biri o başlığı uydurup sınırı atlatabilir. Vekiliniz başka bir makinedeyse docker-compose.yml içindeki bağlamayı değiştirmeniz gerekir; o zaman erişimi güvenlik duvarıyla yalnızca vekilin adresine açın.
Caddy örneği
notusship.sirketiniz.com {
reverse_proxy localhost:8080
}
NotusShip__BaseUrl kullanıcıların gördüğü adres olmalıdır, localhost:8080 değil.
#1b. Yönetilen (harici) PostgreSQL
Paketle gelen db servisi yerine yönetilen bir veritabanı kullanabilirsiniz — RDS, Supabase, Hetzner, Coolify'ın kendi Postgres kaynağı, hepsi olur.
Farklı compose dosyası:
curl -O https://raw.githubusercontent.com/notussoft/notusship/main/deploy/docker-compose.external-db.yml
db servisi ve notusship-db volume'u yok; geri kalan her şey aynı.
⚠ Boş veritabanını SİZ oluşturursunuz. Uygulama şemayı kurar (migration'lar açılışta çalışır) ama veritabanının kendisini kurmaz. Paket kurulumunda bu görünmüyor çünkü Postgres imajı veritabanını ilk açılışta kendisi yaratıyor. Yönetilen bir serviste böyle bir şey olmaz: sağlayıcı kendi adıyla bir veritabanı verir ve bağlantı dizenizdeki ad orada yoktur. Bağlanmadan önce oluşturun.
Farklı değişken. POSTGRES_PASSWORD yerine tam bağlantı dizesi verilir:
| Değişken | Değer |
|---|---|
ConnectionStrings__Default | Host=db.ornek.com;Port=5432;Database=notusship;Username=notusship;Password=…;SSL Mode=Require;Trust Server Certificate=true |
Parçalardan kurmuyoruz çünkü yönetilen servisler genelde SSL ve havuz ayarları da istiyor; tek dize sağlayıcının verdiği hâliyle yapıştırılır. Kalan değişkenler (bölüm 5) aynı.
⚠ Sunucu sürümü 17 veya altı olmalı. İmajdakipg_dumpistemcisi 17; sunucu 18+ ise yedek alınamaz. Uygulama bunu başlangıçta log'a yazıyor (Backups will not run: …) ama kurulumdan sonra fark etmek, yedeksiz geçen günler demek. Veritabanını oluştururken sürümü siz seçiyorsanız 17'de kalın.
Uygulama veritabanına ulaşabilmeli. Yönetilen veritabanı ayrı bir ağdaysa uygulamanın oraya erişimi açılmalı; sağlayıcının verdiği iç adresi kullanın, dışa açık adres trafiği gereksiz yere internetten dolaştırır.
Kurulumdan önce kanıtlayın:
docker compose run --rm app sh -c 'apk add --no-cache postgresql-client >/dev/null 2>&1; \
PGPASSWORD=<şifre> psql -h <adres> -U <kullanıcı> -d <veritabanı> -c "select 1"'
Geri yükleme prosedürü de farklı — db konteyneri olmadığı için komutu uygulama konteyneri çalıştırıyor: runbook.md §2b.
#2. Ekibinizi ekleme
docker compose exec app dotnet NotusShip.Api.dll add-user \
merve@sirketiniz.com "Merve Y." "guclu-bir-parola" Member
Roller: Owner (her şey), Member (varsayılan — okur ve yazar), Viewer (yalnız okur).
Kullanıcı bu şifreyle giriş yapar.
Uygulamanın içinden de davet edebilirsiniz (Ayarlar → Üyeler → Davet et); SMTP tanımlıysa davet e-postayla gider, her hâlükârda bağlantı ekranda gösterilir ve kendiniz iletebilirsiniz.
#Arayüz dili
NotusShip Türkçe ve İngilizce. Ürün, tarayıcınızın diline göre açılır; giriş ekranının ve kurulum sihirbazının sağ üstündeki Türkçe / English düğmesiyle değiştirebilirsiniz.
Kurulumu yapan kişinin seçtiği dil yeni üyelerin başlangıç dili olur — yani ekibinizi ekledikten sonra tek tek ayarlamanız gerekmez. Sonradan değiştirmek için: organizasyon geneli Ayarlar → Organizasyon, kişisel Ayarlar → Tercihler.
#2b. Şirket hesabıyla giriş (SSO / OIDC)
Ekibiniz Entra ID, Google Workspace ya da OIDC konuşan başka bir sağlayıcı kullanıyorsa, giriş oraya devredilebilir. Aracı bir servis yok — NotusShip doğrudan sizin sağlayıcınızla konuşur; Auth0 gibi bir hesap açmanız gerekmez.
Ayarlar Owner hesabıyla: yan menü → Tek oturum açma.
Sıra önemli. Ekrandaki dönüş adresini önce sağlayıcıya kaydedin, istemci kimliğini ondan sonra alabilirsiniz:
https://notusship.sirketiniz.com/api/auth/sso/callback
Sonra ekrana üç şey girilir:
| Alan | Nereden |
|---|---|
| Yayıncı adresi | Sağlayıcının OIDC keşif adresi. Entra ID'de https://login.microsoftonline.com/<kiracı-kimliği>/v2.0, Google'da https://accounts.google.com |
| İstemci kimliği | Sağlayıcıdaki uygulama kaydından |
| İstemci sırrı | Sağlayıcı istiyorsa. PKCE ile çalışan bir kayıtta gerekmez |
İzinli e-posta alan adları zorunlu ve boş bırakılamaz. Google Workspace istemcisine karşı herhangi bir Google hesabı kimlik doğrulayabilir; liste olmadan dışarıdan biri giriş yapıp ekibinize düşerdi. Alt alan adları sayılmaz: sirketiniz.com yazdığınızda x.sirketiniz.com giremez.
Roller NotusShip'te kalır. Sağlayıcıdaki gruplar role çevrilmez; ilk giriş yapan kişi Member olur ve rolü buradan değiştirirsiniz.
Owner her zaman şifreyle girebilir. "Üyeler şifreyle giremesin" ayarı Owner'ı kapsamaz — sağlayıcı yanlış yapılandırıldığında kendi kurulumunuzdan kilitlenmemeniz için.
⚠ NotusShip__Jwt__SigningKey değiştirirseniz istemci sırrını yeniden girin. Sır o anahtardan türetilen bir anahtarla şifreleniyor. Ürün bunu sessizce geçmez: ayar ekranı "kayıtlı istemci sırrı çözülemiyor" uyarısı gösterir.
#2c. Webhook ve genel API
Genel API. Kalıcı bir anahtar üret (yan menü → API anahtarları) ve Authorization: Bearer nsp_… başlığıyla çağır. Uçların tam listesi https://notusship.sirketiniz.com/openapi/v1.json adresinde; belge kimlik doğrulaması istiyor, yani anahtarınla indirebilirsin.
Adreslerde sürüm öneki (/api/v1) yok. Kural şu: alan eklenir, çıkarılmaz — tanımadığın alanı yok say.
Webhook. Yan menü → Webhook (yalnızca Owner). Bir adres, bir olay listesi ve ürünün ürettiği bir imza sırrı. Sır bir kez gösterilir.
Gönderilen istek:
POST /senin/adresin
Content-Type: application/json
X-NotusShip-Event: IssueCreated
X-NotusShip-Delivery: 0199... # aynı olay yeniden denenirse aynı kalır
X-NotusShip-Timestamp: 1756645200
X-NotusShip-Signature: sha256=...
İmzayı şöyle doğrula (Python):
import hashlib, hmac, time
def dogrula(gizli: str, damga: str, govde: bytes, imza: str) -> bool:
if abs(time.time() - int(damga)) > 300: # 5 dakikadan eski isteği alma
return False
beklenen = "sha256=" + hmac.new(
gizli.encode(), f"{damga}.".encode() + govde, hashlib.sha256
).hexdigest()
return hmac.compare_digest(beklenen, imza)
Bilmen gerekenler:
- Organizasyon geneli çalışır. Özel projelerin olayları da gider.
- Sıra garanti değil. İşler paralel; olayların sırasına güvenme.
- Gövde işaretçidir. Ayrıntıyı API'den oku; alan listesi zamanla büyür.
- Üst üste 15 başarısızlıkta webhook kapanır ve sebebi ekranda yazar.
- Yedekleme kapalı ve SMTP yoksa arka plan kuyruğu hiç kurulmaz; teslimat o zaman istek anında yapılır ve yeniden denenmez. Dayanıklı teslimat istiyorsan günlük yedeği açık bırak.
⚠ NotusShip__Jwt__SigningKey değiştirirsen webhook'ları yeniden oluştur. İmza sırrı o anahtardan türetilen bir anahtarla şifreleniyor; değişince çözülemez ve ekran uyarır.
#2d. GitHub bağlantısı
Commit ve pull request'ler karta bağlanır: mesajda, PR başlığında ya da dal adında NSHIP-42 geçmesi yeter.
Saklanan bir GitHub jetonu yok. Bağlantı tek yönlü — GitHub bize olay gönderir, biz GitHub'a hiç sormayız. Bunun karşılığı: kurulumun GitHub'dan erişilebilir olması gerekir. Kapalı bir ağdaysanız bu özellik çalışmaz.
Kurulum (yan menü → Git bağlantısı, yalnızca Owner):
- Sır üret ve ekrandaki değeri kopyala — bir daha gösterilmez.
- GitHub'da depo → Settings → Webhooks → Add webhook.
- Payload URL: ekrandaki adres. Content type:
application/json. Secret: az önce kopyaladığın değer. - Which events? → Let me select individual events → Pushes ve Pull requests.
- Kaydet. GitHub bir
pinggönderir; ayar ekranında "son olay" dolduysa bağlantı çalışıyor demektir.
Aynı sırrı birden çok depoya yapıştırabilirsin — sır organizasyon başına.
⚠ Sırrı yenilersen eskisi anında geçersiz olur. Her deponun webhook ayarını güncellemen gerekir. Aynı şey NotusShip__Jwt__SigningKey değiştiğinde de geçerli: ayar ekranı uyarır, sırrı yenile.
#3. Yükseltme
Önce CHANGELOG.md okuyun. "⚠ Yükseltme notu" yoksa aşağıdaki üç komut yeterlidir; varsa o not elle yapılacak bir şey söylüyor.
docker compose exec app dotnet NotusShip.Api.dll backup-now # önce yedek
docker compose pull
docker compose up -d
Migration'lar açılışta otomatik uygulanır ve log'a yazılır.
#Yükseltmenin gerçekten olduğunu doğrulama
docker compose exec app dotnet NotusShip.Api.dll version
Çıktı 0.2.0 ya da 0.2.0+abc1234 biçiminde. Sürüm derlemeye gömülüdür; imaj etiketine bakmak yeterli değil çünkü latest her sürümde aynı görünür. Aynı bilgi arayüzde de yazıyor: yan panelin dibinde, kullanıcı adının altında.
Bir arıza bildirirken bu değeri ekleyin — ilk sorulacak soru bu.
#Geriye uyumluluk sözü
Yükseltme veri kaybettirmez. Kolon silme ve yeniden adlandırma iki aşamada yapılır: bir sürümde yeni kolon eklenip çift yazılır, ancak sonraki bir sürümde eskisi kaldırılır.
Bir sürüm geri dönmek desteklenir, iki sürüm geri dönmek desteklenmez — aradaki göçler geri alınmaz.
#Yükseltme sonrası bir şey ters gittiyse
# 1) Önceki sürüme dön (.env içindeki NOTUSSHIP_IMAGE'i eski etikete çevirin)
docker compose up -d
# 2) Veritabanı da geri gerekiyorsa: yedekten geri yükleme prosedürü runbook'ta
Bir sürüm geriye dönmek için veritabanına dokunmanız gerekmez; yeni sürümün eklediği kolonlar eski sürüm tarafından yok sayılır. Geri yükleme yalnızca göçün kendisi bozulduysa gerekir — prosedür ve tatbikat sonucu runbook.md.
Bu sürüme ilk yükseltmede kullanıcılar bir kez sert yenileme yapmalı (Cmd/Ctrl + Shift + R). Önceki sürümlerindex.html'i önbelleklenebilir servis ediyordu; tarayıcıda kalan o kopya, yeni sürümde artık var olmayan dosya adlarını ister ve uygulama açılmaz. Sunucu tarafı önbellekteki eski kopyayı geri alamaz. Bu sürümden sonra sorun tekrarlamaz:index.htmlartıkno-cache, varlıklar parmak izli ve uzun ömürlü.
Belirli bir sürüme sabitlemek için .env içinde:
NOTUSSHIP_IMAGE=ghcr.io/notussoft/notusship:v1.0.0
Üretimde bunu öneririz: latest ile çalışmak, ne zaman yükseldiğinizi bilmemek demektir.
#3b. İzleme
Uygulama üç yoklama adresi sunuyor ve işleri farklı:
| Adres | Ne der |
|---|---|
/health | Süreç ayakta mı. Veritabanına bakmaz — veritabanı geçici düştüğünde konteyner yeniden başlatılmamalı |
/health/ready | Veritabanı erişilebilir ve şema yerinde mi. Ters vekilinizin trafik kararı buna bağlı olmalı |
/health/operations | Yedek gerçekten alınıyor mu, lisans yazmayı kesmek üzere mi |
Üçüncüsünü bir uptime izleyicisine bağlayın (Uptime Kuma, Better Stack, Cloudflare health checks, Coolify'ın bildirimleri — hangisini kullanıyorsanız). Sağlıklı değilse 503 döner; gövdede sorunlu yoklamanın adı yazar, ayrıntı log'dadır.
Neden bu ayrı bir adres: yedeğin çalışmadığını öğrenmenin diğer yolu, geri yüklemeye ihtiyaç duyduğunuz an. Ve bayat bir yedek trafik kararını etkilememeli — bu yüzden ready ile karıştırılmadı.
Kurulumdan sonraki ilk gün 503 beklenir: ilk yedek 02:00 UTC'de alınır.
#3c. KVKK / GDPR talepleri
Veri erişimi (KVKK m.11 / GDPR m.15). Kullanıcı kendi verisini indirebiliyor: Ayarlar → Tercihler → Verilerim. Tek JSON dosyası, kapsam o organizasyon. Operatörün yapması gereken bir şey yok.
Silme (KVKK m.7 / GDPR m.17). İki adım, sırası önemli:
# 1) Kişiyi ekipten çıkarın: Ayarlar → Üyeler → Çıkar
# 2) Kimliğini silin
docker compose exec app dotnet NotusShip.Api.dll anonymize-user ayrilan@sirketiniz.com
Komut onay istiyor (e-posta adresini tekrar yazmanız gerekiyor) ve geri alınamaz — geri dönüş yalnızca yedekten.
Ne olduğu: kişinin adı Silinmiş kullanıcı olur, e-postası ulaşılamaz bir adrese çevrilir, şifresi silinir, bildirimleri ve kaydedilmiş filtreleri silinir. Ürettiği içerik ve issue geçmişi kalır.
Bu bilinçli: yorumları ve zaman kayıtlarını silmek, ekibin altı ay önce ne olduğunu okumasını imkânsızlaştırır. Silme hakkının amacı kişinin kimliğinin ortadan kalkması; anonimleştirme onu yapıyor. Kişiye bu ayrımı anlatmanız gerekebilir.
Kullanıcı hâlâ bir organizasyona üyeyse komut reddediyor ve sırayı söylüyor.
#4. Yedekleme
Her gece 02:00 UTC'de otomatik yedek alınır, 14 gün saklanır.
docker compose exec db ls -lh /backups # yedekleri listele
docker compose exec app dotnet NotusShip.Api.dll backup-now # şimdi al
Geri yükleme prosedürü ve tatbikat sonucu: runbook.md.
Platformunuzun kendi yedeklemesi varsa (Coolify, yönetilen veritabanı sağlayıcınız…) NotusShip__Backup__Enabled=false ile bizimkini kapatabilirsiniz. Tavsiyemiz ilk aylarda ikisini de açık bırakmak: bizim yedeğimizin geri yükleme yolu denenmiş ve kaydı runbook'ta, sizinki henüz denenmedi.
notusship-backups ve notusship-files volume'larını sunucu dışına kopyalayın — sunucu tamamen kaybolursa yedeğin sunucuda durması işe yaramaz.
#5. Yapılandırma
Tüm ayarlar ortam değişkenidir. Zorunlu olanlar eksikse uygulama açık bir mesajla başlamayı reddeder ve konteyner 1 koduyla kapanır; sessizce yanlış çalışmaz.
| Değişken | Zorunlu | Varsayılan | Açıklama |
|---|---|---|---|
POSTGRES_PASSWORD | ✔ | — | Veritabanı şifresi |
NotusShip__Jwt__SigningKey | ✔ | — | En az 32 karakter. Değiştirmek tüm oturumları sonlandırır |
NotusShip__BaseUrl | ✔ | — | Dışarıdan görünen adres |
NOTUSSHIP_PORT | 8080 | Ana makinedeki port | |
NOTUSSHIP_IMAGE | …:latest | İmaj etiketi | |
NotusShip__Backup__Enabled | true | Günlük yedek | |
NotusShip__Backup__HourUtc | 2 | Yedek saati (UTC) | |
NotusShip__Backup__RetentionDays | 14 | Saklama süresi | |
NOTUSSHIP_LICENSE | — | Lisans anahtarı. Verilmezse 3 kullanıcılık ücretsiz kademe. Süresi dolarsa kurulum 3 kullanıcıya kadar ücretsiz kademeye geri düşer | |
ConnectionStrings__Default | ✔¹ | — | Yalnızca harici veritabanı paketinde; POSTGRES_PASSWORD'ün yerine geçer (bölüm 1b) |
NotusShip__Email__Host | — | Doluysa e-posta açılır. Boşsa şifre kurtarma çalışmaz — aşağıya bakın | |
NotusShip__Email__Port | 587 | ||
NotusShip__Email__UseStartTls | true | ||
NotusShip__Email__User | — | ||
NotusShip__Email__Password | — | .env dosyasında kalır; uygulama log'a yazmaz | |
NotusShip__Email__FromAddress | — | Gönderen adres. Boşsa USER kullanılır | |
NotusShip__Email__FromName | NotusShip |
¹ docker-compose.external-db.yml kullanıyorsanız zorunlu, paket kurulumunda kullanılmıyor.
#Adlar 14 Eylül 2026'da değişti — mevcut kurulumlar okusun
Daha önce bu ayarların ikinci bir adı vardı (NOTUSSHIP_SMTP_HOST gibi) ve docker-compose.yml onları uygulamanın okuduğu adlara çeviriyordu. O çeviri kaldırıldı: artık .env'de ne yazıyorsa uygulamaya o gidiyor.
Sebebi bir kusurdu ve yaşandı: çeviri yalnızca compose konteyneri başlatan şey ise oluyordu. Doğrudan ortam değişkeni enjekte eden bir platformda (bizimkinde Coolify) eski adlar girildi, konteynerin içinde göründü ve hiç okunmadı — hata yok, log yok, e-posta sessizce kapalı. Üstelik çeviri tablosu üç compose dosyasında aynı bile değildi.
.env dosyanızda eski adlar duruyorsa uygulama bunu açılışta söylüyor:
warn: Configuration variable NOTUSSHIP_SMTP_HOST is NOT READ; the application
reads NotusShip__Email__Host, which is EMPTY — this setting is off.
Karşılığını zaten doldurduysanız satır information seviyesinde geçer ve eski değişkeni silebilirsiniz. Değer log'a asla yazılmaz, yalnızca ad.
Yeni adlar deploy/.env.example içinde tam listeyle duruyor. Çevirirken tek kural: sayı ve doğru/yanlış ayarlarını boş bırakmayın. NotusShip__Email__Port= gibi boş bir satır, ayarsız bir satırla aynı şey değil — uygulama açılışta Failed to convert configuration value '' diyerek kapanır. Değeri yazın ya da satırı yorum yapın. (Eski compose bunu ${…:-587} ile gizliyordu.)
#SMTP'yi atlamanın bedeli
E-posta isteğe bağlı ve atlarsanız ürün çalışmaya devam eder: davet bağlantıları ekranda gösterilir, bildirimler uygulama içinde kalır. "Önce SMTP kurun" diyen bir kurulum, hiç bitmeyen kurulumlar üretir — o yüzden zorunlu değil.
Ama bir şey çalışmaz: şifre kurtarma. Şifresini unutan kullanıcı kendi başına sıfırlayamaz; çıkış yolu sunucuda bir operatör komutudur:
docker compose exec app dotnet NotusShip.Api.dll reset-password <e-posta>
Ürün bunu ekranda açıkça söylüyor (gelmeyecek bir postayı beklemenize izin vermiyor) ve Ayarlar → Üyeler sayfası kurulumda e-posta olmadığını uyarı olarak gösteriyor. Yine de en ucuz an, SMTP'yi kurulum sırasında doldurmaktır: kurulum sekiz saniyede bittiği için bu adımı atlamak çok kolay ve bedeli aylar sonra, kimsenin beklemediği bir anda çıkıyor.
#6. Sık sorunlar
docker compose up -d "unauthorized" diyor Registry'ye giriş yapmamışsınız ya da verilen jetonun süresi dolmuş. 1. bölümdeki docker login ghcr.io komutunu çalıştırıp tekrar deneyin. İmaj private bir registry'de; anonim erişim yok.
Log'da password authentication failed for user "notusship" yazıyor Veritabanı, .env'de şu an yazan şifreden başka bir şifreyle kurulmuş. PostgreSQL şifreyi yalnızca veri dizinini ilk yarattığında yazar; .env'i sonradan düzeltmek hiçbir şeyi değiştirmez. Kurulum hâlâ boşsa en kısa yol baştan başlamaktır:
docker compose down -v # ⚠ veritabanı volume'unu SİLER
docker compose up -d
İçinde veri varsa -v KULLANMAYIN; şifreyi veritabanının içinde değiştirin:
docker compose exec db psql -U notusship -c "ALTER USER notusship PASSWORD '.env-dosyanizdaki-deger';"
docker compose restart app
Kullanıcı şifresini unuttu, "şifremi unuttum" bağlantı göndermiyor Kurulumda SMTP yapılandırılmamış. Ürün bunu ekranda söylüyor. Şifreyi operatör sıfırlar:
docker compose exec app dotnet NotusShip.Api.dll reset-password <e-posta>
Kalıcı çözüm NotusShip__Email__Host ve arkadaşlarını doldurmak (bölüm 5). Doldurup docker compose up -d dediğinizde Ayarlar → Üyeler sayfasındaki uyarı kaybolur.
Uygulama başlamıyor, log'da "required configuration is missing" yazıyor Mesaj hangi değişkenlerin eksik olduğunu ve nasıl üretileceğini tek tek söyler. .env dosyanızı doldurup docker compose up -d deyin.
Log'da NOTUSSHIP_MODE was not recognised yazıyor cloud ya da selfhosted olmalı. Self-hosted pakette bu değer zaten sabit; elle değiştirmeyin.
İlk açılışta __EFMigrationsHistory için iki hata satırı görünüyor Normaldir. Boş bir veritabanında Entity Framework önce bu tabloyu sorgular, bulamaz ve hatayı log'lar; hemen ardından tabloları oluşturur. Migrations applied. satırını gördüyseniz sorun yok.
Log'da "Backups will not run: … pg_dump …" yazıyor İmajdaki PostgreSQL istemcisi veritabanı sunucusundan eski. İmajı yükseltin. Bu denetim başlangıçta çalışır ki sorunu gece 02:00'de değil şimdi öğrenin.
Kayıt ekranı "Bu kurulum zaten kuruldu" diyor Beklenen davranış: kayıt ilk kullanıcıdan sonra kapanır. Bölüm 2'deki komutla hesap açtırın.
Veritabanına dışarıdan bağlanamıyorum Bilerek: db servisinin portu dışarı açılmaz. İhtiyaç hâlinde docker compose exec db psql -U notusship kullanın.
Tepede "Lisans yenilenmeli" şeridi çıktı Lisansın doldu. 14 günlük ek süre içindeyseniz her şey çalışmaya devam eder. Ek süre de bittiğinde ne olacağı kurulumunuzun büyüklüğüne bağlı:
- 3 kullanıcı veya daha az — kurulum ücretsiz kademeye geri düşer ve normal çalışmaya devam eder. Anahtarı
.env'den silmeniz gerekmez. - 3 kullanıcıdan fazla — yazma kapanır; okuma, giriş ve yedek açık kalır. Veriye erişiminiz asla kesilmez.
Deneme anahtarınız bittiğinde küçük bir ekipseniz hiçbir şey yapmanız gerekmiyor: anahtar almış olmak sizi anahtarsız olmaktan kötü duruma düşürmez.
Durumu görmek için: docker compose exec app dotnet NotusShip.Api.dll license-show
"Koltuk sınırı dolu" diyor Lisansınızdaki kullanıcı sayısına ulaşıldı. Mevcut kullanıcılar etkilenmez, yalnızca yeni ekleme durur.
Loglar nerede docker compose logs app (JSON) ve notusship-logs volume'unda günlük dosyalar, son 7 gün.
#7. Kaldırma
docker compose down # konteynerler gider, veri kalır
docker compose down -v # VERİ DE GİDER — önce yedek alın