#!/usr/bin/env bash # Path: Commands/Local/Dev/scripts/backend-stack.sh set -euo pipefail action=${1:-up} script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) project_root=$(cd -- "$script_dir/../../../.." && pwd) posix_root="$project_root/POSIX" backend_dir="$project_root/Backend" backend_bake="$backend_dir/docker-bake.hcl" env_dir="$project_root/Env" compose_file="$project_root/Docker/docker-compose.local.dev.yaml" runtime_dir="$backend_dir/tmp/dev" backend_image="moku/work-backend:dev" backend_go_pkg_volume="moku_work_backend_go_pkg" backend_go_build_volume="moku_work_backend_go_build" local_uid=$(id -u) local_gid=$(id -g) services=(web api worker) source "$script_dir/docker.sh" source "$script_dir/env.sh" source "$project_root/Commands/Local/scripts/common.sh" build_backend() { cd "$backend_dir" docker buildx bake -f "$backend_bake" dev } up_backend() { LOCAL_UID="$local_uid" LOCAL_GID="$local_gid" docker compose -f "$compose_file" up -d --remove-orphans --force-recreate "${services[@]}" } down_backend() { LOCAL_UID="$local_uid" LOCAL_GID="$local_gid" docker compose -f "$compose_file" stop "${services[@]}" >/dev/null 2>&1 || true LOCAL_UID="$local_uid" LOCAL_GID="$local_gid" docker compose -f "$compose_file" rm -f "${services[@]}" >/dev/null 2>&1 || true } restart_backend() { LOCAL_UID="$local_uid" LOCAL_GID="$local_gid" docker compose -f "$compose_file" restart "${services[@]}" } follow_logs() { LOCAL_UID="$local_uid" LOCAL_GID="$local_gid" docker compose -f "$compose_file" logs -f "${services[@]}" } clean_runtime() { rm -rf "$runtime_dir" } case "$action" in check) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_posix_root "$project_root" "$posix_root" ;; build) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_posix_root "$project_root" "$posix_root" build_backend ;; up) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_local_env_file "$env_dir" ensure_posix_root "$project_root" "$posix_root" up_backend run_compose_api_migrations "$compose_file" "api" ;; down) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_local_env_file "$env_dir" ensure_posix_root "$project_root" "$posix_root" confirm_destructive_action 'This will stop and remove the local backend dev containers. Continue?' down_backend ;; restart) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_local_env_file "$env_dir" ensure_posix_root "$project_root" "$posix_root" restart_backend ;; logs) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_local_env_file "$env_dir" ensure_posix_root "$project_root" "$posix_root" follow_logs ;; clean) ensure_docker 'docker is required for the local backend dev runtime. Install Docker first.' ensure_local_env_file "$env_dir" ensure_posix_root "$project_root" "$posix_root" confirm_destructive_action 'This will remove the local backend dev containers, images, volumes, and runtime state. Continue?' down_backend remove_docker_image_if_present "$backend_image" remove_docker_volume_if_present "$backend_go_pkg_volume" remove_docker_volume_if_present "$backend_go_build_volume" clean_runtime ;; *) printf 'Unsupported backend stack action: %s\n' "$action" >&2 exit 1 ;; esac