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.
Files changed (311) hide show
  1. package/.env.example +97 -0
  2. package/README.md +372 -0
  3. package/dist/__tests__/config/settings.test.d.ts +5 -0
  4. package/dist/__tests__/config/settings.test.d.ts.map +1 -0
  5. package/dist/__tests__/config/settings.test.js +154 -0
  6. package/dist/__tests__/config/settings.test.js.map +1 -0
  7. package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
  8. package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
  9. package/dist/__tests__/core/discovery/topology.test.js +191 -0
  10. package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
  11. package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
  12. package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/core/failover/executor.test.js +256 -0
  14. package/dist/__tests__/core/failover/executor.test.js.map +1 -0
  15. package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
  16. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
  17. package/dist/__tests__/core/monitoring/collector.test.js +131 -0
  18. package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
  19. package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
  20. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
  21. package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
  22. package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
  23. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
  24. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
  25. package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
  26. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
  27. package/dist/__tests__/types/index.test.d.ts +5 -0
  28. package/dist/__tests__/types/index.test.d.ts.map +1 -0
  29. package/dist/__tests__/types/index.test.js +290 -0
  30. package/dist/__tests__/types/index.test.js.map +1 -0
  31. package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
  32. package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/exceptions.test.js +142 -0
  34. package/dist/__tests__/utils/exceptions.test.js.map +1 -0
  35. package/dist/api/routes/clusters.d.ts +7 -0
  36. package/dist/api/routes/clusters.d.ts.map +1 -0
  37. package/dist/api/routes/clusters.js +123 -0
  38. package/dist/api/routes/clusters.js.map +1 -0
  39. package/dist/api/routes/config.d.ts +7 -0
  40. package/dist/api/routes/config.d.ts.map +1 -0
  41. package/dist/api/routes/config.js +65 -0
  42. package/dist/api/routes/config.js.map +1 -0
  43. package/dist/api/routes/failover.d.ts +7 -0
  44. package/dist/api/routes/failover.d.ts.map +1 -0
  45. package/dist/api/routes/failover.js +100 -0
  46. package/dist/api/routes/failover.js.map +1 -0
  47. package/dist/api/routes/instances.d.ts +11 -0
  48. package/dist/api/routes/instances.d.ts.map +1 -0
  49. package/dist/api/routes/instances.js +315 -0
  50. package/dist/api/routes/instances.js.map +1 -0
  51. package/dist/api/routes/monitoring.d.ts +7 -0
  52. package/dist/api/routes/monitoring.d.ts.map +1 -0
  53. package/dist/api/routes/monitoring.js +72 -0
  54. package/dist/api/routes/monitoring.js.map +1 -0
  55. package/dist/api/routes/webhooks.d.ts +12 -0
  56. package/dist/api/routes/webhooks.d.ts.map +1 -0
  57. package/dist/api/routes/webhooks.js +232 -0
  58. package/dist/api/routes/webhooks.js.map +1 -0
  59. package/dist/api/schemas/index.d.ts +965 -0
  60. package/dist/api/schemas/index.d.ts.map +1 -0
  61. package/dist/api/schemas/index.js +171 -0
  62. package/dist/api/schemas/index.js.map +1 -0
  63. package/dist/app.d.ts +13 -0
  64. package/dist/app.d.ts.map +1 -0
  65. package/dist/app.js +197 -0
  66. package/dist/app.js.map +1 -0
  67. package/dist/bin/clawsql.d.ts +12 -0
  68. package/dist/bin/clawsql.d.ts.map +1 -0
  69. package/dist/bin/clawsql.js +43 -0
  70. package/dist/bin/clawsql.js.map +1 -0
  71. package/dist/cli/agent/handler.d.ts +73 -0
  72. package/dist/cli/agent/handler.d.ts.map +1 -0
  73. package/dist/cli/agent/handler.js +258 -0
  74. package/dist/cli/agent/handler.js.map +1 -0
  75. package/dist/cli/agent/index.d.ts +14 -0
  76. package/dist/cli/agent/index.d.ts.map +1 -0
  77. package/dist/cli/agent/index.js +30 -0
  78. package/dist/cli/agent/index.js.map +1 -0
  79. package/dist/cli/agent/openclaw-integration.d.ts +81 -0
  80. package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
  81. package/dist/cli/agent/openclaw-integration.js +341 -0
  82. package/dist/cli/agent/openclaw-integration.js.map +1 -0
  83. package/dist/cli/agent/providers/anthropic.d.ts +27 -0
  84. package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
  85. package/dist/cli/agent/providers/anthropic.js +106 -0
  86. package/dist/cli/agent/providers/anthropic.js.map +1 -0
  87. package/dist/cli/agent/providers/base.d.ts +91 -0
  88. package/dist/cli/agent/providers/base.d.ts.map +1 -0
  89. package/dist/cli/agent/providers/base.js +24 -0
  90. package/dist/cli/agent/providers/base.js.map +1 -0
  91. package/dist/cli/agent/providers/openai.d.ts +27 -0
  92. package/dist/cli/agent/providers/openai.d.ts.map +1 -0
  93. package/dist/cli/agent/providers/openai.js +98 -0
  94. package/dist/cli/agent/providers/openai.js.map +1 -0
  95. package/dist/cli/agent/tools/index.d.ts +32 -0
  96. package/dist/cli/agent/tools/index.d.ts.map +1 -0
  97. package/dist/cli/agent/tools/index.js +263 -0
  98. package/dist/cli/agent/tools/index.js.map +1 -0
  99. package/dist/cli/commands/cleanup.d.ts +12 -0
  100. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  101. package/dist/cli/commands/cleanup.js +205 -0
  102. package/dist/cli/commands/cleanup.js.map +1 -0
  103. package/dist/cli/commands/clusters.d.ts +12 -0
  104. package/dist/cli/commands/clusters.d.ts.map +1 -0
  105. package/dist/cli/commands/clusters.js +468 -0
  106. package/dist/cli/commands/clusters.js.map +1 -0
  107. package/dist/cli/commands/config.d.ts +12 -0
  108. package/dist/cli/commands/config.d.ts.map +1 -0
  109. package/dist/cli/commands/config.js +406 -0
  110. package/dist/cli/commands/config.js.map +1 -0
  111. package/dist/cli/commands/cron.d.ts +12 -0
  112. package/dist/cli/commands/cron.d.ts.map +1 -0
  113. package/dist/cli/commands/cron.js +215 -0
  114. package/dist/cli/commands/cron.js.map +1 -0
  115. package/dist/cli/commands/doctor.d.ts +13 -0
  116. package/dist/cli/commands/doctor.d.ts.map +1 -0
  117. package/dist/cli/commands/doctor.js +687 -0
  118. package/dist/cli/commands/doctor.js.map +1 -0
  119. package/dist/cli/commands/failover.d.ts +16 -0
  120. package/dist/cli/commands/failover.d.ts.map +1 -0
  121. package/dist/cli/commands/failover.js +333 -0
  122. package/dist/cli/commands/failover.js.map +1 -0
  123. package/dist/cli/commands/health.d.ts +12 -0
  124. package/dist/cli/commands/health.d.ts.map +1 -0
  125. package/dist/cli/commands/health.js +125 -0
  126. package/dist/cli/commands/health.js.map +1 -0
  127. package/dist/cli/commands/help.d.ts +12 -0
  128. package/dist/cli/commands/help.d.ts.map +1 -0
  129. package/dist/cli/commands/help.js +52 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/instances.d.ts +12 -0
  132. package/dist/cli/commands/instances.d.ts.map +1 -0
  133. package/dist/cli/commands/instances.js +801 -0
  134. package/dist/cli/commands/instances.js.map +1 -0
  135. package/dist/cli/commands/notify.d.ts +12 -0
  136. package/dist/cli/commands/notify.d.ts.map +1 -0
  137. package/dist/cli/commands/notify.js +43 -0
  138. package/dist/cli/commands/notify.js.map +1 -0
  139. package/dist/cli/commands/sql.d.ts +12 -0
  140. package/dist/cli/commands/sql.d.ts.map +1 -0
  141. package/dist/cli/commands/sql.js +90 -0
  142. package/dist/cli/commands/sql.js.map +1 -0
  143. package/dist/cli/commands/start.d.ts +12 -0
  144. package/dist/cli/commands/start.d.ts.map +1 -0
  145. package/dist/cli/commands/start.js +174 -0
  146. package/dist/cli/commands/start.js.map +1 -0
  147. package/dist/cli/commands/status.d.ts +12 -0
  148. package/dist/cli/commands/status.d.ts.map +1 -0
  149. package/dist/cli/commands/status.js +218 -0
  150. package/dist/cli/commands/status.js.map +1 -0
  151. package/dist/cli/commands/stop.d.ts +12 -0
  152. package/dist/cli/commands/stop.d.ts.map +1 -0
  153. package/dist/cli/commands/stop.js +128 -0
  154. package/dist/cli/commands/stop.js.map +1 -0
  155. package/dist/cli/commands/topology.d.ts +12 -0
  156. package/dist/cli/commands/topology.d.ts.map +1 -0
  157. package/dist/cli/commands/topology.js +106 -0
  158. package/dist/cli/commands/topology.js.map +1 -0
  159. package/dist/cli/completer.d.ts +47 -0
  160. package/dist/cli/completer.d.ts.map +1 -0
  161. package/dist/cli/completer.js +332 -0
  162. package/dist/cli/completer.js.map +1 -0
  163. package/dist/cli/formatter.d.ts +165 -0
  164. package/dist/cli/formatter.d.ts.map +1 -0
  165. package/dist/cli/formatter.js +408 -0
  166. package/dist/cli/formatter.js.map +1 -0
  167. package/dist/cli/index.d.ts +21 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +79 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/raw-input.d.ts +97 -0
  172. package/dist/cli/raw-input.d.ts.map +1 -0
  173. package/dist/cli/raw-input.js +493 -0
  174. package/dist/cli/raw-input.js.map +1 -0
  175. package/dist/cli/registry.d.ts +103 -0
  176. package/dist/cli/registry.d.ts.map +1 -0
  177. package/dist/cli/registry.js +205 -0
  178. package/dist/cli/registry.js.map +1 -0
  179. package/dist/cli/repl.d.ts +83 -0
  180. package/dist/cli/repl.d.ts.map +1 -0
  181. package/dist/cli/repl.js +447 -0
  182. package/dist/cli/repl.js.map +1 -0
  183. package/dist/cli/ui/components.d.ts +144 -0
  184. package/dist/cli/ui/components.d.ts.map +1 -0
  185. package/dist/cli/ui/components.js +331 -0
  186. package/dist/cli/ui/components.js.map +1 -0
  187. package/dist/cli/ui/index.d.ts +7 -0
  188. package/dist/cli/ui/index.d.ts.map +1 -0
  189. package/dist/cli/ui/index.js +23 -0
  190. package/dist/cli/ui/index.js.map +1 -0
  191. package/dist/cli/utils/docker-files.d.ts +39 -0
  192. package/dist/cli/utils/docker-files.d.ts.map +1 -0
  193. package/dist/cli/utils/docker-files.js +223 -0
  194. package/dist/cli/utils/docker-files.js.map +1 -0
  195. package/dist/cli/utils/docker-prereq.d.ts +48 -0
  196. package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
  197. package/dist/cli/utils/docker-prereq.js +203 -0
  198. package/dist/cli/utils/docker-prereq.js.map +1 -0
  199. package/dist/config/settings.d.ts +594 -0
  200. package/dist/config/settings.d.ts.map +1 -0
  201. package/dist/config/settings.js +250 -0
  202. package/dist/config/settings.js.map +1 -0
  203. package/dist/core/discovery/cluster-view.d.ts +50 -0
  204. package/dist/core/discovery/cluster-view.d.ts.map +1 -0
  205. package/dist/core/discovery/cluster-view.js +235 -0
  206. package/dist/core/discovery/cluster-view.js.map +1 -0
  207. package/dist/core/discovery/scanner.d.ts +70 -0
  208. package/dist/core/discovery/scanner.d.ts.map +1 -0
  209. package/dist/core/discovery/scanner.js +197 -0
  210. package/dist/core/discovery/scanner.js.map +1 -0
  211. package/dist/core/discovery/topology.d.ts +118 -0
  212. package/dist/core/discovery/topology.d.ts.map +1 -0
  213. package/dist/core/discovery/topology.js +550 -0
  214. package/dist/core/discovery/topology.js.map +1 -0
  215. package/dist/core/failover/candidate-selector.d.ts +46 -0
  216. package/dist/core/failover/candidate-selector.d.ts.map +1 -0
  217. package/dist/core/failover/candidate-selector.js +70 -0
  218. package/dist/core/failover/candidate-selector.js.map +1 -0
  219. package/dist/core/failover/executor.d.ts +104 -0
  220. package/dist/core/failover/executor.d.ts.map +1 -0
  221. package/dist/core/failover/executor.js +248 -0
  222. package/dist/core/failover/executor.js.map +1 -0
  223. package/dist/core/failover/operation-builder.d.ts +71 -0
  224. package/dist/core/failover/operation-builder.d.ts.map +1 -0
  225. package/dist/core/failover/operation-builder.js +157 -0
  226. package/dist/core/failover/operation-builder.js.map +1 -0
  227. package/dist/core/failover/operation-runner.d.ts +75 -0
  228. package/dist/core/failover/operation-runner.d.ts.map +1 -0
  229. package/dist/core/failover/operation-runner.js +191 -0
  230. package/dist/core/failover/operation-runner.js.map +1 -0
  231. package/dist/core/failover/promoter.d.ts +33 -0
  232. package/dist/core/failover/promoter.d.ts.map +1 -0
  233. package/dist/core/failover/promoter.js +97 -0
  234. package/dist/core/failover/promoter.js.map +1 -0
  235. package/dist/core/failover/recovery-manager.d.ts +47 -0
  236. package/dist/core/failover/recovery-manager.d.ts.map +1 -0
  237. package/dist/core/failover/recovery-manager.js +145 -0
  238. package/dist/core/failover/recovery-manager.js.map +1 -0
  239. package/dist/core/failover/types.d.ts +54 -0
  240. package/dist/core/failover/types.d.ts.map +1 -0
  241. package/dist/core/failover/types.js +8 -0
  242. package/dist/core/failover/types.js.map +1 -0
  243. package/dist/core/monitoring/collector.d.ts +25 -0
  244. package/dist/core/monitoring/collector.d.ts.map +1 -0
  245. package/dist/core/monitoring/collector.js +115 -0
  246. package/dist/core/monitoring/collector.js.map +1 -0
  247. package/dist/core/monitoring/exporters.d.ts +49 -0
  248. package/dist/core/monitoring/exporters.d.ts.map +1 -0
  249. package/dist/core/monitoring/exporters.js +126 -0
  250. package/dist/core/monitoring/exporters.js.map +1 -0
  251. package/dist/core/routing/proxysql-manager.d.ts +213 -0
  252. package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
  253. package/dist/core/routing/proxysql-manager.js +632 -0
  254. package/dist/core/routing/proxysql-manager.js.map +1 -0
  255. package/dist/core/sync/replica-recovery.d.ts +40 -0
  256. package/dist/core/sync/replica-recovery.d.ts.map +1 -0
  257. package/dist/core/sync/replica-recovery.js +134 -0
  258. package/dist/core/sync/replica-recovery.js.map +1 -0
  259. package/dist/core/sync/sync-coordinator.d.ts +83 -0
  260. package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
  261. package/dist/core/sync/sync-coordinator.js +254 -0
  262. package/dist/core/sync/sync-coordinator.js.map +1 -0
  263. package/dist/core/sync/topology-watcher.d.ts +76 -0
  264. package/dist/core/sync/topology-watcher.d.ts.map +1 -0
  265. package/dist/core/sync/topology-watcher.js +222 -0
  266. package/dist/core/sync/topology-watcher.js.map +1 -0
  267. package/dist/core/sync/types.d.ts +85 -0
  268. package/dist/core/sync/types.d.ts.map +1 -0
  269. package/dist/core/sync/types.js +8 -0
  270. package/dist/core/sync/types.js.map +1 -0
  271. package/dist/index.d.ts +5 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +9 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/types/index.d.ts +212 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +153 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/database.d.ts +62 -0
  280. package/dist/utils/database.d.ts.map +1 -0
  281. package/dist/utils/database.js +257 -0
  282. package/dist/utils/database.js.map +1 -0
  283. package/dist/utils/exceptions.d.ts +69 -0
  284. package/dist/utils/exceptions.d.ts.map +1 -0
  285. package/dist/utils/exceptions.js +121 -0
  286. package/dist/utils/exceptions.js.map +1 -0
  287. package/dist/utils/logger.d.ts +20 -0
  288. package/dist/utils/logger.d.ts.map +1 -0
  289. package/dist/utils/logger.js +90 -0
  290. package/dist/utils/logger.js.map +1 -0
  291. package/dist/utils/mysql-client.d.ts +43 -0
  292. package/dist/utils/mysql-client.d.ts.map +1 -0
  293. package/dist/utils/mysql-client.js +125 -0
  294. package/dist/utils/mysql-client.js.map +1 -0
  295. package/docker/Dockerfile +61 -0
  296. package/docker/Dockerfile.node +41 -0
  297. package/docker/grafana/dashboards/clawsql.json +212 -0
  298. package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
  299. package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
  300. package/docker/init/primary.sql +26 -0
  301. package/docker/init/replica.sql +16 -0
  302. package/docker/orchestrator/orchestrator.conf.json +98 -0
  303. package/docker/prometheus/prometheus.yml +45 -0
  304. package/docker/proxysql/entrypoint.sh +8 -0
  305. package/docker/proxysql/init.sql.demo +30 -0
  306. package/docker/proxysql/proxysql.cnf +38 -0
  307. package/docker-compose.demo.yml +115 -0
  308. package/docker-compose.yml +217 -0
  309. package/init/primary.sql +19 -0
  310. package/init/replica.sql +13 -0
  311. 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,8 @@
1
+ #!/bin/bash
2
+ # ClawSQL ProxySQL Entrypoint
3
+
4
+ # Remove stale PID file if exists
5
+ rm -f /var/lib/proxysql/proxysql.pid
6
+
7
+ # Start ProxySQL in foreground
8
+ exec proxysql --config /etc/proxysql.cnf --foreground
@@ -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:
@@ -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;
@@ -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;