GH GambleHub

ტექნოლოგიები და ინფრასტრუქტურა Docker Compose და Dev გარემოცვა

Docker Compose და Dev გარემო

1) რატომ არის კომპოზიცია

Docker Commose არის სწრაფი გზა პროდ-დასტის რეპლიკის იდაყვის/CI: პროგრამები, BD, რიგები, ქეში, საპირისპირო მარიონეტული, მოქნილი სერვისები. მიზნები:
  • პარიტეტი გაყიდვით (სურათები, ცვლადები, ქსელები) ნაკლებად „მუშაობს ჩემთან“.
  • სწრაფი დასაწყისი დამწყებთათვის არის 'make up' და ბრძოლა.
  • დეველოპერის/ფილიალის იზოლირებული სტენდები - პარალელური მუშაობა კონფლიქტების გარეშე.
  • ინტეგრაციის ტესტები რეალურ დამოკიდებულებაზე.

2) საცავის ძირითადი სტრუქტურა


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 (опционально)
რეკომენდაციები:
  • compose. yaml - აღწერს „ჩონჩხი“ (სერვისები, ქსელები, ტომი) იგივეა, რაც dev/CI.
  • override - მხოლოდ ადგილობრივი რედაქტირება: დირექტორიების მაპინგები, პორტები, debug დროშები.
  • .env. example - დეველოპერი ასლებს '.env- ში და ცვლის მნიშვნელობებს.

3) ჩარჩო. yaml (მაგალითი)

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: {}
ძირითადი წერტილები:
  • Traefik/NGINX, როგორც gateway: უახლოვდება Routing სქემას გაყიდვასთან.
  • Healthcheck და depends _ on 'condition: service _ healthy' (v3-ში waiting სკრიპტების საშუალებით) არის შეკვეთილი დასაწყისი.
  • Volumes persistence (BD/ქეში) და bind-mount კოდი (ცხელი-reload).

4) პროფილები და რამდენიმე ფაილი

Profiles ('profiles: [dev, ci, extras]') მოიცავს/გამორიცხავს სერვისებს ('docker compose -profile extras up-d').

რამდენიმე ფაილი:
  • `docker compose -f compose. yaml -f compose. dev. yaml up '- კონფიგურაციის შერწყმა.
ტიპიური ნაკრები:
  • `compose. yaml '- ბაზა.
  • `compose. dev. yaml '- bind-mounty, debag, icheflagi.
  • `compose. extras. yaml '- ინსტრუმენტული (Grafana, pgAdmin, Kafdrop).
  • `compose. ci. yaml '- „თავი გრაფიკის გარეშე“, bind-mounts- ის გარეშე.

5) ცვლადი, საიდუმლოებები და პარამეტრები

.env - ცვლადის ზოგადი წყარო: მასპინძლები, ტესტის მონაცემთა ბაზის კრედიტები, დროშები.

ჩვენ არ გვაქვს საიდუმლოებები dev- ში აშკარა ფორმით; ჩვენ ვიყენებთ:
  • ადგილობრივი dummy საიდუმლოებები (დანამატის გასაღებები),
  • ინტეგრაცია skinny-Vault/SOPS- ით განსაკუთრებით მგრძნობიარე.
  • პრინციპი: მინიმალური საჭირო მონაცემები. PAN/PII - ნიშნები/ფიქსაცია.

6) შეკრება და სიჩქარე

6. 1 Multi-stage + BuildKit

Dockerfile სამიზნეებით 'base', 'dev', 'medel'; საერთო cache-layer დამოკიდებულებისთვის.
ჩართეთ BuildKit: 'DOCKER _ BUILDKIT = 1' (ან კონფისკაციაში).
ქეშირება: '-mount = ტიპი = cache, target =/root/.cache/...' pip/npm/maven.

6. 2 სწრაფი ციკლი

Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
ცალკეული target dev შეკრება მხოლოდ საჭირო.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.

მაკეფილის მაგალითი:
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) BD, მიგრაცია, სეირნობა

მიგრაცია (Flyway/Liquibase/Alembic/Prisma) იწყება 'db' - ის დაწყების შემდეგ (healthcheck- ის მოლოდინი).
სიდინგი: ცალკეული კონტეინერი 'თესლი' ფიქსირებით; განმეორებითი და idempotent.
მონაცემთა ჭურვები: ტომი 'pgdata' შეგიძლიათ ჩამოაგდოთ/აღადგინოთ 'reset-db სკრიპტით. sh`.


8) ბროკერები, ქეში, CDC

Kafka/Rabbit/Redpanda - როგორც გაყიდვაში (მინიმალური კონფიგურაცია).
Redis ერთად AOF შედის რეალისტიკისთვის.
CDC კონექტორები (სურვილისამებრ): Debezium ცალკეულ სერვისში ანალიტიკოსების ინტეგრაციის ტესტებისთვის.


9) გარე მომწოდებლების Mokes

WireMock/Prism for REST, MockServer რთული სცენარებისთვის.
Mailhog/SMTP4Dev წერილებისთვის.
Localstack/MinIO ღრუბლოვანი სვეტებისა და S3 თავსებადობისთვის.
პოლიტიკა: ყველა გარე PSP/KYC/KMS - პერკუსიის მეშვეობით კონტრაქტებით (OpenAPI) და არა „ინტერნეტით“.


10) საპირისპირო მარიონეტული და TLS

Traefik/NGINX ანაწილებს მომსახურებებს ადგილობრივ დომენებზე ('test', '.local'):
  • `api. local. test`, `mockpsp. local. test`.
  • TLS: mkcert, ადგილობრივი სანდო სერტიფიკატის გასაცემად, HSTS/Secure-cookies- ის შესამოწმებლად.
  • Sticky სესიები მოიცავს მხოლოდ იმ შემთხვევებს, სადაც ეს მართალია.

