Baseline standards: design, SOP, CI policy
This commit is contained in:
226
sop/container-deployment.md
Normal file
226
sop/container-deployment.md
Normal file
@ -0,0 +1,226 @@
|
||||
# SOP: Container Deployment (Makefile‑Driven)
|
||||
|
||||
**Status:** Operational
|
||||
**Geltungsbereich:** generisch, projekt‑ und technologieübergreifend
|
||||
|
||||
---
|
||||
|
||||
## Zweck
|
||||
Dieses Dokument definiert ein **verbindliches Standard Operating Procedure (SOP)** für containerbasierte Applikationen.
|
||||
|
||||
Ziel ist ein Deployment‑Ansatz, der:
|
||||
- reproduzierbar
|
||||
- sicher
|
||||
- nachvollziehbar
|
||||
- CI‑fähig
|
||||
- agentenfähig
|
||||
|
||||
ist – unabhängig von Projekt, Teamgröße oder Hosting‑Umgebung.
|
||||
|
||||
---
|
||||
|
||||
## Grundprinzip
|
||||
|
||||
Das Setup basiert auf einer **strikten Trennung von Verantwortlichkeiten**:
|
||||
|
||||
- **Konfiguration:** `.env`
|
||||
- **Orchestrierung:** Docker Compose
|
||||
- **Steuerung & Validierung:** Makefile
|
||||
- **Ausführung:** Container
|
||||
|
||||
Das **Makefile ist die einzige erlaubte Benutzerschnittstelle** und damit die Single Source of Truth.
|
||||
|
||||
---
|
||||
|
||||
## 0. Voraussetzungen & Systemanforderungen
|
||||
|
||||
### 0.1 Zielsystem
|
||||
- Linux (empfohlen)
|
||||
- Ubuntu ≥ 22.04
|
||||
- Debian ≥ 12
|
||||
- macOS / Windows (eingeschränkt, nicht offiziell supported)
|
||||
|
||||
### 0.2 Erforderliche Software
|
||||
| Tool | Mindestversion | Zweck |
|
||||
|-----|----------------|-------|
|
||||
| Docker Engine | ≥ 24.x | Container Runtime |
|
||||
| Docker Compose Plugin | ≥ 2.x | Orchestrierung |
|
||||
| GNU Make | ≥ 4.x | Steuerung & Validierung |
|
||||
| curl | aktuell | Healthchecks |
|
||||
| lsof / ss | systemabhängig | Port‑Prüfung |
|
||||
|
||||
### 0.3 Berechtigungen
|
||||
- Benutzer ist Mitglied der `docker`‑Gruppe **oder** darf Docker via sudo ausführen
|
||||
- Schreibrechte im Projektverzeichnis
|
||||
|
||||
---
|
||||
|
||||
## 1. Projektstruktur (Baseline)
|
||||
|
||||
```text
|
||||
project/
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
├── Makefile
|
||||
├── .env.example
|
||||
├── .env # lokal, nicht versioniert
|
||||
└── app/ # Anwendungscode
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Dockerfile – Image‑Definition
|
||||
|
||||
### Prinzip: Multi‑Stage Build
|
||||
|
||||
**Warum?**
|
||||
- kleinere Images
|
||||
- reduzierte Angriffsfläche
|
||||
- saubere Trennung von Build‑ und Runtime‑Abhängigkeiten
|
||||
|
||||
### Referenz‑Dockerfile (Beispiel)
|
||||
|
||||
```dockerfile
|
||||
# Stage 1: Build
|
||||
FROM node:18-alpine AS builder
|
||||
WORKDIR /build
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Stage 2: Runtime
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /build/dist ./dist
|
||||
COPY --from=builder /build/package*.json ./
|
||||
RUN npm install --omit=dev
|
||||
|
||||
RUN addgroup -S app && adduser -S app -G app
|
||||
USER app
|
||||
|
||||
EXPOSE 8080
|
||||
CMD ["node", "dist/server.js"]
|
||||
```
|
||||
|
||||
### Regeln
|
||||
- Build‑Tools gehören **nicht** ins Runtime‑Image
|
||||
- Runtime‑Container laufen **nicht als root**
|
||||
|
||||
---
|
||||
|
||||
## 3. docker‑compose.yml – Orchestrierung
|
||||
|
||||
Docker Compose beschreibt **ausschließlich den Zielzustand** der Laufzeitumgebung.
|
||||
|
||||
> Compose ist deklarativ. Keine Logik. Keine Prüfungen.
|
||||
|
||||
### Referenz
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "${PORT}:8080"
|
||||
environment:
|
||||
- APP_URL=http://localhost:${PORT}
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
```
|
||||
|
||||
### Regeln
|
||||
- Ports niemals hardcoden
|
||||
- Konfiguration ausschließlich über ENV
|
||||
- Healthcheck ist Pflicht
|
||||
|
||||
---
|
||||
|
||||
## 4. Makefile – Steuerung & Kontrolle
|
||||
|
||||
Das Makefile ist die **zentrale Kontrollinstanz**.
|
||||
|
||||
### Referenz
|
||||
|
||||
```make
|
||||
-include .env
|
||||
export
|
||||
|
||||
PORT ?= 8080
|
||||
|
||||
.PHONY: build check up up-safe down logs health
|
||||
|
||||
build:
|
||||
docker compose build
|
||||
|
||||
check:
|
||||
@docker compose version > /dev/null
|
||||
@test -f .env || (echo ".env missing" && exit 1)
|
||||
|
||||
up:
|
||||
docker compose up -d
|
||||
|
||||
up-safe: check
|
||||
$(MAKE) up
|
||||
|
||||
down:
|
||||
docker compose down
|
||||
|
||||
logs:
|
||||
docker compose logs -f
|
||||
|
||||
health:
|
||||
@docker inspect --format='{{json .State.Health.Status}}' \
|
||||
$$(docker compose ps -q app)
|
||||
```
|
||||
|
||||
### Zentrale Regeln
|
||||
- `make up-safe` ist der **einzige erlaubte Startpunkt**
|
||||
- Direkte Nutzung von `docker compose` ist untersagt
|
||||
|
||||
---
|
||||
|
||||
## 5. CI‑Gate‑Policy
|
||||
|
||||
Die CI nutzt **dieselben Prüfregeln** wie der lokale Preflight‑Check.
|
||||
|
||||
### Prüfungen
|
||||
- Dockerfile baubar
|
||||
- Compose valide
|
||||
- `.env.example` vollständig
|
||||
- keine Secrets im Repository
|
||||
- Build erfolgreich
|
||||
|
||||
### Regel
|
||||
> Merge oder Deployment nur bei grüner Pipeline.
|
||||
|
||||
---
|
||||
|
||||
## 6. Anti‑Patterns (verboten)
|
||||
|
||||
- direkter Aufruf von `docker compose up`
|
||||
- hardcodierte Ports
|
||||
- Logik im Compose‑File
|
||||
- Secrets im Repository
|
||||
- Root‑User im Runtime‑Container
|
||||
- fehlende Healthchecks
|
||||
|
||||
**Merksatz:**
|
||||
> Wenn etwas schneller geht, weil es Prüfungen umgeht – ist es falsch.
|
||||
|
||||
---
|
||||
|
||||
## Fazit
|
||||
|
||||
Dieses SOP definiert einen kontrollierten, sicheren und reproduzierbaren Weg für Container‑Deployments.
|
||||
|
||||
Kein Komfort auf Kosten von Stabilität.
|
||||
Kein Start ohne Prüfung.
|
||||
Keine Magie – nur Disziplin.
|
||||
|
||||
Reference in New Issue
Block a user