feat(appliance): initial release of MERICA standalone appliance v1.0.0

This commit is contained in:
2026-10-21 17:16:46 +07:00
commit 851be0cda7
144 changed files with 31135 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
# ==============================================================================
# MERICA PRODUCTION APPLIANCE — DOCKER COMPOSE CONFIGURATION
# ==============================================================================
# Ultra-lean decoupled architecture containing strictly:
# 1. MERICA (Unified Nginx + FastAPI + Vite Frontend Appliance on Port 14000)
# 2. Apache Airflow 3 (API Server, Scheduler, DAG Processor with Git DAG Bundles)
#
# Clean production deployment:
# - Zero test suites or developer tooling
# - Zero internal database bloat (PostgreSQL MetaDB is configured externally via .env)
# - All host ports mapped cleanly to 14000 series
# ==============================================================================
x-airflow-common:
&airflow-common
image: ${AIRFLOW_IMAGE:-registry.sicabe.com/airflow:3.3.2-om203-ol}
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
&airflow-common-env
# [NOTE REGISTRY IMAGE BUILD]: Paket berikut disuntikkan dinamis via _PIP_ADDITIONAL_REQUIREMENTS.
# Harap sertakan RUN pip install astronomer-cosmos==1.15.1 saat update image registry.sicabe.com/airflow.
_PIP_ADDITIONAL_REQUIREMENTS: '${AIRFLOW_ADDITIONAL_REQUIREMENTS:-apache-airflow-providers-git==1.0.0 dbt-postgres==1.11.0 astronomer-cosmos==1.15.1}'
DBT_PROFILE_NAME: '${DBT_PROFILE_NAME:-dlh_postgres}'
AIRFLOW__CORE__EXECUTOR: '${AIRFLOW_EXECUTOR:-LocalExecutor}'
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: 'postgresql+psycopg2://${POSTGRES_USER:-dlh_user}:${POSTGRES_PASSWORD:-dlh_password}@${POSTGRES_HOST:-host.docker.internal}:${POSTGRES_PORT:-14432}/${POSTGRES_DB:-dlh_lakehouse}'
AIRFLOW__CORE__FERNET_KEY: '${AIRFLOW__CORE__FERNET_KEY:-FnhjRG8hCAWFi7xAcd1OPCf-t1JfZQmaiMT9Cjp0h6U=}'
AIRFLOW__CORE__SECRET_KEY: '${AIRFLOW_SECRET_KEY:-secret-key-dlh-12345678901234567890123456789012}'
AIRFLOW__API_SERVER__JWT_SECRET: '${AIRFLOW_SECRET_KEY:-secret-key-dlh-12345678901234567890123456789012}'
AIRFLOW__API_AUTH__JWT_SECRET: '${AIRFLOW_SECRET_KEY:-secret-key-dlh-12345678901234567890123456789012}'
AIRFLOW__API_AUTH__SECRET_KEY: '${AIRFLOW_SECRET_KEY:-secret-key-dlh-12345678901234567890123456789012}'
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: '${AIRFLOW_DAGS_ARE_PAUSED_AT_CREATION:-false}'
AIRFLOW__CORE__LOAD_EXAMPLES: '${AIRFLOW_LOAD_EXAMPLES:-false}'
AIRFLOW__CORE__AUTH_MANAGER: 'airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager'
# OpenLineage & Metadata Governance
AIRFLOW__OPENLINEAGE__DISABLED: '${OPENLINEAGE_DISABLED:-False}'
AIRFLOW__OPENLINEAGE__URL: '${OPENLINEAGE_URL:-http://host.docker.internal:14585/api/v1/openlineage/lineage}'
AIRFLOW__OPENLINEAGE__NAMESPACE: '${OPENLINEAGE_NAMESPACE:-dlh-airflow-prod}'
OPENMETADATA_HOST: '${OPENMETADATA_HOST:-http://host.docker.internal:14585}'
ENABLE_OPENMETADATA_SYNC: '${ENABLE_OPENMETADATA_SYNC:-false}'
# Git DAG Bundle Configuration (AIP-66)
AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_STORAGE_PATH: '${AIRFLOW_DAG_BUNDLE_STORAGE_PATH:-/opt/airflow/dag_bundles}'
AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_CONFIG_LIST: >-
[
{
"name": "${GIT_PIPELINE_BUNDLE_NAME:-merica-pipeline}",
"classpath": "airflow.providers.git.bundles.git.GitDagBundle",
"kwargs": {
"repo_url": "${GIT_PIPELINE_REPO_URL:-https://repo.sicabe.com/merica-dlh/merica-pipelines.git}",
"tracking_ref": "${GIT_PIPELINE_REPO_BRANCH:-main}",
"subdir": "${GIT_PIPELINE_REPO_SUBDIR:-dags}",
"refresh_interval": ${AIRFLOW_DAG_BUNDLE_REFRESH_INTERVAL:-30}
}
}
]
POSTGRES_HOST: '${POSTGRES_HOST:-host.docker.internal}'
POSTGRES_PORT: '${POSTGRES_PORT:-14432}'
POSTGRES_DB: '${POSTGRES_DB:-dlh_lakehouse}'
POSTGRES_USER: '${POSTGRES_USER:-dlh_user}'
POSTGRES_PASSWORD: '${POSTGRES_PASSWORD:-dlh_password}'
volumes:
- airflow_dag_bundles:/opt/airflow/dag_bundles
networks:
- merica-appliance-net
services:
# ----------------------------------------------------------------------------
# 1. MERICA Unified Appliance (Frontend UI + Backend API Gateway)
# ----------------------------------------------------------------------------
merica:
build: .
image: ${MERICA_IMAGE:-registry.sicabe.com/merica:1.0.0}
container_name: merica
restart: always
ports:
- "${MERICA_PORT:-14000}:80"
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- AIRFLOW_API_URL=http://airflow-webserver:8080
- AIRFLOW_WEB_URL=http://localhost:${AIRFLOW_WEBSERVER_HOST_PORT:-14080}
- OPENMETADATA_HOST=${OPENMETADATA_HOST:-http://host.docker.internal:14585}
- OPENMETADATA_JWT_TOKEN=${OPENMETADATA_JWT_TOKEN:-}
- ENABLE_OPENMETADATA_SYNC=${ENABLE_OPENMETADATA_SYNC:-false}
- GOVERNANCE_DOMAIN=${GOVERNANCE_DOMAIN:-Lingkungan Hidup & Kehutanan}
- GOVERNANCE_OWNER_TEAM=${GOVERNANCE_OWNER_TEAM:-de_team_dlh}
- GOVERNANCE_OWNER_NAME=${GOVERNANCE_OWNER_NAME:-Data Engineering DLH}
- GOVERNANCE_TIER=${GOVERNANCE_TIER:-Tier.Tier1}
- GOVERNANCE_CERTIFICATION=${GOVERNANCE_CERTIFICATION:-Certification.Gold}
- POSTGRES_HOST=${POSTGRES_HOST:-host.docker.internal}
- POSTGRES_PORT=${POSTGRES_PORT:-14432}
- POSTGRES_DB=${POSTGRES_DB:-dlh_lakehouse}
- POSTGRES_USER=${POSTGRES_USER:-dlh_user}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-dlh_password}
volumes:
- airflow_dag_bundles:/opt/airflow/dag_bundles:ro
- studio_storage:/app/storage
- studio_data:/app/data
depends_on:
- airflow-webserver
networks:
- merica-appliance-net
# ----------------------------------------------------------------------------
# 2. Apache Airflow 3 Webserver / API Server
# ----------------------------------------------------------------------------
airflow-webserver:
<<: *airflow-common
container_name: merica-airflow-webserver
command: api-server
restart: always
ports:
- "${AIRFLOW_WEBSERVER_HOST_PORT:-14080}:8080"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
# ----------------------------------------------------------------------------
# 3. Apache Airflow 3 Scheduler
# ----------------------------------------------------------------------------
airflow-scheduler:
<<: *airflow-common
container_name: merica-airflow-scheduler
command: scheduler
restart: always
depends_on:
- airflow-webserver
# ----------------------------------------------------------------------------
# 4. Apache Airflow 3 DAG Processor (AIP-66 Git Sync Engine)
# ----------------------------------------------------------------------------
airflow-dag-processor:
<<: *airflow-common
container_name: merica-airflow-dag-processor
command: dag-processor
restart: always
depends_on:
- airflow-webserver
volumes:
airflow_dag_bundles:
studio_storage:
studio_data:
networks:
merica-appliance-net:
driver: bridge