11) დეველოპერის პროფილები: Node/Python/Java

Node: mount 'node _ modules' როგორც ქეში (volume) ინსტალაციის დაჩქარების მიზნით; 'CHOKIDAR _ USEPOLING = 1' Windows/WSL.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C-o' + დამოკიდებულების ფენა.


12) ტესტები და ხარისხი

ჩვენ ვატარებთ ინტეგრაციის ტესტებს Compose ქსელის შიგნით: 'docker compose run test'.
Testcontainers (JVM/Node/Python/.NET) არის კარგი ვარიანტი unit ინტეგრაციისთვის სრული დასტის გარეშე.
კონტრაქტის ტესტები მაკა-კით - კარიბჭე CI- ში.
Linters/Pre commit: გაშვება კონტეინერში განმეორებით.


13) მოწყობილობები და „IDE კოდი“

`devcontainer. json 'აფიქსირებს ნაგვის გამოსახულებას (CLI, SDK, ლინტერები), ამონტაჟებს პროექტს, ახდენს' postCreateCommand '- ს.
მოგება: იგივე ინსტრუმენტები, მასპინძლის „დაბინძურება“, ახალი მანქანა - მზად არის წუთში.


14) უსაფრთხოება dev- ში

ოთახის გარეშე განაცხადის სურათებში; 'readOnlyRootFilesystem', როდესაც შესაძლებელია.
არ არსებობს საბრძოლო გასაღებები/საიდუმლოებები, თუნდაც დროებით.
ლოგოები - PII/PAN გარეშე; შენიღბვა ფორმატის დონეზე.
პორტებისა და ქსელების გაჯანსაღება: გარე დაშვება მხოლოდ gateway- ით.


15) FinOps/შესრულება ლოკალში

შეზღუდეთ რესურსები: 'deploy. resources. limits '(კომპოზიცია ნაწილობრივ კითხულობს, მაგრამ ეხმარება დისციპლინას).
შეამცირეთ გულშემატკივარი (ნაკლები ნაგულისხმევი მომსახურება; extras - პროფილები).
Kash BuildKit და volume ქეში პაკეტების მენეჯერებისთვის.


16) CI с Compose

გამოიყენეთ იგივე 'კომპოზიცია. yaml` + `compose. ci. yaml 'bind-mounts- ის გარეშე.
დამოკიდებულების ქეში ჰგავს attachable volumes ჯობებს/ფენებს შორის.
პარალელური ჯობი: 'name:' კომპოზიციაში განსხვავებულია (ან ფილიალის პრეფიქსი) ისე, რომ სტენდები არ კონფლიქტდება.


17) ტრაბლშუტინგი

'docker compose ps '/' logs -f '/' exec' - ძირითადი დიაგნოზი.
შეამოწმეთ DNS კომპონენტის ქსელში (მომსახურება სახელით).
თუ bind-mount „ანელებს“ macOS/Windows - ': cached '/': delegated' ან Mutagen/virtiofs.
Healthcheck არის „მწვანე“, მაგრამ მომსახურება „მკვდარია“: შეამოწმეთ თქვენი მადა და მიგრაციის რიგი.


18) განხორციელების შემოწმების სია

1. ძირითადი დასტის (gateway, app, db, cache, queue) კომპოზიციაში. yaml.
2. ადგილობრივი რედაქტირება - override (v.gitignore).
3..env. example არის სრული და შესაბამისი; 'make bootstrap' ასლის '.env'.
4. Healthchecks და BD/მიგრაციის მოლოდინის სკრიპტი.
5. WireMock/Localstack/MinIO გარე პროვაიდერებისთვის.
6. სიდინგი და მიგრაცია, როგორც ბრძანებები 'make seed/migrate'.
7. BuildKit + multi სცენა, დამოკიდებულების ქეში.
8. Devcontainers/Makefile სწრაფი დაწყებისთვის.
9. პროფილები 'extras' ინსტრუმენტებისთვის (Grafana/pgAdmin/Kafdrop).
10. CI იყენებს იგივე კომპოზიციას (+ ci-override).


19) ანტი შაბლონები

„მონსტრი“ 40 სერვისზე, ყოველთვის დაწყებულია: ჩართეთ პროფილები.
მკაცრად დაფარული პორტები, რომლებიც ეწინააღმდეგებიან დეველოპერებს.
საიდუმლოებები/გასაღებები Git ან '.env. example`.
დამოკიდებულია ტესტების „ინტერნეტზე“ (რეალური PSP/KYC).
Healthcheck/მოლოდინების არარსებობა არის მიგრაციისა და დაწყების რბოლა.
სიდინგის არარსებობა - მფრინავი ინტეგრაციის ტესტები.


20) შედეგი

კომპოზიცია არის განვითარების სიჩქარის ძრავა: ერთი ფაილი აღწერს თქვენს მომსახურების სამყაროს, ხოლო პროფილები/overraids იძლევა მოქნილობას. შეინარჩუნეთ პარიტეტი გაყიდვით, ავტომატურად მოაწყეთ სავარძელი და მიგრაცია, შეინარჩუნეთ ხიდები და TLS „როგორც ბრძოლაში“, დააჩქარეთ BuildKit- ის შეკრება - და მიიღებთ ადგილობრივ გარემოს, რომელშიც მოსახერხებელია მუშაობა, მარტივად ტესტირება და უსაფრთხოდ რეპროდუცირება iGaming/fintech გაყიდვების სცენარები.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.