- infra/compose/nats.yml: NATS server with JetStream, persistence volume, healthcheck - infra/compose/dapr.yml: Dapr placement service for sidecar coordination - infra/dapr/: Dapr global config, pubsub component (NATS), statestore (Redis) - infra/compose/scraper.yml: add Dapr sidecar container + depends_on nats/dapr - docs/add-dapr-service.md: guide for integrating Dapr into new services - docs/add-new-app.md: add Dapr sidecar step - ARCHITECTURE.md: add NATS/Dapr to infra table + service mesh diagram - infra/README.md: update layout and deployment order - deploy-docker.yml: add nats.yml + dapr.yml to ALL_COMPOSE_FILES Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.9 KiB
Menambahkan Aplikasi Baru ke Deployment
Dokumen ini menjelaskan langkah menambahkan service baru ke asepharyana-hub. Root repo berfungsi sebagai hub: source aplikasi berada di apps/<nama-app> sebagai submodule, sedangkan Docker Compose, Traefik, dan workflow deploy tetap berada di root repo.
1. Buat repo aplikasi
Buat repo baru di GitHub dengan pola nama:
https://github.com/asepharyana/asepharyana-hub-<nama-app>.git
Lalu tambahkan ke root hub sebagai submodule:
git submodule add https://github.com/asepharyana/asepharyana-hub-<nama-app>.git apps/<nama-app>
git submodule update --init --recursive
2. Tambahkan Dockerfile
Tambahkan Dockerfile runtime di infra/docker/<nama-app>.Dockerfile.
Gunakan root repo sebagai build context agar Dockerfile bisa mengakses submodule path:
docker build -f infra/docker/<nama-app>.Dockerfile -t <nama-app>:local .
3. Tambahkan Compose file
Buat infra/compose/<nama-app>.yml:
services:
<nama-app>:
container_name: <nama-app>
image: ghcr.io/asepharyana/asepharyana-hub/<nama-app>:sha-<short-sha>
restart: always
networks:
app-shared-net:
aliases:
- <nama-app>
env_file:
- ../../.env
networks:
app-shared-net:
name: app-shared-net
external: true
Gunakan app-shared-net agar service dapat diakses oleh Traefik dan service lain.
3.5. Tambahkan Dapr sidecar (wajib untuk pub/sub)
Setiap service yang ingin menggunakan Dapr pub/sub atau service invocation harus punya sidecar.
Tambah di infra/compose/<nama-app>.yml:
<nama-app>-dapr:
container_name: <nama-app>-dapr
image: daprio/daprd:latest
restart: always
depends_on:
dapr-placement:
condition: service_healthy
nats:
condition: service_healthy
networks:
- app-shared-net
command:
- './daprd'
- '--app-id=<nama-app>'
- '--app-port=<port>'
- '--dapr-http-port=3500'
- '--dapr-grpc-port=50001'
- '--placement-host-address=dapr-placement:50005'
- '--components-path=/components'
volumes:
- ../../infra/dapr/components:/components
Pastikan juga app container punya depends_on ke dapr-placement dan nats:
depends_on:
dapr-placement:
condition: service_healthy
nats:
condition: service_healthy
4. Tambahkan route Traefik
Update infra/traefik/dynamic/apps.yaml:
http:
routers:
<nama-app>:
rule: 'Host(`<subdomain>.asepharyana.my.id`) || Host(`<subdomain>.asepharyana.web.id`)'
entryPoints:
- websecure
tls: {}
middlewares:
- common-chain@file
service: <nama-app>-service
services:
<nama-app>-service:
loadBalancer:
servers:
- url: 'http://<nama-app>:<port>'
5. Update workflow build
Update .github/workflows/docker-build-push.yml:
- Tambahkan path detection untuk
apps/<nama-app>daninfra/docker/<nama-app>.Dockerfile. - Tambahkan service ke matrix build.
- Tambahkan mapping Dockerfile di step
Docker metadata. - Tambahkan mapping compose file dan submodule path di step
Update tags and submodules.
6. Update workflow deploy
Tambahkan compose file baru ke ALL_COMPOSE_FILES di .github/workflows/deploy-docker.yml:
infra/compose/<nama-app>.yml
7. Update dokumentasi
Update file berikut bila service baru mengubah arsitektur publik:
README.mdARCHITECTURE.mdinfra/README.md.gitmodules
8. Validasi
Jalankan validasi YAML dan compose rendering:
python - <<'PY'
import pathlib, yaml
for path in pathlib.Path('infra').rglob('*.yml'):
with path.open() as fh:
yaml.safe_load(fh)
print(f'OK {path}')
for path in pathlib.Path('infra').rglob('*.yaml'):
with path.open() as fh:
yaml.safe_load(fh)
print(f'OK {path}')
PY
for f in infra/compose/*.yml; do
docker compose -f "$f" config >/dev/null && echo "OK $f"
done