docs: map existing codebase

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 17:50:10 +02:00
parent 7f776298a9
commit ce7cd19fef
7 changed files with 658 additions and 0 deletions
+119
View File
@@ -0,0 +1,119 @@
# External Integrations
**Analysis Date:** 2026-04-10
## APIs & External Services
**Analytics:**
- Google Analytics / Google Tag Manager via `nuxt-gtag` ^4.1.0
- SDK/Client: `nuxt-gtag` Nuxt module
- Auth: `NUXT_PUBLIC_GTAG_ID` env var (public runtime config)
- Enabled only in production: `enabled: import.meta.env.NODE_ENV === 'production'`
- Config in `nuxt.config.ts` under `gtag:` and `runtimeConfig.public.gtag`
## Data Storage
**Databases:**
- None — all portfolio data is static (TypeScript data files in `app/data/`)
**File Storage:**
- Local filesystem only — images served from `public/` or via `@nuxt/image`
**Caching:**
- None — Nuxt SSR per-request rendering
## Authentication & Identity
**Auth Provider:**
- None — no user authentication required for this portfolio site
## Email
**SMTP Email (Contact Form):**
- Provider: Any SMTP-compatible server (configured at runtime)
- Implementation: `nodemailer` ^8.0.5 in server API route `app/api/contact.post.ts`
- Validation: `zod` ^4.3.6 validates request body server-side
- Auth env vars:
- `NUXT_SMTP_HOST` - SMTP server hostname
- `NUXT_SMTP_USER` - SMTP credentials username
- `NUXT_SMTP_PASS` - SMTP credentials password
- `NUXT_SMTP_TO` - Destination email address for contact messages
## SEO & Discoverability
**Sitemap:**
- `@nuxtjs/sitemap` ^8.0.12 — automatic XML sitemap generation
- Base URL: `https://killiandalcin.fr` (configured in `nuxt.config.ts` under `site:`)
- Site name: "Killian' DAL-CIN - Developpeur Full Stack"
## Monitoring & Observability
**Error Tracking:**
- None detected
**Logs:**
- Standard Node.js stdout/stderr (captured by Docker/host)
## CI/CD & Deployment
**Hosting:**
- Self-hosted Docker container on VPS
- Image: `node:22-alpine` (multi-stage build)
- Container port: 3000
- Reverse proxy: Traefik
- TLS via Let's Encrypt (`certresolver=public`)
- Wildcard cert covering `killiandalcin.fr` and `*.killiandalcin.fr`
- www → non-www permanent redirect middleware
- Config via Docker labels in `docker-compose.yml`
**CI Pipeline:**
- None detected — manual Docker image build and deploy
**Build process:**
1. `docker build` — runs `npm ci` + `nuxt build` in `node:22-alpine`
2. Output `.output/` copied to runtime stage
3. `docker-compose up` starts the container with runtime env vars
## Internationalization
**i18n Provider:**
- `@nuxtjs/i18n` ^10.2.4
- Strategy: `prefix_except_default` (French at `/`, English at `/en/`)
- Default locale: `fr`
- Supported locales: `fr` (fr-FR), `en` (en-US)
- Locale files: `i18n/locales/fr.json`, `i18n/locales/en.json`
- Browser detection: cookie-based (`i18n_redirected`) for SSR safety
## Image Optimization
**Provider:**
- `@nuxt/image` ^2.0.0
- Default provider: local (no external image CDN configured)
- Images served from `public/`
## Webhooks & Callbacks
**Incoming:**
- `POST /api/contact` — contact form submission endpoint (`app/api/contact.post.ts`)
**Outgoing:**
- None
## Environment Configuration
**Required env vars (production):**
- `NUXT_SMTP_HOST` - SMTP server hostname
- `NUXT_SMTP_USER` - SMTP username
- `NUXT_SMTP_PASS` - SMTP password
- `NUXT_SMTP_TO` - Contact form recipient email
- `NUXT_PUBLIC_GTAG_ID` - Google Analytics tag ID
- `PORTFOLIO_URL` - Primary domain (used in Traefik labels)
- `PORTFOLIO_URL_WWW` - WWW variant (used in Traefik www-redirect rule)
**Secrets location:**
- Passed as Docker environment variables at runtime (not committed to repo)
- `docker-compose.yml` reads from host environment via `${VAR_NAME}` syntax
---
*Integration audit: 2026-04-10*