diff --git a/docs/superpowers/plans/2026-07-14-phase0a-bootstrap-self-built-image.md b/docs/superpowers/plans/2026-07-14-phase0a-bootstrap-self-built-image.md new file mode 100644 index 0000000..68aaea3 --- /dev/null +++ b/docs/superpowers/plans/2026-07-14-phase0a-bootstrap-self-built-image.md @@ -0,0 +1,249 @@ +# 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 commit `b5a0961`). +- AdamuSw `origin` = `https://gitea.atfatmc.com/atfatmc/AdamuSw.git`, branch `main`. +- Docker build context'i `src/` klasörüdür (Dockerfile `COPY Directory.Packages.props .` ve `COPY Startup/*.csproj Startup/` yapar → context = `src/`). +- Bu fazda core kaynak koduna **hiç dokunulmaz**; sadece baseline + deploy dosyaları eklenir. `// ADAMU-CUSTOM` bu fazda kullanılmaz. +- Commit yazarı: `Acentech Dev `. +- DockerHub hedefi bir değişkendir; Task 3'te kullanıcı kendi hesabını girer: `HUB=/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'lar `src/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. + +```bash +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** + +```bash +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: `upstream` remote'unu ekle ve remote'ları doğrula** + +```bash +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. + +```bash +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). + +```bash +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** + +```bash +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:dev` lokal image; çalışan bir all-in-one stack. Task 3 bu image'i tag'leyip push eder. + +- [ ] **Step 1: Image'i kaynaktan derle** + +```bash +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`: +```yaml +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** + +```bash +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). + +```bash +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** + +```bash +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** + +```bash +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:dev` image'i +- Produces: DockerHub'da `:latest` ve `:b5a0961` tag'leri; başka sunucuda `docker pull` ile çekilebilir. + +- [ ] **Step 1: DockerHub hedefini ayarla (kullanıcı kendi hesabını girer)** + +```bash +export HUB="/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** + +```bash +docker login +``` +Expected: `Login Succeeded`. + +- [ ] **Step 3: Image'i tag'le** + +```bash +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** + +```bash +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)** + +```bash +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.