GH GambleHub

Technologie und Infrastruktur → Docker Compose und Dev-Umgebung

Docker Compose und Dev-Umgebung

1) Warum Compose

Docker Compose ist eine schnelle Möglichkeit, eine Replik eines Prod-Stacks in Locations/CIs zu heben: Apps, DBs, Warteschlangen, Caches, Reverse Proxy, Mock-Services. Die Ziele sind:
  • Parität mit dem Verkauf (Bilder, Variablen, Netzwerke) → weniger „funktioniert für mich“.
  • Ein schneller Start für Anfänger → „make up“ und in die Schlacht.
  • Isolierte Stände pro Entwickler/Filiale → paralleler Betrieb ohne Konflikte.
  • Integrationstests an realen Abhängigkeiten.

2) Grundlegende Repository-Struktur


project/
docker/
app/      # Dockerfile, скрипты web/      # Nginx/Traefik конфиги seed/      # сидеры/фикстуры compose.yaml       # общий базовый стек compose.override.yaml   # локальные оверрайды (в.gitignore)
compose.ci.yaml      # для CI
.env.example       # шаблон окружения
Makefile         # удобные цели devcontainer.json     # VS Code Dev Containers (опционально)
Empfehlungen:
  • compose. yaml - beschreibt das „Skelett“ (Dienste, Netzwerke, Volumes) das gleiche für dev/CI.
  • override - nur lokale Bearbeitungen: Verzeichnis-Mappings, Ports, Debug-Flags.
  • .env. example → der Entwickler kopiert in '.env' und ersetzt die Werte.

3) Compose-Rahmen. yaml (Beispiel)

yaml name: project services:
gateway:
image: traefik:v3 command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.dev.acme.tlschallenge=true"
ports: ["80:80", "443:443"]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro networks: [edge, core]

api:
build:
context:.
dockerfile: docker/app/Dockerfile target: dev env_file: [.env]
command:./scripts/dev-start.sh volumes:
-./:/app:cached depends_on: [db, redis, kafka]
labels:
- "traefik.http.routers.api.rule=Host(`${API_HOST}`)"
- "traefik.http.services.api.loadbalancer.server.port=8080"
networks: [core]

db:
image: postgres:16 environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: ${DB_NAME}
volumes:
- pgdata:/var/lib/postgresql/data healthcheck: {test: ["CMD-SHELL","pg_isready -U $$POSTGRES_USER"], interval: 5s, timeout: 3s, retries: 20}
networks: [core]

redis:
image: redis:7 command: ["redis-server","--appendonly","yes"]
volumes: [ "redisdata:/data" ]
networks: [core]

kafka:
image: bitnami/kafka:3 environment:
KAFKA_ENABLE_KRAFT: "yes"
KAFKA_CFG_PROCESS_ROLES: "controller,broker"
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 networks: [core]

mailhog:
image: mailhog/mailhog ports: ["8025:8025"]
networks: [core]

mock-psp:
image: wiremock/wiremock:3 command: ["--verbose","--global-response-templating"]
volumes: ["./docker/mocks/psp:/home/wiremock"]
labels:
- "traefik.http.routers.mockpsp.rule=Host(`${PSP_HOST}`)"
networks: [core]

volumes:
pgdata: {}
redisdata: {}

networks:
edge: {}
core: {}
Die wichtigsten Punkte:
  • Traefik/NGINX als Gateway: Bringt das Routing-Schema näher an die Produktion.
  • Healthcheck und depends_on mit 'condition: service_healthy' (in v3 über waiting-scripts) ist ein geordneter Start.
  • Volumes für Persistenz (DB/Cache) und Bind-Mount für Code (Hot-Reload).

4) Profile und mehrere Dateien

Profiles ('profiles: [dev, ci, extras]') aktivieren/eliminieren Dienste ('docker compose --profile extras up -d').

