#!/usr/bin/env bash # Lifecycle commands for the local dev stack (mysql + api-server + web-view). # Bots (telegram-bot, transfer-bot) are gated behind a compose 'bots' profile # and do not start with 'up'. Status is used by scripts/bot_cli.sh. set -euo pipefail usage() { cat <<'EOF' Lifecycle for the dev stack (mysql + api-server + web-view + web-next). Usage: scripts/dev.sh up Start all dev services in the background. scripts/dev.sh down Stop the stack. mysql volume kept (DB persists). scripts/dev.sh reset-db Stop the stack AND drop the mysql volume; then start. scripts/dev.sh logs Tail logs from the running stack. scripts/dev.sh status Print 'OK' if mysql is running, else exit 1. Environment: NO_SUDO=1 Skip the 'sudo' prefix (use if your user is in the docker group). EOF } ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${ROOT_DIR}" SUDO="sudo" [[ "${NO_SUDO:-0}" == "1" ]] && SUDO="" # shellcheck disable=SC2206 COMPOSE=(${SUDO} docker compose -f docker-compose.yml -f docker-compose.override.yml) # Help and empty-arg cases don't need .env. Handle them first. case "${1:-}" in -h|--help|help) usage exit 0 ;; "") usage >&2 exit 1 ;; esac if [[ ! -f .env ]]; then echo "ERROR: .env not found at repo root. Run: cp envs/dev/.env.example .env (then edit)." >&2 exit 2 fi case "${1:-}" in up) "${COMPOSE[@]}" up -d --build mysql api-server web-view web-next "${COMPOSE[@]}" ps ;; down) # --remove-orphans cleans up containers from manual `docker compose # -f docker-compose.yml ...` invocations (e.g., the prod-mode gunicorn # smoke test) that landed in the same compose project but aren't # services in the override. "${COMPOSE[@]}" down --remove-orphans ;; reset-db) "${COMPOSE[@]}" down --volumes --remove-orphans "${COMPOSE[@]}" up -d --build mysql api-server web-view web-next ;; logs) "${COMPOSE[@]}" logs -f mysql api-server web-view web-next ;; status) if "${COMPOSE[@]}" ps --status running --services 2>/dev/null | grep -q '^mysql$'; then echo OK else echo "ERROR: dev stack not running. Run 'scripts/dev.sh up' first." >&2 exit 1 fi ;; *) echo "unknown command: $1" >&2 usage >&2 exit 1 ;; esac