Files
AdamuSw/docs/superpowers/plans/2026-07-14-phase0a-bootstrap-self-built-image.md
Acentech Dev 2e59cdfe1f
Some checks failed
.NET Core / build (push) Has been cancelled
chore: AdamuSw deploy composes (local test + Coolify/Traefik prod) using self-built image
- deploy-adamu/docker-compose.local.yml: local postgres + adamu-openmu:dev, direct 8080
- deploy-adamu/docker-compose.prod.yml: Coolify/Traefik prod adapted from AdaMu, image swapped to our build
- additive folder (deploy-adamu) to avoid upstream deploy/ merge conflicts
- plan Step5 fixed (-p:ci=true), paths -> deploy-adamu

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 19:31:07 +03:00

10 KiB
Raw Permalink Blame History

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

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: upstream remote'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ı, Dockerfile'ın kullandığı -p:ci=true bayrağıyla derle. ci=true, Persistence.csproj'daki source-generator PreBuild target'ını atlar (Condition="'$(ci)'!='true'") — Generated.cs dosyaları zaten repo'da commit'li olduğu için Docker/CI bunları kullanır. ci=true VERMEZSEN generator --no-build sıralama hatası verir (gerçek hata değil, sadece lokal dev regenerasyon yolu).

cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw/src" && \
dotnet build Startup/MUnique.OpenMU.Startup.csproj -c Release -p:ci=true --nologo -clp:ErrorsOnly 2>&1 | tail -20

Expected: Build succeeded / Oluşturma başarılı oldu (0 hata). 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-adamu/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

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/openmuimage: adamu-openmu:dev ve nginx katmanı sadeleştirildi (doğrudan 8080 expose).

Create deploy-adamu/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-adamu" && \
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-adamu" && \
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-adamu" && \
docker compose -f docker-compose.local.yml down && \
cd "/d/OpenMU/MU Client_Mobile 1.04d - Season 6E3/AdamuSw" && \
git add deploy-adamu/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 <HUB>:latest ve <HUB>:b5a0961 tag'leri; başka sunucuda docker pull ile ç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.