Mehrere Dateien:
  • `docker compose -f compose. yaml -f compose. dev. yaml up'- Zusammenführen von Konfigurationen.
Typischer Satz:
  • `compose. yaml 'ist die Basis.
  • `compose. dev. yaml'- bind-mounts, debag, ficheflags.
  • `compose. extras. yaml'- instrumental (Grafana, pgAdmin, Kafdrop).
  • `compose. ci. yaml'- „Kopf ohne Grafik“, ohne bind-mounts.

5) Variablen, Geheimnisse und Einstellungen

.env ist die gemeinsame Quelle von Variablen: Hosts, Credits von Test-DBs, Flags.

Geheimnisse in dev halten wir nicht explizit; Wir verwenden:
  • lokale Dummy-Geheimnisse (Stub-Schlüssel),
  • Integration mit skinny-Vault/SOPS für besonders sensible.
  • Das Prinzip: minimal benötigte Daten. PAN/PII - Token/Fiktionen.

6) Baugruppen und Geschwindigkeit

6. 1 Multi-stage + BuildKit

Dockerfile mit den Zielen 'base', 'dev', 'prod'; gemeinsamer Cache-Layer für Abhängigkeiten.
BuildKit aktivieren: 'DOCKER _ BUILDKIT = 1' (oder in config).
Caching: '--mount = type = cache, target =/root/.cache/...' für pip/npm/maven.

6. 2 Schneller Zyklus

Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Separates Dev-Target mit Montage nur des Gewünschten.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.

Beispiel für ein Makefile:
make
ENV?= dev up:
docker compose --profile $(ENV) up -d down:
docker compose down -v logs:
docker compose logs -f --tail=200 rebuild:
DOCKER_BUILDKIT=1 docker compose build --pull --no-cache api seed:
docker compose run --rm api./scripts/seed.sh migrate:
docker compose run --rm api./scripts/migrate.sh test:
docker compose -f compose.yaml -f compose.ci.yaml run --rm api./scripts/test.sh

7) DB, Migration, Siding

Migrationen (Flyway/Liquibase/Alembic/Prisma) werden durch ein Hook-Script nach dem Start von 'db' (Warten auf healthcheck) ausgelöst.
Siding: separater Container 'seed' mit Fikturen; wiederholbar und idempotent.
Daten-Snapshots: Das Volume' pgdata 'kann mit dem Skript' reset-db 'zurückgesetzt/wiederhergestellt werden. sh`.


8) Broker, Caches, CDC

Kafka/Rabbit/Redpanda - wie in der Produktion (minimale Configs).
Redis mit AOF aktiviert für Realismus.
CDC-Konnektoren (optional): Debezium in einem separaten Service für Analytics-Integrationstests.


9) Moki von externen Lieferanten

WireMock/Prism für REST, MockServer für komplexe Szenarien.
Mailhog/SMTP4Dev für Briefe.
Localstack/MinIO für Cloud-Stops und S3-Kompatibilität.
Richtlinie: Alle externen PSPs/KYCs/KMSs sind über einen Mock-Hub für Verträge (OpenAPI) und nicht „online“.


10) Reverse Proxy und TLS

Traefik/NGINX vergibt Dienstleistungen über lokale Domains („.test“, „.local“):
  • `api. local. test`, `mockpsp. local. test`.
  • TLS: mkcert für die Ausstellung eines vertrauenswürdigen lokalen Zertifikats zum Testen von HSTS/Secure-Cookies.
  • Aktivieren Sie Sticky-Sitzungen nur für Fälle, in denen es wirklich wichtig ist.

11) Entwicklungsprofile: Node/Python/Java

Node: mount 'node _ modules' als Cache (Volume), um die Installation zu beschleunigen; 'CHOKIDAR _ USEPOLLING = 1' unter Windows/WSL.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C -o' + -Ebene mit Abhängigkeiten.


12) Tests und Qualität

