chore(ops): harden deployment and runtime setup
This commit is contained in:
parent
1d7e7c41c9
commit
c35bd5877e
30 changed files with 534 additions and 61 deletions
125
README.md
125
README.md
|
|
@ -13,6 +13,8 @@ Eigenständige öffentliche Firmenwebsite für Funktechnik Schubert. Dieses Proj
|
|||
- Nginx/Reverse-Proxy-fähig
|
||||
- SEO Metadata, Sitemap und robots.txt
|
||||
|
||||
Version: `0.2.2`
|
||||
|
||||
## Seiten
|
||||
|
||||
- `/` Startseite
|
||||
|
|
@ -38,6 +40,7 @@ Eigenständige öffentliche Firmenwebsite für Funktechnik Schubert. Dieses Proj
|
|||
|
||||
```bash
|
||||
npm install
|
||||
cp .env.example .env
|
||||
npm run dev
|
||||
```
|
||||
|
||||
|
|
@ -47,6 +50,14 @@ Die Website läuft lokal unter:
|
|||
http://localhost:3010
|
||||
```
|
||||
|
||||
Für den Admin-Bereich müssen in `.env` mindestens gesetzt sein:
|
||||
|
||||
```text
|
||||
ADMIN_EMAIL
|
||||
ADMIN_PASSWORD
|
||||
ADMIN_SESSION_SECRET
|
||||
```
|
||||
|
||||
## Checks
|
||||
|
||||
```bash
|
||||
|
|
@ -73,6 +84,14 @@ Port:
|
|||
3010:3010
|
||||
```
|
||||
|
||||
Die Runtime-Daten werden über Docker-Volumes gespeichert:
|
||||
|
||||
- `funktechnik-data` → `/app/data`
|
||||
- `funktechnik-uploads` → `/app/public/uploads/images`
|
||||
- `funktechnik-next-cache` → `/app/.next/cache`
|
||||
|
||||
Dadurch sind keine manuellen `chmod`- oder `chown`-Befehle notwendig.
|
||||
|
||||
## Umgebung
|
||||
|
||||
`.env.example` kopieren:
|
||||
|
|
@ -83,13 +102,13 @@ cp .env.example .env
|
|||
|
||||
Variablen:
|
||||
|
||||
- `NEXT_PUBLIC_SITE_URL`
|
||||
- `ADMIN_EMAIL`
|
||||
- `ADMIN_PASSWORD`
|
||||
- `ADMIN_SESSION_SECRET`
|
||||
- `AUTH_COOKIE_SECURE`
|
||||
- `OLYMPUS_INTAKE_API_URL`
|
||||
- `OLYMPUS_INTAKE_API_TOKEN`
|
||||
- `NEXT_PUBLIC_SITE_URL`: öffentliche Basis-URL für SEO, Sitemap und Metadaten
|
||||
- `ADMIN_EMAIL`: Admin-Login E-Mail
|
||||
- `ADMIN_PASSWORD`: Admin-Login Passwort
|
||||
- `ADMIN_SESSION_SECRET`: langer Zufallswert zum Signieren der Admin-Session
|
||||
- `AUTH_COOKIE_SECURE`: `true` in Produktion mit HTTPS, lokal `false`
|
||||
- `OLYMPUS_INTAKE_API_URL`: vorbereitet für spätere serverseitige Olympus-Anbindung
|
||||
- `OLYMPUS_INTAKE_API_TOKEN`: vorbereitet für spätere serverseitige Olympus-Anbindung
|
||||
|
||||
Die Olympus-Variablen sind nur für eine spätere serverseitige Integration vorbereitet. Sie werden nicht im Browser verwendet.
|
||||
|
||||
|
|
@ -106,6 +125,7 @@ Für lokale Entwicklung kann `AUTH_COOKIE_SECURE=false` bleiben. Produktiv muss
|
|||
- `POST /api/admin/settings`
|
||||
- `POST /api/admin/smtp`
|
||||
- `GET/POST /api/admin/media`
|
||||
- `GET /api/health`
|
||||
|
||||
Aktuell validieren die Routen serverseitig, geben klare JSON-Antworten zurück und schreiben nur technische Metadaten in Server-Logs. Es werden keine Nachrichteninhalte oder Tokens geloggt. Kontakt- und Reparaturanfragen werden lokal unter `data/*.json` gespeichert und nicht versioniert.
|
||||
|
||||
|
|
@ -127,6 +147,97 @@ Funktionen:
|
|||
|
||||
SMTP-Versand, Publishing von Website-Inhalten und Olympus-Übernahme sind bewusst noch nicht aktiv gekoppelt.
|
||||
|
||||
## Runtime Data
|
||||
|
||||
Im Repository liegen nur:
|
||||
|
||||
```text
|
||||
data/.gitkeep
|
||||
data/contact-inquiries.example.json
|
||||
data/repair-inquiries.example.json
|
||||
```
|
||||
|
||||
Echte Runtime-Dateien werden nicht committed:
|
||||
|
||||
```text
|
||||
data/contact-inquiries.json
|
||||
data/repair-inquiries.json
|
||||
data/site-settings.json
|
||||
data/smtp-settings.json
|
||||
```
|
||||
|
||||
Uploads unter `public/uploads/images/` werden ebenfalls nicht committed.
|
||||
|
||||
## Healthcheck
|
||||
|
||||
```bash
|
||||
scripts/healthcheck.sh
|
||||
```
|
||||
|
||||
Oder direkt:
|
||||
|
||||
```bash
|
||||
curl http://localhost:3010/api/health
|
||||
```
|
||||
|
||||
Antwort:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"version": "0.2.2",
|
||||
"storage": "ok",
|
||||
"admin": "configured",
|
||||
"timestamp": "..."
|
||||
}
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
```bash
|
||||
scripts/deploy.sh
|
||||
```
|
||||
|
||||
Das Skript führt aus:
|
||||
|
||||
- `docker compose config`
|
||||
- `docker compose build`
|
||||
- `docker compose up -d`
|
||||
- Healthcheck über `/api/health`
|
||||
|
||||
Produktiv muss die `.env` auf dem Zielsystem gepflegt werden. Secrets werden nicht ins Repository aufgenommen.
|
||||
|
||||
## Update
|
||||
|
||||
```bash
|
||||
git pull
|
||||
docker compose config
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
scripts/healthcheck.sh
|
||||
```
|
||||
|
||||
## Backup
|
||||
|
||||
```bash
|
||||
scripts/backup.sh
|
||||
```
|
||||
|
||||
Das Backup enthält `data/` und `public/uploads/`. Die `.env` wird bewusst nicht automatisch gesichert. Sie muss separat sicher abgelegt werden.
|
||||
|
||||
## Restore
|
||||
|
||||
```bash
|
||||
scripts/restore.sh backups/funktechnik-data-YYYYMMDD-HHMMSS.tar.gz
|
||||
```
|
||||
|
||||
Danach Container neu starten:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
scripts/healthcheck.sh
|
||||
```
|
||||
|
||||
## Nginx
|
||||
|
||||
Siehe `nginx.example.conf`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue