spindb 0.37.2 → 0.38.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/dist/cli/bin.js +9 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/attach.js +102 -0
- package/dist/cli/commands/attach.js.map +1 -0
- package/dist/cli/commands/backup.js +197 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/backups.js +190 -0
- package/dist/cli/commands/backups.js.map +1 -0
- package/dist/cli/commands/clone.js +119 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connect.js +559 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/create.js +952 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/databases.js +485 -0
- package/dist/cli/commands/databases.js.map +1 -0
- package/dist/cli/commands/delete.js +106 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/deps.js +238 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/detach.js +81 -0
- package/dist/cli/commands/detach.js.map +1 -0
- package/dist/cli/commands/doctor.js +567 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/duckdb.js +207 -0
- package/dist/cli/commands/duckdb.js.map +1 -0
- package/dist/cli/commands/edit.js +524 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/engines.js +1414 -0
- package/dist/cli/commands/engines.js.map +1 -0
- package/dist/cli/commands/export.js +383 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.js +270 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/list.js +215 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.js +81 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/menu/backup-handlers.js +1202 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
- package/dist/cli/commands/menu/container-handlers.js +1788 -0
- package/dist/cli/commands/menu/container-handlers.js.map +1 -0
- package/dist/cli/commands/menu/engine-handlers.js +235 -0
- package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
- package/dist/cli/commands/menu/index.js +266 -0
- package/dist/cli/commands/menu/index.js.map +1 -0
- package/dist/cli/commands/menu/settings-handlers.js +320 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
- package/dist/cli/commands/menu/shared.js +13 -0
- package/dist/cli/commands/menu/shared.js.map +1 -0
- package/dist/cli/commands/menu/shell-handlers.js +1573 -0
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
- package/dist/cli/commands/menu/sql-handlers.js +185 -0
- package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
- package/dist/cli/commands/menu/update-handlers.js +322 -0
- package/dist/cli/commands/menu/update-handlers.js.map +1 -0
- package/dist/cli/commands/menu/validators.js +9 -0
- package/dist/cli/commands/menu/validators.js.map +1 -0
- package/dist/cli/commands/ports.js +166 -0
- package/dist/cli/commands/ports.js.map +1 -0
- package/dist/cli/commands/pull.js +166 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/query.js +180 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/restore.js +428 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/run.js +115 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/self-update.js +99 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/sqlite.js +207 -0
- package/dist/cli/commands/sqlite.js.map +1 -0
- package/dist/cli/commands/start.js +196 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stop.js +182 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/url.js +88 -0
- package/dist/cli/commands/url.js.map +1 -0
- package/dist/cli/commands/users.js +189 -0
- package/dist/cli/commands/users.js.map +1 -0
- package/dist/cli/commands/version.js +52 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/which.js +258 -0
- package/dist/cli/commands/which.js.map +1 -0
- package/dist/cli/constants.js +212 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/helpers.js +1120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/prompts.js +1002 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/cli/ui/spinner.js +74 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/theme.js +99 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/utils/file-follower.js +79 -0
- package/dist/cli/utils/file-follower.js.map +1 -0
- package/dist/config/backup-formats.js +363 -0
- package/dist/config/backup-formats.js.map +1 -0
- package/dist/config/defaults.js +25 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/engine-defaults.js +303 -0
- package/dist/config/engine-defaults.js.map +1 -0
- package/dist/config/engines-registry.js +103 -0
- package/dist/config/engines-registry.js.map +1 -0
- package/dist/config/os-dependencies.js +767 -0
- package/dist/config/os-dependencies.js.map +1 -0
- package/dist/config/paths.js +156 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.js +3 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/backup-restore.js +219 -0
- package/dist/core/backup-restore.js.map +1 -0
- package/dist/core/base-binary-manager.js +403 -0
- package/dist/core/base-binary-manager.js.map +1 -0
- package/dist/core/base-document-binary-manager.js +364 -0
- package/dist/core/base-document-binary-manager.js.map +1 -0
- package/dist/core/base-embedded-binary-manager.js +364 -0
- package/dist/core/base-embedded-binary-manager.js.map +1 -0
- package/dist/core/base-server-binary-manager.js +368 -0
- package/dist/core/base-server-binary-manager.js.map +1 -0
- package/dist/core/config-manager.js +495 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/container-manager.js +609 -0
- package/dist/core/container-manager.js.map +1 -0
- package/dist/core/credential-generator.js +67 -0
- package/dist/core/credential-generator.js.map +1 -0
- package/dist/core/credential-manager.js +211 -0
- package/dist/core/credential-manager.js.map +1 -0
- package/dist/core/dblab-utils.js +105 -0
- package/dist/core/dblab-utils.js.map +1 -0
- package/dist/core/dependency-manager.js +359 -0
- package/dist/core/dependency-manager.js.map +1 -0
- package/dist/core/docker-exporter.js +1077 -0
- package/dist/core/docker-exporter.js.map +1 -0
- package/dist/core/error-handler.js +295 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/fs-error-utils.js +74 -0
- package/dist/core/fs-error-utils.js.map +1 -0
- package/dist/core/homebrew-version-manager.js +280 -0
- package/dist/core/homebrew-version-manager.js.map +1 -0
- package/dist/core/hostdb-client.js +252 -0
- package/dist/core/hostdb-client.js.map +1 -0
- package/dist/core/hostdb-metadata.js +243 -0
- package/dist/core/hostdb-metadata.js.map +1 -0
- package/dist/core/hostdb-releases-factory.js +161 -0
- package/dist/core/hostdb-releases-factory.js.map +1 -0
- package/dist/core/library-env.js +88 -0
- package/dist/core/library-env.js.map +1 -0
- package/dist/core/pgweb-utils.js +53 -0
- package/dist/core/pgweb-utils.js.map +1 -0
- package/dist/core/platform-service.js +632 -0
- package/dist/core/platform-service.js.map +1 -0
- package/dist/core/port-manager.js +136 -0
- package/dist/core/port-manager.js.map +1 -0
- package/dist/core/process-manager.js +445 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/pull-manager.js +418 -0
- package/dist/core/pull-manager.js.map +1 -0
- package/dist/core/query-parser.js +449 -0
- package/dist/core/query-parser.js.map +1 -0
- package/dist/core/spawn-utils.js +90 -0
- package/dist/core/spawn-utils.js.map +1 -0
- package/dist/core/start-with-retry.js +90 -0
- package/dist/core/start-with-retry.js.map +1 -0
- package/dist/core/test-cleanup.js +85 -0
- package/dist/core/test-cleanup.js.map +1 -0
- package/dist/core/tls-generator.js +84 -0
- package/dist/core/tls-generator.js.map +1 -0
- package/dist/core/transaction-manager.js +139 -0
- package/dist/core/transaction-manager.js.map +1 -0
- package/dist/core/update-manager.js +241 -0
- package/dist/core/update-manager.js.map +1 -0
- package/dist/core/version-migration.js +260 -0
- package/dist/core/version-migration.js.map +1 -0
- package/dist/core/version-utils.js +91 -0
- package/dist/core/version-utils.js.map +1 -0
- package/dist/engines/base-engine.js +179 -0
- package/dist/engines/base-engine.js.map +1 -0
- package/dist/engines/clickhouse/backup.js +289 -0
- package/dist/engines/clickhouse/backup.js.map +1 -0
- package/dist/engines/clickhouse/binary-manager.js +145 -0
- package/dist/engines/clickhouse/binary-manager.js.map +1 -0
- package/dist/engines/clickhouse/binary-urls.js +100 -0
- package/dist/engines/clickhouse/binary-urls.js.map +1 -0
- package/dist/engines/clickhouse/cli-utils.js +143 -0
- package/dist/engines/clickhouse/cli-utils.js.map +1 -0
- package/dist/engines/clickhouse/hostdb-releases.js +24 -0
- package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
- package/dist/engines/clickhouse/index.js +1077 -0
- package/dist/engines/clickhouse/index.js.map +1 -0
- package/dist/engines/clickhouse/restore.js +335 -0
- package/dist/engines/clickhouse/restore.js.map +1 -0
- package/dist/engines/clickhouse/version-maps.js +83 -0
- package/dist/engines/clickhouse/version-maps.js.map +1 -0
- package/dist/engines/clickhouse/version-validator.js +133 -0
- package/dist/engines/clickhouse/version-validator.js.map +1 -0
- package/dist/engines/cockroachdb/backup.js +261 -0
- package/dist/engines/cockroachdb/backup.js.map +1 -0
- package/dist/engines/cockroachdb/binary-manager.js +33 -0
- package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
- package/dist/engines/cockroachdb/binary-urls.js +33 -0
- package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
- package/dist/engines/cockroachdb/cli-utils.js +338 -0
- package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
- package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
- package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
- package/dist/engines/cockroachdb/index.js +1016 -0
- package/dist/engines/cockroachdb/index.js.map +1 -0
- package/dist/engines/cockroachdb/restore.js +323 -0
- package/dist/engines/cockroachdb/restore.js.map +1 -0
- package/dist/engines/cockroachdb/version-maps.js +37 -0
- package/dist/engines/cockroachdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/api-client.js +64 -0
- package/dist/engines/couchdb/api-client.js.map +1 -0
- package/dist/engines/couchdb/backup.js +90 -0
- package/dist/engines/couchdb/backup.js.map +1 -0
- package/dist/engines/couchdb/binary-manager.js +62 -0
- package/dist/engines/couchdb/binary-manager.js.map +1 -0
- package/dist/engines/couchdb/binary-urls.js +92 -0
- package/dist/engines/couchdb/binary-urls.js.map +1 -0
- package/dist/engines/couchdb/hostdb-releases.js +21 -0
- package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
- package/dist/engines/couchdb/index.js +1043 -0
- package/dist/engines/couchdb/index.js.map +1 -0
- package/dist/engines/couchdb/restore.js +198 -0
- package/dist/engines/couchdb/restore.js.map +1 -0
- package/dist/engines/couchdb/version-maps.js +67 -0
- package/dist/engines/couchdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/version-validator.js +88 -0
- package/dist/engines/couchdb/version-validator.js.map +1 -0
- package/dist/engines/duckdb/binary-manager.js +33 -0
- package/dist/engines/duckdb/binary-manager.js.map +1 -0
- package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
- package/dist/engines/duckdb/binary-urls.js.map +1 -0
- package/dist/engines/duckdb/hostdb-releases.js +21 -0
- package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
- package/dist/engines/duckdb/index.js +594 -0
- package/dist/engines/duckdb/index.js.map +1 -0
- package/dist/engines/duckdb/registry.js +265 -0
- package/dist/engines/duckdb/registry.js.map +1 -0
- package/dist/engines/duckdb/scanner.js +12 -0
- package/dist/engines/duckdb/scanner.js.map +1 -0
- package/dist/engines/duckdb/version-maps.js +67 -0
- package/dist/engines/duckdb/version-maps.js.map +1 -0
- package/dist/engines/duckdb/version-validator.js +62 -0
- package/dist/engines/duckdb/version-validator.js.map +1 -0
- package/dist/engines/ferretdb/backup.js +170 -0
- package/dist/engines/ferretdb/backup.js.map +1 -0
- package/dist/engines/ferretdb/binary-manager.js +765 -0
- package/dist/engines/ferretdb/binary-manager.js.map +1 -0
- package/dist/engines/ferretdb/binary-urls.js +135 -0
- package/dist/engines/ferretdb/binary-urls.js.map +1 -0
- package/dist/engines/ferretdb/index.js +1517 -0
- package/dist/engines/ferretdb/index.js.map +1 -0
- package/dist/engines/ferretdb/restore.js +310 -0
- package/dist/engines/ferretdb/restore.js.map +1 -0
- package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
- package/dist/engines/ferretdb/version-maps.js.map +1 -0
- package/dist/engines/file-based-utils.js +184 -0
- package/dist/engines/file-based-utils.js.map +1 -0
- package/dist/engines/index.js +124 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/influxdb/api-client.js +54 -0
- package/dist/engines/influxdb/api-client.js.map +1 -0
- package/dist/engines/influxdb/backup.js +119 -0
- package/dist/engines/influxdb/backup.js.map +1 -0
- package/dist/engines/influxdb/binary-manager.js +87 -0
- package/dist/engines/influxdb/binary-manager.js.map +1 -0
- package/dist/engines/influxdb/binary-urls.js +56 -0
- package/dist/engines/influxdb/binary-urls.js.map +1 -0
- package/dist/engines/influxdb/hostdb-releases.js +21 -0
- package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
- package/dist/engines/influxdb/index.js +962 -0
- package/dist/engines/influxdb/index.js.map +1 -0
- package/dist/engines/influxdb/restore.js +329 -0
- package/dist/engines/influxdb/restore.js.map +1 -0
- package/dist/engines/influxdb/version-maps.js +64 -0
- package/dist/engines/influxdb/version-maps.js.map +1 -0
- package/dist/engines/influxdb/version-validator.js +109 -0
- package/dist/engines/influxdb/version-validator.js.map +1 -0
- package/dist/engines/mariadb/backup.js +178 -0
- package/dist/engines/mariadb/backup.js.map +1 -0
- package/dist/engines/mariadb/binary-manager.js +33 -0
- package/dist/engines/mariadb/binary-manager.js.map +1 -0
- package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
- package/dist/engines/mariadb/binary-urls.js.map +1 -0
- package/dist/engines/mariadb/hostdb-releases.js +21 -0
- package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
- package/dist/engines/mariadb/index.js +1011 -0
- package/dist/engines/mariadb/index.js.map +1 -0
- package/dist/engines/mariadb/restore.js +322 -0
- package/dist/engines/mariadb/restore.js.map +1 -0
- package/dist/engines/mariadb/version-maps.js +63 -0
- package/dist/engines/mariadb/version-maps.js.map +1 -0
- package/dist/engines/mariadb/version-validator.js +143 -0
- package/dist/engines/mariadb/version-validator.js.map +1 -0
- package/dist/engines/meilisearch/api-client.js +50 -0
- package/dist/engines/meilisearch/api-client.js.map +1 -0
- package/dist/engines/meilisearch/backup.js +167 -0
- package/dist/engines/meilisearch/backup.js.map +1 -0
- package/dist/engines/meilisearch/binary-manager.js +31 -0
- package/dist/engines/meilisearch/binary-manager.js.map +1 -0
- package/dist/engines/meilisearch/binary-urls.js +56 -0
- package/dist/engines/meilisearch/binary-urls.js.map +1 -0
- package/dist/engines/meilisearch/hostdb-releases.js +21 -0
- package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
- package/dist/engines/meilisearch/index.js +992 -0
- package/dist/engines/meilisearch/index.js.map +1 -0
- package/dist/engines/meilisearch/restore.js +167 -0
- package/dist/engines/meilisearch/restore.js.map +1 -0
- package/dist/engines/meilisearch/version-maps.js +67 -0
- package/dist/engines/meilisearch/version-maps.js.map +1 -0
- package/dist/engines/meilisearch/version-validator.js +109 -0
- package/dist/engines/meilisearch/version-validator.js.map +1 -0
- package/dist/engines/mongodb/backup.js +109 -0
- package/dist/engines/mongodb/backup.js.map +1 -0
- package/dist/engines/mongodb/binary-manager.js +36 -0
- package/dist/engines/mongodb/binary-manager.js.map +1 -0
- package/dist/engines/mongodb/binary-urls.js +46 -0
- package/dist/engines/mongodb/binary-urls.js.map +1 -0
- package/dist/engines/mongodb/cli-utils.js +131 -0
- package/dist/engines/mongodb/cli-utils.js.map +1 -0
- package/dist/engines/mongodb/hostdb-releases.js +77 -0
- package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
- package/dist/engines/mongodb/index.js +873 -0
- package/dist/engines/mongodb/index.js.map +1 -0
- package/dist/engines/mongodb/restore.js +276 -0
- package/dist/engines/mongodb/restore.js.map +1 -0
- package/dist/engines/mongodb/version-maps.js +79 -0
- package/dist/engines/mongodb/version-maps.js.map +1 -0
- package/dist/engines/mongodb/version-validator.js +133 -0
- package/dist/engines/mongodb/version-validator.js.map +1 -0
- package/dist/engines/mysql/backup.js +210 -0
- package/dist/engines/mysql/backup.js.map +1 -0
- package/dist/engines/mysql/binary-detection.js +325 -0
- package/dist/engines/mysql/binary-detection.js.map +1 -0
- package/dist/engines/mysql/binary-manager.js +30 -0
- package/dist/engines/mysql/binary-manager.js.map +1 -0
- package/dist/engines/mysql/binary-urls.js +87 -0
- package/dist/engines/mysql/binary-urls.js.map +1 -0
- package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
- package/dist/engines/mysql/hostdb-releases.js.map +1 -0
- package/dist/engines/mysql/index.js +1066 -0
- package/dist/engines/mysql/index.js.map +1 -0
- package/dist/engines/mysql/restore.js +361 -0
- package/dist/engines/mysql/restore.js.map +1 -0
- package/dist/engines/mysql/version-maps.js +79 -0
- package/dist/engines/mysql/version-maps.js.map +1 -0
- package/dist/engines/mysql/version-validator.js +266 -0
- package/dist/engines/mysql/version-validator.js.map +1 -0
- package/dist/engines/postgresql/backup.js +118 -0
- package/dist/engines/postgresql/backup.js.map +1 -0
- package/dist/engines/postgresql/binary-manager.js +85 -0
- package/dist/engines/postgresql/binary-manager.js.map +1 -0
- package/dist/engines/postgresql/binary-urls.js +80 -0
- package/dist/engines/postgresql/binary-urls.js.map +1 -0
- package/dist/engines/postgresql/hostdb-releases.js +21 -0
- package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
- package/dist/engines/postgresql/index.js +852 -0
- package/dist/engines/postgresql/index.js.map +1 -0
- package/dist/engines/postgresql/remote-version.js +109 -0
- package/dist/engines/postgresql/remote-version.js.map +1 -0
- package/dist/engines/postgresql/restore.js +254 -0
- package/dist/engines/postgresql/restore.js.map +1 -0
- package/dist/engines/postgresql/version-maps.js +73 -0
- package/dist/engines/postgresql/version-maps.js.map +1 -0
- package/dist/engines/postgresql/version-validator.js +286 -0
- package/dist/engines/postgresql/version-validator.js.map +1 -0
- package/dist/engines/qdrant/api-client.js +50 -0
- package/dist/engines/qdrant/api-client.js.map +1 -0
- package/dist/engines/qdrant/backup.js +115 -0
- package/dist/engines/qdrant/backup.js.map +1 -0
- package/dist/engines/qdrant/binary-manager.js +31 -0
- package/dist/engines/qdrant/binary-manager.js.map +1 -0
- package/dist/engines/qdrant/binary-urls.js +92 -0
- package/dist/engines/qdrant/binary-urls.js.map +1 -0
- package/dist/engines/qdrant/cli-utils.js +39 -0
- package/dist/engines/qdrant/cli-utils.js.map +1 -0
- package/dist/engines/qdrant/hostdb-releases.js +21 -0
- package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
- package/dist/engines/qdrant/index.js +1002 -0
- package/dist/engines/qdrant/index.js.map +1 -0
- package/dist/engines/qdrant/restore.js +154 -0
- package/dist/engines/qdrant/restore.js.map +1 -0
- package/dist/engines/qdrant/version-maps.js +67 -0
- package/dist/engines/qdrant/version-maps.js.map +1 -0
- package/dist/engines/qdrant/version-validator.js +109 -0
- package/dist/engines/qdrant/version-validator.js.map +1 -0
- package/dist/engines/questdb/backup.js +191 -0
- package/dist/engines/questdb/backup.js.map +1 -0
- package/dist/engines/questdb/binary-manager.js +247 -0
- package/dist/engines/questdb/binary-manager.js.map +1 -0
- package/dist/engines/questdb/binary-urls.js +27 -0
- package/dist/engines/questdb/binary-urls.js.map +1 -0
- package/dist/engines/questdb/hostdb-releases.js +21 -0
- package/dist/engines/questdb/hostdb-releases.js.map +1 -0
- package/dist/engines/questdb/index.js +814 -0
- package/dist/engines/questdb/index.js.map +1 -0
- package/dist/engines/questdb/restore.js +202 -0
- package/dist/engines/questdb/restore.js.map +1 -0
- package/dist/engines/questdb/version-maps.js +33 -0
- package/dist/engines/questdb/version-maps.js.map +1 -0
- package/dist/engines/questdb/version-validator.js +99 -0
- package/dist/engines/questdb/version-validator.js.map +1 -0
- package/dist/engines/redis/backup.js +292 -0
- package/dist/engines/redis/backup.js.map +1 -0
- package/dist/engines/redis/binary-manager.js +32 -0
- package/dist/engines/redis/binary-manager.js.map +1 -0
- package/dist/engines/redis/binary-urls.js +96 -0
- package/dist/engines/redis/binary-urls.js.map +1 -0
- package/dist/engines/redis/cli-utils.js +38 -0
- package/dist/engines/redis/cli-utils.js.map +1 -0
- package/dist/engines/redis/hostdb-releases.js +21 -0
- package/dist/engines/redis/hostdb-releases.js.map +1 -0
- package/dist/engines/redis/index.js +1263 -0
- package/dist/engines/redis/index.js.map +1 -0
- package/dist/engines/redis/restore.js +338 -0
- package/dist/engines/redis/restore.js.map +1 -0
- package/dist/engines/redis/version-maps.js +70 -0
- package/dist/engines/redis/version-maps.js.map +1 -0
- package/dist/engines/redis/version-validator.js +109 -0
- package/dist/engines/redis/version-validator.js.map +1 -0
- package/dist/engines/sqlite/binary-manager.js +39 -0
- package/dist/engines/sqlite/binary-manager.js.map +1 -0
- package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
- package/dist/engines/sqlite/binary-urls.js.map +1 -0
- package/dist/engines/sqlite/hostdb-releases.js +21 -0
- package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
- package/dist/engines/sqlite/index.js +493 -0
- package/dist/engines/sqlite/index.js.map +1 -0
- package/dist/engines/sqlite/registry.js +163 -0
- package/dist/engines/sqlite/registry.js.map +1 -0
- package/dist/engines/sqlite/scanner.js +12 -0
- package/dist/engines/sqlite/scanner.js.map +1 -0
- package/dist/engines/sqlite/version-maps.js +57 -0
- package/dist/engines/sqlite/version-maps.js.map +1 -0
- package/dist/engines/surrealdb/backup.js +97 -0
- package/dist/engines/surrealdb/backup.js.map +1 -0
- package/dist/engines/surrealdb/binary-manager.js +33 -0
- package/dist/engines/surrealdb/binary-manager.js.map +1 -0
- package/dist/engines/surrealdb/binary-urls.js +33 -0
- package/dist/engines/surrealdb/binary-urls.js.map +1 -0
- package/dist/engines/surrealdb/cli-utils.js +147 -0
- package/dist/engines/surrealdb/cli-utils.js.map +1 -0
- package/dist/engines/surrealdb/hostdb-releases.js +21 -0
- package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
- package/dist/engines/surrealdb/index.js +1022 -0
- package/dist/engines/surrealdb/index.js.map +1 -0
- package/dist/engines/surrealdb/restore.js +224 -0
- package/dist/engines/surrealdb/restore.js.map +1 -0
- package/dist/engines/surrealdb/version-maps.js +36 -0
- package/dist/engines/surrealdb/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/backup.js +36 -0
- package/dist/engines/tigerbeetle/backup.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-manager.js +72 -0
- package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-urls.js +49 -0
- package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
- package/dist/engines/tigerbeetle/index.js +559 -0
- package/dist/engines/tigerbeetle/index.js.map +1 -0
- package/dist/engines/tigerbeetle/restore.js +91 -0
- package/dist/engines/tigerbeetle/restore.js.map +1 -0
- package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
- package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/version-validator.js +108 -0
- package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
- package/dist/engines/typedb/backup.js +129 -0
- package/dist/engines/typedb/backup.js.map +1 -0
- package/dist/engines/typedb/binary-manager.js +151 -0
- package/dist/engines/typedb/binary-manager.js.map +1 -0
- package/dist/engines/typedb/binary-urls.js +33 -0
- package/dist/engines/typedb/binary-urls.js.map +1 -0
- package/dist/engines/typedb/cli-utils.js +163 -0
- package/dist/engines/typedb/cli-utils.js.map +1 -0
- package/dist/engines/typedb/hostdb-releases.js +21 -0
- package/dist/engines/typedb/hostdb-releases.js.map +1 -0
- package/dist/engines/typedb/index.js +1003 -0
- package/dist/engines/typedb/index.js.map +1 -0
- package/dist/engines/typedb/restore.js +279 -0
- package/dist/engines/typedb/restore.js.map +1 -0
- package/dist/engines/typedb/version-maps.js +40 -0
- package/dist/engines/typedb/version-maps.js.map +1 -0
- package/dist/engines/typedb/version-validator.js +103 -0
- package/dist/engines/typedb/version-validator.js.map +1 -0
- package/dist/engines/valkey/backup.js +292 -0
- package/dist/engines/valkey/backup.js.map +1 -0
- package/dist/engines/valkey/binary-manager.js +33 -0
- package/dist/engines/valkey/binary-manager.js.map +1 -0
- package/dist/engines/valkey/binary-urls.js +98 -0
- package/dist/engines/valkey/binary-urls.js.map +1 -0
- package/dist/engines/valkey/cli-utils.js +38 -0
- package/dist/engines/valkey/cli-utils.js.map +1 -0
- package/dist/engines/valkey/hostdb-releases.js +21 -0
- package/dist/engines/valkey/hostdb-releases.js.map +1 -0
- package/dist/engines/valkey/index.js +1257 -0
- package/dist/engines/valkey/index.js.map +1 -0
- package/dist/engines/valkey/restore.js +340 -0
- package/dist/engines/valkey/restore.js.map +1 -0
- package/dist/engines/valkey/version-maps.js +70 -0
- package/dist/engines/valkey/version-maps.js.map +1 -0
- package/dist/engines/valkey/version-validator.js +112 -0
- package/dist/engines/valkey/version-validator.js.map +1 -0
- package/dist/engines/weaviate/api-client.js +50 -0
- package/dist/engines/weaviate/api-client.js.map +1 -0
- package/dist/engines/weaviate/backup.js +95 -0
- package/dist/engines/weaviate/backup.js.map +1 -0
- package/dist/engines/weaviate/binary-manager.js +58 -0
- package/dist/engines/weaviate/binary-manager.js.map +1 -0
- package/dist/engines/weaviate/binary-urls.js +92 -0
- package/dist/engines/weaviate/binary-urls.js.map +1 -0
- package/dist/engines/weaviate/cli-utils.js +39 -0
- package/dist/engines/weaviate/cli-utils.js.map +1 -0
- package/dist/engines/weaviate/hostdb-releases.js +21 -0
- package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
- package/dist/engines/weaviate/index.js +871 -0
- package/dist/engines/weaviate/index.js.map +1 -0
- package/dist/engines/weaviate/restore.js +185 -0
- package/dist/engines/weaviate/restore.js.map +1 -0
- package/dist/engines/weaviate/version-maps.js +67 -0
- package/dist/engines/weaviate/version-maps.js.map +1 -0
- package/dist/engines/weaviate/version-validator.js +109 -0
- package/dist/engines/weaviate/version-validator.js.map +1 -0
- package/dist/types/index.js +102 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +12 -9
- package/bin/cli.js +0 -68
- package/cli/bin.ts +0 -10
- package/cli/commands/attach.ts +0 -139
- package/cli/commands/backup.ts +0 -290
- package/cli/commands/backups.ts +0 -247
- package/cli/commands/clone.ts +0 -159
- package/cli/commands/config.ts +0 -367
- package/cli/commands/connect.ts +0 -684
- package/cli/commands/create.ts +0 -1201
- package/cli/commands/databases.ts +0 -630
- package/cli/commands/delete.ts +0 -133
- package/cli/commands/deps.ts +0 -342
- package/cli/commands/detach.ts +0 -107
- package/cli/commands/doctor.ts +0 -689
- package/cli/commands/duckdb.ts +0 -273
- package/cli/commands/edit.ts +0 -683
- package/cli/commands/engines.ts +0 -1914
- package/cli/commands/export.ts +0 -544
- package/cli/commands/info.ts +0 -340
- package/cli/commands/list.ts +0 -284
- package/cli/commands/logs.ts +0 -102
- package/cli/commands/menu/backup-handlers.ts +0 -1571
- package/cli/commands/menu/container-handlers.ts +0 -2288
- package/cli/commands/menu/engine-handlers.ts +0 -355
- package/cli/commands/menu/index.ts +0 -342
- package/cli/commands/menu/settings-handlers.ts +0 -365
- package/cli/commands/menu/shared.ts +0 -23
- package/cli/commands/menu/shell-handlers.ts +0 -1811
- package/cli/commands/menu/sql-handlers.ts +0 -231
- package/cli/commands/menu/update-handlers.ts +0 -378
- package/cli/commands/menu/validators.ts +0 -8
- package/cli/commands/ports.ts +0 -211
- package/cli/commands/pull.ts +0 -223
- package/cli/commands/query.ts +0 -241
- package/cli/commands/restore.ts +0 -587
- package/cli/commands/run.ts +0 -178
- package/cli/commands/self-update.ts +0 -121
- package/cli/commands/sqlite.ts +0 -273
- package/cli/commands/start.ts +0 -218
- package/cli/commands/stop.ts +0 -241
- package/cli/commands/url.ts +0 -104
- package/cli/commands/users.ts +0 -264
- package/cli/commands/version.ts +0 -55
- package/cli/commands/which.ts +0 -290
- package/cli/constants.ts +0 -233
- package/cli/helpers.ts +0 -1593
- package/cli/index.ts +0 -162
- package/cli/ui/prompts.ts +0 -1525
- package/cli/ui/spinner.ts +0 -88
- package/cli/ui/theme.ts +0 -128
- package/cli/utils/file-follower.ts +0 -93
- package/config/backup-formats.ts +0 -446
- package/config/defaults.ts +0 -56
- package/config/engine-defaults.ts +0 -336
- package/config/engines-registry.ts +0 -150
- package/config/engines.schema.json +0 -135
- package/config/os-dependencies.ts +0 -888
- package/config/paths.ts +0 -200
- package/core/backup-restore.ts +0 -330
- package/core/base-binary-manager.ts +0 -562
- package/core/base-document-binary-manager.ts +0 -523
- package/core/base-embedded-binary-manager.ts +0 -547
- package/core/base-server-binary-manager.ts +0 -523
- package/core/config-manager.ts +0 -652
- package/core/container-manager.ts +0 -787
- package/core/credential-generator.ts +0 -93
- package/core/credential-manager.ts +0 -259
- package/core/dblab-utils.ts +0 -113
- package/core/dependency-manager.ts +0 -512
- package/core/docker-exporter.ts +0 -1345
- package/core/error-handler.ts +0 -419
- package/core/fs-error-utils.ts +0 -82
- package/core/homebrew-version-manager.ts +0 -352
- package/core/hostdb-client.ts +0 -344
- package/core/hostdb-metadata.ts +0 -350
- package/core/hostdb-releases-factory.ts +0 -237
- package/core/library-env.ts +0 -118
- package/core/pgweb-utils.ts +0 -62
- package/core/platform-service.ts +0 -829
- package/core/port-manager.ts +0 -165
- package/core/process-manager.ts +0 -576
- package/core/pull-manager.ts +0 -511
- package/core/query-parser.ts +0 -514
- package/core/spawn-utils.ts +0 -122
- package/core/start-with-retry.ts +0 -130
- package/core/test-cleanup.ts +0 -108
- package/core/tls-generator.ts +0 -116
- package/core/transaction-manager.ts +0 -158
- package/core/update-manager.ts +0 -308
- package/core/version-migration.ts +0 -346
- package/core/version-utils.ts +0 -104
- package/engines/base-engine.ts +0 -340
- package/engines/clickhouse/README.md +0 -231
- package/engines/clickhouse/backup.ts +0 -398
- package/engines/clickhouse/binary-manager.ts +0 -201
- package/engines/clickhouse/binary-urls.ts +0 -125
- package/engines/clickhouse/cli-utils.ts +0 -176
- package/engines/clickhouse/hostdb-releases.ts +0 -30
- package/engines/clickhouse/index.ts +0 -1345
- package/engines/clickhouse/restore.ts +0 -466
- package/engines/clickhouse/version-maps.ts +0 -95
- package/engines/clickhouse/version-validator.ts +0 -154
- package/engines/cockroachdb/README.md +0 -170
- package/engines/cockroachdb/backup.ts +0 -376
- package/engines/cockroachdb/binary-manager.ts +0 -45
- package/engines/cockroachdb/binary-urls.ts +0 -40
- package/engines/cockroachdb/cli-utils.ts +0 -384
- package/engines/cockroachdb/hostdb-releases.ts +0 -26
- package/engines/cockroachdb/index.ts +0 -1276
- package/engines/cockroachdb/restore.ts +0 -455
- package/engines/cockroachdb/version-maps.ts +0 -42
- package/engines/couchdb/README.md +0 -257
- package/engines/couchdb/api-client.ts +0 -81
- package/engines/couchdb/backup.ts +0 -137
- package/engines/couchdb/binary-manager.ts +0 -86
- package/engines/couchdb/binary-urls.ts +0 -115
- package/engines/couchdb/hostdb-releases.ts +0 -23
- package/engines/couchdb/index.ts +0 -1429
- package/engines/couchdb/restore.ts +0 -290
- package/engines/couchdb/version-maps.ts +0 -78
- package/engines/couchdb/version-validator.ts +0 -111
- package/engines/duckdb/README.md +0 -154
- package/engines/duckdb/binary-manager.ts +0 -45
- package/engines/duckdb/hostdb-releases.ts +0 -23
- package/engines/duckdb/index.ts +0 -749
- package/engines/duckdb/registry.ts +0 -303
- package/engines/duckdb/scanner.ts +0 -22
- package/engines/duckdb/version-maps.ts +0 -78
- package/engines/duckdb/version-validator.ts +0 -78
- package/engines/ferretdb/README.md +0 -262
- package/engines/ferretdb/backup.ts +0 -173
- package/engines/ferretdb/binary-manager.ts +0 -1095
- package/engines/ferretdb/binary-urls.ts +0 -183
- package/engines/ferretdb/index.ts +0 -1907
- package/engines/ferretdb/restore.ts +0 -357
- package/engines/file-based-utils.ts +0 -262
- package/engines/index.ts +0 -131
- package/engines/influxdb/README.md +0 -180
- package/engines/influxdb/api-client.ts +0 -64
- package/engines/influxdb/backup.ts +0 -160
- package/engines/influxdb/binary-manager.ts +0 -110
- package/engines/influxdb/binary-urls.ts +0 -69
- package/engines/influxdb/hostdb-releases.ts +0 -23
- package/engines/influxdb/index.ts +0 -1272
- package/engines/influxdb/restore.ts +0 -417
- package/engines/influxdb/version-maps.ts +0 -75
- package/engines/influxdb/version-validator.ts +0 -128
- package/engines/mariadb/README.md +0 -141
- package/engines/mariadb/backup.ts +0 -233
- package/engines/mariadb/binary-manager.ts +0 -45
- package/engines/mariadb/hostdb-releases.ts +0 -23
- package/engines/mariadb/index.ts +0 -1300
- package/engines/mariadb/restore.ts +0 -447
- package/engines/mariadb/version-maps.ts +0 -72
- package/engines/mariadb/version-validator.ts +0 -181
- package/engines/meilisearch/README.md +0 -255
- package/engines/meilisearch/api-client.ts +0 -61
- package/engines/meilisearch/backup.ts +0 -233
- package/engines/meilisearch/binary-manager.ts +0 -43
- package/engines/meilisearch/binary-urls.ts +0 -69
- package/engines/meilisearch/hostdb-releases.ts +0 -26
- package/engines/meilisearch/index.ts +0 -1292
- package/engines/meilisearch/restore.ts +0 -219
- package/engines/meilisearch/version-maps.ts +0 -78
- package/engines/meilisearch/version-validator.ts +0 -128
- package/engines/mongodb/README.md +0 -162
- package/engines/mongodb/backup.ts +0 -127
- package/engines/mongodb/binary-manager.ts +0 -48
- package/engines/mongodb/binary-urls.ts +0 -63
- package/engines/mongodb/cli-utils.ts +0 -171
- package/engines/mongodb/hostdb-releases.ts +0 -91
- package/engines/mongodb/index.ts +0 -1118
- package/engines/mongodb/restore.ts +0 -361
- package/engines/mongodb/version-maps.ts +0 -91
- package/engines/mongodb/version-validator.ts +0 -160
- package/engines/mysql/README.md +0 -142
- package/engines/mysql/backup.ts +0 -270
- package/engines/mysql/binary-detection.ts +0 -408
- package/engines/mysql/binary-manager.ts +0 -42
- package/engines/mysql/binary-urls.ts +0 -104
- package/engines/mysql/index.ts +0 -1361
- package/engines/mysql/restore.ts +0 -500
- package/engines/mysql/version-maps.ts +0 -91
- package/engines/mysql/version-validator.ts +0 -369
- package/engines/postgresql/README.md +0 -158
- package/engines/postgresql/backup.ts +0 -151
- package/engines/postgresql/binary-manager.ts +0 -114
- package/engines/postgresql/binary-urls.ts +0 -99
- package/engines/postgresql/hostdb-releases.ts +0 -26
- package/engines/postgresql/index.ts +0 -1143
- package/engines/postgresql/remote-version.ts +0 -161
- package/engines/postgresql/restore.ts +0 -342
- package/engines/postgresql/version-maps.ts +0 -83
- package/engines/postgresql/version-validator.ts +0 -413
- package/engines/qdrant/README.md +0 -222
- package/engines/qdrant/api-client.ts +0 -61
- package/engines/qdrant/backup.ts +0 -165
- package/engines/qdrant/binary-manager.ts +0 -43
- package/engines/qdrant/binary-urls.ts +0 -115
- package/engines/qdrant/cli-utils.ts +0 -43
- package/engines/qdrant/hostdb-releases.ts +0 -23
- package/engines/qdrant/index.ts +0 -1312
- package/engines/qdrant/restore.ts +0 -203
- package/engines/qdrant/version-maps.ts +0 -78
- package/engines/qdrant/version-validator.ts +0 -128
- package/engines/questdb/README.md +0 -334
- package/engines/questdb/backup.ts +0 -220
- package/engines/questdb/binary-manager.ts +0 -310
- package/engines/questdb/binary-urls.ts +0 -34
- package/engines/questdb/hostdb-releases.ts +0 -23
- package/engines/questdb/index.ts +0 -1023
- package/engines/questdb/restore.ts +0 -260
- package/engines/questdb/version-maps.ts +0 -37
- package/engines/questdb/version-validator.ts +0 -121
- package/engines/redis/README.md +0 -173
- package/engines/redis/backup.ts +0 -389
- package/engines/redis/binary-manager.ts +0 -44
- package/engines/redis/binary-urls.ts +0 -117
- package/engines/redis/cli-utils.ts +0 -42
- package/engines/redis/hostdb-releases.ts +0 -23
- package/engines/redis/index.ts +0 -1583
- package/engines/redis/restore.ts +0 -443
- package/engines/redis/version-maps.ts +0 -81
- package/engines/redis/version-validator.ts +0 -131
- package/engines/sqlite/README.md +0 -162
- package/engines/sqlite/binary-manager.ts +0 -52
- package/engines/sqlite/hostdb-releases.ts +0 -23
- package/engines/sqlite/index.ts +0 -641
- package/engines/sqlite/registry.ts +0 -198
- package/engines/sqlite/scanner.ts +0 -22
- package/engines/sqlite/version-maps.ts +0 -64
- package/engines/surrealdb/README.md +0 -218
- package/engines/surrealdb/backup.ts +0 -131
- package/engines/surrealdb/binary-manager.ts +0 -45
- package/engines/surrealdb/binary-urls.ts +0 -40
- package/engines/surrealdb/cli-utils.ts +0 -173
- package/engines/surrealdb/hostdb-releases.ts +0 -23
- package/engines/surrealdb/index.ts +0 -1246
- package/engines/surrealdb/restore.ts +0 -302
- package/engines/surrealdb/version-maps.ts +0 -41
- package/engines/tigerbeetle/README.md +0 -61
- package/engines/tigerbeetle/backup.ts +0 -49
- package/engines/tigerbeetle/binary-manager.ts +0 -95
- package/engines/tigerbeetle/binary-urls.ts +0 -62
- package/engines/tigerbeetle/hostdb-releases.ts +0 -26
- package/engines/tigerbeetle/index.ts +0 -746
- package/engines/tigerbeetle/restore.ts +0 -130
- package/engines/tigerbeetle/version-validator.ts +0 -126
- package/engines/typedb/backup.ts +0 -167
- package/engines/typedb/binary-manager.ts +0 -200
- package/engines/typedb/binary-urls.ts +0 -40
- package/engines/typedb/cli-utils.ts +0 -210
- package/engines/typedb/hostdb-releases.ts +0 -23
- package/engines/typedb/index.ts +0 -1275
- package/engines/typedb/restore.ts +0 -377
- package/engines/typedb/version-maps.ts +0 -48
- package/engines/typedb/version-validator.ts +0 -127
- package/engines/valkey/README.md +0 -219
- package/engines/valkey/backup.ts +0 -389
- package/engines/valkey/binary-manager.ts +0 -45
- package/engines/valkey/binary-urls.ts +0 -122
- package/engines/valkey/cli-utils.ts +0 -42
- package/engines/valkey/hostdb-releases.ts +0 -23
- package/engines/valkey/index.ts +0 -1585
- package/engines/valkey/restore.ts +0 -446
- package/engines/valkey/version-maps.ts +0 -81
- package/engines/valkey/version-validator.ts +0 -131
- package/engines/weaviate/README.md +0 -302
- package/engines/weaviate/api-client.ts +0 -61
- package/engines/weaviate/backup.ts +0 -145
- package/engines/weaviate/binary-manager.ts +0 -80
- package/engines/weaviate/binary-urls.ts +0 -115
- package/engines/weaviate/cli-utils.ts +0 -43
- package/engines/weaviate/hostdb-releases.ts +0 -23
- package/engines/weaviate/index.ts +0 -1139
- package/engines/weaviate/restore.ts +0 -235
- package/engines/weaviate/version-maps.ts +0 -78
- package/engines/weaviate/version-validator.ts +0 -128
- package/types/index.ts +0 -624
- /package/{config → dist/config}/engines.json +0 -0
|
@@ -0,0 +1,1077 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Exporter
|
|
3
|
+
*
|
|
4
|
+
* Generates Docker artifacts (Dockerfile, docker-compose.yml, entrypoint.sh, etc.)
|
|
5
|
+
* for running SpinDB containers in Docker.
|
|
6
|
+
*
|
|
7
|
+
* Architecture: SpinDB runs inside the container and manages the database,
|
|
8
|
+
* using the same hostdb binaries as local development.
|
|
9
|
+
*/
|
|
10
|
+
import { mkdir, writeFile, copyFile, rm, readdir, readFile } from 'fs/promises';
|
|
11
|
+
import { join, basename } from 'path';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
import { Engine, isFileBasedEngine, assertExhaustive, } from '../types/index.js';
|
|
15
|
+
import { engineDefaults } from '../config/engine-defaults.js';
|
|
16
|
+
import { getDefaultFormat, getBackupExtension } from '../config/backup-formats.js';
|
|
17
|
+
import { generateCredentials } from './credential-generator.js';
|
|
18
|
+
import { generateTLSCertificates, isOpenSSLAvailable } from './tls-generator.js';
|
|
19
|
+
import { withTransaction } from './transaction-manager.js';
|
|
20
|
+
/**
|
|
21
|
+
* Get the display name for an engine
|
|
22
|
+
*/
|
|
23
|
+
function getEngineDisplayName(engine) {
|
|
24
|
+
const displayNames = {
|
|
25
|
+
[Engine.PostgreSQL]: 'PostgreSQL',
|
|
26
|
+
[Engine.MySQL]: 'MySQL',
|
|
27
|
+
[Engine.MariaDB]: 'MariaDB',
|
|
28
|
+
[Engine.SQLite]: 'SQLite',
|
|
29
|
+
[Engine.DuckDB]: 'DuckDB',
|
|
30
|
+
[Engine.MongoDB]: 'MongoDB',
|
|
31
|
+
[Engine.FerretDB]: 'FerretDB',
|
|
32
|
+
[Engine.Redis]: 'Redis',
|
|
33
|
+
[Engine.Valkey]: 'Valkey',
|
|
34
|
+
[Engine.ClickHouse]: 'ClickHouse',
|
|
35
|
+
[Engine.Qdrant]: 'Qdrant',
|
|
36
|
+
[Engine.Meilisearch]: 'Meilisearch',
|
|
37
|
+
[Engine.CouchDB]: 'CouchDB',
|
|
38
|
+
[Engine.CockroachDB]: 'CockroachDB',
|
|
39
|
+
[Engine.SurrealDB]: 'SurrealDB',
|
|
40
|
+
[Engine.QuestDB]: 'QuestDB',
|
|
41
|
+
[Engine.TypeDB]: 'TypeDB',
|
|
42
|
+
[Engine.InfluxDB]: 'InfluxDB',
|
|
43
|
+
[Engine.Weaviate]: 'Weaviate',
|
|
44
|
+
[Engine.TigerBeetle]: 'TigerBeetle',
|
|
45
|
+
};
|
|
46
|
+
return displayNames[engine] || engine;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Engine binary configuration for Docker exports
|
|
50
|
+
*
|
|
51
|
+
* Defines primary binaries per engine for PATH setup and documentation.
|
|
52
|
+
* This structure supports future enhancements:
|
|
53
|
+
* - excludedBinaries: binaries to omit from PATH (e.g., internal tools)
|
|
54
|
+
* - renamedBinaries: map of original -> renamed (e.g., for collision avoidance)
|
|
55
|
+
* - priority: for multi-engine containers, which engine's binary wins
|
|
56
|
+
*/
|
|
57
|
+
const _ENGINE_BINARY_CONFIG = {
|
|
58
|
+
[Engine.PostgreSQL]: {
|
|
59
|
+
primaryBinaries: ['psql', 'pg_dump', 'pg_restore', 'createdb', 'dropdb'],
|
|
60
|
+
},
|
|
61
|
+
[Engine.MySQL]: {
|
|
62
|
+
primaryBinaries: ['mysql', 'mysqldump', 'mysqladmin'],
|
|
63
|
+
},
|
|
64
|
+
[Engine.MariaDB]: {
|
|
65
|
+
primaryBinaries: ['mariadb', 'mariadb-dump', 'mariadb-admin'],
|
|
66
|
+
},
|
|
67
|
+
[Engine.SQLite]: {
|
|
68
|
+
primaryBinaries: ['sqlite3'],
|
|
69
|
+
},
|
|
70
|
+
[Engine.DuckDB]: {
|
|
71
|
+
primaryBinaries: ['duckdb'],
|
|
72
|
+
},
|
|
73
|
+
[Engine.MongoDB]: {
|
|
74
|
+
primaryBinaries: ['mongosh', 'mongodump', 'mongorestore'],
|
|
75
|
+
},
|
|
76
|
+
[Engine.FerretDB]: {
|
|
77
|
+
primaryBinaries: ['mongosh', 'psql'], // FerretDB uses mongosh + PostgreSQL backend
|
|
78
|
+
},
|
|
79
|
+
[Engine.Redis]: {
|
|
80
|
+
primaryBinaries: ['redis-cli', 'redis-server'],
|
|
81
|
+
},
|
|
82
|
+
[Engine.Valkey]: {
|
|
83
|
+
primaryBinaries: ['valkey-cli', 'valkey-server'],
|
|
84
|
+
},
|
|
85
|
+
[Engine.ClickHouse]: {
|
|
86
|
+
primaryBinaries: ['clickhouse', 'clickhouse-client'],
|
|
87
|
+
},
|
|
88
|
+
[Engine.Qdrant]: {
|
|
89
|
+
primaryBinaries: [], // REST API only, no CLI tools
|
|
90
|
+
},
|
|
91
|
+
[Engine.Meilisearch]: {
|
|
92
|
+
primaryBinaries: [], // REST API only, no CLI tools
|
|
93
|
+
},
|
|
94
|
+
[Engine.CouchDB]: {
|
|
95
|
+
primaryBinaries: [], // REST API only, no CLI tools
|
|
96
|
+
},
|
|
97
|
+
[Engine.CockroachDB]: {
|
|
98
|
+
primaryBinaries: ['cockroach'],
|
|
99
|
+
},
|
|
100
|
+
[Engine.SurrealDB]: {
|
|
101
|
+
primaryBinaries: ['surreal'],
|
|
102
|
+
},
|
|
103
|
+
[Engine.QuestDB]: {
|
|
104
|
+
primaryBinaries: [], // Uses psql from PostgreSQL for connections
|
|
105
|
+
},
|
|
106
|
+
[Engine.TypeDB]: {
|
|
107
|
+
primaryBinaries: ['typedb', 'typedb_console_bin'],
|
|
108
|
+
},
|
|
109
|
+
[Engine.InfluxDB]: {
|
|
110
|
+
primaryBinaries: [], // REST API only, no CLI tools
|
|
111
|
+
},
|
|
112
|
+
[Engine.Weaviate]: {
|
|
113
|
+
primaryBinaries: [], // REST/GraphQL API only, no CLI tools
|
|
114
|
+
},
|
|
115
|
+
[Engine.TigerBeetle]: {
|
|
116
|
+
primaryBinaries: ['tigerbeetle'],
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Get the connection string template for an engine
|
|
121
|
+
* Includes placeholders for credentials and optionally TLS
|
|
122
|
+
*
|
|
123
|
+
* @param engine - Database engine
|
|
124
|
+
* @param port - Port number
|
|
125
|
+
* @param database - Database name
|
|
126
|
+
* @param useTLS - Whether to include TLS parameters (default: true)
|
|
127
|
+
*/
|
|
128
|
+
function getConnectionStringTemplate(engine, port, database, useTLS = true) {
|
|
129
|
+
switch (engine) {
|
|
130
|
+
case Engine.PostgreSQL:
|
|
131
|
+
case Engine.CockroachDB:
|
|
132
|
+
case Engine.QuestDB:
|
|
133
|
+
return useTLS
|
|
134
|
+
? `postgresql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?sslmode=require`
|
|
135
|
+
: `postgresql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
|
|
136
|
+
case Engine.MySQL:
|
|
137
|
+
case Engine.MariaDB:
|
|
138
|
+
return useTLS
|
|
139
|
+
? `mysql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?ssl=true`
|
|
140
|
+
: `mysql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
|
|
141
|
+
case Engine.MongoDB:
|
|
142
|
+
case Engine.FerretDB:
|
|
143
|
+
return useTLS
|
|
144
|
+
? `mongodb://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?tls=true`
|
|
145
|
+
: `mongodb://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
|
|
146
|
+
case Engine.Redis:
|
|
147
|
+
case Engine.Valkey:
|
|
148
|
+
return useTLS
|
|
149
|
+
? `rediss://:\${SPINDB_PASSWORD}@<host>:${port}`
|
|
150
|
+
: `redis://:\${SPINDB_PASSWORD}@<host>:${port}`;
|
|
151
|
+
case Engine.ClickHouse:
|
|
152
|
+
return useTLS
|
|
153
|
+
? `clickhouse://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?secure=true`
|
|
154
|
+
: `clickhouse://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
|
|
155
|
+
case Engine.Qdrant:
|
|
156
|
+
return useTLS ? `https://<host>:${port}` : `http://<host>:${port}`;
|
|
157
|
+
case Engine.Meilisearch:
|
|
158
|
+
case Engine.InfluxDB:
|
|
159
|
+
case Engine.Weaviate:
|
|
160
|
+
return useTLS ? `https://<host>:${port}` : `http://<host>:${port}`;
|
|
161
|
+
case Engine.CouchDB:
|
|
162
|
+
return useTLS
|
|
163
|
+
? `https://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`
|
|
164
|
+
: `http://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
|
|
165
|
+
case Engine.SurrealDB:
|
|
166
|
+
return useTLS
|
|
167
|
+
? `wss://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}`
|
|
168
|
+
: `ws://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}`;
|
|
169
|
+
case Engine.TypeDB:
|
|
170
|
+
return `typedb://<host>:${port}`;
|
|
171
|
+
case Engine.TigerBeetle:
|
|
172
|
+
return `<host>:${port}`;
|
|
173
|
+
case Engine.SQLite:
|
|
174
|
+
case Engine.DuckDB:
|
|
175
|
+
return `File-based database (no network connection)`;
|
|
176
|
+
default:
|
|
177
|
+
assertExhaustive(engine, `Unhandled engine in getConnectionUri: ${engine}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Generate the Dockerfile content
|
|
182
|
+
*/
|
|
183
|
+
function generateDockerfile(engine, isFileBased, useTLS) {
|
|
184
|
+
// File-based engines don't have a running server, so check container exists
|
|
185
|
+
// Server-based engines check for running status
|
|
186
|
+
const healthcheck = isFileBased
|
|
187
|
+
? `HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \\
|
|
188
|
+
CMD gosu spindb spindb list --json | grep -q '"engine":.*"${engine}"'`
|
|
189
|
+
: `HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \\
|
|
190
|
+
CMD gosu spindb spindb list --json | grep -q '"status":.*"running"'`;
|
|
191
|
+
// Only copy TLS certificates if they were generated
|
|
192
|
+
const copyCerts = useTLS
|
|
193
|
+
? `
|
|
194
|
+
# Copy TLS certificates
|
|
195
|
+
COPY --chown=spindb:spindb ./certs/ /home/spindb/.spindb/certs/
|
|
196
|
+
`
|
|
197
|
+
: '';
|
|
198
|
+
return `# SpinDB Docker Container
|
|
199
|
+
# Runs SpinDB inside Docker to manage database lifecycle
|
|
200
|
+
|
|
201
|
+
FROM ubuntu:22.04
|
|
202
|
+
|
|
203
|
+
# Prevent interactive prompts during package installation
|
|
204
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
205
|
+
|
|
206
|
+
# Install base dependencies
|
|
207
|
+
# libnuma1: Required by PostgreSQL binaries
|
|
208
|
+
# libxml2: XML library required by PostgreSQL
|
|
209
|
+
# libicu70: ICU library required by PostgreSQL (Ubuntu 22.04 ships ICU 70)
|
|
210
|
+
# libaio1: Async I/O library required by MySQL
|
|
211
|
+
# libncurses6: Terminal library required by MariaDB
|
|
212
|
+
# locales: Needed for PostgreSQL locale configuration
|
|
213
|
+
# lsof: Needed by SpinDB's findProcessByPort()
|
|
214
|
+
# gosu: For running commands as non-root user
|
|
215
|
+
RUN apt-get update && apt-get install -y \\
|
|
216
|
+
curl \\
|
|
217
|
+
openssl \\
|
|
218
|
+
ca-certificates \\
|
|
219
|
+
gnupg \\
|
|
220
|
+
libnuma1 \\
|
|
221
|
+
libxml2 \\
|
|
222
|
+
libicu70 \\
|
|
223
|
+
libaio1 \\
|
|
224
|
+
libncurses6 \\
|
|
225
|
+
locales \\
|
|
226
|
+
lsof \\
|
|
227
|
+
gosu \\
|
|
228
|
+
&& locale-gen en_US.UTF-8 \\
|
|
229
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
230
|
+
|
|
231
|
+
# Set locale environment variables
|
|
232
|
+
ENV LANG=en_US.UTF-8
|
|
233
|
+
ENV LC_ALL=en_US.UTF-8
|
|
234
|
+
|
|
235
|
+
# Install Node.js 22 LTS (matches SpinDB's engine requirements)
|
|
236
|
+
RUN mkdir -p /etc/apt/keyrings \\
|
|
237
|
+
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \\
|
|
238
|
+
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \\
|
|
239
|
+
&& apt-get update \\
|
|
240
|
+
&& apt-get install -y nodejs \\
|
|
241
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
242
|
+
|
|
243
|
+
# Create spindb user (non-root for database processes)
|
|
244
|
+
RUN groupadd -r spindb && useradd -r -g spindb -d /home/spindb -m -s /bin/bash spindb
|
|
245
|
+
|
|
246
|
+
# Install pnpm and SpinDB globally
|
|
247
|
+
ENV PNPM_HOME="/home/spindb/.local/share/pnpm"
|
|
248
|
+
ENV PATH="$PNPM_HOME:$PATH"
|
|
249
|
+
RUN npm install -g pnpm \\
|
|
250
|
+
&& mkdir -p "$PNPM_HOME" \\
|
|
251
|
+
&& pnpm add -g spindb
|
|
252
|
+
|
|
253
|
+
# Create spindb directories with proper ownership
|
|
254
|
+
RUN mkdir -p /home/spindb/.spindb/containers /home/spindb/.spindb/bin /home/spindb/.spindb/certs /home/spindb/.spindb/init \\
|
|
255
|
+
&& chown -R spindb:spindb /home/spindb
|
|
256
|
+
${copyCerts}
|
|
257
|
+
# Copy database backup/data
|
|
258
|
+
COPY --chown=spindb:spindb ./data/ /home/spindb/.spindb/init/
|
|
259
|
+
|
|
260
|
+
# Copy entrypoint script
|
|
261
|
+
COPY ./entrypoint.sh /entrypoint.sh
|
|
262
|
+
RUN chmod +x /entrypoint.sh
|
|
263
|
+
|
|
264
|
+
# Environment variables (can be overridden)
|
|
265
|
+
ENV SPINDB_ENGINE=${engine}
|
|
266
|
+
ENV HOME=/home/spindb
|
|
267
|
+
|
|
268
|
+
# Expose database port
|
|
269
|
+
EXPOSE \${SPINDB_PORT:-${engineDefaults[engine].defaultPort}}
|
|
270
|
+
|
|
271
|
+
# Health check (run as spindb user)
|
|
272
|
+
${healthcheck}
|
|
273
|
+
|
|
274
|
+
ENTRYPOINT ["/entrypoint.sh"]
|
|
275
|
+
`;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Generate the entrypoint.sh content
|
|
279
|
+
*/
|
|
280
|
+
function generateEntrypoint(engine, containerName, database, databases, version, port, useTLS) {
|
|
281
|
+
const isFileBased = isFileBasedEngine(engine);
|
|
282
|
+
// Engine-specific network configuration (run after create, before start)
|
|
283
|
+
// This configures databases to accept connections from Docker network
|
|
284
|
+
let networkConfig = '';
|
|
285
|
+
switch (engine) {
|
|
286
|
+
case Engine.PostgreSQL:
|
|
287
|
+
case Engine.CockroachDB:
|
|
288
|
+
// PostgreSQL/CockroachDB need to listen on all interfaces and allow network connections
|
|
289
|
+
networkConfig = `
|
|
290
|
+
# Configure PostgreSQL to accept connections from Docker network
|
|
291
|
+
echo "Configuring network access..."
|
|
292
|
+
PG_CONF="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/data/postgresql.conf"
|
|
293
|
+
PG_HBA="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/data/pg_hba.conf"
|
|
294
|
+
|
|
295
|
+
# Set listen_addresses to allow connections from any interface
|
|
296
|
+
if [ -f "$PG_CONF" ]; then
|
|
297
|
+
sed -i "s/^#*listen_addresses.*/listen_addresses = '*'/" "$PG_CONF"
|
|
298
|
+
fi
|
|
299
|
+
|
|
300
|
+
# Add rule to allow password-authenticated connections from any IP
|
|
301
|
+
if [ -f "$PG_HBA" ] && ! grep -q "0.0.0.0/0" "$PG_HBA"; then
|
|
302
|
+
echo "host all all 0.0.0.0/0 scram-sha-256" >> "$PG_HBA"
|
|
303
|
+
fi
|
|
304
|
+
`;
|
|
305
|
+
break;
|
|
306
|
+
default:
|
|
307
|
+
// Other engines don't need special network config (they listen on all interfaces by default)
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
// Engine-specific user creation commands
|
|
311
|
+
let userCreationCommands = '';
|
|
312
|
+
switch (engine) {
|
|
313
|
+
case Engine.PostgreSQL:
|
|
314
|
+
userCreationCommands = `
|
|
315
|
+
# Create user with password
|
|
316
|
+
echo "[$(date '+%H:%M:%S')] Creating database user '$SPINDB_USER'..."
|
|
317
|
+
cat > /tmp/create-user.sql <<EOSQL
|
|
318
|
+
DO \\$\\$
|
|
319
|
+
BEGIN
|
|
320
|
+
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$SPINDB_USER') THEN
|
|
321
|
+
CREATE ROLE "$SPINDB_USER" WITH LOGIN PASSWORD '$SPINDB_PASSWORD' CREATEDB;
|
|
322
|
+
ELSE
|
|
323
|
+
ALTER ROLE "$SPINDB_USER" WITH PASSWORD '$SPINDB_PASSWORD';
|
|
324
|
+
END IF;
|
|
325
|
+
END
|
|
326
|
+
\\$\\$;
|
|
327
|
+
GRANT ALL PRIVILEGES ON DATABASE "$DATABASE" TO "$SPINDB_USER";
|
|
328
|
+
EOSQL
|
|
329
|
+
if ! run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database postgres; then
|
|
330
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Failed to create database user"
|
|
331
|
+
rm -f /tmp/create-user.sql
|
|
332
|
+
exit 1
|
|
333
|
+
fi
|
|
334
|
+
rm -f /tmp/create-user.sql
|
|
335
|
+
echo "[$(date '+%H:%M:%S')] User '$SPINDB_USER' created successfully"
|
|
336
|
+
`;
|
|
337
|
+
break;
|
|
338
|
+
case Engine.MySQL:
|
|
339
|
+
case Engine.MariaDB:
|
|
340
|
+
userCreationCommands = `
|
|
341
|
+
# Create user with password
|
|
342
|
+
echo "Creating database user..."
|
|
343
|
+
cat > /tmp/create-user.sql <<EOSQL
|
|
344
|
+
CREATE USER IF NOT EXISTS '$SPINDB_USER'@'%' IDENTIFIED BY '$SPINDB_PASSWORD';
|
|
345
|
+
GRANT ALL PRIVILEGES ON \\\`$DATABASE\\\`.* TO '$SPINDB_USER'@'%';
|
|
346
|
+
FLUSH PRIVILEGES;
|
|
347
|
+
EOSQL
|
|
348
|
+
run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database mysql
|
|
349
|
+
rm -f /tmp/create-user.sql
|
|
350
|
+
`;
|
|
351
|
+
break;
|
|
352
|
+
case Engine.MongoDB:
|
|
353
|
+
case Engine.FerretDB:
|
|
354
|
+
userCreationCommands = `
|
|
355
|
+
# Create user with password
|
|
356
|
+
echo "Creating database user..."
|
|
357
|
+
cat > /tmp/create-user.js <<EOJS
|
|
358
|
+
db.createUser({
|
|
359
|
+
user: "$SPINDB_USER",
|
|
360
|
+
pwd: "$SPINDB_PASSWORD",
|
|
361
|
+
roles: [{ role: "readWrite", db: "$DATABASE" }]
|
|
362
|
+
});
|
|
363
|
+
EOJS
|
|
364
|
+
run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.js --database admin
|
|
365
|
+
rm -f /tmp/create-user.js
|
|
366
|
+
`;
|
|
367
|
+
break;
|
|
368
|
+
case Engine.Redis:
|
|
369
|
+
case Engine.Valkey:
|
|
370
|
+
// Redis uses requirepass, configured at start time
|
|
371
|
+
userCreationCommands = `
|
|
372
|
+
# Redis/Valkey authentication is configured at server start via --requirepass
|
|
373
|
+
echo "Authentication configured via server settings"
|
|
374
|
+
`;
|
|
375
|
+
break;
|
|
376
|
+
case Engine.ClickHouse:
|
|
377
|
+
userCreationCommands = `
|
|
378
|
+
# Create user with password
|
|
379
|
+
echo "Creating database user..."
|
|
380
|
+
cat > /tmp/create-user.sql <<EOSQL
|
|
381
|
+
CREATE USER IF NOT EXISTS $SPINDB_USER IDENTIFIED BY '$SPINDB_PASSWORD';
|
|
382
|
+
GRANT ALL ON $DATABASE.* TO $SPINDB_USER;
|
|
383
|
+
EOSQL
|
|
384
|
+
run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql
|
|
385
|
+
rm -f /tmp/create-user.sql
|
|
386
|
+
`;
|
|
387
|
+
break;
|
|
388
|
+
case Engine.CouchDB:
|
|
389
|
+
userCreationCommands = `
|
|
390
|
+
# CouchDB admin user is configured at server start
|
|
391
|
+
echo "Admin credentials configured via server settings"
|
|
392
|
+
`;
|
|
393
|
+
break;
|
|
394
|
+
case Engine.CockroachDB:
|
|
395
|
+
userCreationCommands = `
|
|
396
|
+
# Create user with password
|
|
397
|
+
echo "Creating database user..."
|
|
398
|
+
cat > /tmp/create-user.sql <<EOSQL
|
|
399
|
+
CREATE USER IF NOT EXISTS $SPINDB_USER WITH PASSWORD '$SPINDB_PASSWORD';
|
|
400
|
+
GRANT ALL ON DATABASE $DATABASE TO $SPINDB_USER;
|
|
401
|
+
EOSQL
|
|
402
|
+
run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database defaultdb
|
|
403
|
+
rm -f /tmp/create-user.sql
|
|
404
|
+
`;
|
|
405
|
+
break;
|
|
406
|
+
case Engine.SurrealDB:
|
|
407
|
+
userCreationCommands = `
|
|
408
|
+
# SurrealDB credentials are configured at server start
|
|
409
|
+
echo "Credentials configured via server settings"
|
|
410
|
+
`;
|
|
411
|
+
break;
|
|
412
|
+
case Engine.QuestDB:
|
|
413
|
+
userCreationCommands = `
|
|
414
|
+
# QuestDB user is configured via config
|
|
415
|
+
echo "User configured via server settings"
|
|
416
|
+
`;
|
|
417
|
+
break;
|
|
418
|
+
case Engine.Qdrant:
|
|
419
|
+
case Engine.Meilisearch:
|
|
420
|
+
case Engine.Weaviate:
|
|
421
|
+
userCreationCommands = `
|
|
422
|
+
# API key is configured at server start
|
|
423
|
+
echo "API key configured via server settings"
|
|
424
|
+
`;
|
|
425
|
+
break;
|
|
426
|
+
case Engine.InfluxDB:
|
|
427
|
+
userCreationCommands = `
|
|
428
|
+
# InfluxDB 3.x local dev runs without authentication
|
|
429
|
+
echo "No authentication required for local InfluxDB 3.x"
|
|
430
|
+
`;
|
|
431
|
+
break;
|
|
432
|
+
case Engine.TypeDB:
|
|
433
|
+
userCreationCommands = `
|
|
434
|
+
# TypeDB community edition does not support user management
|
|
435
|
+
echo "No authentication required"
|
|
436
|
+
`;
|
|
437
|
+
break;
|
|
438
|
+
case Engine.TigerBeetle:
|
|
439
|
+
userCreationCommands = `
|
|
440
|
+
# TigerBeetle has no authentication
|
|
441
|
+
echo "No authentication required"
|
|
442
|
+
`;
|
|
443
|
+
break;
|
|
444
|
+
case Engine.SQLite:
|
|
445
|
+
case Engine.DuckDB:
|
|
446
|
+
userCreationCommands = `
|
|
447
|
+
# File-based database - no user creation needed
|
|
448
|
+
echo "File-based database initialized"
|
|
449
|
+
`;
|
|
450
|
+
break;
|
|
451
|
+
default:
|
|
452
|
+
assertExhaustive(engine, `Unhandled engine in generateEntrypoint: ${engine}`);
|
|
453
|
+
}
|
|
454
|
+
// Generate restore commands for all databases
|
|
455
|
+
// Note: Uses /home/spindb/.spindb/init/ since container runs as spindb user
|
|
456
|
+
const initDir = '/home/spindb/.spindb/init';
|
|
457
|
+
const fileExt = engine === Engine.SQLite ? 'sqlite' : 'duckdb';
|
|
458
|
+
// File-based path is computed at runtime in the shell script using $FILE_DB_PATH
|
|
459
|
+
const restoreSection = isFileBased
|
|
460
|
+
? `
|
|
461
|
+
# File-based database - copy data file to the path used by spindb create --path
|
|
462
|
+
if ls ${initDir}/*.${fileExt} 1> /dev/null 2>&1; then
|
|
463
|
+
echo "Copying database file..."
|
|
464
|
+
cp ${initDir}/*.${fileExt} "$FILE_DB_PATH"
|
|
465
|
+
fi
|
|
466
|
+
`
|
|
467
|
+
: databases.length > 1
|
|
468
|
+
? `
|
|
469
|
+
# Restore data for all databases
|
|
470
|
+
echo "[$(date '+%H:%M:%S')] Checking for backup files in ${initDir}..."
|
|
471
|
+
ls -la ${initDir}/ 2>/dev/null || echo " (directory empty or not found)"
|
|
472
|
+
DATABASES="${databases.join(' ')}"
|
|
473
|
+
for DB in $DATABASES; do
|
|
474
|
+
# Find backup file for this database (pattern: containerName-dbName.*)
|
|
475
|
+
BACKUP_FILE=$(ls ${initDir}/${containerName}-$DB.* 2>/dev/null | head -1)
|
|
476
|
+
if [ -n "$BACKUP_FILE" ]; then
|
|
477
|
+
echo "[$(date '+%H:%M:%S')] Found backup for database '$DB': $BACKUP_FILE"
|
|
478
|
+
# Add database to tracking if not already tracked
|
|
479
|
+
run_as_spindb spindb databases add "$CONTAINER_NAME" "$DB" 2>/dev/null || true
|
|
480
|
+
if ! run_as_spindb spindb restore "$CONTAINER_NAME" "$BACKUP_FILE" --database "$DB" --force; then
|
|
481
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Restore of '$DB' failed"
|
|
482
|
+
exit 1
|
|
483
|
+
fi
|
|
484
|
+
echo "[$(date '+%H:%M:%S')] Restore of '$DB' completed successfully"
|
|
485
|
+
else
|
|
486
|
+
echo "[$(date '+%H:%M:%S')] WARNING: No backup file found for database '$DB'"
|
|
487
|
+
fi
|
|
488
|
+
done
|
|
489
|
+
`
|
|
490
|
+
: `
|
|
491
|
+
# Restore data if backup exists
|
|
492
|
+
echo "[$(date '+%H:%M:%S')] Checking for backup files in ${initDir}..."
|
|
493
|
+
ls -la ${initDir}/ 2>/dev/null || echo " (directory empty or not found)"
|
|
494
|
+
if ls ${initDir}/* 1> /dev/null 2>&1; then
|
|
495
|
+
BACKUP_FILE=$(ls ${initDir}/* | head -1)
|
|
496
|
+
echo "[$(date '+%H:%M:%S')] Found backup file: $BACKUP_FILE"
|
|
497
|
+
echo "[$(date '+%H:%M:%S')] Restoring to database '$DATABASE'..."
|
|
498
|
+
if ! run_as_spindb spindb restore "$CONTAINER_NAME" "$BACKUP_FILE" --database "$DATABASE" --force; then
|
|
499
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Restore failed with exit code $?"
|
|
500
|
+
exit 1
|
|
501
|
+
fi
|
|
502
|
+
echo "[$(date '+%H:%M:%S')] Restore completed successfully"
|
|
503
|
+
else
|
|
504
|
+
echo "[$(date '+%H:%M:%S')] WARNING: No backup files found in ${initDir}"
|
|
505
|
+
fi
|
|
506
|
+
`;
|
|
507
|
+
// Post-restore commands - grant table/sequence permissions to the spindb user
|
|
508
|
+
// Tables created during restore are owned by postgres, so spindb user needs grants
|
|
509
|
+
let postRestoreCommands = '';
|
|
510
|
+
switch (engine) {
|
|
511
|
+
case Engine.PostgreSQL:
|
|
512
|
+
case Engine.CockroachDB:
|
|
513
|
+
postRestoreCommands = `
|
|
514
|
+
# Grant table and sequence permissions to spindb user
|
|
515
|
+
# (Tables from restore are owned by postgres, spindb user needs access)
|
|
516
|
+
echo "[$(date '+%H:%M:%S')] Granting table permissions to '$SPINDB_USER'..."
|
|
517
|
+
cat > /tmp/grant-permissions.sql <<EOSQL
|
|
518
|
+
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "$SPINDB_USER";
|
|
519
|
+
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "$SPINDB_USER";
|
|
520
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO "$SPINDB_USER";
|
|
521
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO "$SPINDB_USER";
|
|
522
|
+
EOSQL
|
|
523
|
+
if ! run_as_spindb spindb run "$CONTAINER_NAME" /tmp/grant-permissions.sql --database "$DATABASE"; then
|
|
524
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Failed to grant permissions"
|
|
525
|
+
rm -f /tmp/grant-permissions.sql
|
|
526
|
+
exit 1
|
|
527
|
+
fi
|
|
528
|
+
rm -f /tmp/grant-permissions.sql
|
|
529
|
+
echo "[$(date '+%H:%M:%S')] Permissions granted successfully"
|
|
530
|
+
`;
|
|
531
|
+
break;
|
|
532
|
+
case Engine.MySQL:
|
|
533
|
+
case Engine.MariaDB:
|
|
534
|
+
// MySQL grants are already handled by GRANT ALL ON database.* in user creation
|
|
535
|
+
postRestoreCommands = '';
|
|
536
|
+
break;
|
|
537
|
+
default:
|
|
538
|
+
// Other engines don't need post-restore permission grants
|
|
539
|
+
postRestoreCommands = '';
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
return `#!/bin/bash
|
|
543
|
+
set -e
|
|
544
|
+
|
|
545
|
+
# Container configuration (from environment variables)
|
|
546
|
+
CONTAINER_NAME="\${SPINDB_CONTAINER:-${containerName}}"
|
|
547
|
+
DATABASE="\${SPINDB_DATABASE:-${database}}"
|
|
548
|
+
ENGINE="\${SPINDB_ENGINE:-${engine}}"
|
|
549
|
+
VERSION="\${SPINDB_VERSION:-${version}}"
|
|
550
|
+
PORT="\${SPINDB_PORT:-${port}}"
|
|
551
|
+
SPINDB_USER="\${SPINDB_USER:-spindb}"
|
|
552
|
+
SPINDB_PASSWORD="\${SPINDB_PASSWORD:?Error: SPINDB_PASSWORD environment variable is required}"
|
|
553
|
+
|
|
554
|
+
# Validate password doesn't contain characters that break SQL/JS here-docs
|
|
555
|
+
# These characters would cause syntax errors in the user creation commands
|
|
556
|
+
if echo "$SPINDB_PASSWORD" | grep -qE "['"'\\\`$!]'; then
|
|
557
|
+
echo "ERROR: SPINDB_PASSWORD contains unsafe characters for shell scripts." >&2
|
|
558
|
+
echo 'Avoid using: '"'"' " \\ \` $ ! in passwords when running in Docker.' >&2
|
|
559
|
+
echo "These characters break SQL/JS here-docs in the entrypoint script." >&2
|
|
560
|
+
exit 1
|
|
561
|
+
fi
|
|
562
|
+
${isFileBased
|
|
563
|
+
? `
|
|
564
|
+
# File-based database path (computed from runtime CONTAINER_NAME)
|
|
565
|
+
FILE_DB_PATH="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/\${CONTAINER_NAME}.${fileExt}"
|
|
566
|
+
`
|
|
567
|
+
: ''}
|
|
568
|
+
# Export environment variables for the spindb user
|
|
569
|
+
export SPINDB_CONTAINER SPINDB_DATABASE SPINDB_ENGINE SPINDB_VERSION SPINDB_PORT SPINDB_USER SPINDB_PASSWORD
|
|
570
|
+
|
|
571
|
+
# PATH will be updated after spindb downloads engine binaries
|
|
572
|
+
|
|
573
|
+
# Fix permissions on mounted volume (may have been created with root ownership)
|
|
574
|
+
echo "Setting up directories..."
|
|
575
|
+
chown -R spindb:spindb /home/spindb/.spindb 2>/dev/null || true
|
|
576
|
+
|
|
577
|
+
echo "========================================"
|
|
578
|
+
echo "SpinDB Docker Container"
|
|
579
|
+
echo "========================================"
|
|
580
|
+
echo "Engine: $ENGINE $VERSION"
|
|
581
|
+
echo "Container: $CONTAINER_NAME"
|
|
582
|
+
echo "Database: $DATABASE"
|
|
583
|
+
echo "Port: $PORT"
|
|
584
|
+
echo "========================================"
|
|
585
|
+
|
|
586
|
+
# Run all spindb commands as the spindb user (databases cannot run as root)
|
|
587
|
+
run_as_spindb() {
|
|
588
|
+
gosu spindb "$@"
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
# Check if container already exists
|
|
592
|
+
if run_as_spindb spindb list --json 2>/dev/null | grep -q '"name": "'"$CONTAINER_NAME"'"'; then
|
|
593
|
+
echo "[$(date '+%H:%M:%S')] Container '$CONTAINER_NAME' already exists"
|
|
594
|
+
${isFileBased
|
|
595
|
+
? `# File-based database: no server to start`
|
|
596
|
+
: `# Check if database is running, start if not (handles Docker restart)
|
|
597
|
+
if ! run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"'; then
|
|
598
|
+
echo "[$(date '+%H:%M:%S')] Database not running, starting..."
|
|
599
|
+
if ! run_as_spindb spindb start "$CONTAINER_NAME"; then
|
|
600
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Failed to start database"
|
|
601
|
+
exit 1
|
|
602
|
+
fi
|
|
603
|
+
fi`}
|
|
604
|
+
else
|
|
605
|
+
echo "[$(date '+%H:%M:%S')] Creating container '$CONTAINER_NAME'..."
|
|
606
|
+
${isFileBased
|
|
607
|
+
? `# File-based database: use deterministic path for database file
|
|
608
|
+
if ! run_as_spindb spindb create "$CONTAINER_NAME" --engine "$ENGINE" --db-version "$VERSION" --path "$FILE_DB_PATH" --force; then
|
|
609
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Failed to create container"
|
|
610
|
+
exit 1
|
|
611
|
+
fi`
|
|
612
|
+
: `# Use --start to ensure database is created (non-TTY defaults to no-start)
|
|
613
|
+
if ! run_as_spindb spindb create "$CONTAINER_NAME" --engine "$ENGINE" --db-version "$VERSION" --port "$PORT" --database "$DATABASE" --force --start; then
|
|
614
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Failed to create container"
|
|
615
|
+
exit 1
|
|
616
|
+
fi`}
|
|
617
|
+
echo "[$(date '+%H:%M:%S')] Container created successfully"
|
|
618
|
+
fi
|
|
619
|
+
|
|
620
|
+
# Add engine binary directory to PATH (idempotent - only adds if not present)
|
|
621
|
+
# This allows users to run psql, mysql, etc. directly in the container
|
|
622
|
+
# Note: We add the actual bin directory to PATH instead of creating symlinks
|
|
623
|
+
# because some binaries (like psql) are wrapper scripts that use relative paths
|
|
624
|
+
echo "Setting up database binaries in PATH..."
|
|
625
|
+
BIN_DIR=$(ls -d /home/spindb/.spindb/bin/\${ENGINE}-*/bin 2>/dev/null | head -1)
|
|
626
|
+
if [ -d "$BIN_DIR" ]; then
|
|
627
|
+
export PATH="$BIN_DIR:$PATH"
|
|
628
|
+
# Create/overwrite script in /etc/profile.d for system-wide access (idempotent)
|
|
629
|
+
# This ensures PATH is set for login shells without duplication
|
|
630
|
+
echo "export PATH=\\"$BIN_DIR:\\$PATH\\"" > /etc/profile.d/spindb-bins.sh
|
|
631
|
+
echo "Binaries available in PATH: $(ls "$BIN_DIR" | tr '\\n' ' ')"
|
|
632
|
+
else
|
|
633
|
+
echo "Warning: No engine binaries found"
|
|
634
|
+
fi
|
|
635
|
+
${networkConfig}${isFileBased
|
|
636
|
+
? `
|
|
637
|
+
# File-based database: no server to start, just verify file exists after restore
|
|
638
|
+
`
|
|
639
|
+
: `
|
|
640
|
+
# Database was started by 'spindb create --start' above
|
|
641
|
+
# Wait for database to be fully ready for connections
|
|
642
|
+
echo "[$(date '+%H:%M:%S')] Waiting for database to be ready..."
|
|
643
|
+
RETRIES=30
|
|
644
|
+
until run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"' || [ $RETRIES -eq 0 ]; do
|
|
645
|
+
echo "[$(date '+%H:%M:%S')] Waiting for database... ($RETRIES attempts remaining)"
|
|
646
|
+
sleep 2
|
|
647
|
+
RETRIES=$((RETRIES-1))
|
|
648
|
+
done
|
|
649
|
+
|
|
650
|
+
if [ $RETRIES -eq 0 ]; then
|
|
651
|
+
echo "[$(date '+%H:%M:%S')] ERROR: Database failed to start"
|
|
652
|
+
exit 1
|
|
653
|
+
fi`}
|
|
654
|
+
|
|
655
|
+
echo "[$(date '+%H:%M:%S')] Database is running!"
|
|
656
|
+
|
|
657
|
+
# Initialization marker file - ensures user creation and data restore only run once
|
|
658
|
+
INIT_MARKER="/home/spindb/.spindb/.initialized-$CONTAINER_NAME"
|
|
659
|
+
if [ ! -f "$INIT_MARKER" ]; then
|
|
660
|
+
echo "[$(date '+%H:%M:%S')] ======== FIRST-TIME INITIALIZATION ========"
|
|
661
|
+
${userCreationCommands}
|
|
662
|
+
${restoreSection}
|
|
663
|
+
${postRestoreCommands}
|
|
664
|
+
# Mark initialization complete
|
|
665
|
+
touch "$INIT_MARKER"
|
|
666
|
+
chown spindb:spindb "$INIT_MARKER"
|
|
667
|
+
echo "[$(date '+%H:%M:%S')] ======== INITIALIZATION COMPLETE ========"
|
|
668
|
+
else
|
|
669
|
+
echo "[$(date '+%H:%M:%S')] Container already initialized, skipping data restore."
|
|
670
|
+
fi
|
|
671
|
+
|
|
672
|
+
echo "========================================"
|
|
673
|
+
echo "SPINDB_READY"
|
|
674
|
+
echo "SpinDB container ready!"
|
|
675
|
+
echo ""
|
|
676
|
+
echo "Connection: ${getConnectionStringTemplate(engine, port, database, useTLS).replace(/\$/g, '\\$')}"
|
|
677
|
+
echo "========================================"
|
|
678
|
+
${isFileBased
|
|
679
|
+
? `
|
|
680
|
+
# File-based database: just keep container alive (no server to monitor)
|
|
681
|
+
exec tail -f /dev/null`
|
|
682
|
+
: `
|
|
683
|
+
# Keep container running
|
|
684
|
+
# Trap SIGTERM and SIGINT for graceful shutdown
|
|
685
|
+
trap "echo 'Shutting down...'; run_as_spindb spindb stop '$CONTAINER_NAME'; exit 0" SIGTERM SIGINT
|
|
686
|
+
|
|
687
|
+
# Keep the container running (as spindb user)
|
|
688
|
+
exec gosu spindb tail -f /dev/null &
|
|
689
|
+
while true; do
|
|
690
|
+
sleep 60
|
|
691
|
+
# Check if database is still running
|
|
692
|
+
if ! run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"'; then
|
|
693
|
+
echo "Database stopped unexpectedly, restarting..."
|
|
694
|
+
run_as_spindb spindb start "$CONTAINER_NAME" || true
|
|
695
|
+
fi
|
|
696
|
+
done`}
|
|
697
|
+
`;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Generate docker-compose.yml content
|
|
701
|
+
*/
|
|
702
|
+
function generateDockerCompose(containerName, engine, version, port, database, isFileBased) {
|
|
703
|
+
// Engine-aware healthcheck matching Dockerfile behavior
|
|
704
|
+
// Server-based: check for running status
|
|
705
|
+
// File-based: check that container exists (no server process to check)
|
|
706
|
+
// Note: Double quotes must be escaped for YAML string context
|
|
707
|
+
const healthcheckCommand = isFileBased
|
|
708
|
+
? `gosu spindb spindb list --json | grep -q '\\"engine\\":.*\\"${engine}\\"'`
|
|
709
|
+
: `gosu spindb spindb list --json | grep -q '\\"status\\":.*\\"running\\"'`;
|
|
710
|
+
const startPeriod = isFileBased ? '30s' : '60s';
|
|
711
|
+
return `name: spindb-${containerName}
|
|
712
|
+
|
|
713
|
+
services:
|
|
714
|
+
${containerName}:
|
|
715
|
+
build: .
|
|
716
|
+
container_name: spindb-${containerName}
|
|
717
|
+
restart: unless-stopped
|
|
718
|
+
environment:
|
|
719
|
+
SPINDB_CONTAINER: \${CONTAINER_NAME:-${containerName}}
|
|
720
|
+
SPINDB_ENGINE: \${ENGINE:-${engine}}
|
|
721
|
+
SPINDB_VERSION: \${VERSION:-${version}}
|
|
722
|
+
SPINDB_PORT: \${PORT:-${port}}
|
|
723
|
+
SPINDB_DATABASE: \${DATABASE:-${database}}
|
|
724
|
+
SPINDB_USER: \${SPINDB_USER:-spindb}
|
|
725
|
+
SPINDB_PASSWORD: \${SPINDB_PASSWORD:?Set SPINDB_PASSWORD in .env file}
|
|
726
|
+
ports:
|
|
727
|
+
- "\${PORT:-${port}}:\${PORT:-${port}}"
|
|
728
|
+
volumes:
|
|
729
|
+
- spindb-data:/home/spindb/.spindb
|
|
730
|
+
healthcheck:
|
|
731
|
+
test: ["CMD-SHELL", "${healthcheckCommand}"]
|
|
732
|
+
interval: 30s
|
|
733
|
+
timeout: 10s
|
|
734
|
+
start_period: ${startPeriod}
|
|
735
|
+
retries: 3
|
|
736
|
+
|
|
737
|
+
volumes:
|
|
738
|
+
spindb-data:
|
|
739
|
+
`;
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Generate .env file content
|
|
743
|
+
*/
|
|
744
|
+
function generateEnvFile(containerName, engine, version, port, database, credentials) {
|
|
745
|
+
return `# SpinDB Docker Configuration
|
|
746
|
+
# Generated by: spindb export docker
|
|
747
|
+
|
|
748
|
+
# Container settings
|
|
749
|
+
CONTAINER_NAME=${containerName}
|
|
750
|
+
ENGINE=${engine}
|
|
751
|
+
VERSION=${version}
|
|
752
|
+
PORT=${port}
|
|
753
|
+
DATABASE=${database}
|
|
754
|
+
|
|
755
|
+
# Credentials (auto-generated, change in production)
|
|
756
|
+
SPINDB_USER=${credentials.username}
|
|
757
|
+
SPINDB_PASSWORD=${credentials.password}
|
|
758
|
+
`;
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Generate README.md content
|
|
762
|
+
*/
|
|
763
|
+
function generateReadme(containerName, engine, version, port, database, useTLS) {
|
|
764
|
+
const displayName = getEngineDisplayName(engine);
|
|
765
|
+
const connectionTemplate = getConnectionStringTemplate(engine, port, database, useTLS);
|
|
766
|
+
// TLS-conditional content
|
|
767
|
+
const tlsSecurityNote = useTLS
|
|
768
|
+
? '- TLS certificates in `certs/` are self-signed. For production, replace with valid certificates.'
|
|
769
|
+
: '- TLS is disabled for this export. Consider enabling TLS for production use.';
|
|
770
|
+
const certsFileEntry = useTLS ? '| `certs/` | TLS certificates |\n' : '';
|
|
771
|
+
const tlsCustomization = useTLS
|
|
772
|
+
? `
|
|
773
|
+
### Use Custom Certificates
|
|
774
|
+
|
|
775
|
+
Replace the files in \`certs/\`:
|
|
776
|
+
- \`server.crt\` - TLS certificate
|
|
777
|
+
- \`server.key\` - TLS private key
|
|
778
|
+
|
|
779
|
+
### Disable TLS
|
|
780
|
+
|
|
781
|
+
Edit \`entrypoint.sh\` and remove TLS-related flags (not recommended for production).
|
|
782
|
+
`
|
|
783
|
+
: `
|
|
784
|
+
### Enable TLS
|
|
785
|
+
|
|
786
|
+
To enable TLS, re-export the container without the \`--skip-tls\` flag (requires OpenSSL).
|
|
787
|
+
`;
|
|
788
|
+
return `# ${containerName} - SpinDB Docker Export
|
|
789
|
+
|
|
790
|
+
This directory contains a Docker-ready package for running your SpinDB ${displayName} container.
|
|
791
|
+
|
|
792
|
+
## Quick Start
|
|
793
|
+
|
|
794
|
+
\`\`\`bash
|
|
795
|
+
# Start the container
|
|
796
|
+
docker compose up -d
|
|
797
|
+
|
|
798
|
+
# View logs
|
|
799
|
+
docker compose logs -f
|
|
800
|
+
|
|
801
|
+
# Stop the container
|
|
802
|
+
docker compose down
|
|
803
|
+
\`\`\`
|
|
804
|
+
|
|
805
|
+
## Configuration
|
|
806
|
+
|
|
807
|
+
| Setting | Value |
|
|
808
|
+
|---------|-------|
|
|
809
|
+
| Engine | ${displayName} ${version} |
|
|
810
|
+
| Port | ${port} |
|
|
811
|
+
| Database | ${database} |
|
|
812
|
+
| Username | spindb |
|
|
813
|
+
|
|
814
|
+
## Connection String
|
|
815
|
+
|
|
816
|
+
\`\`\`
|
|
817
|
+
${connectionTemplate}
|
|
818
|
+
\`\`\`
|
|
819
|
+
|
|
820
|
+
Replace \`<host>\` with your server's hostname or IP address.
|
|
821
|
+
Replace \`\${SPINDB_USER}\` and \`\${SPINDB_PASSWORD}\` with the values from \`.env\`.
|
|
822
|
+
|
|
823
|
+
## Security Notes
|
|
824
|
+
|
|
825
|
+
- The \`.env\` file contains auto-generated credentials. **Change these in production.**
|
|
826
|
+
${tlsSecurityNote}
|
|
827
|
+
- The default \`spindb\` user has full access to the database. Create restricted users for applications.
|
|
828
|
+
|
|
829
|
+
## Files
|
|
830
|
+
|
|
831
|
+
| File | Description |
|
|
832
|
+
|------|-------------|
|
|
833
|
+
| \`Dockerfile\` | Docker image definition |
|
|
834
|
+
| \`docker-compose.yml\` | Container orchestration |
|
|
835
|
+
| \`.env\` | Environment variables and credentials |
|
|
836
|
+
| \`entrypoint.sh\` | Container startup script |
|
|
837
|
+
${certsFileEntry}| \`data/\` | Database backup for initialization |
|
|
838
|
+
|
|
839
|
+
## Customization
|
|
840
|
+
|
|
841
|
+
### Change Port
|
|
842
|
+
|
|
843
|
+
Edit \`.env\`:
|
|
844
|
+
\`\`\`
|
|
845
|
+
PORT=5433
|
|
846
|
+
\`\`\`
|
|
847
|
+
${tlsCustomization}
|
|
848
|
+
---
|
|
849
|
+
|
|
850
|
+
Generated by [SpinDB](https://github.com/robertjbass/spindb)
|
|
851
|
+
`;
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Export a SpinDB container to Docker-ready artifacts
|
|
855
|
+
*/
|
|
856
|
+
export async function exportToDocker(container, options) {
|
|
857
|
+
const { outputDir, port = container.port, includeData = true, backupPath, backupPaths, skipTLS = false, } = options;
|
|
858
|
+
const engine = container.engine;
|
|
859
|
+
const version = container.version;
|
|
860
|
+
const database = container.database;
|
|
861
|
+
const containerName = container.name;
|
|
862
|
+
// Get all databases for the container
|
|
863
|
+
const databases = container.databases || [database];
|
|
864
|
+
return withTransaction(async (tx) => {
|
|
865
|
+
// Check if output directory already exists
|
|
866
|
+
const outputDirExisted = existsSync(outputDir);
|
|
867
|
+
if (outputDirExisted) {
|
|
868
|
+
// If it exists, check if it's empty or only contains 'data' (from backup step)
|
|
869
|
+
const existingFiles = await readdir(outputDir);
|
|
870
|
+
const nonDataFiles = existingFiles.filter((f) => f !== 'data');
|
|
871
|
+
if (nonDataFiles.length > 0) {
|
|
872
|
+
throw new Error(`Output directory "${outputDir}" already exists and is not empty. ` +
|
|
873
|
+
`Please use an empty directory or remove the existing files.`);
|
|
874
|
+
}
|
|
875
|
+
// Directory exists but is empty or only has data/ - don't register rollback for it
|
|
876
|
+
}
|
|
877
|
+
else {
|
|
878
|
+
// Directory doesn't exist - create it and register rollback
|
|
879
|
+
await mkdir(outputDir, { recursive: true });
|
|
880
|
+
tx.addRollback({
|
|
881
|
+
description: `Delete output directory: ${outputDir}`,
|
|
882
|
+
execute: async () => {
|
|
883
|
+
await rm(outputDir, { recursive: true, force: true });
|
|
884
|
+
},
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
// Create subdirectories (always register rollback for these since we create them)
|
|
888
|
+
const certsDir = join(outputDir, 'certs');
|
|
889
|
+
const dataDir = join(outputDir, 'data');
|
|
890
|
+
await mkdir(certsDir, { recursive: true });
|
|
891
|
+
tx.addRollback({
|
|
892
|
+
description: `Delete certs directory: ${certsDir}`,
|
|
893
|
+
execute: async () => {
|
|
894
|
+
await rm(certsDir, { recursive: true, force: true });
|
|
895
|
+
},
|
|
896
|
+
});
|
|
897
|
+
await mkdir(dataDir, { recursive: true });
|
|
898
|
+
tx.addRollback({
|
|
899
|
+
description: `Delete data directory: ${dataDir}`,
|
|
900
|
+
execute: async () => {
|
|
901
|
+
await rm(dataDir, { recursive: true, force: true });
|
|
902
|
+
},
|
|
903
|
+
});
|
|
904
|
+
const files = [];
|
|
905
|
+
// Generate credentials
|
|
906
|
+
const credentials = generateCredentials();
|
|
907
|
+
// Check OpenSSL availability once for TLS decisions
|
|
908
|
+
const hasOpenSSL = await isOpenSSLAvailable();
|
|
909
|
+
// Generate TLS certificates (if openssl is available and not skipped)
|
|
910
|
+
if (!skipTLS && hasOpenSSL) {
|
|
911
|
+
await generateTLSCertificates({
|
|
912
|
+
outputDir: join(outputDir, 'certs'),
|
|
913
|
+
commonName: 'localhost',
|
|
914
|
+
validDays: 365,
|
|
915
|
+
});
|
|
916
|
+
files.push('certs/server.crt', 'certs/server.key');
|
|
917
|
+
}
|
|
918
|
+
// Copy backup files if provided (multiple databases)
|
|
919
|
+
if (includeData && backupPaths && backupPaths.length > 0) {
|
|
920
|
+
for (const bp of backupPaths) {
|
|
921
|
+
if (existsSync(bp.path)) {
|
|
922
|
+
const backupFilename = basename(bp.path);
|
|
923
|
+
await copyFile(bp.path, join(outputDir, 'data', backupFilename));
|
|
924
|
+
files.push(`data/${backupFilename}`);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
else if (includeData && backupPath && existsSync(backupPath)) {
|
|
929
|
+
// Single backup file (legacy support)
|
|
930
|
+
const backupFilename = basename(backupPath);
|
|
931
|
+
await copyFile(backupPath, join(outputDir, 'data', backupFilename));
|
|
932
|
+
files.push(`data/${backupFilename}`);
|
|
933
|
+
}
|
|
934
|
+
// Determine TLS status for Dockerfile and entrypoint
|
|
935
|
+
const useTLS = !skipTLS && hasOpenSSL;
|
|
936
|
+
// Generate Dockerfile
|
|
937
|
+
const dockerfile = generateDockerfile(engine, isFileBasedEngine(engine), useTLS);
|
|
938
|
+
await writeFile(join(outputDir, 'Dockerfile'), dockerfile);
|
|
939
|
+
files.push('Dockerfile');
|
|
940
|
+
// Generate entrypoint.sh
|
|
941
|
+
const entrypoint = generateEntrypoint(engine, containerName, database, databases, version, port, useTLS);
|
|
942
|
+
await writeFile(join(outputDir, 'entrypoint.sh'), entrypoint, {
|
|
943
|
+
mode: 0o755,
|
|
944
|
+
});
|
|
945
|
+
files.push('entrypoint.sh');
|
|
946
|
+
// Generate docker-compose.yml
|
|
947
|
+
const dockerCompose = generateDockerCompose(containerName, engine, version, port, database, isFileBasedEngine(engine));
|
|
948
|
+
await writeFile(join(outputDir, 'docker-compose.yml'), dockerCompose);
|
|
949
|
+
files.push('docker-compose.yml');
|
|
950
|
+
// Generate .env file
|
|
951
|
+
const envFile = generateEnvFile(containerName, engine, version, port, database, credentials);
|
|
952
|
+
await writeFile(join(outputDir, '.env'), envFile);
|
|
953
|
+
files.push('.env');
|
|
954
|
+
// Generate README.md
|
|
955
|
+
const readme = generateReadme(containerName, engine, version, port, database, useTLS);
|
|
956
|
+
await writeFile(join(outputDir, 'README.md'), readme);
|
|
957
|
+
files.push('README.md');
|
|
958
|
+
return {
|
|
959
|
+
outputDir,
|
|
960
|
+
credentials,
|
|
961
|
+
port,
|
|
962
|
+
engine,
|
|
963
|
+
version,
|
|
964
|
+
database,
|
|
965
|
+
files,
|
|
966
|
+
};
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
/**
|
|
970
|
+
* Get the backup file path that would be used for a container export
|
|
971
|
+
*/
|
|
972
|
+
export function getExportBackupPath(outputDir, containerName, database, engine) {
|
|
973
|
+
const format = getDefaultFormat(engine);
|
|
974
|
+
const extension = getBackupExtension(engine, format);
|
|
975
|
+
return join(outputDir, 'data', `${containerName}-${database}${extension}`);
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* Get the default Docker export directory for a container
|
|
979
|
+
*/
|
|
980
|
+
export function getDefaultDockerExportPath(containerName, engine) {
|
|
981
|
+
return join(homedir(), '.spindb', 'containers', engine, containerName, 'docker');
|
|
982
|
+
}
|
|
983
|
+
/**
|
|
984
|
+
* Check if a Docker export already exists for a container
|
|
985
|
+
*/
|
|
986
|
+
export function dockerExportExists(containerName, engine) {
|
|
987
|
+
const exportPath = getDefaultDockerExportPath(containerName, engine);
|
|
988
|
+
const envPath = join(exportPath, '.env');
|
|
989
|
+
return existsSync(envPath);
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Read Docker credentials from an existing export's .env file
|
|
993
|
+
*/
|
|
994
|
+
export async function getDockerCredentials(containerName, engine) {
|
|
995
|
+
const exportPath = getDefaultDockerExportPath(containerName, engine);
|
|
996
|
+
const envPath = join(exportPath, '.env');
|
|
997
|
+
if (!existsSync(envPath)) {
|
|
998
|
+
return null;
|
|
999
|
+
}
|
|
1000
|
+
try {
|
|
1001
|
+
const envContent = await readFile(envPath, 'utf-8');
|
|
1002
|
+
const lines = envContent.split('\n');
|
|
1003
|
+
const values = {};
|
|
1004
|
+
for (const line of lines) {
|
|
1005
|
+
const match = line.match(/^([A-Z_]+)=(.*)$/);
|
|
1006
|
+
if (match) {
|
|
1007
|
+
values[match[1]] = match[2];
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return {
|
|
1011
|
+
username: values.SPINDB_USER || 'spindb',
|
|
1012
|
+
password: values.SPINDB_PASSWORD || '',
|
|
1013
|
+
port: parseInt(values.PORT || '0', 10),
|
|
1014
|
+
database: values.DATABASE || '',
|
|
1015
|
+
engine: values.ENGINE || engine,
|
|
1016
|
+
version: values.VERSION || '',
|
|
1017
|
+
containerName: values.CONTAINER_NAME || containerName,
|
|
1018
|
+
};
|
|
1019
|
+
}
|
|
1020
|
+
catch {
|
|
1021
|
+
return null;
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* Get the Docker connection string for an existing export
|
|
1026
|
+
* Returns the connection string with actual credentials substituted
|
|
1027
|
+
*/
|
|
1028
|
+
export async function getDockerConnectionString(containerName, engine, options = {}) {
|
|
1029
|
+
const credentials = await getDockerCredentials(containerName, engine);
|
|
1030
|
+
if (!credentials) {
|
|
1031
|
+
return null;
|
|
1032
|
+
}
|
|
1033
|
+
const host = options.host || 'localhost';
|
|
1034
|
+
const { username, password, port, database } = credentials;
|
|
1035
|
+
// URL-encode credentials to escape reserved URI characters
|
|
1036
|
+
const encodedUsername = encodeURIComponent(username);
|
|
1037
|
+
const encodedPassword = encodeURIComponent(password);
|
|
1038
|
+
const encodedDatabase = encodeURIComponent(database);
|
|
1039
|
+
// Build connection string based on engine type
|
|
1040
|
+
switch (engine) {
|
|
1041
|
+
case Engine.PostgreSQL:
|
|
1042
|
+
case Engine.CockroachDB:
|
|
1043
|
+
case Engine.QuestDB:
|
|
1044
|
+
return `postgresql://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
|
|
1045
|
+
case Engine.MySQL:
|
|
1046
|
+
case Engine.MariaDB:
|
|
1047
|
+
return `mysql://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
|
|
1048
|
+
case Engine.MongoDB:
|
|
1049
|
+
case Engine.FerretDB:
|
|
1050
|
+
return `mongodb://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
|
|
1051
|
+
case Engine.Redis:
|
|
1052
|
+
case Engine.Valkey:
|
|
1053
|
+
return `redis://:${encodedPassword}@${host}:${port}`;
|
|
1054
|
+
case Engine.ClickHouse:
|
|
1055
|
+
return `clickhouse://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
|
|
1056
|
+
case Engine.Qdrant:
|
|
1057
|
+
return `http://${host}:${port}`;
|
|
1058
|
+
case Engine.Meilisearch:
|
|
1059
|
+
case Engine.InfluxDB:
|
|
1060
|
+
case Engine.Weaviate:
|
|
1061
|
+
return `http://${host}:${port}`;
|
|
1062
|
+
case Engine.CouchDB:
|
|
1063
|
+
return `http://${username}:${password}@${host}:${port}/${database}`;
|
|
1064
|
+
case Engine.SurrealDB:
|
|
1065
|
+
return `ws://${username}:${password}@${host}:${port}`;
|
|
1066
|
+
case Engine.TypeDB:
|
|
1067
|
+
return `typedb://${host}:${port}`;
|
|
1068
|
+
case Engine.TigerBeetle:
|
|
1069
|
+
return `${host}:${port}`;
|
|
1070
|
+
case Engine.SQLite:
|
|
1071
|
+
case Engine.DuckDB:
|
|
1072
|
+
return `File-based database (no network connection)`;
|
|
1073
|
+
default:
|
|
1074
|
+
assertExhaustive(engine, `Unhandled engine in getDockerConnectionString: ${engine}`);
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
//# sourceMappingURL=docker-exporter.js.map
|