Wir fahren Integrationstests innerhalb des Compose-Netzwerks: 'docker compose run test'.
Testcontainer (für JVM/Node/Python/.NET) ist eine Choi-Option für Unit-Integration ohne Full-Stack.
Vertragstests mit dem Mock-Hub → Gate in CI.
Linters/Pre-commit: Starten Sie in einem Container für Wiederholbarkeit.


13) Devcontainer und „IDE-as-Code“

`devcontainer. json 'erfasst das Image von razrab (CLI, SDK, linters), mountet das Projekt, jagt' postCreateCommand'.
Profit: die gleichen Werkzeuge, nicht „verstopfen“ den Host, neue Maschine - bereit in Minuten.


14) Sicherheit in dev

Ohne root in den App-Images; 'readOnlyRootFilesystem' wann immer möglich.
Keine Kampfschlüssel/Geheimnisse, auch nicht vorübergehend.
Logs - ohne PII/PAN; Maskierung auf Formatterebene.
Trennung von Ports und Netzwerken: externer Zugriff nur über Gateway.


15) FinOps/Leistung in Lokalen

Ressourcen begrenzen: 'deploy. resources. limits'(Compose liest teilweise, hilft aber bei der Disziplin).
Reduzieren Sie das Fan-Out (weniger Standarddienste; extras - Profile).
BuildKit-Cache und Volume-Caches für Paketmanager.


16) CI с Compose

Verwenden Sie die gleichen 'compose. yaml` + `compose. ci. yaml 'ohne bind-mounts.
Abhängigkeitscaches sind wie attachable volumes zwischen Jobs/Layern.
Parallele Jobs: 'name:' in Compose ist anders (oder Präfix durch Zweig), damit die Stände nicht kollidieren.


17) Trablschuting

'docker compose ps '/' logs -f '/' exec' - grundlegende Diagnose.
Überprüfen Sie DNS im Compose-Netzwerk (Service by Name).
Wenn bind-mount auf macOS/Windows „verlangsamt“ -': cached '/': delegated 'oder Mutagen/virtiofs.
Healthcheck ist „grün“, aber der Service ist „tot“: Überprüfen Sie die „Bereitschaft“ Ihrer Apps und die Reihenfolge der Migrationen.


18) Checkliste Umsetzung

1. Der Basis-Stack (Gateway, api, db, cache, queue) in compose. yaml.
2. Lokale Bearbeitungen sind in override (v. gitignore).
3..env. Beispiel vollständig und aktuell; 'make bootstrap' kopiert es in '.env'.
4. Healthchecks und DB/Migrations-Warteskript.
5. WireMock/Localstack/MinIO für externe Anbieter.
6. Siding und Migrationen als Cmdlets' make seed/migrate'.
7. BuildKit + multi-stage, Abhängigkeitscaches.
8. Devcontainers/Makefile für einen schnellen Start.
9. 'extras' Profile für Werkzeuge (Grafana/pgAdmin/Kafdrop).
10. CI verwendet die gleiche compose (+ ci-override).


19) Anti-Muster

„Monster-compose“ auf 40 Dienste, immer läuft: Profile einschalten.
Hart genagelte Ports, die zwischen Entwicklern in Konflikt geraten.
Geheimnisse/Schlüssel in Git oder '.env. example`.
Abhängigkeit vom „Internet“ für Tests (echte PSP/KYC).
Mangel an Healthcheck/Erwartung - Rennen von Migrationen und Starts.
Fehlende Siding → flaky Integrationstests.


20) Das Ergebnis

Compose ist der Motor der Entwicklungsgeschwindigkeit: Eine Datei beschreibt Ihre Servicewelt und Profile/Overrides geben Flexibilität. Halten Sie die Parität mit dem Verkauf aufrecht, automatisieren Sie Siding und Migrationen, halten Sie Moki und TLS „wie im Kampf“, beschleunigen Sie BuildKit-Builds - und Sie erhalten eine lokale Umgebung, in der es bequem ist, zu arbeiten, einfach zu testen und iGaming-/Fintech-Verkaufsszenarien sicher zu reproduzieren.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.