Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
e5b9d21
ci(macos): add conditional code signing and notarization
ZhuchkaTriplesix Jul 10, 2026
18296ec
ci(macos): isolate signing entitlements so unsigned builds stay uncha…
ZhuchkaTriplesix Jul 10, 2026
f98ba1f
fix(core): disconnect SQLite service inside disconnectAllExternalServ…
ZhuchkaTriplesix Jul 10, 2026
3eeb0ef
Merge pull request #283 from QueryaHub/issue/271-app-shutdown-sqlite
ZhuchkaTriplesix Jul 10, 2026
33184a0
fix(postgresql): pass SSL client certificates when connecting via hos…
ZhuchkaTriplesix Jul 10, 2026
72fecf6
fix(postgresql): pass SSL client certificates when connecting via hos…
ZhuchkaTriplesix Jul 10, 2026
6eb7978
fix(connections): serialize concurrent pool acquire for the same key …
ZhuchkaTriplesix Jul 10, 2026
c86fde9
fix(connections): serialize concurrent pool acquire for the same key …
ZhuchkaTriplesix Jul 10, 2026
fc6df78
fix(storage): keep connection metadata and secrets consistent on OS s…
ZhuchkaTriplesix Jul 10, 2026
ecd2f36
Merge pull request #286 from QueryaHub/issue/276-local-db-secrets-ato…
ZhuchkaTriplesix Jul 10, 2026
96a194f
fix(csv): stream file export and build clipboard CSV off the UI isola…
ZhuchkaTriplesix Jul 10, 2026
d189f3b
Merge pull request #287 from QueryaHub/issue/277-csv-streaming-isolate
ZhuchkaTriplesix Jul 10, 2026
eb2aeb4
fix(mysql): harden custom SELECT validation in table browser (#274)
ZhuchkaTriplesix Jul 10, 2026
8aab4c0
Merge pull request #288 from QueryaHub/issue/274-mysql-sql-validation
ZhuchkaTriplesix Jul 10, 2026
816f44d
fix(core): log swallowed errors in connection drivers and folders sto…
ZhuchkaTriplesix Jul 10, 2026
1eaea4a
Merge pull request #289 from QueryaHub/issue/272-silent-catch-logging
ZhuchkaTriplesix Jul 10, 2026
936ad2a
fix(connections): show SQLite in Driver Manager built-in list (#270)
ZhuchkaTriplesix Jul 10, 2026
c0f1219
Merge pull request #290 from QueryaHub/issue/270-driver-manager-sqlite
ZhuchkaTriplesix Jul 10, 2026
11e5789
fix(ui): disable workspace Execute/Refresh when query cannot run (#266)
ZhuchkaTriplesix Jul 10, 2026
0a59710
fix(ui): simplify disabled RunButton to satisfy analyzer (#266)
ZhuchkaTriplesix Jul 10, 2026
dff1c03
fix(ui): address analyzer warnings in disabled RunButton (#266)
ZhuchkaTriplesix Jul 10, 2026
2f9a469
Merge pull request #291 from QueryaHub/issue/266-f5-button-disabled
ZhuchkaTriplesix Jul 10, 2026
25cf627
feat(connections): add SSL client certificate support for MySQL, Mong…
ZhuchkaTriplesix Jul 10, 2026
e68342a
fix(connections): restore missing _useSSL field in Redis connection f…
ZhuchkaTriplesix Jul 10, 2026
a6550e1
fix(connections): satisfy analyzer for SSL mysql_client override (#278)
ZhuchkaTriplesix Jul 10, 2026
eb7a57e
Merge pull request #292 from QueryaHub/issue/278-ssl-certs-mysql-mong…
ZhuchkaTriplesix Jul 10, 2026
5843661
feat(core): implement AppUpdaterService with GitHub Releases and SHA2…
ZhuchkaTriplesix Jul 10, 2026
73147a5
test(updater): satisfy prefer_const_constructors in updater tests
ZhuchkaTriplesix Jul 10, 2026
e232570
Merge pull request #293 from QueryaHub/issue/280-app-updater-service
ZhuchkaTriplesix Jul 10, 2026
be1adbc
feat(ui): add Check for Updates dialog, badge, and startup settings (…
ZhuchkaTriplesix Jul 10, 2026
f1be02c
Merge pull request #294 from QueryaHub/issue/281-update-dialog-ui
ZhuchkaTriplesix Jul 10, 2026
6efbbb1
feat(core): implement platform-specific in-place update installers (#…
ZhuchkaTriplesix Jul 10, 2026
a16d061
test(updater): fix analyzer warning in zip encode test
ZhuchkaTriplesix Jul 10, 2026
b254f56
test(updater): avoid unnecessary cast in zip encode test
ZhuchkaTriplesix Jul 10, 2026
85f8648
test(updater): simplify zip encode in traversal test
ZhuchkaTriplesix Jul 10, 2026
a704d74
Merge pull request #295 from QueryaHub/issue/282-platform-installers
ZhuchkaTriplesix Jul 10, 2026
88040f5
fix(ui): route File menu SQL intents through global fallback
ZhuchkaTriplesix Jul 10, 2026
c679638
enhancement(ui): show coming soon state on placeholder workspace tabs
ZhuchkaTriplesix Jul 10, 2026
c40668d
Merge pull request #296 from QueryaHub/issue/267-coming-soon-tabs
ZhuchkaTriplesix Jul 10, 2026
3b87d96
test: add const to ConnectionRow in global actions tests
ZhuchkaTriplesix Jul 10, 2026
66eed1f
Merge pull request #297 from QueryaHub/issue/268-sql-file-menu-global
ZhuchkaTriplesix Jul 10, 2026
ecf1378
enhancement(marketplace): mark database drivers as preview-only
ZhuchkaTriplesix Jul 10, 2026
672d5ab
fix(ui): add const constructors in extension marketplace widgets
ZhuchkaTriplesix Jul 10, 2026
085d656
Merge pull request #298 from QueryaHub/issue/269-marketplace-driver-p…
ZhuchkaTriplesix Jul 10, 2026
8370eed
fix(core): log remaining silent catches in database drivers
ZhuchkaTriplesix Jul 10, 2026
d03438f
Merge pull request #299 from QueryaHub/issue/272-remaining-silent-cat…
ZhuchkaTriplesix Jul 10, 2026
f6a9d06
chore: exclude build output from analyzer scope
ZhuchkaTriplesix Jul 10, 2026
d1ae7ab
fix(theme): harden extension folder watcher in tests and CI
ZhuchkaTriplesix Jul 10, 2026
c31143c
fix(updater): correct quoting in platform replace helper scripts
ZhuchkaTriplesix Jul 10, 2026
475b995
feat(sandbox): parse and validate sandbox capabilities from extension…
ZhuchkaTriplesix Jul 10, 2026
dc13594
Merge pull request #306 from QueryaHub/issue/301-sandbox-manifest-config
ZhuchkaTriplesix Jul 10, 2026
d976270
feat(sandbox): add SandboxProcessRunner with platform launch wrappers
ZhuchkaTriplesix Jul 10, 2026
f955925
fix(sandbox): clear analyzer warnings in scratch dir and fake process
ZhuchkaTriplesix Jul 10, 2026
4e360cb
Merge pull request #307 from QueryaHub/issue/300-sandbox-process-runner
ZhuchkaTriplesix Jul 10, 2026
1fb3070
feat(sandbox): Zero-Trust credentials injector over Stdio JSON-RPC
ZhuchkaTriplesix Jul 10, 2026
999d9a7
Merge pull request #308 from QueryaHub/issue/302-sandbox-credentials-…
ZhuchkaTriplesix Jul 10, 2026
aef44f3
feat(sandbox): add Watchdog heartbeat and auto-recovery backoff
ZhuchkaTriplesix Jul 10, 2026
0ce5a9d
Merge pull request #309 from QueryaHub/issue/303-sandbox-watchdog
ZhuchkaTriplesix Jul 10, 2026
96812bd
feat(sandbox): sanitize stderr, rotate logs, and write security audit
ZhuchkaTriplesix Jul 10, 2026
9514e92
fix(sandbox): clear analyze warnings in sanitization pipe
ZhuchkaTriplesix Jul 10, 2026
f9f4ac9
Merge pull request #310 from QueryaHub/issue/304-sandbox-sanitization…
ZhuchkaTriplesix Jul 10, 2026
4f532fc
feat(sandbox): add Level-1 embedded runtime and lift driver preview gate
ZhuchkaTriplesix Jul 10, 2026
704d788
fix(sandbox): prefer const constructors in #305 tests
ZhuchkaTriplesix Jul 10, 2026
3b47319
fix(sandbox): prefer const ExtensionManifest in marketplace test
ZhuchkaTriplesix Jul 10, 2026
4480110
Merge pull request #311 from QueryaHub/issue/305-sandbox-embedded-run…
ZhuchkaTriplesix Jul 10, 2026
61cb00f
feat(extensions): implement Block C PluginRpcBridge over Stdio JSON-RPC
ZhuchkaTriplesix Jul 10, 2026
fd4d3d4
Merge pull request #313 from QueryaHub/issue/312-rpc-protocol-bridge
ZhuchkaTriplesix Jul 10, 2026
de81f40
feat(ui): add SDUI Form and Tree builders for extension schemas
ZhuchkaTriplesix Jul 10, 2026
175d9f4
fix(ui): use DropdownButtonFormField.initialValue instead of value
ZhuchkaTriplesix Jul 10, 2026
b5fc577
Merge pull request #315 from QueryaHub/issue/314-sdui-form-tree-builders
ZhuchkaTriplesix Jul 10, 2026
efbf901
fix(sandbox): preserve external RPC client ownership in watchdog duri…
ZhuchkaTriplesix Jul 11, 2026
a818271
feat(settings): install extensions from local .zip/.qext packages
ZhuchkaTriplesix Jul 11, 2026
0dcc990
Merge pull request #317 from QueryaHub/issue/316-local-extension-install
ZhuchkaTriplesix Jul 11, 2026
eb58991
feat(extensions): register sandboxed drivers and activate via RPC
ZhuchkaTriplesix Jul 11, 2026
7cf1cb3
chore(docker): add ClickHouse service to local dev stack
ZhuchkaTriplesix Jul 11, 2026
c9732c4
fix(extensions): mark driver binaries executable and soften bwrap fal…
ZhuchkaTriplesix Jul 11, 2026
184b076
feat(extensions): SQL workspace and schema tree for sandboxed drivers
ZhuchkaTriplesix Jul 11, 2026
b53f774
fix(extensions): clear analyze warnings for driver session and tests
ZhuchkaTriplesix Jul 11, 2026
0e97bd5
test: align SQL hint and Driver Manager dialog with extension registr…
ZhuchkaTriplesix Jul 11, 2026
5cbe369
Merge pull request #319 from QueryaHub/feat/driver-registration-activ…
ZhuchkaTriplesix Jul 11, 2026
062027d
chore(release): prepare 0.4.10 release
ZhuchkaTriplesix Jul 11, 2026
9c84abb
Merge branch 'main' into release/0.4.10
ZhuchkaTriplesix Jul 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,57 @@ jobs:
- name: Build macOS (release)
run: flutter build macos --release

- name: Sign and notarize macOS app
if: ${{ secrets.MACOS_SIGN_IDENTITY != '' && secrets.MACOS_NOTARY_KEY != '' }}
env:
MACOS_CERTIFICATE_P12: ${{ secrets.MACOS_CERTIFICATE_P12 }}
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
MACOS_SIGN_IDENTITY: ${{ secrets.MACOS_SIGN_IDENTITY }}
MACOS_NOTARY_KEY: ${{ secrets.MACOS_NOTARY_KEY }}
MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
MACOS_NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
run: |
set -euo pipefail
APP="build/macos/Build/Products/Release/querya_desktop.app"
test -d "$APP"

KEYCHAIN="$RUNNER_TEMP/build.keychain"
security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$KEYCHAIN"
security set-keychain-settings -lut 1200 "$KEYCHAIN"
security default-keychain -s "$KEYCHAIN"
security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$KEYCHAIN"

echo "$MACOS_CERTIFICATE_P12" | base64 --decode -o "$RUNNER_TEMP/certificate.p12"
security import "$RUNNER_TEMP/certificate.p12" -k "$KEYCHAIN" -P "$MACOS_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_KEYCHAIN_PASSWORD" "$KEYCHAIN"

# Sign nested code from the inside out (avoids --deep pitfalls).
find "$APP/Contents/Frameworks" -type f \( -name "*.dylib" -o -name "*.so" \) -exec \
codesign --force --timestamp --options runtime --sign "$MACOS_SIGN_IDENTITY" {} +
find "$APP/Contents/Frameworks" -type d -name "*.framework" -exec \
codesign --force --timestamp --options runtime --sign "$MACOS_SIGN_IDENTITY" {} +
find "$APP/Contents/MacOS" -maxdepth 1 -type f -exec \
codesign --force --timestamp --options runtime --sign "$MACOS_SIGN_IDENTITY" {} +

# Sign the main app bundle with hardened runtime and signed entitlements.
codesign --force --timestamp --options runtime \
--entitlements macos/Runner/ReleaseSigned.entitlements \
--sign "$MACOS_SIGN_IDENTITY" "$APP"

codesign --verify --deep --strict --verbose=2 "$APP"

NOTARY_KEY="$RUNNER_TEMP/notary_key.p8"
echo -n "$MACOS_NOTARY_KEY" | base64 --decode -o "$NOTARY_KEY"
ditto -c -k --keepParent "$APP" "$RUNNER_TEMP/notarize.zip"
xcrun notarytool submit "$RUNNER_TEMP/notarize.zip" \
--key "$NOTARY_KEY" \
--key-id "$MACOS_NOTARY_KEY_ID" \
--issuer "$MACOS_NOTARY_ISSUER_ID" \
--wait
xcrun stapler staple "$APP"
rm "$NOTARY_KEY"

- name: Zip macOS .app
run: |
APP="build/macos/Build/Products/Release/querya_desktop.app"
Expand Down Expand Up @@ -204,7 +255,7 @@ jobs:
echo "### Downloads"
echo "- **Linux**: \`Querya-Desktop-${VERSION}-linux.zip\`"
echo "- **Windows**: \`Querya-Desktop-${VERSION}-windows.zip\`"
echo "- **macOS**: \`Querya-Desktop-${VERSION}-macos.zip\` (unsigned \`.app\` in zip; right-click → Open on first launch)"
echo "- **macOS**: \`Querya-Desktop-${VERSION}-macos.zip\` (signed, notarized and stapled \`.app\` when Apple Developer secrets are configured; otherwise unsigned)"
echo ""
echo "Verify checksums: \`SHA256SUMS.txt\`"
echo ""
Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.4.10] - 2026-07-11

Sandboxed extension runtime, SDUI, and first end-to-end external database drivers (Registration + Activation), plus in-app updates and connection reliability fixes.

### Added

- **Extension sandbox runtime (Block E, #300–#305)** — parse `sandbox` capabilities from manifests; launch plugins via `SandboxProcessRunner` (bwrap / sandbox-exec / Windows soft-start); Zero-Trust `system.injectCredentials` over Stdio; watchdog + auto-recovery; stderr sanitization, rotating logs, and security audit; Level-1 embedded runtime stubs and lifted preview gate for policy-compliant `process` drivers.
- **Plugin RPC bridge (Block C, #312)** — `PluginRpcBridge` over NDJSON JSON-RPC (`system.handshake` / `ping` / `shutdown`, `db.connect`).
- **SDUI builders (#314)** — `SduiFormBuilder` and `SduiTreeBuilder` render connection forms and schema trees from extension JSON schemas (`key` / `boolean` aliases supported).
- **Local extension install (#316)** — install `.zip` / `.qext` packages from Preferences and Extension Manager with the same SandboxPolicy checks as the Marketplace.
- **Driver Registration + Activation (#318 / #319)** — parse `contributions.drivers` / `capabilities`; list installed drivers in New Connection and Driver Manager; SDUI connection form; `ExtensionDriverSession` for connect + schema tree; SQL workspace / table view for sandboxed drivers; Docker ClickHouse service for local testing.
- **In-app updates (#280–#282)** — updater service, Check for Updates UI / badge / startup settings, and platform installer helpers.
- **SSL certificate pickers for MySQL, MongoDB, and Redis (#278)** — optional client certificate paths on those connection forms.
- **SQLite in Driver Manager (#270)** — built-in SQLite listed alongside other Dart drivers.

### Fixed

- **Secrets / shutdown / reliability** — atomic LocalDb + secure-store updates (#276); disconnect SQLite on app shutdown (#271); log remaining silent catches in database drivers (#272); harden MySQL custom SELECT validation (#274); stream large CSV exports on an isolate (#277).
- **UI / menus** — disabled Run (F5) when no SQL-capable connection (#266); coming-soon placeholders for unfinished workspace tabs (#267); global File → New/Open/Save SQL for active SQL editors (#268).
- **Marketplace** — database drivers without a valid process sandbox stay preview-only listings (#269).
- **Sandbox launch** — mark driver binaries executable after zip install; fall back when bubblewrap user namespaces are unavailable.

## [0.4.9] - 2026-07-10

PostgreSQL connection reliability and TLS improvements, plus menu and URI import polish.
Expand Down
1 change: 1 addition & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- third_party/**
- build/**

linter:
rules:
Expand Down
6 changes: 6 additions & 0 deletions docker/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ POSTGRES_PORT=5432
MYSQL_PORT=3306
REDIS_PORT=6379
MONGO_PORT=27017
CLICKHOUSE_HTTP_PORT=8123
CLICKHOUSE_NATIVE_PORT=9000

POSTGRES_USER=querya
POSTGRES_PASSWORD=querya
Expand All @@ -17,3 +19,7 @@ MYSQL_PASSWORD=querya

MONGO_INITDB_ROOT_USERNAME=querya
MONGO_INITDB_ROOT_PASSWORD=querya

CLICKHOUSE_DB=querya
CLICKHOUSE_USER=querya
CLICKHOUSE_PASSWORD=querya
112 changes: 112 additions & 0 deletions docker/clickhouse/init/01_seed.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
-- Demo OLAP data for Querya ClickHouse extension testing.
-- Runs once on first container start via /docker-entrypoint-initdb.d

CREATE DATABASE IF NOT EXISTS querya;

CREATE TABLE IF NOT EXISTS querya.customers
(
id UInt32,
name String,
email String,
city LowCardinality(String),
created_at DateTime
)
ENGINE = MergeTree
ORDER BY id;

CREATE TABLE IF NOT EXISTS querya.products
(
id UInt32,
sku String,
title String,
category LowCardinality(String),
price Decimal(10, 2)
)
ENGINE = MergeTree
ORDER BY id;

CREATE TABLE IF NOT EXISTS querya.orders
(
id UInt64,
customer_id UInt32,
status LowCardinality(String),
total Decimal(12, 2),
placed_at DateTime
)
ENGINE = MergeTree
ORDER BY (placed_at, id);

CREATE TABLE IF NOT EXISTS querya.order_lines
(
order_id UInt64,
product_id UInt32,
qty UInt16,
unit_price Decimal(10, 2)
)
ENGINE = MergeTree
ORDER BY (order_id, product_id);

CREATE TABLE IF NOT EXISTS querya.events
(
event_id UUID,
event_time DateTime,
user_id UInt32,
event_type LowCardinality(String),
path String,
country LowCardinality(String),
revenue Decimal(12, 4)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_time)
ORDER BY (event_time, user_id);

-- 500 customers
INSERT INTO querya.customers
SELECT
toUInt32(number + 1) AS id,
concat('Customer ', toString(number + 1)) AS name,
concat('user', toString(number + 1), '@example.com') AS email,
['Berlin', 'London', 'Madrid', 'Paris', 'Tokyo', 'New York', 'São Paulo', 'Cairo'][number % 8 + 1] AS city,
now() - toIntervalDay(number % 365) AS created_at
FROM numbers(500);

-- 80 products
INSERT INTO querya.products
SELECT
toUInt32(number + 1) AS id,
concat('SKU-', leftPad(toString(number + 1), 4, '0')) AS sku,
concat('Product ', toString(number + 1)) AS title,
['Electronics', 'Books', 'Home', 'Sports', 'Fashion'][number % 5 + 1] AS category,
toDecimal64(round(4.99 + (number % 200) * 1.37, 2), 2) AS price
FROM numbers(80);

-- 2_000 orders
INSERT INTO querya.orders
SELECT
toUInt64(number + 1) AS id,
toUInt32((number % 500) + 1) AS customer_id,
['new', 'paid', 'shipped', 'cancelled', 'refunded'][number % 5 + 1] AS status,
toDecimal64(round(9.99 + (number % 150) * 2.41, 2), 2) AS total,
now() - toIntervalHour(number % (24 * 120)) AS placed_at
FROM numbers(2000);

-- ~6_000 order lines (1–4 lines per order)
INSERT INTO querya.order_lines
SELECT
toUInt64((number % 2000) + 1) AS order_id,
toUInt32((number % 80) + 1) AS product_id,
toUInt16((number % 5) + 1) AS qty,
toDecimal64(round(4.99 + (number % 200) * 1.37, 2), 2) AS unit_price
FROM numbers(6000);

-- 50_000 analytics events
INSERT INTO querya.events
SELECT
generateUUIDv4() AS event_id,
now() - toIntervalSecond(number % (86400 * 30)) AS event_time,
toUInt32((number % 500) + 1) AS user_id,
['page_view', 'add_to_cart', 'purchase', 'search', 'login'][number % 5 + 1] AS event_type,
concat('/app/', ['home', 'catalog', 'product', 'checkout', 'account'][number % 5 + 1]) AS path,
['DE', 'GB', 'ES', 'FR', 'JP', 'US', 'BR', 'EG'][number % 8 + 1] AS country,
if(number % 5 = 2, toDecimal64(round((number % 100) * 1.25, 4), 4), toDecimal64(0, 4)) AS revenue
FROM numbers(50000);
33 changes: 33 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
# Redis port 6379 no auth keys prefix querya:*
# MongoDB port 27017 db querya user querya password querya
# auth source: admin collections: users, products, orders
# ClickHouse HTTP 8123 / native 9000 db querya user querya password querya
# tables: customers, products, orders, order_lines, events
# SQLite local file ./sqlite/data/querya.db
# tables: users, products, orders
# ─────────────────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -137,6 +139,36 @@ services:
retries: 20
start_period: 30s

clickhouse:
image: clickhouse/clickhouse-server:24.8
container_name: querya-clickhouse
restart: unless-stopped
environment:
CLICKHOUSE_DB: ${CLICKHOUSE_DB:-querya}
CLICKHOUSE_USER: ${CLICKHOUSE_USER:-querya}
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-querya}
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
ports:
- "${CLICKHOUSE_HTTP_PORT:-8123}:8123"
- "${CLICKHOUSE_NATIVE_PORT:-9000}:9000"
volumes:
- clickhouse_data:/var/lib/clickhouse
- ./clickhouse/init:/docker-entrypoint-initdb.d:ro
ulimits:
nofile:
soft: 262144
hard: 262144
healthcheck:
test:
[
"CMD-SHELL",
"clickhouse-client --user $${CLICKHOUSE_USER:-querya} --password $${CLICKHOUSE_PASSWORD:-querya} --query 'SELECT 1'",
]
interval: 5s
timeout: 5s
retries: 20
start_period: 40s

sqlite-seed:
image: alpine:latest
container_name: querya-sqlite-seed
Expand All @@ -152,3 +184,4 @@ volumes:
mysql_data:
redis_data:
mongo_data:
clickhouse_data:
5 changes: 3 additions & 2 deletions docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ day-to-day usage, and [Security](security.md) for how credentials are stored.
## Local dev databases (optional)

The repo includes a Docker Compose stack under [`docker/`](../docker/) with
PostgreSQL, MySQL, MongoDB, and Redis plus seed data:
PostgreSQL, MySQL, MongoDB, Redis, ClickHouse, and SQLite seed data:

```bash
cp docker/.env.example docker/.env # optional overrides
cd docker && docker compose up -d
```

Default credentials: user/password **`querya`**, database **`querya`**
(MongoDB auth source: **`admin`**). Stop with `docker compose down`.
(MongoDB auth source: **`admin`**; ClickHouse HTTP **`8123`**, native **`9000`**).
Stop with `docker compose down`.
Loading
Loading