clawsql 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +97 -0
- package/README.md +372 -0
- package/dist/__tests__/config/settings.test.d.ts +5 -0
- package/dist/__tests__/config/settings.test.d.ts.map +1 -0
- package/dist/__tests__/config/settings.test.js +154 -0
- package/dist/__tests__/config/settings.test.js.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.js +191 -0
- package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
- package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
- package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
- package/dist/__tests__/core/failover/executor.test.js +256 -0
- package/dist/__tests__/core/failover/executor.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.js +131 -0
- package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
- package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
- package/dist/__tests__/types/index.test.d.ts +5 -0
- package/dist/__tests__/types/index.test.d.ts.map +1 -0
- package/dist/__tests__/types/index.test.js +290 -0
- package/dist/__tests__/types/index.test.js.map +1 -0
- package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
- package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
- package/dist/__tests__/utils/exceptions.test.js +142 -0
- package/dist/__tests__/utils/exceptions.test.js.map +1 -0
- package/dist/api/routes/clusters.d.ts +7 -0
- package/dist/api/routes/clusters.d.ts.map +1 -0
- package/dist/api/routes/clusters.js +123 -0
- package/dist/api/routes/clusters.js.map +1 -0
- package/dist/api/routes/config.d.ts +7 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +65 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/failover.d.ts +7 -0
- package/dist/api/routes/failover.d.ts.map +1 -0
- package/dist/api/routes/failover.js +100 -0
- package/dist/api/routes/failover.js.map +1 -0
- package/dist/api/routes/instances.d.ts +11 -0
- package/dist/api/routes/instances.d.ts.map +1 -0
- package/dist/api/routes/instances.js +315 -0
- package/dist/api/routes/instances.js.map +1 -0
- package/dist/api/routes/monitoring.d.ts +7 -0
- package/dist/api/routes/monitoring.d.ts.map +1 -0
- package/dist/api/routes/monitoring.js +72 -0
- package/dist/api/routes/monitoring.js.map +1 -0
- package/dist/api/routes/webhooks.d.ts +12 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +232 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/api/schemas/index.d.ts +965 -0
- package/dist/api/schemas/index.d.ts.map +1 -0
- package/dist/api/schemas/index.js +171 -0
- package/dist/api/schemas/index.js.map +1 -0
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +197 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/clawsql.d.ts +12 -0
- package/dist/bin/clawsql.d.ts.map +1 -0
- package/dist/bin/clawsql.js +43 -0
- package/dist/bin/clawsql.js.map +1 -0
- package/dist/cli/agent/handler.d.ts +73 -0
- package/dist/cli/agent/handler.d.ts.map +1 -0
- package/dist/cli/agent/handler.js +258 -0
- package/dist/cli/agent/handler.js.map +1 -0
- package/dist/cli/agent/index.d.ts +14 -0
- package/dist/cli/agent/index.d.ts.map +1 -0
- package/dist/cli/agent/index.js +30 -0
- package/dist/cli/agent/index.js.map +1 -0
- package/dist/cli/agent/openclaw-integration.d.ts +81 -0
- package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
- package/dist/cli/agent/openclaw-integration.js +341 -0
- package/dist/cli/agent/openclaw-integration.js.map +1 -0
- package/dist/cli/agent/providers/anthropic.d.ts +27 -0
- package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/agent/providers/anthropic.js +106 -0
- package/dist/cli/agent/providers/anthropic.js.map +1 -0
- package/dist/cli/agent/providers/base.d.ts +91 -0
- package/dist/cli/agent/providers/base.d.ts.map +1 -0
- package/dist/cli/agent/providers/base.js +24 -0
- package/dist/cli/agent/providers/base.js.map +1 -0
- package/dist/cli/agent/providers/openai.d.ts +27 -0
- package/dist/cli/agent/providers/openai.d.ts.map +1 -0
- package/dist/cli/agent/providers/openai.js +98 -0
- package/dist/cli/agent/providers/openai.js.map +1 -0
- package/dist/cli/agent/tools/index.d.ts +32 -0
- package/dist/cli/agent/tools/index.d.ts.map +1 -0
- package/dist/cli/agent/tools/index.js +263 -0
- package/dist/cli/agent/tools/index.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +12 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +205 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/clusters.d.ts +12 -0
- package/dist/cli/commands/clusters.d.ts.map +1 -0
- package/dist/cli/commands/clusters.js +468 -0
- package/dist/cli/commands/clusters.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +406 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +12 -0
- package/dist/cli/commands/cron.d.ts.map +1 -0
- package/dist/cli/commands/cron.js +215 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +13 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +687 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/failover.d.ts +16 -0
- package/dist/cli/commands/failover.d.ts.map +1 -0
- package/dist/cli/commands/failover.js +333 -0
- package/dist/cli/commands/failover.js.map +1 -0
- package/dist/cli/commands/health.d.ts +12 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +125 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/help.d.ts +12 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +52 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/instances.d.ts +12 -0
- package/dist/cli/commands/instances.d.ts.map +1 -0
- package/dist/cli/commands/instances.js +801 -0
- package/dist/cli/commands/instances.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +12 -0
- package/dist/cli/commands/notify.d.ts.map +1 -0
- package/dist/cli/commands/notify.js +43 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/sql.d.ts +12 -0
- package/dist/cli/commands/sql.d.ts.map +1 -0
- package/dist/cli/commands/sql.js +90 -0
- package/dist/cli/commands/sql.js.map +1 -0
- package/dist/cli/commands/start.d.ts +12 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +174 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +218 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +12 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +128 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/topology.d.ts +12 -0
- package/dist/cli/commands/topology.d.ts.map +1 -0
- package/dist/cli/commands/topology.js +106 -0
- package/dist/cli/commands/topology.js.map +1 -0
- package/dist/cli/completer.d.ts +47 -0
- package/dist/cli/completer.d.ts.map +1 -0
- package/dist/cli/completer.js +332 -0
- package/dist/cli/completer.js.map +1 -0
- package/dist/cli/formatter.d.ts +165 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +408 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/raw-input.d.ts +97 -0
- package/dist/cli/raw-input.d.ts.map +1 -0
- package/dist/cli/raw-input.js +493 -0
- package/dist/cli/raw-input.js.map +1 -0
- package/dist/cli/registry.d.ts +103 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +205 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/repl.d.ts +83 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +447 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/ui/components.d.ts +144 -0
- package/dist/cli/ui/components.d.ts.map +1 -0
- package/dist/cli/ui/components.js +331 -0
- package/dist/cli/ui/components.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +23 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/utils/docker-files.d.ts +39 -0
- package/dist/cli/utils/docker-files.d.ts.map +1 -0
- package/dist/cli/utils/docker-files.js +223 -0
- package/dist/cli/utils/docker-files.js.map +1 -0
- package/dist/cli/utils/docker-prereq.d.ts +48 -0
- package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
- package/dist/cli/utils/docker-prereq.js +203 -0
- package/dist/cli/utils/docker-prereq.js.map +1 -0
- package/dist/config/settings.d.ts +594 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +250 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/discovery/cluster-view.d.ts +50 -0
- package/dist/core/discovery/cluster-view.d.ts.map +1 -0
- package/dist/core/discovery/cluster-view.js +235 -0
- package/dist/core/discovery/cluster-view.js.map +1 -0
- package/dist/core/discovery/scanner.d.ts +70 -0
- package/dist/core/discovery/scanner.d.ts.map +1 -0
- package/dist/core/discovery/scanner.js +197 -0
- package/dist/core/discovery/scanner.js.map +1 -0
- package/dist/core/discovery/topology.d.ts +118 -0
- package/dist/core/discovery/topology.d.ts.map +1 -0
- package/dist/core/discovery/topology.js +550 -0
- package/dist/core/discovery/topology.js.map +1 -0
- package/dist/core/failover/candidate-selector.d.ts +46 -0
- package/dist/core/failover/candidate-selector.d.ts.map +1 -0
- package/dist/core/failover/candidate-selector.js +70 -0
- package/dist/core/failover/candidate-selector.js.map +1 -0
- package/dist/core/failover/executor.d.ts +104 -0
- package/dist/core/failover/executor.d.ts.map +1 -0
- package/dist/core/failover/executor.js +248 -0
- package/dist/core/failover/executor.js.map +1 -0
- package/dist/core/failover/operation-builder.d.ts +71 -0
- package/dist/core/failover/operation-builder.d.ts.map +1 -0
- package/dist/core/failover/operation-builder.js +157 -0
- package/dist/core/failover/operation-builder.js.map +1 -0
- package/dist/core/failover/operation-runner.d.ts +75 -0
- package/dist/core/failover/operation-runner.d.ts.map +1 -0
- package/dist/core/failover/operation-runner.js +191 -0
- package/dist/core/failover/operation-runner.js.map +1 -0
- package/dist/core/failover/promoter.d.ts +33 -0
- package/dist/core/failover/promoter.d.ts.map +1 -0
- package/dist/core/failover/promoter.js +97 -0
- package/dist/core/failover/promoter.js.map +1 -0
- package/dist/core/failover/recovery-manager.d.ts +47 -0
- package/dist/core/failover/recovery-manager.d.ts.map +1 -0
- package/dist/core/failover/recovery-manager.js +145 -0
- package/dist/core/failover/recovery-manager.js.map +1 -0
- package/dist/core/failover/types.d.ts +54 -0
- package/dist/core/failover/types.d.ts.map +1 -0
- package/dist/core/failover/types.js +8 -0
- package/dist/core/failover/types.js.map +1 -0
- package/dist/core/monitoring/collector.d.ts +25 -0
- package/dist/core/monitoring/collector.d.ts.map +1 -0
- package/dist/core/monitoring/collector.js +115 -0
- package/dist/core/monitoring/collector.js.map +1 -0
- package/dist/core/monitoring/exporters.d.ts +49 -0
- package/dist/core/monitoring/exporters.d.ts.map +1 -0
- package/dist/core/monitoring/exporters.js +126 -0
- package/dist/core/monitoring/exporters.js.map +1 -0
- package/dist/core/routing/proxysql-manager.d.ts +213 -0
- package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
- package/dist/core/routing/proxysql-manager.js +632 -0
- package/dist/core/routing/proxysql-manager.js.map +1 -0
- package/dist/core/sync/replica-recovery.d.ts +40 -0
- package/dist/core/sync/replica-recovery.d.ts.map +1 -0
- package/dist/core/sync/replica-recovery.js +134 -0
- package/dist/core/sync/replica-recovery.js.map +1 -0
- package/dist/core/sync/sync-coordinator.d.ts +83 -0
- package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/core/sync/sync-coordinator.js +254 -0
- package/dist/core/sync/sync-coordinator.js.map +1 -0
- package/dist/core/sync/topology-watcher.d.ts +76 -0
- package/dist/core/sync/topology-watcher.d.ts.map +1 -0
- package/dist/core/sync/topology-watcher.js +222 -0
- package/dist/core/sync/topology-watcher.js.map +1 -0
- package/dist/core/sync/types.d.ts +85 -0
- package/dist/core/sync/types.d.ts.map +1 -0
- package/dist/core/sync/types.js +8 -0
- package/dist/core/sync/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +153 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/database.d.ts +62 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +257 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/exceptions.d.ts +69 -0
- package/dist/utils/exceptions.d.ts.map +1 -0
- package/dist/utils/exceptions.js +121 -0
- package/dist/utils/exceptions.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +90 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mysql-client.d.ts +43 -0
- package/dist/utils/mysql-client.d.ts.map +1 -0
- package/dist/utils/mysql-client.js +125 -0
- package/dist/utils/mysql-client.js.map +1 -0
- package/docker/Dockerfile +61 -0
- package/docker/Dockerfile.node +41 -0
- package/docker/grafana/dashboards/clawsql.json +212 -0
- package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
- package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
- package/docker/init/primary.sql +26 -0
- package/docker/init/replica.sql +16 -0
- package/docker/orchestrator/orchestrator.conf.json +98 -0
- package/docker/prometheus/prometheus.yml +45 -0
- package/docker/proxysql/entrypoint.sh +8 -0
- package/docker/proxysql/init.sql.demo +30 -0
- package/docker/proxysql/proxysql.cnf +38 -0
- package/docker-compose.demo.yml +115 -0
- package/docker-compose.yml +217 -0
- package/init/primary.sql +19 -0
- package/init/replica.sql +13 -0
- package/package.json +84 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- MySQL Replica Initialization Script
|
|
2
|
+
-- This script runs on replica MySQL instances startup
|
|
3
|
+
|
|
4
|
+
-- Stop any existing replication
|
|
5
|
+
STOP SLAVE;
|
|
6
|
+
|
|
7
|
+
-- Configure replication to primary
|
|
8
|
+
CHANGE MASTER TO
|
|
9
|
+
MASTER_HOST='mysql-primary',
|
|
10
|
+
MASTER_PORT=3306,
|
|
11
|
+
MASTER_USER='repl',
|
|
12
|
+
MASTER_PASSWORD='replpassword',
|
|
13
|
+
MASTER_AUTO_POSITION=1;
|
|
14
|
+
|
|
15
|
+
-- Start replication
|
|
16
|
+
START SLAVE;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Debug": false,
|
|
3
|
+
"ListenAddress": ":3000",
|
|
4
|
+
"MySQLTopologyUser": "clawsql",
|
|
5
|
+
"MySQLTopologyPassword": "clawsql_password",
|
|
6
|
+
"MySQLTopologyCredentialsConfigFile": "",
|
|
7
|
+
"MySQLTopologySSLPrivateKeyFile": "",
|
|
8
|
+
"MySQLTopologySSLCertFile": "",
|
|
9
|
+
"MySQLTopologySSLCAFile": "",
|
|
10
|
+
"MySQLTopologySSLSkipVerify": true,
|
|
11
|
+
"MySQLTopologyUseMutualTLS": false,
|
|
12
|
+
"BackendDB": "mysql",
|
|
13
|
+
"MySQLOrchestratorHost": "metadata-mysql",
|
|
14
|
+
"MySQLOrchestratorPort": 3306,
|
|
15
|
+
"MySQLOrchestratorDatabase": "clawsql_meta",
|
|
16
|
+
"MySQLOrchestratorUser": "clawsql",
|
|
17
|
+
"MySQLOrchestratorPassword": "clawsql_password",
|
|
18
|
+
"MySQLConnectTimeoutSeconds": 5,
|
|
19
|
+
"MySQLDiscoveryPollSeconds": 5,
|
|
20
|
+
"MySQLFailedDiscoveryPollSeconds": 5,
|
|
21
|
+
"MySQLDiscoveryMaxConcurrency": 100,
|
|
22
|
+
"ReplicationLagQuery": "SELECT ABS(TIMESTAMPDIFF(SECOND, NOW(), ts)) FROM replication.heartbeat",
|
|
23
|
+
"DiscoverByShowSlaveHosts": true,
|
|
24
|
+
"PowerOffInstancesMeta": true,
|
|
25
|
+
"InstanceBulkOperationsWaitTimeoutSeconds": 300,
|
|
26
|
+
"HostnameResolveMethod": "default",
|
|
27
|
+
"MySQLHostnameResolveMethod": "@@hostname",
|
|
28
|
+
"SkipBinlogServerUnresolveCheck": true,
|
|
29
|
+
"ExpiryHostnameResolvesMinutes": 60,
|
|
30
|
+
"RejectHostnameResolvePattern": "",
|
|
31
|
+
"ReasonableReplicationLagSeconds": 10,
|
|
32
|
+
"ProblemIgnoreHostnameFilters": [],
|
|
33
|
+
"VerifyReplicationFilters": false,
|
|
34
|
+
"ReasonableMaintenanceReplicationLagSeconds": 20,
|
|
35
|
+
"CandidateInstanceExpireMinutes": 60,
|
|
36
|
+
"AuditLogFile": "/var/lib/orchestrator/audit.log",
|
|
37
|
+
"AuditToSyslog": false,
|
|
38
|
+
"AuditToBackendDB": true,
|
|
39
|
+
"RemoveTextFromHostnameDisplay": ".mycompany.com",
|
|
40
|
+
"ReadOnly": false,
|
|
41
|
+
"AuthenticationMethod": "",
|
|
42
|
+
"HTTPAuthUser": "",
|
|
43
|
+
"HTTPAuthPassword": "",
|
|
44
|
+
"AuthUserHeader": "X-Forwarded-User",
|
|
45
|
+
"PowerAuthUsers": ["*"],
|
|
46
|
+
"ClusterNameToAlias": {
|
|
47
|
+
"127.0.0.1": "test suite"
|
|
48
|
+
},
|
|
49
|
+
"DetectClusterAliasQuery": "SELECT SUBSTRING_INDEX(@@hostname, '.', 1)",
|
|
50
|
+
"DetectClusterDomainQuery": "",
|
|
51
|
+
"DetectInstanceAliasQuery": "",
|
|
52
|
+
"DetectPromotionRuleQuery": "",
|
|
53
|
+
"DataCenterPattern": "[.]([^.]+)[.][^.]+[.]mycompany[.]com",
|
|
54
|
+
"PhysicalEnvironmentPattern": "[.]([^.]+[.][^.]+)[.]mycompany[.]com",
|
|
55
|
+
"PromotionIgnoreHostnameFilters": [],
|
|
56
|
+
"DetectSemiSyncEnforcedQuery": "SELECT 0 FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'rpl_semi_sync_master_wait_for_replica_count' AND VARIABLE_VALUE = '0'",
|
|
57
|
+
"ServeAgentsHttp": false,
|
|
58
|
+
"AgentsServerPort": ":3001",
|
|
59
|
+
"AgentsUseSSL": false,
|
|
60
|
+
"AgentsSSLSkipVerify": false,
|
|
61
|
+
"AgentSSLPrivateKeyFile": "",
|
|
62
|
+
"AgentSSLCertFile": "",
|
|
63
|
+
"AgentSSLCAFile": "",
|
|
64
|
+
"AgentPollSeconds": 60,
|
|
65
|
+
"AgentUnseenForgetSeconds": 600,
|
|
66
|
+
"AgentAutoDiscover": false,
|
|
67
|
+
"PseudoGTIDPattern": "drop view if exists `meta`.`_pseudo_gtid_`",
|
|
68
|
+
"PseudoGTIDPatternIsFixedSubstring": true,
|
|
69
|
+
"PseudoGTIDMonotonicHint": "asc:",
|
|
70
|
+
"DetectPseudoGTIDQuery": "SELECT count(*) FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA='meta' AND TABLE_NAME='_pseudo_gtid_'",
|
|
71
|
+
"BinlogEventsChunkSize": 10000,
|
|
72
|
+
"SkipBinlogEventsContaining": [],
|
|
73
|
+
"ReduceReplicationAnalysisCount": true,
|
|
74
|
+
"FailureDetectionPeriodBlockMinutes": 1,
|
|
75
|
+
"RecoveryPeriodBlockMinutes": 1,
|
|
76
|
+
"RecoveryIgnoreHostnameFilters": [],
|
|
77
|
+
"RecoverMasterClusterFilters": ["*"],
|
|
78
|
+
"RecoverIntermediateMasterClusterFilters": ["*"],
|
|
79
|
+
"AutoMasterFailover": true,
|
|
80
|
+
"FailMasterFailover": true,
|
|
81
|
+
"OnFailureDetectionProcesses": [],
|
|
82
|
+
"PreFailoverProcesses": [],
|
|
83
|
+
"PostFailoverProcesses": [
|
|
84
|
+
"curl -s -X POST http://clawsql:8080/api/v1/webhooks/orchestrator/failover -H 'Content-Type: application/json' -d '{\"cluster\":\"{alias}\",\"master\":\"{failedHost}:{failedPort}\",\"successor\":\"{successorHost}:{successorPort}\",\"isSuccessful\":{isSuccessful},\"failoverType\":\"master\",\"reason\":\"{failureType}\"}'"
|
|
85
|
+
],
|
|
86
|
+
"PostUnsuccessfulFailoverProcesses": [],
|
|
87
|
+
"PostMasterFailoverProcesses": [
|
|
88
|
+
"curl -s -X POST http://clawsql:8080/api/v1/webhooks/orchestrator/failover -H 'Content-Type: application/json' -d '{\"cluster\":\"{alias}\",\"master\":\"{failedHost}:{failedPort}\",\"successor\":\"{successorHost}:{successorPort}\",\"isSuccessful\":true,\"failoverType\":\"master\"}'"
|
|
89
|
+
],
|
|
90
|
+
"PostIntermediateMasterFailoverProcesses": [
|
|
91
|
+
"curl -s -X POST http://clawsql:8080/api/v1/webhooks/orchestrator/failover -H 'Content-Type: application/json' -d '{\"cluster\":\"{alias}\",\"master\":\"{failedHost}:{failedPort}\",\"successor\":\"{successorHost}:{successorPort}\",\"isSuccessful\":true,\"failoverType\":\"intermediate-master\"}'"
|
|
92
|
+
],
|
|
93
|
+
"UnresolvedHostnameRecoveryPeriodHours": 1,
|
|
94
|
+
"AutopseudoGTID": false,
|
|
95
|
+
"AutopseudoGTIDIntervalSeconds": 300,
|
|
96
|
+
"AutopseudoGTIDExpireMinutes": 60,
|
|
97
|
+
"RecoveryPollSeconds": 5
|
|
98
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Prometheus Configuration for ClawSQL
|
|
2
|
+
|
|
3
|
+
global:
|
|
4
|
+
scrape_interval: 15s
|
|
5
|
+
evaluation_interval: 15s
|
|
6
|
+
external_labels:
|
|
7
|
+
monitor: 'clawsql-demo'
|
|
8
|
+
|
|
9
|
+
alerting:
|
|
10
|
+
alertmanagers:
|
|
11
|
+
- static_configs:
|
|
12
|
+
- targets: []
|
|
13
|
+
|
|
14
|
+
rule_files: []
|
|
15
|
+
|
|
16
|
+
scrape_configs:
|
|
17
|
+
# Prometheus self-monitoring
|
|
18
|
+
- job_name: 'prometheus'
|
|
19
|
+
static_configs:
|
|
20
|
+
- targets: ['localhost:9090']
|
|
21
|
+
|
|
22
|
+
# ClawSQL API metrics
|
|
23
|
+
- job_name: 'clawsql'
|
|
24
|
+
static_configs:
|
|
25
|
+
- targets: ['clawsql:8080']
|
|
26
|
+
metrics_path: '/api/v1/monitoring/metrics'
|
|
27
|
+
|
|
28
|
+
# Orchestrator - no native Prometheus metrics endpoint
|
|
29
|
+
# The /api/health endpoint provides health status but not Prometheus format
|
|
30
|
+
# Uncomment below if you deploy orchestrator_exporter
|
|
31
|
+
# - job_name: 'orchestrator'
|
|
32
|
+
# static_configs:
|
|
33
|
+
# - targets: ['orchestrator-exporter:9123']
|
|
34
|
+
|
|
35
|
+
# MySQL Exporter - requires mysql_exporter container
|
|
36
|
+
# Uncomment and configure when mysql_exporter is deployed
|
|
37
|
+
# - job_name: 'mysql'
|
|
38
|
+
# static_configs:
|
|
39
|
+
# - targets: ['mysql-exporter:9104']
|
|
40
|
+
|
|
41
|
+
# ProxySQL Exporter - requires proxysql_exporter container
|
|
42
|
+
# Uncomment and configure when proxysql_exporter is deployed
|
|
43
|
+
# - job_name: 'proxysql'
|
|
44
|
+
# static_configs:
|
|
45
|
+
# - targets: ['proxysql-exporter:42004']
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
-- ClawSQL ProxySQL Initialization Script
|
|
2
|
+
-- Configures MySQL servers and users for the demo cluster
|
|
3
|
+
|
|
4
|
+
-- Add MySQL servers
|
|
5
|
+
-- Hostgroup 0 = writers (primary)
|
|
6
|
+
-- Hostgroup 1 = readers (replicas)
|
|
7
|
+
INSERT OR REPLACE INTO mysql_servers (hostname, port, hostgroup_id, status, weight) VALUES
|
|
8
|
+
('mysql-primary', 3306, 0, 'ONLINE', 1),
|
|
9
|
+
('mysql-replica-1', 3306, 1, 'ONLINE', 1),
|
|
10
|
+
('mysql-replica-2', 3306, 1, 'ONLINE', 1);
|
|
11
|
+
|
|
12
|
+
-- Add MySQL users for connections through ProxySQL
|
|
13
|
+
INSERT OR REPLACE INTO mysql_users (username, password, default_hostgroup, transaction_persistent) VALUES
|
|
14
|
+
('root', 'rootpassword', 0, 1),
|
|
15
|
+
('clawsql', 'clawsqlpassword', 0, 1);
|
|
16
|
+
|
|
17
|
+
-- Add query rules for read/write splitting
|
|
18
|
+
-- Route SELECT queries to readers (hostgroup 1)
|
|
19
|
+
INSERT OR REPLACE INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES
|
|
20
|
+
(1, 1, '^SELECT', 1, 1);
|
|
21
|
+
|
|
22
|
+
-- Load configuration to runtime
|
|
23
|
+
LOAD MYSQL SERVERS TO RUNTIME;
|
|
24
|
+
LOAD MYSQL USERS TO RUNTIME;
|
|
25
|
+
LOAD MYSQL QUERY RULES TO RUNTIME;
|
|
26
|
+
|
|
27
|
+
-- Save configuration to disk
|
|
28
|
+
SAVE MYSQL SERVERS TO DISK;
|
|
29
|
+
SAVE MYSQL USERS TO DISK;
|
|
30
|
+
SAVE MYSQL QUERY RULES TO DISK;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
datadir="/var/lib/proxysql"
|
|
2
|
+
|
|
3
|
+
admin_variables=
|
|
4
|
+
{
|
|
5
|
+
admin_credentials="admin:admin;clawsql:clawsql"
|
|
6
|
+
mysql_ifaces="0.0.0.0:6032"
|
|
7
|
+
refresh_interval=2000
|
|
8
|
+
web_enabled=true
|
|
9
|
+
web_port=6080
|
|
10
|
+
stats_history_duration=86400
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
mysql_variables=
|
|
14
|
+
{
|
|
15
|
+
threads=4
|
|
16
|
+
max_connections=2048
|
|
17
|
+
default_query_delay=0
|
|
18
|
+
default_query_timeout=36000000
|
|
19
|
+
have_compress=true
|
|
20
|
+
poll_timeout=2000
|
|
21
|
+
interfaces="0.0.0.0:6033"
|
|
22
|
+
default_schema="information_schema"
|
|
23
|
+
stacksize=1048576
|
|
24
|
+
server_version="8.0.0"
|
|
25
|
+
connect_timeout_server=3000
|
|
26
|
+
monitor_username="monitor"
|
|
27
|
+
monitor_password="monitorpassword"
|
|
28
|
+
monitor_history=600000
|
|
29
|
+
monitor_connect_interval=60000
|
|
30
|
+
monitor_ping_interval=10000
|
|
31
|
+
monitor_read_only_interval=1500
|
|
32
|
+
monitor_read_only_timeout=500
|
|
33
|
+
ping_interval_server_msec=120000
|
|
34
|
+
ping_timeout_server=500
|
|
35
|
+
commands_stats=true
|
|
36
|
+
sessions_sort=true
|
|
37
|
+
connect_retries_on_failure=10
|
|
38
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# ClawSQL Demo MySQL Cluster
|
|
2
|
+
# Run with: docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d
|
|
3
|
+
#
|
|
4
|
+
# This file adds a demo MySQL cluster (primary + 2 replicas) for testing.
|
|
5
|
+
# Users with existing MySQL instances do NOT need this file.
|
|
6
|
+
|
|
7
|
+
services:
|
|
8
|
+
# =============================================================================
|
|
9
|
+
# MySQL Primary (Writer)
|
|
10
|
+
# =============================================================================
|
|
11
|
+
mysql-primary:
|
|
12
|
+
image: mysql:8.0
|
|
13
|
+
container_name: mysql-primary
|
|
14
|
+
hostname: mysql-primary
|
|
15
|
+
ports:
|
|
16
|
+
- "3306:3306"
|
|
17
|
+
environment:
|
|
18
|
+
- MYSQL_ROOT_PASSWORD=rootpassword
|
|
19
|
+
- MYSQL_DATABASE=clawsql
|
|
20
|
+
- MYSQL_USER=clawsql
|
|
21
|
+
- MYSQL_PASSWORD=clawsqlpassword
|
|
22
|
+
command: >
|
|
23
|
+
--server-id=1
|
|
24
|
+
--log-bin=mysql-bin
|
|
25
|
+
--binlog-format=ROW
|
|
26
|
+
--gtid-mode=ON
|
|
27
|
+
--enforce-gtid-consistency=ON
|
|
28
|
+
--log-slave-updates=ON
|
|
29
|
+
volumes:
|
|
30
|
+
- mysql-primary-data:/var/lib/mysql
|
|
31
|
+
- ./init/primary.sql:/docker-entrypoint-initdb.d/01-primary.sql
|
|
32
|
+
networks:
|
|
33
|
+
- clawsql-network
|
|
34
|
+
restart: unless-stopped
|
|
35
|
+
healthcheck:
|
|
36
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
|
|
37
|
+
interval: 10s
|
|
38
|
+
timeout: 5s
|
|
39
|
+
retries: 5
|
|
40
|
+
|
|
41
|
+
# =============================================================================
|
|
42
|
+
# MySQL Replica 1 (Reader)
|
|
43
|
+
# =============================================================================
|
|
44
|
+
mysql-replica-1:
|
|
45
|
+
image: mysql:8.0
|
|
46
|
+
container_name: mysql-replica-1
|
|
47
|
+
hostname: mysql-replica-1
|
|
48
|
+
ports:
|
|
49
|
+
- "3307:3306"
|
|
50
|
+
environment:
|
|
51
|
+
- MYSQL_ROOT_PASSWORD=rootpassword
|
|
52
|
+
command: >
|
|
53
|
+
--server-id=2
|
|
54
|
+
--log-bin=mysql-bin
|
|
55
|
+
--binlog-format=ROW
|
|
56
|
+
--gtid-mode=ON
|
|
57
|
+
--enforce-gtid-consistency=ON
|
|
58
|
+
--log-slave-updates=ON
|
|
59
|
+
--read-only=ON
|
|
60
|
+
volumes:
|
|
61
|
+
- mysql-replica-1-data:/var/lib/mysql
|
|
62
|
+
- ./init/replica.sql:/docker-entrypoint-initdb.d/01-replica.sql
|
|
63
|
+
depends_on:
|
|
64
|
+
mysql-primary:
|
|
65
|
+
condition: service_healthy
|
|
66
|
+
networks:
|
|
67
|
+
- clawsql-network
|
|
68
|
+
restart: unless-stopped
|
|
69
|
+
healthcheck:
|
|
70
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
|
|
71
|
+
interval: 10s
|
|
72
|
+
timeout: 5s
|
|
73
|
+
retries: 5
|
|
74
|
+
|
|
75
|
+
# =============================================================================
|
|
76
|
+
# MySQL Replica 2 (Reader)
|
|
77
|
+
# =============================================================================
|
|
78
|
+
mysql-replica-2:
|
|
79
|
+
image: mysql:8.0
|
|
80
|
+
container_name: mysql-replica-2
|
|
81
|
+
hostname: mysql-replica-2
|
|
82
|
+
ports:
|
|
83
|
+
- "3308:3306"
|
|
84
|
+
environment:
|
|
85
|
+
- MYSQL_ROOT_PASSWORD=rootpassword
|
|
86
|
+
command: >
|
|
87
|
+
--server-id=3
|
|
88
|
+
--log-bin=mysql-bin
|
|
89
|
+
--binlog-format=ROW
|
|
90
|
+
--gtid-mode=ON
|
|
91
|
+
--enforce-gtid-consistency=ON
|
|
92
|
+
--log-slave-updates=ON
|
|
93
|
+
--read-only=ON
|
|
94
|
+
volumes:
|
|
95
|
+
- mysql-replica-2-data:/var/lib/mysql
|
|
96
|
+
- ./init/replica.sql:/docker-entrypoint-initdb.d/01-replica.sql
|
|
97
|
+
depends_on:
|
|
98
|
+
mysql-primary:
|
|
99
|
+
condition: service_healthy
|
|
100
|
+
networks:
|
|
101
|
+
- clawsql-network
|
|
102
|
+
restart: unless-stopped
|
|
103
|
+
healthcheck:
|
|
104
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
|
|
105
|
+
interval: 10s
|
|
106
|
+
timeout: 5s
|
|
107
|
+
retries: 5
|
|
108
|
+
|
|
109
|
+
# =============================================================================
|
|
110
|
+
# Volumes for MySQL data persistence
|
|
111
|
+
# =============================================================================
|
|
112
|
+
volumes:
|
|
113
|
+
mysql-primary-data:
|
|
114
|
+
mysql-replica-1-data:
|
|
115
|
+
mysql-replica-2-data:
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# ClawSQL Platform - Docker Compose
|
|
2
|
+
# MySQL HA management platform with Orchestrator, ProxySQL, Prometheus, and Grafana
|
|
3
|
+
#
|
|
4
|
+
# Quick Start:
|
|
5
|
+
# ./start.sh # Start platform only (use your own MySQL)
|
|
6
|
+
# ./start.sh --demo # Start with demo MySQL cluster
|
|
7
|
+
#
|
|
8
|
+
# After starting, register your MySQL instances:
|
|
9
|
+
# curl -X POST http://localhost:8080/api/v1/instances \
|
|
10
|
+
# -H 'Content-Type: application/json' \
|
|
11
|
+
# -d '{"host": "your-mysql-host", "port": 3306}'
|
|
12
|
+
|
|
13
|
+
services:
|
|
14
|
+
# =============================================================================
|
|
15
|
+
# ClawSQL Application (Node.js)
|
|
16
|
+
# =============================================================================
|
|
17
|
+
clawsql:
|
|
18
|
+
build:
|
|
19
|
+
context: .
|
|
20
|
+
dockerfile: docker/Dockerfile.node
|
|
21
|
+
container_name: clawsql
|
|
22
|
+
hostname: clawsql
|
|
23
|
+
ports:
|
|
24
|
+
- "8080:8080"
|
|
25
|
+
environment:
|
|
26
|
+
- API_HOST=0.0.0.0
|
|
27
|
+
- API_PORT=8080
|
|
28
|
+
- API_TOKEN_SECRET=${API_TOKEN_SECRET:-change-me-in-production}
|
|
29
|
+
- ORCHESTRATOR_URL=http://orchestrator:3000
|
|
30
|
+
- PROXYSQL_HOST=proxysql
|
|
31
|
+
- PROXYSQL_ADMIN_PORT=6032
|
|
32
|
+
- PROMETHEUS_URL=http://prometheus:9090
|
|
33
|
+
# Metadata Database (shared with Orchestrator)
|
|
34
|
+
- METADATA_DB_HOST=${METADATA_DB_HOST:-metadata-mysql}
|
|
35
|
+
- METADATA_DB_PORT=${METADATA_DB_PORT:-3306}
|
|
36
|
+
- METADATA_DB_NAME=${METADATA_DB_NAME:-clawsql_meta}
|
|
37
|
+
- METADATA_DB_USER=${METADATA_DB_USER:-clawsql}
|
|
38
|
+
- METADATA_DB_PASSWORD=${METADATA_DB_PASSWORD:-clawsql_password}
|
|
39
|
+
# MySQL credentials (for your MySQL instances)
|
|
40
|
+
- MYSQL_ADMIN_USER=${MYSQL_ADMIN_USER:-clawsql}
|
|
41
|
+
- MYSQL_ADMIN_PASSWORD=${MYSQL_ADMIN_PASSWORD:-clawsql_password}
|
|
42
|
+
- MYSQL_REPLICATION_USER=${MYSQL_REPLICATION_USER:-repl}
|
|
43
|
+
- MYSQL_REPLICATION_PASSWORD=${MYSQL_REPLICATION_PASSWORD:-repl_password}
|
|
44
|
+
# Logging
|
|
45
|
+
- LOG_LEVEL=${LOG_LEVEL:-INFO}
|
|
46
|
+
- LOG_FORMAT=${LOG_FORMAT:-json}
|
|
47
|
+
# Failover settings
|
|
48
|
+
- AUTO_FAILOVER_ENABLED=${AUTO_FAILOVER_ENABLED:-true}
|
|
49
|
+
depends_on:
|
|
50
|
+
orchestrator:
|
|
51
|
+
condition: service_started
|
|
52
|
+
proxysql:
|
|
53
|
+
condition: service_started
|
|
54
|
+
networks:
|
|
55
|
+
- clawsql-network
|
|
56
|
+
restart: unless-stopped
|
|
57
|
+
healthcheck:
|
|
58
|
+
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
|
59
|
+
interval: 30s
|
|
60
|
+
timeout: 10s
|
|
61
|
+
retries: 3
|
|
62
|
+
|
|
63
|
+
# =============================================================================
|
|
64
|
+
# Orchestrator - MySQL Topology Management
|
|
65
|
+
# Uses shared metadata MySQL database
|
|
66
|
+
# =============================================================================
|
|
67
|
+
orchestrator:
|
|
68
|
+
image: openarkcode/orchestrator:latest
|
|
69
|
+
container_name: orchestrator
|
|
70
|
+
hostname: orchestrator
|
|
71
|
+
ports:
|
|
72
|
+
- "3000:3000"
|
|
73
|
+
volumes:
|
|
74
|
+
- ./docker/orchestrator/orchestrator.conf.json:/etc/orchestrator.conf.json
|
|
75
|
+
networks:
|
|
76
|
+
- clawsql-network
|
|
77
|
+
restart: unless-stopped
|
|
78
|
+
|
|
79
|
+
# =============================================================================
|
|
80
|
+
# ProxySQL - MySQL Proxy with Routing
|
|
81
|
+
# =============================================================================
|
|
82
|
+
proxysql:
|
|
83
|
+
image: proxysql/proxysql:latest
|
|
84
|
+
container_name: proxysql
|
|
85
|
+
hostname: proxysql
|
|
86
|
+
ports:
|
|
87
|
+
- "6032:6032" # Admin interface
|
|
88
|
+
- "6033:6033" # MySQL traffic
|
|
89
|
+
volumes:
|
|
90
|
+
- ./docker/proxysql/proxysql.cnf:/etc/proxysql.cnf
|
|
91
|
+
- ./docker/proxysql/entrypoint.sh:/entrypoint.sh:ro
|
|
92
|
+
- proxysql-data:/var/lib/proxysql
|
|
93
|
+
entrypoint: ["/bin/bash", "/entrypoint.sh"]
|
|
94
|
+
networks:
|
|
95
|
+
- clawsql-network
|
|
96
|
+
restart: unless-stopped
|
|
97
|
+
|
|
98
|
+
# =============================================================================
|
|
99
|
+
# Prometheus - Metrics Collection
|
|
100
|
+
# =============================================================================
|
|
101
|
+
prometheus:
|
|
102
|
+
image: prom/prometheus:latest
|
|
103
|
+
container_name: prometheus
|
|
104
|
+
hostname: prometheus
|
|
105
|
+
ports:
|
|
106
|
+
- "9090:9090"
|
|
107
|
+
volumes:
|
|
108
|
+
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
|
109
|
+
- prometheus-data:/prometheus
|
|
110
|
+
command:
|
|
111
|
+
- '--config.file=/etc/prometheus/prometheus.yml'
|
|
112
|
+
- '--storage.tsdb.path=/prometheus'
|
|
113
|
+
- '--web.enable-lifecycle'
|
|
114
|
+
networks:
|
|
115
|
+
- clawsql-network
|
|
116
|
+
restart: unless-stopped
|
|
117
|
+
|
|
118
|
+
# =============================================================================
|
|
119
|
+
# Grafana - Visualization
|
|
120
|
+
# =============================================================================
|
|
121
|
+
grafana:
|
|
122
|
+
image: grafana/grafana:latest
|
|
123
|
+
container_name: grafana
|
|
124
|
+
hostname: grafana
|
|
125
|
+
ports:
|
|
126
|
+
- "3001:3000"
|
|
127
|
+
environment:
|
|
128
|
+
- GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin}
|
|
129
|
+
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin}
|
|
130
|
+
- GF_USERS_ALLOW_SIGN_UP=false
|
|
131
|
+
volumes:
|
|
132
|
+
- grafana-data:/var/lib/grafana
|
|
133
|
+
- ./docker/grafana/provisioning:/etc/grafana/provisioning
|
|
134
|
+
- ./docker/grafana/dashboards:/var/lib/grafana/dashboards
|
|
135
|
+
depends_on:
|
|
136
|
+
- prometheus
|
|
137
|
+
networks:
|
|
138
|
+
- clawsql-network
|
|
139
|
+
restart: unless-stopped
|
|
140
|
+
|
|
141
|
+
# =============================================================================
|
|
142
|
+
# MySQL Exporter - MySQL Metrics (optional, uncomment to enable)
|
|
143
|
+
# =============================================================================
|
|
144
|
+
# mysql-exporter:
|
|
145
|
+
# image: prom/mysqld-exporter:latest
|
|
146
|
+
# container_name: mysql-exporter
|
|
147
|
+
# hostname: mysql-exporter
|
|
148
|
+
# ports:
|
|
149
|
+
# - "9104:9104"
|
|
150
|
+
# environment:
|
|
151
|
+
# - DATA_SOURCE_NAME=${MYSQL_MONITOR_USER:-monitor}:${MYSQL_MONITOR_PASSWORD:-}@(${MYSQL_HOST:-mysql-primary}:3306)/
|
|
152
|
+
# networks:
|
|
153
|
+
# - clawsql-network
|
|
154
|
+
# restart: unless-stopped
|
|
155
|
+
|
|
156
|
+
# =============================================================================
|
|
157
|
+
# ProxySQL Exporter - ProxySQL Metrics (optional, uncomment to enable)
|
|
158
|
+
# =============================================================================
|
|
159
|
+
# proxysql-exporter:
|
|
160
|
+
# image: prom/proxysql-exporter:latest
|
|
161
|
+
# container_name: proxysql-exporter
|
|
162
|
+
# hostname: proxysql-exporter
|
|
163
|
+
# ports:
|
|
164
|
+
# - "42004:42004"
|
|
165
|
+
# command:
|
|
166
|
+
# - '--web.listen-address=:42004'
|
|
167
|
+
# - '--proxysql.addr=proxysql:6032'
|
|
168
|
+
# - '--proxysql.user=admin'
|
|
169
|
+
# - '--proxysql.password=admin'
|
|
170
|
+
# networks:
|
|
171
|
+
# - clawsql-network
|
|
172
|
+
# restart: unless-stopped
|
|
173
|
+
|
|
174
|
+
# =============================================================================
|
|
175
|
+
# Metadata MySQL - Shared Database for Orchestrator and ClawSQL
|
|
176
|
+
# Auto-provisioned if METADATA_DB_HOST is not set
|
|
177
|
+
# =============================================================================
|
|
178
|
+
metadata-mysql:
|
|
179
|
+
image: mysql:8.0
|
|
180
|
+
container_name: metadata-mysql
|
|
181
|
+
hostname: metadata-mysql
|
|
182
|
+
profiles:
|
|
183
|
+
- metadata
|
|
184
|
+
environment:
|
|
185
|
+
MYSQL_ROOT_PASSWORD: ${METADATA_DB_ROOT_PASSWORD:-metadata_root}
|
|
186
|
+
MYSQL_DATABASE: ${METADATA_DB_NAME:-clawsql_meta}
|
|
187
|
+
MYSQL_USER: ${METADATA_DB_USER:-clawsql}
|
|
188
|
+
MYSQL_PASSWORD: ${METADATA_DB_PASSWORD:-clawsql_password}
|
|
189
|
+
volumes:
|
|
190
|
+
- metadata-mysql-data:/var/lib/mysql
|
|
191
|
+
networks:
|
|
192
|
+
- clawsql-network
|
|
193
|
+
restart: unless-stopped
|
|
194
|
+
healthcheck:
|
|
195
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
|
196
|
+
interval: 10s
|
|
197
|
+
timeout: 5s
|
|
198
|
+
retries: 5
|
|
199
|
+
|
|
200
|
+
# =============================================================================
|
|
201
|
+
# Networks
|
|
202
|
+
# =============================================================================
|
|
203
|
+
networks:
|
|
204
|
+
clawsql-network:
|
|
205
|
+
driver: bridge
|
|
206
|
+
ipam:
|
|
207
|
+
config:
|
|
208
|
+
- subnet: 172.18.0.0/24
|
|
209
|
+
|
|
210
|
+
# =============================================================================
|
|
211
|
+
# Volumes
|
|
212
|
+
# =============================================================================
|
|
213
|
+
volumes:
|
|
214
|
+
metadata-mysql-data:
|
|
215
|
+
proxysql-data:
|
|
216
|
+
prometheus-data:
|
|
217
|
+
grafana-data:
|
package/init/primary.sql
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-- Primary initialization script
|
|
2
|
+
-- Create replication user
|
|
3
|
+
CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY 'replpassword';
|
|
4
|
+
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
|
|
5
|
+
|
|
6
|
+
-- Create monitoring user
|
|
7
|
+
CREATE USER IF NOT EXISTS 'monitor'@'%' IDENTIFIED BY 'monitorpassword';
|
|
8
|
+
GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'monitor'@'%';
|
|
9
|
+
GRANT SELECT ON mysql.* TO 'monitor'@'%';
|
|
10
|
+
|
|
11
|
+
-- Create Orchestrator user (needs SUPER for topology management)
|
|
12
|
+
CREATE USER IF NOT EXISTS 'clawsql'@'%' IDENTIFIED BY 'clawsql_password';
|
|
13
|
+
GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
|
|
14
|
+
|
|
15
|
+
-- Create application user for demo database
|
|
16
|
+
CREATE USER IF NOT EXISTS 'app'@'%' IDENTIFIED BY 'apppassword';
|
|
17
|
+
GRANT ALL PRIVILEGES ON clawsql.* TO 'app'@'%';
|
|
18
|
+
|
|
19
|
+
FLUSH PRIVILEGES;
|
package/init/replica.sql
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-- Replica initialization script
|
|
2
|
+
-- Configure replication to primary
|
|
3
|
+
STOP SLAVE;
|
|
4
|
+
|
|
5
|
+
CHANGE REPLICATION SOURCE TO
|
|
6
|
+
SOURCE_HOST='mysql-primary',
|
|
7
|
+
SOURCE_PORT=3306,
|
|
8
|
+
SOURCE_USER='repl',
|
|
9
|
+
SOURCE_PASSWORD='replpassword',
|
|
10
|
+
SOURCE_AUTO_POSITION=1,
|
|
11
|
+
GET_SOURCE_PUBLIC_KEY=1;
|
|
12
|
+
|
|
13
|
+
START SLAVE;
|