{ "ScadaBridge": { "Node": { "Role": "Site", "NodeName": "node-b", "NodeHostname": "scadabridge-site-a-b", "SiteId": "site-a", "RemotingPort": 8082, "GrpcPort": 8083, "MetricsPort": 8084 }, "Cluster": { "SeedNodes": [ "akka.tcp://scadabridge@scadabridge-site-a-a:8082", "akka.tcp://scadabridge@scadabridge-site-a-b:8082" ], "SplitBrainResolverStrategy": "keep-oldest", "StableAfter": "00:00:15", "HeartbeatInterval": "00:00:02", "FailureDetectionThreshold": "00:00:10", "MinNrOfMembers": 1 }, "Database": { "SiteDbPath": "/app/data/scadabridge.db" }, "DataConnection": { "ReconnectInterval": "00:00:05", "TagResolutionRetryInterval": "00:00:10", "WriteTimeout": "00:00:30", "SeedReadTimeout": "00:00:30" }, "StoreAndForward": { "SqliteDbPath": "/app/data/store-and-forward.db", "ReplicationEnabled": true }, "Communication": { "CentralContactPoints": [ "akka.tcp://scadabridge@scadabridge-central-a:8081", "akka.tcp://scadabridge@scadabridge-central-b:8081" ], "DeploymentTimeout": "00:02:00", "LifecycleTimeout": "00:00:30", "QueryTimeout": "00:00:30", "TransportHeartbeatInterval": "00:00:05", "TransportFailureThreshold": "00:00:15" }, "HealthMonitoring": { "ReportInterval": "00:00:30", "OfflineTimeout": "00:01:00" }, "SiteEventLog": { "RetentionDays": 30, "MaxStorageMb": 1024, "PurgeScheduleCron": "0 2 * * *" }, "Notification": {}, "Logging": { "MinimumLevel": "Information" } }, // Consolidated site database (LocalDb Phase 1): OperationTracking + site_events. // On the mounted /app/data volume so it survives container recreate - unlike the // legacy site-tracking.db / site_events.db, which defaulted to CWD-relative paths // outside the volume and were lost on every recreate. // Replication is opt-in and configured separately; absent = local-only. "LocalDb": { "Path": "/app/data/site-localdb.db", // The PASSIVE half of site-a's replicated pair: no PeerAddress, so this node's // sync initiator starts and idles while node-a dials in. Its own writes still // reach node-a - the stream is bidirectional. // // The key MUST match node-a's exactly. LocalDbSyncAuthInterceptor is // fail-closed, so a typo here does not degrade to unauthenticated replication; // it rejects every stream and the pair silently stops converging. "Replication": { "ApiKey": "dev-site-a-localdb-sync-key" } } }