refactor: rename ScadaLink → ZB.MOM.WW.ScadaBridge (code + projects + namespaces)
Solution + 23 src projects + 26 test projects renamed; folders, csproj, namespaces, and ScadaLinkDbContext/ScadaBridgeDbContext class updated. ActorSystem "scadalink" → "scadabridge", Akka seed-node URLs migrated. SQL roles/logins, LDAP domains, CLI command name, and CLI config dir (~/.scadalink → ~/.scadabridge) also renamed. Build green; 5 Host.Tests fail awaiting SQL login rename in next commit. Pre-existing StaleTagMonitor timing flakes unchanged. Rename script committed at tools/rename-to-scadabridge.sh.
This commit is contained in:
+35
-35
@@ -1,6 +1,6 @@
|
||||
# ScadaLink Docker Infrastructure
|
||||
# ScadaBridge Docker Infrastructure
|
||||
|
||||
Local Docker deployment of the full ScadaLink cluster topology: a 2-node central cluster and three 2-node site clusters.
|
||||
Local Docker deployment of the full ScadaBridge cluster topology: a 2-node central cluster and three 2-node site clusters.
|
||||
|
||||
## Cluster Topology
|
||||
|
||||
@@ -54,15 +54,15 @@ Each site cluster runs Site Runtime, Data Connection Layer, Store-and-Forward, a
|
||||
|
||||
| Node | Container Name | Host Web Port | Host Akka Port | Host gRPC Port | Internal Ports |
|
||||
|------|---------------|---------------|----------------|----------------|----------------|
|
||||
| Traefik LB | `scadalink-traefik` | 9000 | — | — | 80 (proxy), 8080 (dashboard) |
|
||||
| Central A | `scadalink-central-a` | 9001 | 9011 | — | 5000 (web), 8081 (Akka) |
|
||||
| Central B | `scadalink-central-b` | 9002 | 9012 | — | 5000 (web), 8081 (Akka) |
|
||||
| Site-A A | `scadalink-site-a-a` | — | 9021 | 9023 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-A B | `scadalink-site-a-b` | — | 9022 | 9024 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-B A | `scadalink-site-b-a` | — | 9031 | 9033 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-B B | `scadalink-site-b-b` | — | 9032 | 9034 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-C A | `scadalink-site-c-a` | — | 9041 | 9043 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-C B | `scadalink-site-c-b` | — | 9042 | 9044 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Traefik LB | `scadabridge-traefik` | 9000 | — | — | 80 (proxy), 8080 (dashboard) |
|
||||
| Central A | `scadabridge-central-a` | 9001 | 9011 | — | 5000 (web), 8081 (Akka) |
|
||||
| Central B | `scadabridge-central-b` | 9002 | 9012 | — | 5000 (web), 8081 (Akka) |
|
||||
| Site-A A | `scadabridge-site-a-a` | — | 9021 | 9023 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-A B | `scadabridge-site-a-b` | — | 9022 | 9024 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-B A | `scadabridge-site-b-a` | — | 9031 | 9033 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-B B | `scadabridge-site-b-b` | — | 9032 | 9034 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-C A | `scadabridge-site-c-a` | — | 9041 | 9043 | 8082 (Akka), 8083 (gRPC) |
|
||||
| Site-C B | `scadabridge-site-c-b` | — | 9042 | 9044 | 8082 (Akka), 8083 (gRPC) |
|
||||
|
||||
Port block pattern: `90X1`/`90X2` (Akka), `90X3`/`90X4` (gRPC) where X = 0 (central), 2 (site-a), 3 (site-b), 4 (site-c). gRPC streaming ports are used by central nodes to subscribe to real-time site data streams.
|
||||
|
||||
@@ -70,13 +70,13 @@ Port block pattern: `90X1`/`90X2` (Akka), `90X3`/`90X4` (gRPC) where X = 0 (cent
|
||||
|
||||
| Service | Container Name | Host Port | Purpose |
|
||||
|---------|---------------|-----------|---------|
|
||||
| MS SQL 2022 | `scadalink-mssql` | 1433 | Configuration and machine data databases |
|
||||
| LDAP (GLAuth) | `scadalink-ldap` | 3893 | Authentication with test users |
|
||||
| SMTP (Mailpit) | `scadalink-smtp` | 1025 / 8025 | Email capture (SMTP / web UI) |
|
||||
| OPC UA | `scadalink-opcua` | 50000 / 8080 | Simulated OPC UA server (protocol / web UI) |
|
||||
| REST API | `scadalink-restapi` | 5200 | External REST API for integration testing |
|
||||
| MS SQL 2022 | `scadabridge-mssql` | 1433 | Configuration and machine data databases |
|
||||
| LDAP (GLAuth) | `scadabridge-ldap` | 3893 | Authentication with test users |
|
||||
| SMTP (Mailpit) | `scadabridge-smtp` | 1025 / 8025 | Email capture (SMTP / web UI) |
|
||||
| OPC UA | `scadabridge-opcua` | 50000 / 8080 | Simulated OPC UA server (protocol / web UI) |
|
||||
| REST API | `scadabridge-restapi` | 5200 | External REST API for integration testing |
|
||||
|
||||
All containers communicate over the shared `scadalink-net` Docker bridge network using container names as hostnames.
|
||||
All containers communicate over the shared `scadabridge-net` Docker bridge network using container names as hostnames.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
@@ -130,7 +130,7 @@ Start infrastructure services first, then build and deploy the application:
|
||||
# 1. Start test infrastructure (MS SQL, LDAP, SMTP, OPC UA)
|
||||
cd infra && docker compose up -d && cd ..
|
||||
|
||||
# 2. Build and deploy all 8 ScadaLink nodes
|
||||
# 2. Build and deploy all 8 ScadaBridge nodes
|
||||
docker/deploy.sh
|
||||
|
||||
# 3. Seed test sites (first-time only, after cluster is healthy)
|
||||
@@ -167,7 +167,7 @@ cd infra && docker compose down && cd ..
|
||||
docker compose -f docker/docker-compose.yml logs -f
|
||||
|
||||
# Single node
|
||||
docker logs -f scadalink-central-a
|
||||
docker logs -f scadabridge-central-a
|
||||
|
||||
# Filter by site cluster
|
||||
docker compose -f docker/docker-compose.yml logs -f site-a-a site-a-b
|
||||
@@ -181,7 +181,7 @@ ls docker/central-node-a/logs/
|
||||
### Restart a Single Node
|
||||
|
||||
```bash
|
||||
docker restart scadalink-central-a
|
||||
docker restart scadabridge-central-a
|
||||
```
|
||||
|
||||
### Check Cluster Health
|
||||
@@ -199,7 +199,7 @@ curl -s http://localhost:9002/health/ready | python3 -m json.tool
|
||||
The CLI connects to the Central Host's HTTP management API via the Traefik load balancer at `http://localhost:9000`, which routes to the active central node:
|
||||
|
||||
```bash
|
||||
dotnet run --project src/ScadaLink.CLI -- \
|
||||
dotnet run --project src/ZB.MOM.WW.ScadaBridge.CLI -- \
|
||||
--url http://localhost:9000 \
|
||||
--username multi-role --password password \
|
||||
template list
|
||||
@@ -209,7 +209,7 @@ Direct access to individual nodes is also available at `http://localhost:9001` (
|
||||
|
||||
> **Note:** The `multi-role` test user has Admin, Design, and Deployment roles. The `admin` user only has the Admin role and cannot perform design or deployment operations. See `infra/glauth/config.toml` for all test users and their group memberships.
|
||||
|
||||
A recommended `~/.scadalink/config.json` for the Docker test environment:
|
||||
A recommended `~/.scadabridge/config.json` for the Docker test environment:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -220,7 +220,7 @@ A recommended `~/.scadalink/config.json` for the Docker test environment:
|
||||
With this config file in place, the URL is automatic:
|
||||
|
||||
```bash
|
||||
dotnet run --project src/ScadaLink.CLI -- \
|
||||
dotnet run --project src/ZB.MOM.WW.ScadaBridge.CLI -- \
|
||||
--username multi-role --password password \
|
||||
template list
|
||||
```
|
||||
@@ -232,19 +232,19 @@ Remove SQLite databases to reset site state (deployed configs, S&F buffers):
|
||||
```bash
|
||||
# Single site
|
||||
rm -rf docker/site-a-node-a/data docker/site-a-node-b/data
|
||||
docker restart scadalink-site-a-a scadalink-site-a-b
|
||||
docker restart scadabridge-site-a-a scadabridge-site-a-b
|
||||
|
||||
# All sites
|
||||
rm -rf docker/site-*/data
|
||||
docker restart scadalink-site-a-a scadalink-site-a-b \
|
||||
scadalink-site-b-a scadalink-site-b-b \
|
||||
scadalink-site-c-a scadalink-site-c-b
|
||||
docker restart scadabridge-site-a-a scadabridge-site-a-b \
|
||||
scadabridge-site-b-a scadabridge-site-b-b \
|
||||
scadabridge-site-c-a scadabridge-site-c-b
|
||||
```
|
||||
|
||||
### Rebuild Image From Scratch (no cache)
|
||||
|
||||
```bash
|
||||
docker build --no-cache -t scadalink:latest -f docker/Dockerfile .
|
||||
docker build --no-cache -t scadabridge:latest -f docker/Dockerfile .
|
||||
```
|
||||
|
||||
## Build Cache
|
||||
@@ -274,31 +274,31 @@ All test passwords are `password`. See `infra/glauth/config.toml` for the full l
|
||||
|
||||
```bash
|
||||
# Stop the active central node
|
||||
docker stop scadalink-central-a
|
||||
docker stop scadabridge-central-a
|
||||
|
||||
# Verify central-b takes over (check logs for leader election)
|
||||
docker logs -f scadalink-central-b
|
||||
docker logs -f scadabridge-central-b
|
||||
|
||||
# Access UI on standby node
|
||||
open http://localhost:9002
|
||||
|
||||
# Restore the original node
|
||||
docker start scadalink-central-a
|
||||
docker start scadabridge-central-a
|
||||
```
|
||||
|
||||
### Site Failover
|
||||
|
||||
```bash
|
||||
# Stop the active site-a node
|
||||
docker stop scadalink-site-a-a
|
||||
docker stop scadabridge-site-a-a
|
||||
|
||||
# Verify site-a-b takes over singleton (DeploymentManager)
|
||||
docker logs -f scadalink-site-a-b
|
||||
docker logs -f scadabridge-site-a-b
|
||||
|
||||
# Restore
|
||||
docker start scadalink-site-a-a
|
||||
docker start scadabridge-site-a-a
|
||||
```
|
||||
|
||||
Same pattern applies for site-b (`scadalink-site-b-a`/`scadalink-site-b-b`) and site-c (`scadalink-site-c-a`/`scadalink-site-c-b`).
|
||||
Same pattern applies for site-b (`scadabridge-site-b-a`/`scadabridge-site-b-b`) and site-c (`scadabridge-site-c-a`/`scadabridge-site-c-b`).
|
||||
|
||||
Failover takes approximately 25 seconds (2s heartbeat + 10s detection threshold + 15s stable-after for split-brain resolver).
|
||||
|
||||
Reference in New Issue
Block a user