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

250 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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ı, 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).
```bash
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**
```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-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**
```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-adamu/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-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).
```bash
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**
```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-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)**
```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.