# 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.