9.6 KiB
Faz 0a — Bootstrap + Kendi Server Image'i — Uygulama Planı
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: AdamuSw ürün reposunu güncel OpenMU kaynağıyla doldurmak, upstream takibini kurmak, kaynaktan kendi Docker server image'imizi derleyip lokalde çalıştığını doğrulamak ve DockerHub'a yayınlamak.
Architecture: AdamuSw (Gitea origin) = ürün fork; upstream = MUnique/OpenMU. Image, upstream'in mevcut src/Startup/Dockerfile'ından derlenir (multi-stage, .NET 10 alpine). Lokal doğrulama, stock all-in-one compose'unu birebir taklit eden ama image'i bizimkiyle değiştiren bir compose ile yapılır (postgres + startup). Bu faz remote-NPC portunu içermez (o Faz 0b); amacı sadece kendi-derlenen-image pipeline'ını uçtan uca kanıtlamaktır.
Tech Stack: .NET 10 SDK (10.0.301 mevcut), Docker 29.2, PostgreSQL, OpenMU Startup (-autostart), Gitea + DockerHub.
Global Constraints
- Ürün repo yolu:
d:/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw(bash'te tırnak içinde — boşluk içerir). - Upstream referans yolu:
d:/OpenMU/MU Client_Mobile 1.04d - Season 6E3/OpenMU(temiz,origin=MUnique, baseline commitb5a0961). - AdamuSw
origin=https://gitea.atfatmc.com/atfatmc/AdamuSw.git, branchmain. - Docker build context'i
src/klasörüdür (DockerfileCOPY Directory.Packages.props .veCOPY Startup/*.csproj Startup/yapar → context =src/). - Bu fazda core kaynak koduna hiç dokunulmaz; sadece baseline + deploy dosyaları eklenir.
// ADAMU-CUSTOMbu fazda kullanılmaz. - Commit yazarı:
Acentech Dev <acentech_dev@affinitybox.com>. - DockerHub hedefi bir değişkendir; Task 3'te kullanıcı kendi hesabını girer:
HUB=<dockerhub-kullanici>/adamu-openmu.
Task 1: AdamuSw'i güncel OpenMU baseline'ı ile doldur ve remote'ları kur
Files:
- Create: AdamuSw kök ağacı (upstream'den temiz tracked-files snapshot'ı)
- Modify: AdamuSw git remote yapılandırması
Interfaces:
-
Consumes: temiz upstream repo (
../OpenMU,HEAD=b5a0961) -
Produces: AdamuSw'de derlenebilir OpenMU kaynağı +
origin(Gitea) +upstream(MUnique) remote'ları. Sonraki task'larsrc/Startup/Dockerfile'a güvenir. -
Step 1: Upstream'in temiz (sadece tracked) ağacını AdamuSw'e aktar
git archive yalnızca git'in takip ettiği dosyaları verir → obj/bin/artifact gelmez.
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/OpenMU" && \
git archive --format=tar HEAD | \
( cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && tar -xf - )
- Step 2: Aktarımın geldiğini doğrula
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
ls src/Startup/Dockerfile src/MUnique.OpenMU.sln .gitignore >/dev/null && echo "OK: baseline files present"
Expected: OK: baseline files present
- Step 3:
upstreamremote'unu ekle ve remote'ları doğrula
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
git remote add upstream https://github.com/MUnique/OpenMU.git 2>/dev/null; \
git remote -v
Expected (dört satır): origin ... AdamuSw.git (fetch/push) ve upstream ... MUnique/OpenMU.git (fetch/push)
- Step 4: Baseline commit'i oluştur
.gitignore upstream'den geldiği için obj/bin zaten hariç kalır.
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
git add -A && \
git -c user.name="Acentech Dev" -c user.email="acentech_dev@affinitybox.com" \
commit -m "baseline: OpenMU upstream b5a0961 (fresh source)" && \
git log --oneline -2
Expected: yeni commit + önceki docs: Castle Siege umbrella design spec commit'i listelenir.
- Step 5: Startup projesinin derlendiğini doğrula (image'den önce hızlı kontrol)
Dockerfile'ın derlediği projenin aynısını lokalde derle — tam solution yerine (daha hızlı, ilgisiz projelerden gürültü yok).
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/src" && \
dotnet build Startup/MUnique.OpenMU.Startup.csproj -c Release --nologo -clp:ErrorsOnly 2>&1 | tail -20
Expected: Build succeeded (hata yok). Uyarılar kabul edilebilir.
- Step 6: Gitea'ya push et
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
git push -u origin main
Expected: push başarılı; Gitea'da main branch commit'leri görünür.
Task 2: Kendi image'ini derle ve lokalde çalıştığını doğrula
Files:
- Create:
deploy-local/docker-compose.local.yml(postgres + bizim image) - Test: lokal
docker compose up+ boot/log doğrulaması
Interfaces:
-
Consumes: Task 1 çıktısı (
src/Startup/Dockerfile) -
Produces:
adamu-openmu:devlokal image; çalışan bir all-in-one stack. Task 3 bu image'i tag'leyip push eder. -
Step 1: Image'i kaynaktan derle
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/src" && \
docker build -f Startup/Dockerfile -t adamu-openmu:dev .
Expected: multi-stage build tamamlanır, son satır naming to docker.io/library/adamu-openmu:dev benzeri; hata yok.
- Step 2: Lokal test compose dosyasını oluştur
Stock all-in-one'ın birebir kopyası; tek fark image: munique/openmu → image: adamu-openmu:dev ve nginx katmanı sadeleştirildi (doğrudan 8080 expose).
Create deploy-local/docker-compose.local.yml:
services:
openmu-startup:
image: adamu-openmu:dev
container_name: adamu-openmu-startup
ports:
- "8080:8080"
- "55901:55901"
- "55902:55902"
- "55903:55903"
- "55904:55904"
- "55905:55905"
- "55906:55906"
- "44405:44405"
- "44406:44406"
- "55980:55980"
environment:
DB_HOST: database
ASPNETCORE_URLS: http://+:8080
working_dir: /app/
depends_on:
- database
database:
image: postgres
container_name: adamu-database
environment:
POSTGRES_PASSWORD: admin
POSTGRES_DB: openmu
POSTGRES_USER: postgres
ports:
- "5432"
volumes:
- adamu-dbdata:/var/lib/postgresql
volumes:
adamu-dbdata:
- Step 3: Stack'i ayağa kaldır
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/deploy-local" && \
docker compose -f docker-compose.local.yml up -d && \
docker compose -f docker-compose.local.yml ps
Expected: adamu-database ve adamu-openmu-startup Up durumda.
- Step 4: Server'ın boot olduğunu loglardan doğrula
-autostart ilk açılışta DB'yi initialize eder (birkaç dakika sürebilir).
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/deploy-local" && \
docker compose -f docker-compose.local.yml logs --tail=40 openmu-startup
Expected: init sonrası dinleme mesajları (ör. GameServer/ConnectServer listening) ve exception/fatal yok. Hâlâ initialize ediyorsa ~60 sn sonra tekrar bak.
- Step 5: Admin panel HTTP yanıtını doğrula
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/
Expected: 200 veya 302 (auth yönlendirmesi). Bağlantı reddi DEĞİL.
- Step 6: Stack'i durdur ve compose dosyasını commit et
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/deploy-local" && \
docker compose -f docker-compose.local.yml down && \
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
git add deploy-local/docker-compose.local.yml && \
git -c user.name="Acentech Dev" -c user.email="acentech_dev@affinitybox.com" \
commit -m "chore: local all-in-one compose for self-built image test" && \
git push origin main
Expected: commit + push başarılı.
Task 3: Image'i DockerHub'a yayınla
Files: yok (deploy işlemi)
Interfaces:
-
Consumes: Task 2'nin
adamu-openmu:devimage'i -
Produces: DockerHub'da
<HUB>:latestve<HUB>:b5a0961tag'leri; başka sunucudadocker pullile çekilebilir. -
Step 1: DockerHub hedefini ayarla (kullanıcı kendi hesabını girer)
export HUB="<dockerhub-kullanici>/adamu-openmu" # <-- kendi DockerHub repona göre değiştir
echo "$HUB"
Expected: hedef repo adı yazılır (ör. atfatmc/adamu-openmu).
- Step 2: DockerHub'a giriş yap
docker login
Expected: Login Succeeded.
- Step 3: Image'i tag'le
docker tag adamu-openmu:dev "$HUB:latest" && \
docker tag adamu-openmu:dev "$HUB:b5a0961" && \
docker images "$HUB"
Expected: iki tag (latest, b5a0961) listelenir.
- Step 4: Push et
docker push "$HUB:latest" && docker push "$HUB:b5a0961"
Expected: her iki push pushed ile biter; digest yazdırılır.
- Step 5: Yayınlandığını doğrula (temiz pull)
docker rmi "$HUB:b5a0961" 2>/dev/null; \
docker pull "$HUB:b5a0961" && echo "OK: image pullable from DockerHub"
Expected: OK: image pullable from DockerHub.
Sonraki adım
Faz 0a bitince pipeline kanıtlanmış olur (kendi image → DockerHub → çekilebilir). Faz 0b ayrı bir plan olacak: AdaMu (eski fork, gitea.atfatmc.com/atfatmc/AdaMu) reposunun kendi git geçmişinden remote-NPC diff'ini çıkar, güncel upstream dosyaları üstüne // ADAMU-CUSTOM işaretleriyle yeniden uygula, regresyon testi ekle, touch-registry'yi güncelle. Server-side dokunulan dosyalar (eski fork'ta tespit edildi): GameLogic/PlayerActions/TalkNpcAction.cs, GameServer/MessageHandler/TalkNpcHandlerPlugInBase.cs, GameServer/RemoteView/World/NewNpcsInScopePlugIn*.cs, NewPlayersInScope*PlugIn*.cs. Production'a geçiş ancak Faz 0b sonrası yapılır (mevcut prod remote-NPC'ye bağımlı).
Faz 0b tamamlanınca CS fazları (P1→P5) başlar.