From 77eb188a2cbaee7c5592471b367636a05634f97d Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sun, 24 May 2026 07:20:49 -0400 Subject: [PATCH] feat(docker-env2): add lifecycle scripts (init-db, deploy, teardown, seed-sites) --- docker-env2/deploy.sh | 34 ++++++++++++++++++++++++++++++++++ docker-env2/init-db.sh | 15 +++++++++++++++ docker-env2/seed-sites.sh | 38 ++++++++++++++++++++++++++++++++++++++ docker-env2/teardown.sh | 19 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100755 docker-env2/deploy.sh create mode 100755 docker-env2/init-db.sh create mode 100755 docker-env2/seed-sites.sh create mode 100755 docker-env2/teardown.sh diff --git a/docker-env2/deploy.sh b/docker-env2/deploy.sh new file mode 100755 index 0000000..22246a0 --- /dev/null +++ b/docker-env2/deploy.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "=== ScadaLink Env2 Docker Deploy ===" + +# Reuse the primary build (same scadalink:latest image, same network creation) +"$SCRIPT_DIR/../docker/build.sh" + +# Ensure env2 databases exist on the shared scadalink-mssql +"$SCRIPT_DIR/init-db.sh" + +echo "" +echo "Deploying env2 containers..." +docker compose -f "$SCRIPT_DIR/docker-compose.yml" up -d --force-recreate + +echo "" +echo "Container status:" +docker compose -f "$SCRIPT_DIR/docker-compose.yml" ps + +echo "" +echo "Access points:" +echo " Central (Traefik LB): http://localhost:9100" +echo " Central UI (node A): http://localhost:9101" +echo " Central UI (node B): http://localhost:9102" +echo " Health check: http://localhost:9101/health/ready" +echo " Active node check: http://localhost:9101/health/active" +echo " Traefik dashboard: http://localhost:8181" +echo "" +echo "To seed test site (first-time setup):" +echo " docker-env2/seed-sites.sh" +echo "" +echo "Logs: docker compose -f $SCRIPT_DIR/docker-compose.yml logs -f" diff --git a/docker-env2/init-db.sh b/docker-env2/init-db.sh new file mode 100755 index 0000000..7b7f527 --- /dev/null +++ b/docker-env2/init-db.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +if ! docker ps --format '{{.Names}}' | grep -q '^scadalink-mssql$'; then + echo "ERROR: scadalink-mssql is not running. Start it: cd infra && docker compose up -d" >&2 + exit 1 +fi + +echo "Applying env2 database setup..." +docker exec -i scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \ + -S localhost -U sa -P 'ScadaLink_Dev1#' -C \ + < "$SCRIPT_DIR/../infra/mssql/setup-env2.sql" + +echo "Env2 databases ready." diff --git a/docker-env2/seed-sites.sh b/docker-env2/seed-sites.sh new file mode 100755 index 0000000..6292271 --- /dev/null +++ b/docker-env2/seed-sites.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -euo pipefail + +# Seed env2's single test site with Akka and gRPC addresses. +# Run after deploy.sh once the env2 central cluster is healthy. +# +# Prerequisites: +# - Infrastructure services running (infra/docker-compose up -d) +# - Env2 application containers running (docker-env2/deploy.sh) +# - Env2 central cluster healthy (curl http://localhost:9100/health/ready) +# +# Usage: +# docker-env2/seed-sites.sh + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +CLI="dotnet run --project $PROJECT_ROOT/src/ScadaLink.CLI --" +AUTH="--username multi-role --password password" +URL="--url http://localhost:9100" + +echo "=== Seeding ScadaLink Env2 Sites ===" + +echo "" +echo "Creating Site-X (Env2 Site X)..." +$CLI $URL $AUTH site create \ + --name "Env2 Site X" \ + --identifier "site-x" \ + --description "Env2 test site - two-node cluster" \ + --node-a-address "akka.tcp://scadalink@scadalink-env2-site-x-a:8082" \ + --node-b-address "akka.tcp://scadalink@scadalink-env2-site-x-b:8082" \ + --grpc-node-a-address "http://scadalink-env2-site-x-a:8083" \ + --grpc-node-b-address "http://scadalink-env2-site-x-b:8083" \ +|| echo " (Site-X may already exist)" + +echo "" +echo "=== Env2 site seeding complete ===" +echo "" +echo "Verify with: $CLI $URL $AUTH site list" diff --git a/docker-env2/teardown.sh b/docker-env2/teardown.sh new file mode 100755 index 0000000..84667ff --- /dev/null +++ b/docker-env2/teardown.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "=== ScadaLink Env2 Docker Teardown ===" + +echo "Stopping env2 application containers..." +docker compose -f "$SCRIPT_DIR/docker-compose.yml" down + +echo "" +echo "Teardown complete." +echo "Site data (SQLite DBs) and logs are preserved in node directories." +echo "" +echo "Env2 databases (ScadaLinkConfig2 / ScadaLinkMachineData2) remain on" +echo "the shared scadalink-mssql. To drop them:" +echo " docker exec scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \\" +echo " -S localhost -U sa -P 'ScadaLink_Dev1#' -C \\" +echo " -Q \"DROP DATABASE ScadaLinkConfig2; DROP DATABASE ScadaLinkMachineData2;\""