@libredb/studio 0.9.7
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/.claude/settings.local.json +127 -0
- package/.cursorrules +426 -0
- package/.devin/wiki.json +143 -0
- package/.dockerignore +80 -0
- package/.env.example +159 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +49 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +57 -0
- package/.github/workflows/ci.yml +185 -0
- package/.github/workflows/codeql.yml +57 -0
- package/.github/workflows/docker-build-push.yml +118 -0
- package/.github/workflows/helm-release.yml +113 -0
- package/CLAUDE.md +265 -0
- package/CODE_OF_CONDUCT.md +124 -0
- package/CONTRIBUTING.md +154 -0
- package/Dockerfile +73 -0
- package/LICENSE +21 -0
- package/README.md +614 -0
- package/SECURITY.md +107 -0
- package/artifacthub-repo.yml +4 -0
- package/bun.lock +1714 -0
- package/bunfig.toml +3 -0
- package/charts/libredb-studio/.helmignore +11 -0
- package/charts/libredb-studio/Chart.lock +6 -0
- package/charts/libredb-studio/Chart.yaml +50 -0
- package/charts/libredb-studio/README.md +206 -0
- package/charts/libredb-studio/templates/NOTES.txt +59 -0
- package/charts/libredb-studio/templates/_helpers.tpl +135 -0
- package/charts/libredb-studio/templates/configmap.yaml +37 -0
- package/charts/libredb-studio/templates/deployment.yaml +184 -0
- package/charts/libredb-studio/templates/hpa.yaml +32 -0
- package/charts/libredb-studio/templates/ingress.yaml +41 -0
- package/charts/libredb-studio/templates/networkpolicy.yaml +50 -0
- package/charts/libredb-studio/templates/pdb.yaml +18 -0
- package/charts/libredb-studio/templates/pvc.yaml +23 -0
- package/charts/libredb-studio/templates/secret.yaml +30 -0
- package/charts/libredb-studio/templates/seed-configmap.yaml +11 -0
- package/charts/libredb-studio/templates/service.yaml +22 -0
- package/charts/libredb-studio/templates/serviceaccount.yaml +13 -0
- package/charts/libredb-studio/values.schema.json +246 -0
- package/charts/libredb-studio/values.yaml +286 -0
- package/components.json +22 -0
- package/conductor/code_styleguides/typescript.md +43 -0
- package/conductor/product-guidelines.md +43 -0
- package/conductor/product.md +3 -0
- package/conductor/setup_state.json +1 -0
- package/conductor/tech-stack.md +39 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +8 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +44 -0
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +31 -0
- package/conductor/tracks.md +8 -0
- package/conductor/workflow.md +333 -0
- package/database-compose.yml +55 -0
- package/docker/postgres-init/01-extensions.sql +10 -0
- package/docker/postgres-init/02-sample-data.sql +585 -0
- package/docker/postgres.yml +68 -0
- package/docker-compose.yml +38 -0
- package/docs/AI_PLAN.md +74 -0
- package/docs/API_DOCS.md +875 -0
- package/docs/ARCHITECTURE.md +218 -0
- package/docs/DATABASE_PROVIDERS.md +358 -0
- package/docs/FEATURES.md +116 -0
- package/docs/HELM_CHART.md +252 -0
- package/docs/LOGIN_PAGE.md +178 -0
- package/docs/MONACO_EDITOR_PERFORMANCE.md +315 -0
- package/docs/OIDC_ARCH.md +681 -0
- package/docs/OIDC_SETUP.md +322 -0
- package/docs/POSTGRES_METRICS.md +516 -0
- package/docs/QUERY_OPTIMIZATION.md +370 -0
- package/docs/SEED_CONNECTIONS.md +468 -0
- package/docs/SQL_ALIAS_COMPLETION.md +190 -0
- package/docs/STORAGE_ARCHITECTURE.md +565 -0
- package/docs/STORAGE_QUICK_SETUP.md +419 -0
- package/docs/TECHNICAL_PLAN.md +36 -0
- package/docs/THEMING.md +345 -0
- package/docs/adding-a-new-database-provider.md +642 -0
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +360 -0
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +118 -0
- package/docs/backlogs/002-DATA_IMPORT.md +215 -0
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +183 -0
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +292 -0
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +352 -0
- package/docs/backlogs/006-DATA_MASKING.md +418 -0
- package/docs/enterprise-features.md +718 -0
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +803 -0
- package/docs/medium-koyeb-article-en.md +215 -0
- package/docs/plans/test-plans.md +445 -0
- package/docs/releases/RELEASE.V0.3.0.md +22 -0
- package/docs/releases/RELEASE.V0.4.0.md +154 -0
- package/docs/releases/RELEASE.V0.5.0.md +252 -0
- package/docs/releases/RELEASE_v0.5.6.md +145 -0
- package/docs/releases/RELEASE_v0.6.1.md +303 -0
- package/docs/releases/RELEASE_v0.6.7.md +292 -0
- package/docs/releases/RELEASE_v0.7.0.md +332 -0
- package/docs/releases/RELEASE_v0.8.0.md +521 -0
- package/docs/sampledb/titanic.sql +1379 -0
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +1362 -0
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +590 -0
- package/e2e/admin-dashboard.spec.ts +64 -0
- package/e2e/connection-management.spec.ts +58 -0
- package/e2e/export.spec.ts +34 -0
- package/e2e/login.spec.ts +85 -0
- package/e2e/query-execution.spec.ts +35 -0
- package/e2e/tab-management.spec.ts +64 -0
- package/eslint.config.mjs +28 -0
- package/fly.toml +43 -0
- package/next.config.ts +32 -0
- package/package.json +130 -0
- package/playwright.config.ts +34 -0
- package/postcss.config.mjs +7 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo.svg +32 -0
- package/public/next.svg +1 -0
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/render.yaml +58 -0
- package/scripts/merge-lcov.mjs +239 -0
- package/sonar-project.properties +16 -0
- package/src/app/admin/error.tsx +46 -0
- package/src/app/admin/page.tsx +10 -0
- package/src/app/api/admin/audit/route.ts +52 -0
- package/src/app/api/admin/fleet-health/route.ts +81 -0
- package/src/app/api/ai/autopilot/route.ts +105 -0
- package/src/app/api/ai/chat/route.ts +132 -0
- package/src/app/api/ai/describe-schema/route.ts +52 -0
- package/src/app/api/ai/explain/route.ts +86 -0
- package/src/app/api/ai/impact/route.ts +97 -0
- package/src/app/api/ai/index-advisor/route.ts +98 -0
- package/src/app/api/ai/nl2sql/route.ts +87 -0
- package/src/app/api/ai/query-safety/route.ts +87 -0
- package/src/app/api/auth/login/route.ts +62 -0
- package/src/app/api/auth/logout/route.ts +25 -0
- package/src/app/api/auth/me/route.ts +10 -0
- package/src/app/api/auth/oidc/callback/route.ts +82 -0
- package/src/app/api/auth/oidc/login/route.ts +43 -0
- package/src/app/api/connections/managed/route.ts +35 -0
- package/src/app/api/db/cancel/route.ts +42 -0
- package/src/app/api/db/disconnect/route.ts +28 -0
- package/src/app/api/db/health/route.ts +49 -0
- package/src/app/api/db/maintenance/route.ts +72 -0
- package/src/app/api/db/monitoring/route.ts +62 -0
- package/src/app/api/db/multi-query/route.ts +116 -0
- package/src/app/api/db/pool-stats/route.ts +37 -0
- package/src/app/api/db/profile/route.ts +144 -0
- package/src/app/api/db/provider-meta/route.ts +49 -0
- package/src/app/api/db/query/route.ts +50 -0
- package/src/app/api/db/schema/route.ts +47 -0
- package/src/app/api/db/schema-snapshot/route.ts +42 -0
- package/src/app/api/db/test-connection/route.ts +55 -0
- package/src/app/api/db/transaction/route.ts +111 -0
- package/src/app/api/storage/[collection]/route.ts +67 -0
- package/src/app/api/storage/config/route.ts +17 -0
- package/src/app/api/storage/migrate/route.ts +45 -0
- package/src/app/api/storage/route.ts +32 -0
- package/src/app/error.tsx +49 -0
- package/src/app/global-error.tsx +55 -0
- package/src/app/globals.css +146 -0
- package/src/app/icon.svg +42 -0
- package/src/app/layout.tsx +34 -0
- package/src/app/login/login-form.tsx +301 -0
- package/src/app/login/page.tsx +11 -0
- package/src/app/monitoring/page.tsx +8 -0
- package/src/app/not-found.tsx +29 -0
- package/src/app/page.tsx +5 -0
- package/src/components/AIAutopilotPanel.tsx +238 -0
- package/src/components/CodeGenerator.tsx +271 -0
- package/src/components/CommandPalette.tsx +227 -0
- package/src/components/ConnectionModal.tsx +759 -0
- package/src/components/CreateTableModal.tsx +281 -0
- package/src/components/DataCharts.tsx +962 -0
- package/src/components/DataImportModal.tsx +582 -0
- package/src/components/DataProfiler.tsx +335 -0
- package/src/components/DatabaseDocs.tsx +251 -0
- package/src/components/MaskingSettings.tsx +414 -0
- package/src/components/MobileNav.tsx +50 -0
- package/src/components/NL2SQLPanel.tsx +281 -0
- package/src/components/PivotTable.tsx +257 -0
- package/src/components/QueryEditor.tsx +760 -0
- package/src/components/QueryHistory.tsx +344 -0
- package/src/components/QuerySafetyDialog.tsx +290 -0
- package/src/components/ResultsGrid.tsx +644 -0
- package/src/components/SaveQueryModal.tsx +104 -0
- package/src/components/SavedQueries.tsx +128 -0
- package/src/components/SchemaDiagram.tsx +473 -0
- package/src/components/SchemaDiff.tsx +473 -0
- package/src/components/SnapshotTimeline.tsx +116 -0
- package/src/components/Studio.tsx +639 -0
- package/src/components/TestDataGenerator.tsx +261 -0
- package/src/components/VisualExplain.tsx +820 -0
- package/src/components/admin/AdminDashboard.tsx +163 -0
- package/src/components/admin/tabs/AuditTab.tsx +531 -0
- package/src/components/admin/tabs/MonitoringEmbed.tsx +11 -0
- package/src/components/admin/tabs/OperationsTab.tsx +646 -0
- package/src/components/admin/tabs/OverviewTab.tsx +1328 -0
- package/src/components/admin/tabs/SecurityTab.tsx +284 -0
- package/src/components/community-section.tsx +92 -0
- package/src/components/icons/db-icons.tsx +84 -0
- package/src/components/libredb-logo.tsx +61 -0
- package/src/components/monitoring/MonitoringDashboard.tsx +345 -0
- package/src/components/monitoring/tabs/MetricChart.tsx +82 -0
- package/src/components/monitoring/tabs/OverviewTab.tsx +263 -0
- package/src/components/monitoring/tabs/PerformanceTab.tsx +254 -0
- package/src/components/monitoring/tabs/PoolTab.tsx +174 -0
- package/src/components/monitoring/tabs/QueriesTab.tsx +287 -0
- package/src/components/monitoring/tabs/SessionsTab.tsx +316 -0
- package/src/components/monitoring/tabs/StorageTab.tsx +335 -0
- package/src/components/monitoring/tabs/TablesTab.tsx +300 -0
- package/src/components/results-grid/ResultCard.tsx +111 -0
- package/src/components/results-grid/RowDetailSheet.tsx +178 -0
- package/src/components/results-grid/StatsBar.tsx +201 -0
- package/src/components/results-grid/index.ts +1 -0
- package/src/components/results-grid/utils.ts +23 -0
- package/src/components/schema-explorer/ColumnList.tsx +53 -0
- package/src/components/schema-explorer/SchemaExplorer.tsx +182 -0
- package/src/components/schema-explorer/TableItem.tsx +210 -0
- package/src/components/schema-explorer/index.ts +1 -0
- package/src/components/sidebar/ConnectionItem.tsx +105 -0
- package/src/components/sidebar/ConnectionsList.tsx +62 -0
- package/src/components/sidebar/Sidebar.tsx +130 -0
- package/src/components/sidebar/index.ts +2 -0
- package/src/components/studio/BottomPanel.tsx +286 -0
- package/src/components/studio/QueryToolbar.tsx +180 -0
- package/src/components/studio/StudioDesktopHeader.tsx +114 -0
- package/src/components/studio/StudioMobileHeader.tsx +340 -0
- package/src/components/studio/StudioTabBar.tsx +82 -0
- package/src/components/studio/index.ts +5 -0
- package/src/components/ui/accordion.tsx +66 -0
- package/src/components/ui/alert-dialog.tsx +157 -0
- package/src/components/ui/alert.tsx +66 -0
- package/src/components/ui/aspect-ratio.tsx +11 -0
- package/src/components/ui/avatar.tsx +53 -0
- package/src/components/ui/badge.tsx +46 -0
- package/src/components/ui/breadcrumb.tsx +109 -0
- package/src/components/ui/button-group.tsx +83 -0
- package/src/components/ui/button.tsx +60 -0
- package/src/components/ui/calendar.tsx +216 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/carousel.tsx +241 -0
- package/src/components/ui/chart.tsx +357 -0
- package/src/components/ui/checkbox.tsx +32 -0
- package/src/components/ui/collapsible.tsx +33 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/context-menu.tsx +252 -0
- package/src/components/ui/dialog.tsx +143 -0
- package/src/components/ui/drawer.tsx +135 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/empty.tsx +104 -0
- package/src/components/ui/field.tsx +248 -0
- package/src/components/ui/form.tsx +167 -0
- package/src/components/ui/hover-card.tsx +44 -0
- package/src/components/ui/input-group.tsx +170 -0
- package/src/components/ui/input-otp.tsx +77 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/item.tsx +193 -0
- package/src/components/ui/kbd.tsx +28 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/menubar.tsx +276 -0
- package/src/components/ui/navigation-menu.tsx +168 -0
- package/src/components/ui/pagination.tsx +127 -0
- package/src/components/ui/popover.tsx +48 -0
- package/src/components/ui/progress.tsx +31 -0
- package/src/components/ui/radio-group.tsx +45 -0
- package/src/components/ui/resizable.tsx +56 -0
- package/src/components/ui/scroll-area.tsx +58 -0
- package/src/components/ui/select.tsx +187 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +139 -0
- package/src/components/ui/sidebar.tsx +726 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/slider.tsx +63 -0
- package/src/components/ui/sonner.tsx +40 -0
- package/src/components/ui/spinner.tsx +16 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/table.tsx +116 -0
- package/src/components/ui/tabs.tsx +66 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/toggle-group.tsx +83 -0
- package/src/components/ui/toggle.tsx +47 -0
- package/src/components/ui/tooltip.tsx +61 -0
- package/src/exports/components.ts +15 -0
- package/src/exports/index.ts +4 -0
- package/src/exports/providers.ts +4 -0
- package/src/exports/types.ts +26 -0
- package/src/hooks/use-ai-chat.ts +182 -0
- package/src/hooks/use-all-connections.ts +66 -0
- package/src/hooks/use-api-call.ts +71 -0
- package/src/hooks/use-auth.ts +51 -0
- package/src/hooks/use-connection-form.ts +349 -0
- package/src/hooks/use-connection-manager.ts +169 -0
- package/src/hooks/use-connection-payload.ts +15 -0
- package/src/hooks/use-inline-editing.ts +109 -0
- package/src/hooks/use-mobile.ts +20 -0
- package/src/hooks/use-monitoring-data.ts +270 -0
- package/src/hooks/use-provider-metadata.ts +62 -0
- package/src/hooks/use-query-execution.ts +478 -0
- package/src/hooks/use-storage-sync.ts +259 -0
- package/src/hooks/use-tab-manager.ts +231 -0
- package/src/hooks/use-toast.ts +20 -0
- package/src/hooks/use-transaction-control.ts +64 -0
- package/src/lib/api/error-codes.ts +30 -0
- package/src/lib/api/errors.ts +236 -0
- package/src/lib/api/with-error-handler.ts +41 -0
- package/src/lib/audit.ts +105 -0
- package/src/lib/auth.ts +87 -0
- package/src/lib/connection-string-parser.ts +172 -0
- package/src/lib/data-masking.ts +385 -0
- package/src/lib/db/base-provider.ts +325 -0
- package/src/lib/db/errors.ts +317 -0
- package/src/lib/db/factory.ts +324 -0
- package/src/lib/db/index.ts +123 -0
- package/src/lib/db/providers/document/index.ts +6 -0
- package/src/lib/db/providers/document/mongodb.ts +992 -0
- package/src/lib/db/providers/keyvalue/redis.ts +554 -0
- package/src/lib/db/providers/sql/index.ts +11 -0
- package/src/lib/db/providers/sql/mssql.ts +1065 -0
- package/src/lib/db/providers/sql/mysql.ts +978 -0
- package/src/lib/db/providers/sql/oracle.ts +1044 -0
- package/src/lib/db/providers/sql/postgres.ts +1179 -0
- package/src/lib/db/providers/sql/sql-base.ts +174 -0
- package/src/lib/db/providers/sql/sqlite.ts +721 -0
- package/src/lib/db/types.ts +437 -0
- package/src/lib/db/utils/pool-manager.ts +287 -0
- package/src/lib/db/utils/query-limiter.ts +239 -0
- package/src/lib/db-ui-config.ts +86 -0
- package/src/lib/editor/mongodb-completions.ts +172 -0
- package/src/lib/editor/sql-completions.ts +280 -0
- package/src/lib/llm/base-provider.ts +117 -0
- package/src/lib/llm/factory.ts +102 -0
- package/src/lib/llm/index.ts +90 -0
- package/src/lib/llm/providers/custom.ts +181 -0
- package/src/lib/llm/providers/gemini.ts +126 -0
- package/src/lib/llm/providers/ollama.ts +154 -0
- package/src/lib/llm/providers/openai.ts +146 -0
- package/src/lib/llm/types.ts +173 -0
- package/src/lib/llm/utils/config.ts +187 -0
- package/src/lib/llm/utils/retry.ts +119 -0
- package/src/lib/llm/utils/streaming.ts +202 -0
- package/src/lib/logger.ts +127 -0
- package/src/lib/monitoring-thresholds.ts +44 -0
- package/src/lib/oidc.ts +262 -0
- package/src/lib/query-generators.ts +61 -0
- package/src/lib/schema-diff/diff-engine.ts +273 -0
- package/src/lib/schema-diff/migration-generator.ts +208 -0
- package/src/lib/schema-diff/types.ts +55 -0
- package/src/lib/seed/config-loader.ts +79 -0
- package/src/lib/seed/connection-filter.ts +49 -0
- package/src/lib/seed/credential-resolver.ts +62 -0
- package/src/lib/seed/index.ts +40 -0
- package/src/lib/seed/resolve-connection.ts +57 -0
- package/src/lib/seed/types.ts +69 -0
- package/src/lib/sql/alias-extractor.ts +267 -0
- package/src/lib/sql/index.ts +8 -0
- package/src/lib/sql/statement-splitter.ts +167 -0
- package/src/lib/sql/types.ts +40 -0
- package/src/lib/ssh/tunnel.ts +142 -0
- package/src/lib/storage/factory.ts +84 -0
- package/src/lib/storage/index.ts +14 -0
- package/src/lib/storage/local-storage.ts +99 -0
- package/src/lib/storage/providers/postgres.ts +225 -0
- package/src/lib/storage/providers/sqlite.ts +153 -0
- package/src/lib/storage/storage-facade.ts +272 -0
- package/src/lib/storage/types.ts +75 -0
- package/src/lib/time-series-buffer.ts +58 -0
- package/src/lib/types.ts +173 -0
- package/src/lib/utils.ts +6 -0
- package/src/proxy.ts +104 -0
- package/src/types/db-drivers.d.ts +23 -0
- package/src/types/html2canvas.d.ts +9 -0
- package/tests/api/admin/audit.test.ts +178 -0
- package/tests/api/admin/fleet-health.test.ts +183 -0
- package/tests/api/ai/autopilot.test.ts +174 -0
- package/tests/api/ai/chat.test.ts +250 -0
- package/tests/api/ai/describe-schema.test.ts +266 -0
- package/tests/api/ai/explain.test.ts +199 -0
- package/tests/api/ai/impact.test.ts +168 -0
- package/tests/api/ai/index-advisor.test.ts +171 -0
- package/tests/api/ai/nl2sql.test.ts +202 -0
- package/tests/api/ai/query-safety.test.ts +196 -0
- package/tests/api/auth/login.test.ts +170 -0
- package/tests/api/auth/logout.test.ts +140 -0
- package/tests/api/auth/me.test.ts +73 -0
- package/tests/api/auth/oidc-callback.test.ts +215 -0
- package/tests/api/auth/oidc-login.test.ts +127 -0
- package/tests/api/db/cancel.test.ts +198 -0
- package/tests/api/db/disconnect.test.ts +124 -0
- package/tests/api/db/health.test.ts +222 -0
- package/tests/api/db/maintenance.test.ts +263 -0
- package/tests/api/db/monitoring.test.ts +221 -0
- package/tests/api/db/multi-query.test.ts +316 -0
- package/tests/api/db/pool-stats.test.ts +135 -0
- package/tests/api/db/profile.test.ts +330 -0
- package/tests/api/db/provider-meta.test.ts +193 -0
- package/tests/api/db/query.test.ts +314 -0
- package/tests/api/db/schema-snapshot.test.ts +170 -0
- package/tests/api/db/schema.test.ts +191 -0
- package/tests/api/db/test-connection.test.ts +185 -0
- package/tests/api/db/transaction.test.ts +314 -0
- package/tests/api/proxy.test.ts +191 -0
- package/tests/api/seed/managed-route.test.ts +113 -0
- package/tests/api/storage/config.test.ts +42 -0
- package/tests/api/storage/storage-routes.test.ts +309 -0
- package/tests/components/AIAutopilotPanel.test.tsx +756 -0
- package/tests/components/AdminPage.test.tsx +33 -0
- package/tests/components/CodeGenerator.test.tsx +182 -0
- package/tests/components/CommandPalette.test.tsx +428 -0
- package/tests/components/CommunitySection.test.tsx +91 -0
- package/tests/components/ConnectionModal.mobile.test.tsx +284 -0
- package/tests/components/ConnectionModal.test.tsx +570 -0
- package/tests/components/CreateTableModal.test.tsx +383 -0
- package/tests/components/DataCharts.test.tsx +739 -0
- package/tests/components/DataImportModal.test.tsx +751 -0
- package/tests/components/DataProfiler.test.tsx +589 -0
- package/tests/components/DatabaseDocs.test.tsx +353 -0
- package/tests/components/LoginPage.test.tsx +163 -0
- package/tests/components/LoginPageOIDC.test.tsx +92 -0
- package/tests/components/MaskingSettings.test.tsx +498 -0
- package/tests/components/MobileNav.test.tsx +30 -0
- package/tests/components/MonitoringPage.test.tsx +32 -0
- package/tests/components/NL2SQLPanel.test.tsx +621 -0
- package/tests/components/Page.test.tsx +33 -0
- package/tests/components/PivotTable.test.tsx +350 -0
- package/tests/components/QueryEditor.test.tsx +1730 -0
- package/tests/components/QueryHistory.test.tsx +572 -0
- package/tests/components/QuerySafetyDialog.test.tsx +586 -0
- package/tests/components/ResultsGrid.test.tsx +804 -0
- package/tests/components/RootLayout.test.tsx +83 -0
- package/tests/components/SaveQueryModal.test.tsx +25 -0
- package/tests/components/SavedQueries.test.tsx +43 -0
- package/tests/components/SchemaDiagram.test.tsx +1034 -0
- package/tests/components/SchemaDiff.test.tsx +906 -0
- package/tests/components/SnapshotTimeline.test.tsx +174 -0
- package/tests/components/Studio.test.tsx +1030 -0
- package/tests/components/TestDataGenerator.test.tsx +291 -0
- package/tests/components/VisualExplain.test.tsx +704 -0
- package/tests/components/admin/AdminDashboard.test.tsx +205 -0
- package/tests/components/admin/AuditTab.test.tsx +220 -0
- package/tests/components/admin/MonitoringEmbed.test.tsx +58 -0
- package/tests/components/admin/OperationsTab.test.tsx +975 -0
- package/tests/components/admin/OverviewTab.test.tsx +254 -0
- package/tests/components/admin/SecurityTab.test.tsx +467 -0
- package/tests/components/monitoring/MetricChart.test.tsx +111 -0
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +259 -0
- package/tests/components/monitoring/OverviewTab.test.tsx +78 -0
- package/tests/components/monitoring/PerformanceTab.test.tsx +87 -0
- package/tests/components/monitoring/PoolTab.test.tsx +42 -0
- package/tests/components/monitoring/QueriesTab.test.tsx +80 -0
- package/tests/components/monitoring/SessionsTab.test.tsx +154 -0
- package/tests/components/monitoring/StorageTab.test.tsx +127 -0
- package/tests/components/monitoring/TablesTab.test.tsx +153 -0
- package/tests/components/results-grid/ResultCard.test.tsx +105 -0
- package/tests/components/results-grid/RowDetailSheet.test.tsx +308 -0
- package/tests/components/results-grid/StatsBar.test.tsx +162 -0
- package/tests/components/schema-explorer/ColumnList.test.tsx +151 -0
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +461 -0
- package/tests/components/schema-explorer/TableItem.test.tsx +415 -0
- package/tests/components/sidebar/ConnectionItem.test.tsx +201 -0
- package/tests/components/sidebar/ConnectionsList.test.tsx +176 -0
- package/tests/components/sidebar/Sidebar.test.tsx +187 -0
- package/tests/components/studio/BottomPanel.test.tsx +383 -0
- package/tests/components/studio/QueryToolbar.test.tsx +321 -0
- package/tests/components/studio/StudioDesktopHeader.test.tsx +377 -0
- package/tests/components/studio/StudioMobileHeader.test.tsx +198 -0
- package/tests/components/studio/StudioTabBar.test.tsx +331 -0
- package/tests/fixtures/connections.ts +96 -0
- package/tests/fixtures/masking-configs.ts +86 -0
- package/tests/fixtures/query-results.ts +71 -0
- package/tests/fixtures/schemas.ts +64 -0
- package/tests/fixtures/seed-connections/invalid-config.yaml +7 -0
- package/tests/fixtures/seed-connections/minimal-config.yaml +8 -0
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +23 -0
- package/tests/fixtures/seed-connections/multi-role-config.yaml +30 -0
- package/tests/fixtures/seed-connections/valid-config.json +15 -0
- package/tests/fixtures/seed-connections/valid-config.yaml +51 -0
- package/tests/helpers/mock-fetch.ts +59 -0
- package/tests/helpers/mock-monaco.ts +112 -0
- package/tests/helpers/mock-navigation.ts +28 -0
- package/tests/helpers/mock-next.ts +80 -0
- package/tests/helpers/mock-provider.ts +133 -0
- package/tests/helpers/mock-sonner.ts +29 -0
- package/tests/helpers/render-with-providers.tsx +19 -0
- package/tests/hooks/use-ai-chat.test.ts +600 -0
- package/tests/hooks/use-auth.test.ts +371 -0
- package/tests/hooks/use-connection-form.test.ts +743 -0
- package/tests/hooks/use-connection-manager.test.ts +466 -0
- package/tests/hooks/use-inline-editing.test.ts +321 -0
- package/tests/hooks/use-mobile.test.ts +177 -0
- package/tests/hooks/use-monitoring-data.test.ts +819 -0
- package/tests/hooks/use-provider-metadata.test.ts +228 -0
- package/tests/hooks/use-query-execution.test.ts +1212 -0
- package/tests/hooks/use-tab-manager.test.ts +756 -0
- package/tests/hooks/use-toast.test.ts +74 -0
- package/tests/hooks/use-transaction-control.test.ts +211 -0
- package/tests/integration/db/mongodb-provider.test.ts +698 -0
- package/tests/integration/db/mssql-provider.test.ts +840 -0
- package/tests/integration/db/mysql-provider.test.ts +872 -0
- package/tests/integration/db/oracle-provider.test.ts +843 -0
- package/tests/integration/db/postgres-provider.test.ts +1382 -0
- package/tests/integration/db/redis-provider.test.ts +526 -0
- package/tests/integration/db/sqlite-provider.test.ts +480 -0
- package/tests/integration/seed/seed-pipeline.test.ts +102 -0
- package/tests/isolated/factory-singleton.test.ts +150 -0
- package/tests/isolated/use-storage-sync.test.ts +389 -0
- package/tests/run-components.sh +196 -0
- package/tests/setup-dom.ts +58 -0
- package/tests/setup.ts +40 -0
- package/tests/unit/api-errors.test.ts +210 -0
- package/tests/unit/code-generator-functions.test.ts +271 -0
- package/tests/unit/components/column-list.test.tsx +190 -0
- package/tests/unit/components/data-import-modal.test.tsx +441 -0
- package/tests/unit/components/studio-mobile-header.test.tsx +327 -0
- package/tests/unit/data-charts-functions.test.ts +496 -0
- package/tests/unit/data-import-functions.test.ts +320 -0
- package/tests/unit/data-import-utils.test.ts +125 -0
- package/tests/unit/db/base-provider.test.ts +517 -0
- package/tests/unit/db/errors.test.ts +403 -0
- package/tests/unit/db/factory.test.ts +436 -0
- package/tests/unit/db/pool-manager.test.ts +440 -0
- package/tests/unit/db/query-limiter.test.ts +387 -0
- package/tests/unit/db/sql-base.test.ts +438 -0
- package/tests/unit/lib/api/error-codes.test.ts +39 -0
- package/tests/unit/lib/audit.test.ts +326 -0
- package/tests/unit/lib/auth.test.ts +146 -0
- package/tests/unit/lib/connection-string-parser.test.ts +424 -0
- package/tests/unit/lib/data-masking.test.ts +583 -0
- package/tests/unit/lib/db-icons.test.tsx +41 -0
- package/tests/unit/lib/monitoring-thresholds.test.ts +133 -0
- package/tests/unit/lib/oidc.test.ts +509 -0
- package/tests/unit/lib/query-generators.test.ts +127 -0
- package/tests/unit/lib/storage/factory.test.ts +71 -0
- package/tests/unit/lib/storage/local-storage.test.ts +114 -0
- package/tests/unit/lib/storage/providers/postgres.test.ts +312 -0
- package/tests/unit/lib/storage/providers/sqlite.test.ts +232 -0
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +331 -0
- package/tests/unit/lib/storage/storage-facade.test.ts +184 -0
- package/tests/unit/lib/storage.test.ts +317 -0
- package/tests/unit/lib/time-series-buffer.test.ts +212 -0
- package/tests/unit/lib/utils.test.ts +24 -0
- package/tests/unit/llm/base-provider.test.ts +238 -0
- package/tests/unit/llm/config.test.ts +262 -0
- package/tests/unit/llm/custom-provider.test.ts +281 -0
- package/tests/unit/llm/gemini-provider.test.ts +248 -0
- package/tests/unit/llm/llm-factory.test.ts +155 -0
- package/tests/unit/llm/ollama-provider.test.ts +288 -0
- package/tests/unit/llm/openai-provider.test.ts +324 -0
- package/tests/unit/llm/retry.test.ts +180 -0
- package/tests/unit/llm/streaming.test.ts +355 -0
- package/tests/unit/logger.test.ts +198 -0
- package/tests/unit/mongodb-completions.test.ts +516 -0
- package/tests/unit/pivot-table-functions.test.ts +76 -0
- package/tests/unit/query-cancelled-error.test.ts +81 -0
- package/tests/unit/schema-diff/diff-engine.test.ts +367 -0
- package/tests/unit/schema-diff/migration-generator.test.ts +513 -0
- package/tests/unit/seed/config-loader.test.ts +73 -0
- package/tests/unit/seed/connection-filter.test.ts +91 -0
- package/tests/unit/seed/credential-resolver.test.ts +85 -0
- package/tests/unit/seed/index.test.ts +72 -0
- package/tests/unit/seed/resolve-connection.test.ts +74 -0
- package/tests/unit/seed/types.test.ts +129 -0
- package/tests/unit/sql/alias-extractor.test.ts +444 -0
- package/tests/unit/sql/statement-splitter.test.ts +348 -0
- package/tests/unit/sql-completions.test.ts +463 -0
- package/tests/unit/ssh-tunnel.test.ts +465 -0
- package/tsconfig.json +42 -0
|
@@ -0,0 +1,803 @@
|
|
|
1
|
+
# Helm Chart & ArtifactHub Setup – LibreDB Studio in Kubernetes Plan
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
The LibreDB Studio Docker image (`ghcr.io/libredb/libredb-studio`) and GitHub Actions CI/CD pipelines are already fully operational. However, there is currently no Helm chart or ArtifactHub integration for users who want to deploy LibreDB Studio on Kubernetes.
|
|
6
|
+
|
|
7
|
+
The goal of this plan is to create a **production-grade Helm chart** and publish it automatically to **ArtifactHub** through a release pipeline.
|
|
8
|
+
|
|
9
|
+
**Current state**
|
|
10
|
+
|
|
11
|
+
* Docker image publishing → `ghcr.io`
|
|
12
|
+
* CI pipeline → lint / typecheck / test / build
|
|
13
|
+
* Deployments → Fly.io and Render
|
|
14
|
+
* **Missing components** → Helm chart + Kubernetes support
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Directory Structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
charts/
|
|
22
|
+
libredb-studio/
|
|
23
|
+
Chart.yaml # Chart metadata + ArtifactHub annotations
|
|
24
|
+
values.yaml # Default configuration values
|
|
25
|
+
values.schema.json # JSON Schema validation
|
|
26
|
+
.helmignore # Files excluded from Helm packages
|
|
27
|
+
README.md # Chart documentation
|
|
28
|
+
templates/
|
|
29
|
+
_helpers.tpl # Named template helpers
|
|
30
|
+
deployment.yaml # Main application Deployment
|
|
31
|
+
service.yaml # ClusterIP/NodePort/LoadBalancer Service
|
|
32
|
+
ingress.yaml # Optional Ingress (nginx/traefik)
|
|
33
|
+
configmap.yaml # Non-sensitive environment variables
|
|
34
|
+
secret.yaml # Sensitive environment variables
|
|
35
|
+
serviceaccount.yaml # ServiceAccount
|
|
36
|
+
hpa.yaml # HorizontalPodAutoscaler
|
|
37
|
+
pdb.yaml # PodDisruptionBudget
|
|
38
|
+
pvc.yaml # PersistentVolumeClaim (SQLite mode)
|
|
39
|
+
networkpolicy.yaml # Optional NetworkPolicy
|
|
40
|
+
NOTES.txt # Post-install usage instructions
|
|
41
|
+
|
|
42
|
+
artifacthub-repo.yml # ArtifactHub repository metadata (project root)
|
|
43
|
+
|
|
44
|
+
.github/workflows/
|
|
45
|
+
helm-release.yml # Helm lint, test, and release pipeline
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
# Step 1 – `charts/libredb-studio/Chart.yaml`
|
|
51
|
+
|
|
52
|
+
Helm API version: **v2**
|
|
53
|
+
|
|
54
|
+
* `appVersion` → taken from `package.json` (`0.8.10`)
|
|
55
|
+
* `chart version` → `0.1.0`
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
apiVersion: v2
|
|
59
|
+
name: libredb-studio
|
|
60
|
+
description: Web-based SQL IDE for cloud-native teams supporting PostgreSQL, MySQL, SQLite, Oracle, SQL Server, MongoDB, and Redis
|
|
61
|
+
type: application
|
|
62
|
+
version: 0.1.0
|
|
63
|
+
appVersion: "0.8.10"
|
|
64
|
+
kubeVersion: ">=1.26.0-0"
|
|
65
|
+
home: https://github.com/libredb/libredb-studio
|
|
66
|
+
icon: https://raw.githubusercontent.com/libredb/libredb-studio/main/public/logo.svg
|
|
67
|
+
sources:
|
|
68
|
+
- https://github.com/libredb/libredb-studio
|
|
69
|
+
keywords:
|
|
70
|
+
- sql
|
|
71
|
+
- ide
|
|
72
|
+
- database
|
|
73
|
+
- postgresql
|
|
74
|
+
- mysql
|
|
75
|
+
- mongodb
|
|
76
|
+
- redis
|
|
77
|
+
- sqlite
|
|
78
|
+
- oracle
|
|
79
|
+
- mssql
|
|
80
|
+
- web-ide
|
|
81
|
+
maintainers:
|
|
82
|
+
- name: cevheri
|
|
83
|
+
url: https://github.com/cevheri
|
|
84
|
+
annotations:
|
|
85
|
+
artifacthub.io/category: database
|
|
86
|
+
artifacthub.io/license: MIT
|
|
87
|
+
artifacthub.io/prerelease: "true"
|
|
88
|
+
artifacthub.io/containsSecurityUpdates: "false"
|
|
89
|
+
artifacthub.io/images: |
|
|
90
|
+
- name: libredb-studio
|
|
91
|
+
image: ghcr.io/libredb/libredb-studio:0.8.10
|
|
92
|
+
platforms:
|
|
93
|
+
- linux/amd64
|
|
94
|
+
artifacthub.io/links: |
|
|
95
|
+
- name: Documentation
|
|
96
|
+
url: https://github.com/libredb/libredb-studio#readme
|
|
97
|
+
- name: Container Image
|
|
98
|
+
url: https://github.com/libredb/libredb-studio/pkgs/container/libredb-studio
|
|
99
|
+
- name: Source
|
|
100
|
+
url: https://github.com/libredb/libredb-studio
|
|
101
|
+
artifacthub.io/changes: |
|
|
102
|
+
- Initial Helm chart release
|
|
103
|
+
dependencies:
|
|
104
|
+
- name: postgresql
|
|
105
|
+
version: "16.x.x"
|
|
106
|
+
repository: https://charts.bitnami.com/bitnami
|
|
107
|
+
condition: postgresql.enabled
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
# Step 2 – `values.yaml`
|
|
113
|
+
|
|
114
|
+
All configuration keys use **camelCase** and include clear documentation.
|
|
115
|
+
|
|
116
|
+
### Image & Replica Settings
|
|
117
|
+
|
|
118
|
+
* `image.repository: ghcr.io/libredb/libredb-studio`
|
|
119
|
+
* `image.tag: ""` → defaults to `Chart.appVersion`
|
|
120
|
+
* `image.pullPolicy: IfNotPresent`
|
|
121
|
+
* `replicaCount: 1`
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### Secrets (stored in Kubernetes Secret)
|
|
126
|
+
|
|
127
|
+
Examples:
|
|
128
|
+
|
|
129
|
+
* `secrets.jwtSecret`
|
|
130
|
+
* `secrets.adminEmail`
|
|
131
|
+
* `secrets.adminPassword`
|
|
132
|
+
* `secrets.userEmail`
|
|
133
|
+
* `secrets.userPassword`
|
|
134
|
+
* `secrets.llmApiKey`
|
|
135
|
+
* `secrets.oidcClientId`
|
|
136
|
+
* `secrets.oidcClientSecret`
|
|
137
|
+
* `secrets.storagePostgresUrl`
|
|
138
|
+
|
|
139
|
+
External secret integration:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
secrets.existingSecret: ""
|
|
143
|
+
secrets.existingSecretKeys: {}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Supports integrations like:
|
|
147
|
+
|
|
148
|
+
* External Secrets Operator
|
|
149
|
+
* Sealed Secrets
|
|
150
|
+
* HashiCorp Vault
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
### Config (stored in ConfigMap)
|
|
155
|
+
|
|
156
|
+
Key settings include:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
authProvider: local # local | oidc
|
|
160
|
+
config.logLevel: info
|
|
161
|
+
config.storageProvider: local # local | sqlite | postgres
|
|
162
|
+
config.storageSqlitePath: /app/data/libredb-storage.db
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Optional configuration for:
|
|
166
|
+
|
|
167
|
+
* AI providers
|
|
168
|
+
* OIDC SSO
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### Persistence (SQLite Mode)
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
persistence.enabled: false
|
|
176
|
+
persistence.size: 1Gi
|
|
177
|
+
persistence.accessModes: [ReadWriteOnce]
|
|
178
|
+
persistence.existingClaim: ""
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Persistence automatically enables when `storageProvider=sqlite`.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### Security
|
|
186
|
+
|
|
187
|
+
Example secure defaults:
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
podSecurityContext:
|
|
191
|
+
runAsNonRoot: true
|
|
192
|
+
runAsUser: 1001
|
|
193
|
+
runAsGroup: 1001
|
|
194
|
+
fsGroup: 1001
|
|
195
|
+
seccompProfile: RuntimeDefault
|
|
196
|
+
|
|
197
|
+
securityContext:
|
|
198
|
+
allowPrivilegeEscalation: false
|
|
199
|
+
readOnlyRootFilesystem: true
|
|
200
|
+
capabilities:
|
|
201
|
+
drop:
|
|
202
|
+
- ALL
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### Health Probes
|
|
208
|
+
|
|
209
|
+
Using Dockerfile health endpoint:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
GET /api/db/health
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Probes:
|
|
216
|
+
|
|
217
|
+
* **startupProbe** → fast startup detection
|
|
218
|
+
* **readinessProbe** → traffic readiness
|
|
219
|
+
* **livenessProbe** → container health monitoring
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
### Resources
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
requests:
|
|
227
|
+
cpu: 100m
|
|
228
|
+
memory: 256Mi
|
|
229
|
+
|
|
230
|
+
limits:
|
|
231
|
+
memory: 512Mi
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### Networking
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
service.type: ClusterIP
|
|
240
|
+
service.port: 80
|
|
241
|
+
service.targetPort: 3000
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Optional:
|
|
245
|
+
|
|
246
|
+
* Ingress
|
|
247
|
+
* NetworkPolicy
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### Scaling & High Availability
|
|
252
|
+
|
|
253
|
+
Optional features:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
autoscaling.enabled: false
|
|
257
|
+
podDisruptionBudget.enabled: false
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
### PostgreSQL Subchart
|
|
263
|
+
|
|
264
|
+
Optional internal database:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
postgresql.enabled: false
|
|
268
|
+
postgresql.auth.username
|
|
269
|
+
postgresql.auth.password
|
|
270
|
+
postgresql.auth.database
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
# Step 3 – `_helpers.tpl`
|
|
276
|
+
|
|
277
|
+
Common Helm helper templates:
|
|
278
|
+
|
|
279
|
+
* `libredb-studio.name`
|
|
280
|
+
* `libredb-studio.fullname`
|
|
281
|
+
* `libredb-studio.chart`
|
|
282
|
+
* `libredb-studio.labels`
|
|
283
|
+
* `libredb-studio.selectorLabels`
|
|
284
|
+
* `libredb-studio.serviceAccountName`
|
|
285
|
+
* `libredb-studio.secretName`
|
|
286
|
+
* `libredb-studio.configMapName`
|
|
287
|
+
* `libredb-studio.pvcName`
|
|
288
|
+
* `libredb-studio.persistenceEnabled`
|
|
289
|
+
* `libredb-studio.image`
|
|
290
|
+
|
|
291
|
+
These helpers standardize naming, labels, and resource references.
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
# Step 4 – `deployment.yaml`
|
|
296
|
+
|
|
297
|
+
Important design decisions:
|
|
298
|
+
|
|
299
|
+
### 1. Config checksum annotations
|
|
300
|
+
|
|
301
|
+
Pods restart automatically when ConfigMaps or Secrets change.
|
|
302
|
+
|
|
303
|
+
### 2. readOnlyRootFilesystem compatibility
|
|
304
|
+
|
|
305
|
+
Next.js writes runtime cache to:
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
/app/.next/cache
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Solution:
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
emptyDir volume mount
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Also used for `/tmp`.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### 3. Conditional PVC Mount
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
/app/data
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Mounted only when using **SQLite storage mode**.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
### 4. Environment variables
|
|
332
|
+
|
|
333
|
+
Sources:
|
|
334
|
+
|
|
335
|
+
* ConfigMap
|
|
336
|
+
* Secret references
|
|
337
|
+
* optional `extraEnv`
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
### Dockerfile compatibility
|
|
342
|
+
|
|
343
|
+
Deployment settings match the container configuration:
|
|
344
|
+
|
|
345
|
+
| Setting | Value |
|
|
346
|
+
| -------------- | ------------------ |
|
|
347
|
+
| Port | 3000 |
|
|
348
|
+
| User | UID 1001 |
|
|
349
|
+
| Workdir | `/app` |
|
|
350
|
+
| Data directory | `/app/data` |
|
|
351
|
+
| Next.js cache | `/app/.next/cache` |
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
# Step 5 – `configmap.yaml`
|
|
356
|
+
|
|
357
|
+
Fixed environment variables:
|
|
358
|
+
|
|
359
|
+
```
|
|
360
|
+
NODE_ENV=production
|
|
361
|
+
PORT=3000
|
|
362
|
+
HOSTNAME=0.0.0.0
|
|
363
|
+
NEXT_TELEMETRY_DISABLED=1
|
|
364
|
+
NODE_OPTIONS=--max-old-space-size=384
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Dynamic variables include:
|
|
368
|
+
|
|
369
|
+
* authProvider
|
|
370
|
+
* storageProvider
|
|
371
|
+
* logLevel
|
|
372
|
+
* OIDC settings
|
|
373
|
+
* AI settings
|
|
374
|
+
|
|
375
|
+
Smart default:
|
|
376
|
+
|
|
377
|
+
If `postgresql.enabled=true` and storageProvider=local → automatically switch to PostgreSQL.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
# Step 6 – `secret.yaml`
|
|
382
|
+
|
|
383
|
+
Behavior:
|
|
384
|
+
|
|
385
|
+
* If `secrets.existingSecret` is set → Helm **does not generate a Secret**
|
|
386
|
+
* Otherwise Helm creates a Secret with:
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
jwtSecret
|
|
390
|
+
adminEmail
|
|
391
|
+
adminPassword
|
|
392
|
+
userEmail
|
|
393
|
+
userPassword
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Optional values:
|
|
397
|
+
|
|
398
|
+
* `llmApiKey`
|
|
399
|
+
* `oidcClientSecret`
|
|
400
|
+
* `storagePostgresUrl`
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
# Step 7 – Additional Templates
|
|
405
|
+
|
|
406
|
+
Includes:
|
|
407
|
+
|
|
408
|
+
* `service.yaml`
|
|
409
|
+
* `ingress.yaml`
|
|
410
|
+
* `serviceaccount.yaml`
|
|
411
|
+
* `hpa.yaml`
|
|
412
|
+
* `pdb.yaml`
|
|
413
|
+
* `pvc.yaml`
|
|
414
|
+
* `networkpolicy.yaml`
|
|
415
|
+
* `NOTES.txt`
|
|
416
|
+
|
|
417
|
+
These resources are conditionally rendered depending on values.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
# Step 8 – `values.schema.json`
|
|
422
|
+
|
|
423
|
+
Uses **JSON Schema Draft-07** to validate Helm values.
|
|
424
|
+
|
|
425
|
+
Examples:
|
|
426
|
+
|
|
427
|
+
```
|
|
428
|
+
authProvider: enum [local, oidc]
|
|
429
|
+
storageProvider: enum [local, sqlite, postgres]
|
|
430
|
+
logLevel: enum [debug, info, warn, error]
|
|
431
|
+
service.type: enum [ClusterIP, NodePort, LoadBalancer]
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Additional validations:
|
|
435
|
+
|
|
436
|
+
* `replicaCount ≥ 1`
|
|
437
|
+
* storage size format validation
|
|
438
|
+
* email format validation
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
# Step 9 – `.helmignore`
|
|
443
|
+
|
|
444
|
+
```
|
|
445
|
+
.git
|
|
446
|
+
.gitignore
|
|
447
|
+
.github
|
|
448
|
+
.vscode
|
|
449
|
+
.idea
|
|
450
|
+
*.swp
|
|
451
|
+
*.bak
|
|
452
|
+
*.tmp
|
|
453
|
+
*.orig
|
|
454
|
+
.DS_Store
|
|
455
|
+
ci/
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
# Step 10 – `artifacthub-repo.yml`
|
|
461
|
+
|
|
462
|
+
Located in the **project root**.
|
|
463
|
+
|
|
464
|
+
```yaml
|
|
465
|
+
repositoryID: libredb-studio
|
|
466
|
+
owners:
|
|
467
|
+
- name: cevheri
|
|
468
|
+
email: cevheri@users.noreply.github.com
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
# Step 11 – GitHub Workflow (`helm-release.yml`)
|
|
474
|
+
|
|
475
|
+
Pipeline contains **three jobs**.
|
|
476
|
+
|
|
477
|
+
### Job 1 – lint-test
|
|
478
|
+
|
|
479
|
+
Tools used:
|
|
480
|
+
|
|
481
|
+
* `helm/chart-testing-action`
|
|
482
|
+
* `helm/kind-action`
|
|
483
|
+
|
|
484
|
+
Steps:
|
|
485
|
+
|
|
486
|
+
1. Lint Helm chart
|
|
487
|
+
2. Create temporary Kubernetes cluster
|
|
488
|
+
3. Install chart and run tests
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
### Job 2 – release-github-pages
|
|
493
|
+
|
|
494
|
+
Uses:
|
|
495
|
+
|
|
496
|
+
```
|
|
497
|
+
helm/chart-releaser-action
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
Outputs:
|
|
501
|
+
|
|
502
|
+
* `index.yaml`
|
|
503
|
+
* Helm repository hosted on GitHub Pages
|
|
504
|
+
|
|
505
|
+
Repository URL:
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
https://libredb.github.io/libredb-studio/
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
### Job 3 – release-oci
|
|
514
|
+
|
|
515
|
+
Publishes the chart to an OCI registry.
|
|
516
|
+
|
|
517
|
+
Steps:
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
helm dependency build
|
|
521
|
+
helm package
|
|
522
|
+
helm push
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
Target registry:
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
oci://ghcr.io/libredb/charts
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
Authentication via `GITHUB_TOKEN`.
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
# Step 12 – Chart README
|
|
536
|
+
|
|
537
|
+
`charts/libredb-studio/README.md` includes:
|
|
538
|
+
|
|
539
|
+
* Overview
|
|
540
|
+
* Badges
|
|
541
|
+
* Installation guide
|
|
542
|
+
* Storage modes
|
|
543
|
+
* OIDC setup
|
|
544
|
+
* AI configuration
|
|
545
|
+
* High availability configuration
|
|
546
|
+
* Ingress examples
|
|
547
|
+
* External Secrets integration
|
|
548
|
+
* Upgrade guide
|
|
549
|
+
* Full configuration reference table
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
# Installation Examples
|
|
554
|
+
|
|
555
|
+
## Minimal Installation
|
|
556
|
+
|
|
557
|
+
```
|
|
558
|
+
helm repo add libredb https://libredb.github.io/libredb-studio
|
|
559
|
+
|
|
560
|
+
helm install libredb libredb/libredb-studio \
|
|
561
|
+
--set secrets.jwtSecret=$(openssl rand -base64 32) \
|
|
562
|
+
--set secrets.adminPassword=MyAdmin123 \
|
|
563
|
+
--set secrets.userPassword=MyUser123
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## Production Installation
|
|
569
|
+
|
|
570
|
+
Example with:
|
|
571
|
+
|
|
572
|
+
* PostgreSQL
|
|
573
|
+
* Ingress
|
|
574
|
+
* Autoscaling
|
|
575
|
+
|
|
576
|
+
(Commands remain unchanged.)
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
# Important Design Decisions
|
|
581
|
+
|
|
582
|
+
### Next.js Cache
|
|
583
|
+
|
|
584
|
+
Next.js writes cache files at runtime.
|
|
585
|
+
|
|
586
|
+
Solution:
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
emptyDir volume
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Cache is ephemeral but acceptable because LibreDB Studio is session-based.
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
### SQLite Multi-Replica Warning
|
|
597
|
+
|
|
598
|
+
SQLite supports only **one writer**.
|
|
599
|
+
|
|
600
|
+
If:
|
|
601
|
+
|
|
602
|
+
```
|
|
603
|
+
storageProvider=sqlite
|
|
604
|
+
replicaCount > 1
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
the README includes a warning.
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
### PostgreSQL Subchart Integration
|
|
612
|
+
|
|
613
|
+
When `postgresql.enabled=true`:
|
|
614
|
+
|
|
615
|
+
* storage provider automatically switches to PostgreSQL
|
|
616
|
+
* connection URL generated automatically
|
|
617
|
+
* credentials read from the subchart secret
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
### existingSecret Pattern
|
|
622
|
+
|
|
623
|
+
Encourages production-grade secret management with:
|
|
624
|
+
|
|
625
|
+
* Vault
|
|
626
|
+
* Sealed Secrets
|
|
627
|
+
* External Secrets Operator
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
### Dual Distribution Strategy
|
|
632
|
+
|
|
633
|
+
Charts are published to both:
|
|
634
|
+
|
|
635
|
+
1. GitHub Pages (classic Helm repo)
|
|
636
|
+
2. OCI registry (`ghcr.io`)
|
|
637
|
+
|
|
638
|
+
ArtifactHub supports both.
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
# Verification
|
|
643
|
+
|
|
644
|
+
## Local Testing
|
|
645
|
+
|
|
646
|
+
Steps:
|
|
647
|
+
|
|
648
|
+
```
|
|
649
|
+
helm lint charts/libredb-studio
|
|
650
|
+
helm template ...
|
|
651
|
+
helm install ...
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
Includes:
|
|
655
|
+
|
|
656
|
+
* lint validation
|
|
657
|
+
* schema validation
|
|
658
|
+
* installation test on a Kind cluster
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
# Implementation Order
|
|
663
|
+
|
|
664
|
+
Recommended order of implementation:
|
|
665
|
+
|
|
666
|
+
1. `.helmignore`
|
|
667
|
+
2. `Chart.yaml`
|
|
668
|
+
3. `values.yaml`
|
|
669
|
+
4. `values.schema.json`
|
|
670
|
+
5. `_helpers.tpl`
|
|
671
|
+
6. `configmap.yaml`
|
|
672
|
+
7. `secret.yaml`
|
|
673
|
+
8. `serviceaccount.yaml`
|
|
674
|
+
9. `deployment.yaml`
|
|
675
|
+
10. `service.yaml`
|
|
676
|
+
11. `ingress.yaml`
|
|
677
|
+
12. `hpa.yaml`
|
|
678
|
+
13. `pdb.yaml`
|
|
679
|
+
14. `pvc.yaml`
|
|
680
|
+
15. `networkpolicy.yaml`
|
|
681
|
+
16. `NOTES.txt`
|
|
682
|
+
17. `README.md`
|
|
683
|
+
18. `artifacthub-repo.yml`
|
|
684
|
+
19. `helm-release.yml`
|
|
685
|
+
20. Final verification with `helm lint` and `helm dependency build`
|
|
686
|
+
|
|
687
|
+
---
|
|
688
|
+
|
|
689
|
+
# ArtifactHub Setup Guide
|
|
690
|
+
|
|
691
|
+
Steps performed **after the code is implemented**.
|
|
692
|
+
|
|
693
|
+
---
|
|
694
|
+
|
|
695
|
+
## 1 – Enable GitHub Pages
|
|
696
|
+
|
|
697
|
+
Repository → **Settings → Pages**
|
|
698
|
+
|
|
699
|
+
Source:
|
|
700
|
+
|
|
701
|
+
```
|
|
702
|
+
Deploy from a branch
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
Branch:
|
|
706
|
+
|
|
707
|
+
```
|
|
708
|
+
gh-pages
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
Result:
|
|
712
|
+
|
|
713
|
+
```
|
|
714
|
+
https://libredb.github.io/libredb-studio/
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
## 2 – Create ArtifactHub Organization
|
|
720
|
+
|
|
721
|
+
Go to:
|
|
722
|
+
|
|
723
|
+
[https://artifacthub.io](https://artifacthub.io)
|
|
724
|
+
|
|
725
|
+
Sign in with GitHub.
|
|
726
|
+
|
|
727
|
+
Create organization:
|
|
728
|
+
|
|
729
|
+
```
|
|
730
|
+
Name: libredb
|
|
731
|
+
Display Name: LibreDB
|
|
732
|
+
Home URL: https://github.com/libredb
|
|
733
|
+
Description: Open-source database tools for cloud-native teams
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## 3 – Add Helm Repository
|
|
739
|
+
|
|
740
|
+
ArtifactHub → Control Panel → Repositories → Add
|
|
741
|
+
|
|
742
|
+
```
|
|
743
|
+
Kind: Helm charts
|
|
744
|
+
Name: libredb-studio
|
|
745
|
+
URL: https://libredb.github.io/libredb-studio/
|
|
746
|
+
Organization: libredb
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
ArtifactHub scans the repo automatically.
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
## 4 – Add OCI Repository (Optional)
|
|
754
|
+
|
|
755
|
+
```
|
|
756
|
+
oci://ghcr.io/libredb/charts/libredb-studio
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
---
|
|
760
|
+
|
|
761
|
+
## 5 – Verified Publisher Badge
|
|
762
|
+
|
|
763
|
+
Requirements:
|
|
764
|
+
|
|
765
|
+
* `artifacthub-repo.yml` in repository
|
|
766
|
+
* Hosted Helm repo
|
|
767
|
+
|
|
768
|
+
ArtifactHub verifies ownership automatically.
|
|
769
|
+
|
|
770
|
+
---
|
|
771
|
+
|
|
772
|
+
## 6 – Official Status (Optional)
|
|
773
|
+
|
|
774
|
+
Once verified:
|
|
775
|
+
|
|
776
|
+
```
|
|
777
|
+
Control Panel → Organization → Request Official Status
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
ArtifactHub performs a manual review.
|
|
781
|
+
|
|
782
|
+
---
|
|
783
|
+
|
|
784
|
+
# Final Result
|
|
785
|
+
|
|
786
|
+
LibreDB Studio Helm chart will be available at:
|
|
787
|
+
|
|
788
|
+
**ArtifactHub**
|
|
789
|
+
|
|
790
|
+
[https://artifacthub.io/packages/helm/libredb-studio/libredb-studio](https://artifacthub.io/packages/helm/libredb-studio/libredb-studio)
|
|
791
|
+
|
|
792
|
+
**Helm repository**
|
|
793
|
+
|
|
794
|
+
```
|
|
795
|
+
helm repo add libredb https://libredb.github.io/libredb-studio
|
|
796
|
+
```
|
|
797
|
+
|
|
798
|
+
**OCI registry**
|
|
799
|
+
|
|
800
|
+
```
|
|
801
|
+
helm install libredb oci://ghcr.io/libredb/charts/libredb-studio
|
|
802
|
+
```
|
|
803
|
+
|