diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..258d0cc
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,40 @@
+# Node artifact files
+node_modules/
+dist/
+build/
+
+
+# Local development
+*.env
+*.dev
+.DS_Store
+
+# Docker
+Dockerfile
+docker-compose.yml
+*.dockerignore
+
+# Debug log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# IDE files
+.idea/
+.vscode/
+*.swp
+*.swo
+
+# Build results
+out/
+*.tsbuildinfo
+.next/
+
+# SvelteKit
+.svelte-kit/
+
+# Tauri
+src-tauri/
+
+#Clickhouse
+conf/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..1f967e4
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+FROM node:23 AS builder
+
+WORKDIR /app
+COPY . .
+RUN npm install
+
+ENV NODE_ENV=production
+ENV PLATFORM=WEB
+
+ARG CLICKHOUSE_URL
+
+RUN npm run build
+RUN ls /app/build
+
+FROM nginx
+COPY --from=builder /app/build /usr/share/nginx/html
diff --git a/README.md b/README.md
index 5bf84d4..74239e9 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,29 @@
## Getting Started
+### → Live
+
+https://agx.app
+
+### → Local
+
+1. Clone the repository:
+
+```bash
+git clone https://github.com/agnosticeng/agx
+cd agx
+```
+
+2. Run with docker compose:
+
+```bash
+docker compose up
+```
+
+3. Access the application via https://localhost:8080
+
+### → Native
+
1. Clone the repository:
```bash
diff --git a/conf/config.xml b/conf/config.xml
new file mode 100644
index 0000000..f781054
--- /dev/null
+++ b/conf/config.xml
@@ -0,0 +1,1794 @@
+
+
+ 1
+
+
+ trace
+ /var/log/clickhouse-server/clickhouse-server.log
+ /var/log/clickhouse-server/clickhouse-server.err.log
+
+ 1000M
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://{bucket}.s3.amazonaws.com
+
+
+ https://storage.googleapis.com/{bucket}
+
+
+ https://{bucket}.oss.aliyuncs.com
+
+
+
+
+
+
+ Access-Control-Allow-Origin
+ *
+
+
+ Access-Control-Allow-Headers
+ origin, x-requested-with, x-clickhouse-format, x-clickhouse-user, x-clickhouse-key, Authorization
+
+
+ Access-Control-Allow-Methods
+ POST, GET, OPTIONS
+
+
+ Access-Control-Max-Age
+ 86400
+
+
+
+
+
+
+
+ 8123
+
+
+ 9000
+
+
+
+
+
+ 9004
+
+
+ 9005
+
+
+
+
+
+
+
+
+
+
+
+ 9009
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ::1
+ 127.0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+
+
+ false
+
+
+ /path/to/ssl_cert_file
+ /path/to/ssl_key_file
+
+
+ false
+
+
+ /path/to/ssl_ca_cert_file
+
+
+ none
+
+
+ 0
+
+
+ -1
+ -1
+
+
+ false
+
+
+
+
+
+
+
+
+
+ none
+ true
+ true
+ sslv2,sslv3
+ true
+
+
+
+ RejectCertificateHandler
+
+
+
+
+ true
+ true
+ sslv2,sslv3
+ true
+
+
+
+ RejectCertificateHandler
+
+
+
+
+
+
+
+
+ 0
+ 2
+
+
+ 1000
+
+
+ 0
+
+
+
+ 10000
+
+
+
+
+
+ true
+
+
+ 0.9
+
+
+ 4194304
+
+
+ 0
+
+
+
+
+
+ 8589934592
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /var/lib/clickhouse/caches/
+
+ false
+
+
+ /var/lib/clickhouse/
+
+
+
+
+
+ /var/lib/clickhouse/tmp/
+
+
+ 1
+ 1
+ 1
+
+
+ sha256_password
+
+
+ 12
+
+
+
+
+
+
+
+
+ /var/lib/clickhouse/user_files/
+
+
+
+
+
+
+
+
+
+
+
+
+ users.xml
+
+
+
+ /var/lib/clickhouse/access/
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ 600
+
+
+
+ default
+
+
+ SQL_
+
+
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+ ' | sed -e 's|.*>\(.*\)<.*|\1|')
+ wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
+ apt install --no-install-recommends -f ./clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
+ clickhouse-jdbc-bridge &
+
+ * [CentOS/RHEL]
+ export MVN_URL=https://repo1.maven.org/maven2/com/clickhouse/clickhouse-jdbc-bridge/
+ export PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '' | sed -e 's|.*>\(.*\)<.*|\1|')
+ wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
+ yum localinstall -y clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
+ clickhouse-jdbc-bridge &
+
+ Please refer to https://github.com/ClickHouse/clickhouse-jdbc-bridge#usage for more information.
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ localhost
+ 9000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3600
+
+
+
+ 3600
+
+
+ 60
+
+
+
+
+
+
+
+
+
+
+
+
+ system
+
+
+ toYYYYMM(event_date)
+
+
+
+
+
+
+
+ 7500
+
+ 1048576
+
+ 8192
+
+ 524288
+
+ false
+
+
+
+
+
+
+
+ system
+
+
+ toYYYYMM(event_date)
+ 7500
+ 1048576
+ 8192
+ 524288
+
+ false
+ true
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+
+
+
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+ trace
+
+
+
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ 1000
+ false
+
+
+
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ 1000
+ false
+
+
+
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ 1000
+ false
+
+
+
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ 1000
+ false
+
+
+
+
+ system
+
+ 7000
+ 1048576
+ 8192
+ 524288
+ false
+
+
+
+
+
+
+ engine MergeTree
+ partition by toYYYYMM(finish_date)
+ order by (finish_date, finish_time_us, trace_id)
+
+ system
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+
+
+
+
+
+ system
+
+
+
+ 1000
+ 1024
+ 1024
+ 512
+ true
+
+
+
+
+
+
+
+ system
+
+
+ toYYYYMM(event_date)
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+ event_date + INTERVAL 30 DAY DELETE
+
+
+
+
+ system
+
+
+ 7500
+ 1048576
+ 8192
+ 524288
+ false
+ event_date
+ event_date + INTERVAL 3 DAY
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+ event_date + INTERVAL 30 DAY
+
+
+
+
+
+
+
+
+
+
+
+
+
+ *_dictionary.*ml
+
+
+ true
+
+
+ true
+
+
+ *_function.*ml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /clickhouse/task_queue/ddl
+
+ /clickhouse/task_queue/replicas
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ click_cost
+ any
+
+ 0
+ 3600
+
+
+ 86400
+ 60
+
+
+
+ max
+
+ 0
+ 60
+
+
+ 3600
+ 300
+
+
+ 86400
+ 3600
+
+
+
+
+
+ /var/lib/clickhouse/format_schemas/
+
+
+ /usr/share/clickhouse/protos/
+
+
+
+
+
+
+
+
+
+ false
+
+ false
+
+
+ https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ backups
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/users.xml b/conf/users.xml
new file mode 100644
index 0000000..d44f528
--- /dev/null
+++ b/conf/users.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ ::/0
+
+
+
+
+
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..f33057b
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,29 @@
+version: '3'
+services:
+ agx_app:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ args:
+ - CLICKHOUSE_URL=http://localhost:8123?default_format=JSON
+ ports:
+ - '8080:80'
+ depends_on:
+ clickhouse:
+ condition: service_healthy
+ clickhouse:
+ image: clickhouse/clickhouse-server:latest
+ ports:
+ - '8123:8123'
+ - '9000:9000'
+ volumes:
+ - clickhouse_data:/var/lib/clickhouse
+ - ./conf/config.xml:/etc/clickhouse-server/config.d/config.xml
+ - ./conf/users.xml:/etc/clickhouse-server/users.d/users.xml
+ healthcheck:
+ test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1
+ interval: 3s
+ timeout: 5s
+ retries: 5
+volumes:
+ clickhouse_data:
diff --git a/src/lib/olap-engine/engine-remote.ts b/src/lib/olap-engine/engine-remote.ts
index 70b2b51..3da2d5b 100644
--- a/src/lib/olap-engine/engine-remote.ts
+++ b/src/lib/olap-engine/engine-remote.ts
@@ -9,8 +9,7 @@ export class RemoteEngine extends InternalEventEmitter implements OLAPEn
async exec(query: string, _emit = true) {
try {
- const proxy =
- new URLSearchParams(window.location.search).get('proxy') ?? 'https://proxy.agx.app/query';
+ const proxy = new URLSearchParams(window.location.search).get('proxy') ?? CLICKHOUSE_URL;
const response = await fetch(proxy, { method: 'POST', body: query });
const r = await response.text();
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
index 2be3f9d..6ef483b 100644
--- a/src/vite-env.d.ts
+++ b/src/vite-env.d.ts
@@ -1,3 +1,5 @@
declare const PLATFORM: 'NATIVE' | 'WEB';
declare const BUILD: string;
+declare const CLICKHOUSE_URL: string;
+
type MaybePromise = T | Promise;
diff --git a/vite.config.js b/vite.config.js
index dab7f81..f5fcda3 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -22,6 +22,7 @@ export default defineConfig(async () => ({
exclude: ['@sqlite.org/sqlite-wasm']
},
define: {
+ CLICKHOUSE_URL: JSON.stringify(process.env.CLICKHOUSE_URL || 'https://proxy.agx.app/query'),
PLATFORM: JSON.stringify(process.env.PLATFORM || 'NATIVE'),
BUILD: JSON.stringify(
(process.env.CF_PAGES_COMMIT_SHA || process.env.COMMIT_SHA || 'dev').slice(0, 7)