chahinebrini
59e97e004d
fix(admin): port-override AFTER infisical injection (was hijacking backend port)
...
Bug: admin-app PM2-service kaperte port 3016 vom backend-staging.
Backend ging in crash-loop (22 restarts), nginx routete /api auf admin Nuxt-app
→ HTTP 302 redirect zu /login → Frontend „JSON Parse error: Unexpected character: <".
Root cause: backend-staging-Infisical-env hat PORT=3016, NITRO_PORT=3016 als
secrets. Admin-Script exportierte PORT=3017 VOR `infisical run` — aber Infisical
overrode mit den 3016-secrets innerhalb seines bash-c block.
Fix: PORT/NITRO_PORT/NITRO_HOST exports MOVED inside `bash -c` block, AFTER
infisical-env-injection. Hard-override gewinnt jetzt.
Verified manual:
- pm2 stop+delete rebreak-admin-staging → port 3016 frei
- pm2 restart rebreak-staging → online auf 3016
- curl /api/auth/me → HTTP 401 JSON (war 302 HTML)
- Backend wieder healthy
Pending: nächster admin-deploy via GH-Actions wird sich mit fixed script
auf 3017 starten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 22:52:38 +02:00
chahinebrini
d3dfa74cf8
feat(admin): Admin App initial commit + Deploy-Infrastructure
...
apps/admin/:
- Nuxt 4.1.3 + @nuxt/ui 4 + @nuxtjs/supabase, port 3017 staging
- 7 pages: index (59 LOC dashboard), login (72 LOC), auth/confirm, plus stubs
für domains/users/stats/moderation (14-17 LOC each, content für separate
Phase 2 Session)
- composables/useAdminAuth.ts: Supabase login + verifyAdminRole hook
- middleware/admin-auth.ts: route guard (Phase 3 backend-check ready)
- layouts/default.vue, app.vue, README.md
- nuxt.config.ts: SSR=true, port 3017, dark-mode preference, Supabase
pkce-flow, runtimeConfig.adminSecret für Phase 3 backend-binding
Deploy-Infrastructure:
- .github/workflows/deploy-admin-staging.yml: build admin auf push to main mit
path-filter apps/admin/**, scp tar zu Server, atomic-mv + pm2 restart
- scripts/deploy-admin-from-artifact.sh: Server-side deploy (extract, atomic mv,
pm2 reload). Kein prisma-migrate (admin hat kein eigenes DB-Schema).
- apps/admin/start-admin-staging.sh: pm2 start-script mit Infisical-wrapper,
port 3017, mappt Infisical SUPABASE_URL/KEY auf NUXT_PUBLIC_*
- ecosystem.config.js: rebreak-admin-staging Eintrag (port 3017,
max_memory_restart 400M)
- ops/nginx/admin-staging.rebreak.org.conf: HTTP→HTTPS redirect, SSL paths,
proxy auf 127.0.0.1:3017, noindex header
Pending User-Actions für go-live:
1. DNS-A-Record admin.staging.rebreak.org → 49.13.55.22
2. SSL-cert via certbot (oder bestehender wildcard *.staging.rebreak.org)
3. nginx-config auf Server aktivieren (sudo cp + ln + reload)
4. pm2 initial start: pm2 start ecosystem.config.js --only rebreak-admin-staging
5. Infisical-secret ADMIN_SECRET (server-only, Phase 3 binding)
GH-Actions: keine neuen Secrets (nutzt bestehende HETZNER_SSH_KEY/HOST/USER)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 22:17:20 +02:00
chahinebrini
8f2b93f881
feat(profile): Avatar + Nickname edit-flow
...
User-Wunsch: auf Profile Avatar + Nickname ändern können. Avatar entweder
preset aus signup-list ODER eigene Foto mit cropper.
New files:
- app/profile/edit.tsx — vollständiger Edit-Screen (Avatar-Gallery + Photo-Picker
+ Nickname TextInput + Save-Button)
- lib/avatars.ts — HERO_AVATARS preset-list (matched mit Nuxt-app Signup) +
getAvatarUrl helper
- lib/resolveAvatar.ts — resolveAvatar(avatarId, nickname): URL für
preset-id ODER fallback auf nickname-initial-tile
Profile-Page wiring:
- Avatar-Tap + Nickname-Tap pushen jetzt zu /profile/edit (statt Alert-stub)
- Nach successful save: useMe.reload() + router.back()
Edit-Flow:
- Preset (HERO_AVATARS, 12 items): tap-grid mit selected-State + brand-Border
- Eigenes Photo: expo-image-picker mit allowsEditing+aspect[1,1] (OS-nativer
Crop-Dialog), expo-file-system/legacy für base64-Konvertierung, upload via
POST /api/avatar/upload (writes Supabase-Storage rebreak-avatars + updated
Profile)
- Save: PATCH /api/auth/me { nickname, avatar }
i18n: profile.edit_* keys DE+EN
Backend-API:
- PATCH /api/auth/me — existiert (apps/admin/composables nicht — backend!)
- POST /api/avatar/upload — existiert
TS-fixes:
- expo-file-system → /legacy import (SDK 54 breaking change, siehe Task #14 )
- ?? + || mixing fixed mit klammern
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 22:15:13 +02:00