Files
asepharyana-hub/docs/add-new-app.md
T
asepharyanaandClaude Opus 4.8 ea168b4b20 feat: add NATS + Dapr infrastructure for event-driven architecture
- 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>
2026-07-21 17:26:02 +07:00

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:

  1. Tambahkan path detection untuk apps/<nama-app> dan infra/docker/<nama-app>.Dockerfile.
  2. Tambahkan service ke matrix build.
  3. Tambahkan mapping Dockerfile di step Docker metadata.
  4. 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.md
  • ARCHITECTURE.md
  • infra/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