docs: Phase 0a implementation plan (bootstrap + self-built image + DockerHub)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Acentech Dev
2026-07-14 18:56:36 +03:00
parent ed464095f9
commit 450402e47d

View File

@@ -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 <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.
```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 `<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)**
```bash
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**
```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.