From 5fa2ab992fc6f0147433a5ec1b42681488f4aa55 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 13:17:03 -0700
Subject: [PATCH 01/18] style: rename hyperdx docker dirs
---
docker/{local => hyperdx-all-in-one}/Dockerfile | 4 ++--
docker/{local => hyperdx-all-in-one}/build.sh | 0
docker/{local => hyperdx-all-in-one}/clickhouseConfig.xml | 0
docker/{local => hyperdx-all-in-one}/entry.sh | 0
docker/{fullstack => hyperdx}/Dockerfile | 0
docker/{fullstack => hyperdx}/entry.sh | 0
6 files changed, 2 insertions(+), 2 deletions(-)
rename docker/{local => hyperdx-all-in-one}/Dockerfile (98%)
rename docker/{local => hyperdx-all-in-one}/build.sh (100%)
rename docker/{local => hyperdx-all-in-one}/clickhouseConfig.xml (100%)
rename docker/{local => hyperdx-all-in-one}/entry.sh (100%)
rename docker/{fullstack => hyperdx}/Dockerfile (100%)
rename docker/{fullstack => hyperdx}/entry.sh (100%)
diff --git a/docker/local/Dockerfile b/docker/hyperdx-all-in-one/Dockerfile
similarity index 98%
rename from docker/local/Dockerfile
rename to docker/hyperdx-all-in-one/Dockerfile
index 7ca80f485a..47e1b03874 100644
--- a/docker/local/Dockerfile
+++ b/docker/hyperdx-all-in-one/Dockerfile
@@ -49,8 +49,8 @@ COPY --from=app ./public ./public
COPY --from=app ./styles ./styles
ENV NEXT_TELEMETRY_DISABLED 1
-ENV NEXT_OUTPUT_STANDALONE true
-ENV NEXT_PUBLIC_IS_LOCAL_MODE true
+ENV NEXT_OUTPUT_STANDALONE false
+ENV NEXT_PUBLIC_IS_LOCAL_MODE false
RUN yarn build && rm -rf node_modules && yarn workspaces focus --production
# == Clickhouse/Base Image ==
diff --git a/docker/local/build.sh b/docker/hyperdx-all-in-one/build.sh
similarity index 100%
rename from docker/local/build.sh
rename to docker/hyperdx-all-in-one/build.sh
diff --git a/docker/local/clickhouseConfig.xml b/docker/hyperdx-all-in-one/clickhouseConfig.xml
similarity index 100%
rename from docker/local/clickhouseConfig.xml
rename to docker/hyperdx-all-in-one/clickhouseConfig.xml
diff --git a/docker/local/entry.sh b/docker/hyperdx-all-in-one/entry.sh
similarity index 100%
rename from docker/local/entry.sh
rename to docker/hyperdx-all-in-one/entry.sh
diff --git a/docker/fullstack/Dockerfile b/docker/hyperdx/Dockerfile
similarity index 100%
rename from docker/fullstack/Dockerfile
rename to docker/hyperdx/Dockerfile
diff --git a/docker/fullstack/entry.sh b/docker/hyperdx/entry.sh
similarity index 100%
rename from docker/fullstack/entry.sh
rename to docker/hyperdx/entry.sh
From f54b05c3b0dcb158afa9bfb104bafb871a9df101 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 16:58:27 -0700
Subject: [PATCH 02/18] feat: introduce all-one-one multi-stage build
---
docker/hyperdx/Dockerfile | 48 +++++++--
docker/hyperdx/clickhouseConfig.xml | 150 ++++++++++++++++++++++++++++
docker/hyperdx/entry.sh | 15 +--
3 files changed, 189 insertions(+), 24 deletions(-)
create mode 100644 docker/hyperdx/clickhouseConfig.xml
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 10598017d9..65ba600434 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -3,9 +3,16 @@
# - App (Frontend)
ARG NODE_VERSION=22.14.0
+ARG CLICKHOUSE_VERSION=24
+ARG OTEL_COLLECTOR_VERSION=0.120.0
# base #############################################################################################
-FROM node:${NODE_VERSION}-alpine AS base
+# == Clickhouse/Base Image ==
+FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS clickhouse_base
+# == Otel Collector Image ==
+FROM otel/opentelemetry-collector-contrib:${OTEL_COLLECTOR_VERSION} AS otel_collector_base
+
+FROM node:${NODE_VERSION}-alpine AS node_base
WORKDIR /app/api
@@ -24,7 +31,7 @@ RUN yarn install && yarn cache clean
## API Builder Image ###############################################################################
-FROM base AS api_builder
+FROM node_base AS api_builder
WORKDIR /app/api
@@ -34,7 +41,7 @@ RUN yarn build && rm -rf node_modules && yarn workspaces focus --production
# APP Builder Image ###############################################################################
-FROM base AS app_builder
+FROM node_base AS app_builder
WORKDIR /app/app
@@ -74,13 +81,26 @@ COPY --from=app_builder /app/app/node_modules ./node_modules
COPY --from=app_builder /app/app/package.json ./package.json
# Set up start script
-COPY --chown=node:node --from=fullstack ./entry.sh /etc/local/entry.sh
+COPY --chown=node:node --from=hyperdx ./entry.sh /etc/local/entry.sh
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
# prod-extended ############################################################################################
-FROM prod AS prod-extended
-
-USER root
+FROM scratch AS all-in-one
+
+# Copy base
+COPY --from=clickhouse_base / /
+COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
+COPY --from=node_base /usr/lib /usr/lib
+COPY --from=node_base /usr/local/lib /usr/local/lib
+COPY --from=node_base /usr/local/include /usr/local/include
+COPY --from=node_base /usr/local/bin /usr/local/bin
+
+# Set up Clickhouse
+COPY --from=clickhouse ./local/*.xml /etc/clickhouse-server
+# overwrite default config
+COPY --from=hyperdx ./clickhouseConfig.xml /etc/clickhouse-server/config.xml
+# Set up Otel Collector
+COPY --from=otel-collector ./config.yaml /etc/otelcol-contrib/config.yaml
# == Install MongoDB v4 Deps ==
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories
@@ -89,10 +109,16 @@ RUN apk update
RUN apk add mongodb yaml-cpp=0.6.2-r2
# Set up Mongo directories with proper permissions
-RUN mkdir -p /data/db && \
- chown -R node:node /data/db && \
- chown -R node:node /var/log
+RUN mkdir -p /data/db
-USER node
+ENV NODE_ENV production
+# Install libs used for the start script
+RUN npm install -g concurrently@9.1.0
+# Set up App
+COPY --from=prod /app/api /app/api
+COPY --from=prod /app/app /app/app
+COPY --from=prod /etc/local/entry.sh /etc/local/entry.sh
+
+WORKDIR /app/app
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
diff --git a/docker/hyperdx/clickhouseConfig.xml b/docker/hyperdx/clickhouseConfig.xml
new file mode 100644
index 0000000000..a5650fa601
--- /dev/null
+++ b/docker/hyperdx/clickhouseConfig.xml
@@ -0,0 +1,150 @@
+
+
+
+
+ false
+ /var/log/clickhouse-server/clickhouse-server.log
+ /var/log/clickhouse-server/clickhouse-server.err.log
+
+
+ 0.0.0.0
+ 8123
+ 9000
+ ch-server
+ 9009
+
+ 4096
+ 64
+ 100
+ 0
+ 0
+
+ 0
+
+
+ /var/lib/clickhouse/
+ /var/lib/clickhouse/tmp/
+ /var/lib/clickhouse/user_files/
+
+ users.xml
+ default
+ default
+ UTC
+ false
+
+
+
+ system
+
+ 7500
+
+
+
+
+ system
+
+ 7500
+ 1000
+
+
+
+
+ system
+
+
+ 7000
+
+
+
+
+
+
+ engine MergeTree
+ partition by toYYYYMM(finish_date)
+ order by (finish_date, finish_time_us, trace_id)
+
+ system
+
+ 7500
+
+
+
+
+
+ system
+
+
+
+ 1000
+
+
+
+
+ system
+
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+
+ system
+
+ toYYYYMM(event_date)
+ 7500
+
+
+
+ /clickhouse/task_queue/ddl
+
+
+ /var/lib/clickhouse/format_schemas/
+
diff --git a/docker/hyperdx/entry.sh b/docker/hyperdx/entry.sh
index 9494ed18b7..5e99c348ec 100644
--- a/docker/hyperdx/entry.sh
+++ b/docker/hyperdx/entry.sh
@@ -2,24 +2,13 @@
export FRONTEND_URL="${FRONTEND_URL:-${HYPERDX_APP_URL:-http://localhost}:${HYPERDX_APP_PORT:-8080}}"
-# Internal Services
-export MONGO_URI="${MONGO_URI:-mongodb://127.0.0.1:27017/hyperdx}"
-
echo "Visit the HyperDX UI at $FRONTEND_URL"
echo ""
-# Start Mongo Server if it exists (will run in prod-extended but not in prod)
-if command -v mongod &> /dev/null; then
- echo "Starting MongoDB server..."
- mongod --quiet --dbpath /data/db > /var/log/mongod.log 2>&1 &
- # Wait for MongoDB to start
- sleep 2
-fi
-
# Use concurrently to run both the API and App servers
npx concurrently \
"--kill-others" \
"--names=API,APP,ALERT-TASK" \
- "MONGO_URI=${MONGO_URI} PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/index.js" \
+ "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/index.js" \
"HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} /app/app/node_modules/.bin/next start -p ${HYPERDX_APP_PORT:-8080}" \
- "MONGO_URI=${MONGO_URI} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/tasks/index.js check-alerts"
+ "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/tasks/index.js check-alerts"
From e66fb7ee8326c581ebb801b3d9b9680d75af48dd Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 17:16:22 -0700
Subject: [PATCH 03/18] feat: add all-in-on-entry.sh
---
docker/hyperdx/Dockerfile | 14 ++++---
docker/hyperdx/all-in-one-entry.sh | 61 ++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 5 deletions(-)
create mode 100644 docker/hyperdx/all-in-one-entry.sh
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 65ba600434..7a89ebbe73 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -90,10 +90,11 @@ FROM scratch AS all-in-one
# Copy base
COPY --from=clickhouse_base / /
COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
+COPY --from=node_base --link /usr/local/bin /usr/local/bin
+COPY --from=node_base --link /usr/local/lib /usr/local/lib
COPY --from=node_base /usr/lib /usr/lib
-COPY --from=node_base /usr/local/lib /usr/local/lib
COPY --from=node_base /usr/local/include /usr/local/include
-COPY --from=node_base /usr/local/bin /usr/local/bin
+
# Set up Clickhouse
COPY --from=clickhouse ./local/*.xml /etc/clickhouse-server
@@ -108,17 +109,20 @@ RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repos
RUN apk update
RUN apk add mongodb yaml-cpp=0.6.2-r2
+# Install libs used for the start script
+RUN apk add curl
+
# Set up Mongo directories with proper permissions
RUN mkdir -p /data/db
ENV NODE_ENV production
-# Install libs used for the start script
-RUN npm install -g concurrently@9.1.0
# Set up App
COPY --from=prod /app/api /app/api
COPY --from=prod /app/app /app/app
-COPY --from=prod /etc/local/entry.sh /etc/local/entry.sh
+COPY --from=hyperdx ./all-in-one-entry.sh /etc/local/entry.sh
WORKDIR /app/app
+# Expose ports
+EXPOSE 8080 4317 4318 13133 8123 9000
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
diff --git a/docker/hyperdx/all-in-one-entry.sh b/docker/hyperdx/all-in-one-entry.sh
new file mode 100644
index 0000000000..a3fe418479
--- /dev/null
+++ b/docker/hyperdx/all-in-one-entry.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+export HYPERDX_LOG_LEVEL="error"
+# https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#logger
+export CLICKHOUSE_LOG_LEVEL="error"
+
+# User can specify either an entire SERVER_URL, or override slectively the
+# HYPERDX_API_URL or HYPERDX_API_PORT from the defaults
+# Same applies to the frontend/app
+export SERVER_URL="http://127.0.0.1:${HYPERDX_API_PORT:-8000}"
+export FRONTEND_URL="${FRONTEND_URL:-${HYPERDX_APP_URL:-http://localhost}:${HYPERDX_APP_PORT:-8080}}"
+
+# Internal Services
+export CLICKHOUSE_SERVER_ENDPOINT="ch-server:9000"
+export MONGO_URI="mongodb://db:27017/hyperdx"
+
+export EXPRESS_SESSION_SECRET="hyperdx is cool đź‘‹"
+export IS_LOCAL_APP_MODE="DANGEROUSLY_is_local_app_modeđź’€"
+export NEXT_TELEMETRY_DISABLED="1"
+
+
+# Simulate Docker Service DNS
+echo "127.0.0.1 ch-server" >> /etc/hosts
+echo "127.0.0.1 db" >> /etc/hosts
+
+echo "Visit the HyperDX UI at $FRONTEND_URL/search"
+echo ""
+echo "Send OpenTelemetry data via"
+echo "http/protobuf: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318"
+echo "gRPC: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317"
+echo ""
+echo ""
+
+# Start Clickhouse Server
+/entrypoint.sh &
+
+# Start Mongo Server
+mongod --quiet --dbpath /data/db > /var/log/mongod.log 2>&1 &
+
+# Wait for Clickhouse to be ready
+while ! curl -s "http://ch-server:8123" > /dev/null; do
+ echo "Waiting for Clickhouse to be ready..."
+ sleep 1
+done
+# Start Otel Collector
+otelcol-contrib --config /etc/otelcol-contrib/config.yaml &
+
+# Start HyperDX app
+npx concurrently \
+ "--kill-others" \
+ "--names=API,APP,ALERT-TASK" \
+ "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/index.js" \
+ "HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} /app/app/node_modules/.bin/next start -p ${HYPERDX_APP_PORT:-8080}" \
+ "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/tasks/index.js check-alerts" \
+ > /var/log/app.log 2>&1 &
+
+# Wait for any process to exit
+wait -n
+
+# Exit with status of process that exited first
+exit $?
From 2464456b444de21317edc00ceff4674869ad60af Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 17:23:49 -0700
Subject: [PATCH 04/18] style: deprecate old all-in-one dir
---
docker/hyperdx-all-in-one/Dockerfile | 132 ---------------
docker/hyperdx-all-in-one/build.sh | 10 --
.../hyperdx-all-in-one/clickhouseConfig.xml | 150 ------------------
docker/hyperdx-all-in-one/entry.sh | 68 --------
docker/hyperdx/build.sh | 10 ++
5 files changed, 10 insertions(+), 360 deletions(-)
delete mode 100644 docker/hyperdx-all-in-one/Dockerfile
delete mode 100755 docker/hyperdx-all-in-one/build.sh
delete mode 100644 docker/hyperdx-all-in-one/clickhouseConfig.xml
delete mode 100644 docker/hyperdx-all-in-one/entry.sh
create mode 100755 docker/hyperdx/build.sh
diff --git a/docker/hyperdx-all-in-one/Dockerfile b/docker/hyperdx-all-in-one/Dockerfile
deleted file mode 100644
index 47e1b03874..0000000000
--- a/docker/hyperdx-all-in-one/Dockerfile
+++ /dev/null
@@ -1,132 +0,0 @@
-# Starts several services in a single container for local use
-# - Clickhouse
-# - Mongo
-# - Otel Collector (otelcol)
-# - API (Node)
-# - App (Frontend)
-# - Redis Cache
-
-# TODO:
-# - Customize ports, need to set up env vars or relax CORS and other port requirements
-# - Have otel collector listen to a directory users can mount logs into
-# - Allow persisting settings on disk
-# - Limiting persisted data with some auto rotation
-
-ARG NODE_VERSION=22.14.0
-ARG CLICKHOUSE_VERSION=24
-ARG OTEL_COLLECTOR_VERSION=0.120.0
-# Get Node base image to copy over Node binaries
-FROM node:${NODE_VERSION}-alpine AS node
-
-# == API Builder Image ==
-# FROM node:${NODE_VERSION}-alpine AS api_builder
-
-# WORKDIR /app/api
-# COPY ./yarn.lock ./.yarnrc.yml .
-# COPY ./.yarn ./.yarn
-# COPY --from=api ./package.json .
-# RUN yarn install && yarn cache clean
-
-# COPY --from=api ./tsconfig.json .
-# COPY --from=api ./src ./src
-# RUN yarn run build
-
-# == App Builder Image ==
-FROM node:${NODE_VERSION}-alpine AS app_builder
-
-WORKDIR /app/app
-
-COPY ./yarn.lock ./.yarnrc.yml .
-COPY ./.yarn ./.yarn
-COPY --from=app ./package.json .
-
-RUN yarn install && yarn cache clean
-
-COPY --from=app ./.eslintrc.js ./next.config.js ./tsconfig.json ./next.config.js ./mdx.d.ts ./.eslintrc.js ./
-COPY --from=app ./src ./src
-COPY --from=app ./pages ./pages
-COPY --from=app ./public ./public
-COPY --from=app ./styles ./styles
-
-ENV NEXT_TELEMETRY_DISABLED 1
-ENV NEXT_OUTPUT_STANDALONE false
-ENV NEXT_PUBLIC_IS_LOCAL_MODE false
-RUN yarn build && rm -rf node_modules && yarn workspaces focus --production
-
-# == Clickhouse/Base Image ==
-FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS clickhouse_base
-
-# == Otel Collector Image ==
-FROM otel/opentelemetry-collector-contrib:${OTEL_COLLECTOR_VERSION} AS otel_collector_base
-
-FROM scratch as base
-COPY --from=clickhouse_base / /
-COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
-
-# ===
-# === Install Deps
-# ===
-
-# == Install Node Deps ==
-COPY --from=node /usr/lib /usr/lib
-COPY --from=node /usr/local/lib /usr/local/lib
-COPY --from=node /usr/local/include /usr/local/include
-COPY --from=node /usr/local/bin /usr/local/bin
-
-# RUN npm install -g yarn --force
-
-# == Install MongoDB v4 Deps ==
-# RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories
-# RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories
-# RUN apk update
-# RUN apk add mongodb yaml-cpp=0.6.2-r2
-RUN apk add curl
-
-# == Install Redis ==
-# If this version pinning fails, this is likely due to the version being dropped
-# from APK
-# RUN apk add 'redis<7.0.14'
-
-# ===
-# === Set Up Services
-# ===
-
-# Set up Clickhouse
-COPY --from=clickhouse ./local/*.xml /etc/clickhouse-server
-# overwrite default config
-COPY --from=local ./clickhouseConfig.xml /etc/clickhouse-server/config.xml
-
-# Set up Mongo
-# RUN mkdir -p /data/db
-
-# Set up Otel Collector
-COPY --from=otel-collector ./config.yaml /etc/otelcol-contrib/config.yaml
-
-# Set up API (NOT USED YET)
-# WORKDIR /app/api
-
-# COPY --from=api_builder ./app/api/build ./build
-# COPY ./yarn.lock ./.yarnrc.yml .
-# COPY ./.yarn ./.yarn
-# COPY --from=api_builder ./app/api/package.json .
-
-# # Only install prod dependencies
-# RUN yarn workspaces focus --production && yarn cache clean
-
-# # Remove dev dependencies
-# RUN rm -rf ./.yarn
-
-# Set up App
-WORKDIR /app/app
-COPY --from=app_builder /app/app/next.config.js ./
-COPY --from=app_builder /app/app/public ./public
-COPY --from=app_builder /app/app/.next ./.next
-COPY --from=app_builder /app/app/node_modules ./node_modules
-COPY --from=app_builder /app/app/package.json ./package.json
-
-# Expose ports
-EXPOSE 8000 8080 4317 4318 13133 8123 9000
-
-# Set up start script
-COPY --from=local ./entry.sh /etc/local/entry.sh
-CMD sh /etc/local/entry.sh
diff --git a/docker/hyperdx-all-in-one/build.sh b/docker/hyperdx-all-in-one/build.sh
deleted file mode 100755
index b46a401ba0..0000000000
--- a/docker/hyperdx-all-in-one/build.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# Meant to be run from the root of the repo
-
-docker build --squash -t hdx-oss-dev-local -f ./docker/local/Dockerfile \
- --build-context clickhouse=./docker/clickhouse \
- --build-context otel-collector=./docker/otel-collector \
- --build-context local=./docker/local \
- --build-context api=./packages/api \
- --build-context app=./packages/app \
- .
diff --git a/docker/hyperdx-all-in-one/clickhouseConfig.xml b/docker/hyperdx-all-in-one/clickhouseConfig.xml
deleted file mode 100644
index a5650fa601..0000000000
--- a/docker/hyperdx-all-in-one/clickhouseConfig.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
-
- false
- /var/log/clickhouse-server/clickhouse-server.log
- /var/log/clickhouse-server/clickhouse-server.err.log
-
-
- 0.0.0.0
- 8123
- 9000
- ch-server
- 9009
-
- 4096
- 64
- 100
- 0
- 0
-
- 0
-
-
- /var/lib/clickhouse/
- /var/lib/clickhouse/tmp/
- /var/lib/clickhouse/user_files/
-
- users.xml
- default
- default
- UTC
- false
-
-
-
- system
-
- 7500
-
-
-
-
- system
-
- 7500
- 1000
-
-
-
-
- system
-
-
- 7000
-
-
-
-
-
-
- engine MergeTree
- partition by toYYYYMM(finish_date)
- order by (finish_date, finish_time_us, trace_id)
-
- system
-
- 7500
-
-
-
-
-
- system
-
-
-
- 1000
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
- /clickhouse/task_queue/ddl
-
-
- /var/lib/clickhouse/format_schemas/
-
diff --git a/docker/hyperdx-all-in-one/entry.sh b/docker/hyperdx-all-in-one/entry.sh
deleted file mode 100644
index 88f74d8044..0000000000
--- a/docker/hyperdx-all-in-one/entry.sh
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/bash
-
-export HYPERDX_LOG_LEVEL="error"
-# https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#logger
-export CLICKHOUSE_LOG_LEVEL="error"
-
-# User can specify either an entire SERVER_URL, or override slectively the
-# HYPERDX_API_URL or HYPERDX_API_PORT from the defaults
-# Same applies to the frontend/app
-export SERVER_URL="http://127.0.0.1:${HYPERDX_API_PORT:-8000}"
-export FRONTEND_URL="${FRONTEND_URL:-${HYPERDX_APP_URL:-http://localhost}:${HYPERDX_APP_PORT:-8080}}"
-
-# Internal Services
-export CLICKHOUSE_SERVER_ENDPOINT="ch-server:9000"
-export MONGO_URI="mongodb://db:27017/hyperdx"
-export REDIS_URI="redis://redis:6379"
-
-export EXPRESS_SESSION_SECRET="hyperdx is cool đź‘‹"
-export IS_LOCAL_APP_MODE="DANGEROUSLY_is_local_app_modeđź’€"
-export NEXT_TELEMETRY_DISABLED="1"
-
-
-# Simulate Docker Service DNS
-echo "127.0.0.1 ch-server" >> /etc/hosts
-echo "127.0.0.1 db" >> /etc/hosts
-echo "127.0.0.1 redis" >> /etc/hosts
-
-echo "Visit the HyperDX UI at $FRONTEND_URL/search"
-echo ""
-echo "Send OpenTelemetry data via"
-echo "http/protobuf: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318"
-echo "gRPC: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317"
-echo ""
-echo ""
-
-# Start Clickhouse Server
-/entrypoint.sh &
-
-# Start Redis Server
-# redis-server > /var/log/redis.log 2>&1 &
-
-# Start Mongo Server
-# mongod --quiet --dbpath /data/db > /var/log/mongod.log 2>&1 &
-
-# Wait for Clickhouse to be ready
-while ! curl -s "http://ch-server:8123" > /dev/null; do
- echo "Waiting for Clickhouse to be ready..."
- sleep 1
-done
-# Start Otel Collector
-otelcol-contrib --config /etc/otelcol-contrib/config.yaml &
-
-# Api
-# CLICKHOUSE_USER=api \
-# CLICKHOUSE_PASSWORD=api \
-# PORT=8000 \
-# node /app/api/build/index.js > /var/log/api.log 2>&1 &
-
-# App
-NODE_ENV=production \
-NEXT_PUBLIC_SERVER_URL="${SERVER_URL}" \
-/app/app/node_modules/.bin/next start -p ${HYPERDX_APP_PORT:-8080} > /var/log/app.log 2>&1 &
-
-# Wait for any process to exit
-wait -n
-
-# Exit with status of process that exited first
-exit $?
diff --git a/docker/hyperdx/build.sh b/docker/hyperdx/build.sh
new file mode 100755
index 0000000000..df6e442518
--- /dev/null
+++ b/docker/hyperdx/build.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+# Meant to be run from the root of the repo
+
+docker build --squash . -f ./docker/hyperdx/Dockerfile \
+ --build-context clickhouse=./docker/clickhouse \
+ --build-context otel-collector=./docker/otel-collector \
+ --build-context hyperdx=./docker/hyperdx \
+ --build-context api=./packages/api \
+ --build-context app=./packages/app \
+ --target all-in-one -t hyperdx/dev-all-in-one
From 5691a4a805bfefdf19f467f26a93e774798fc21c Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 17:44:13 -0700
Subject: [PATCH 05/18] style + fix: rename entry files + enforce auth in prod
---
docker/hyperdx/Dockerfile | 6 +++---
docker/hyperdx/{all-in-one-entry.sh => entry.local.sh} | 0
docker/hyperdx/{entry.sh => entry.prod.sh} | 4 ++++
3 files changed, 7 insertions(+), 3 deletions(-)
rename docker/hyperdx/{all-in-one-entry.sh => entry.local.sh} (100%)
rename docker/hyperdx/{entry.sh => entry.prod.sh} (83%)
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 7a89ebbe73..3f0afed086 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -81,7 +81,7 @@ COPY --from=app_builder /app/app/node_modules ./node_modules
COPY --from=app_builder /app/app/package.json ./package.json
# Set up start script
-COPY --chown=node:node --from=hyperdx ./entry.sh /etc/local/entry.sh
+COPY --chown=node:node --from=hyperdx ./entry.prod.sh /etc/local/entry.sh
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
# prod-extended ############################################################################################
@@ -90,7 +90,7 @@ FROM scratch AS all-in-one
# Copy base
COPY --from=clickhouse_base / /
COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
-COPY --from=node_base --link /usr/local/bin /usr/local/bin
+COPY --from=node_base --link /usrlocal./local/bin /usr/local/bin
COPY --from=node_base --link /usr/local/lib /usr/local/lib
COPY --from=node_base /usr/lib /usr/lib
COPY --from=node_base /usr/local/include /usr/local/include
@@ -120,7 +120,7 @@ ENV NODE_ENV production
# Set up App
COPY --from=prod /app/api /app/api
COPY --from=prod /app/app /app/app
-COPY --from=hyperdx ./all-in-one-entry.sh /etc/local/entry.sh
+COPY --from=hyperdx ./entry.local.sh /etc/local/entry.sh
WORKDIR /app/app
# Expose ports
diff --git a/docker/hyperdx/all-in-one-entry.sh b/docker/hyperdx/entry.local.sh
similarity index 100%
rename from docker/hyperdx/all-in-one-entry.sh
rename to docker/hyperdx/entry.local.sh
diff --git a/docker/hyperdx/entry.sh b/docker/hyperdx/entry.prod.sh
similarity index 83%
rename from docker/hyperdx/entry.sh
rename to docker/hyperdx/entry.prod.sh
index 5e99c348ec..ef370aca52 100644
--- a/docker/hyperdx/entry.sh
+++ b/docker/hyperdx/entry.prod.sh
@@ -2,6 +2,10 @@
export FRONTEND_URL="${FRONTEND_URL:-${HYPERDX_APP_URL:-http://localhost}:${HYPERDX_APP_PORT:-8080}}"
+# Set to "REQUIRED_AUTH" to enforce API authentication.
+# ⚠️ Do not change this value !!!!
+export IS_LOCAL_APP_MODE="REQUIRED_AUTH"
+
echo "Visit the HyperDX UI at $FRONTEND_URL"
echo ""
From ebcc9f2e61294070843cb06d81c6d3a5c05b5fbc Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 20:04:15 -0700
Subject: [PATCH 06/18] cleaup Makefile
---
.env | 2 ++
Makefile | 75 ++++++++++++++++++++++++--------------------------------
2 files changed, 34 insertions(+), 43 deletions(-)
diff --git a/.env b/.env
index 2c34179a88..541bcb09b2 100644
--- a/.env
+++ b/.env
@@ -4,6 +4,8 @@ IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx
IMAGE_NAME_HDX=docker.hyperdx.io/hyperdx/hyperdx
LOCAL_IMAGE_NAME=ghcr.io/hyperdxio/hyperdx-local
LOCAL_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-local
+ALL_IN_ONE_IMAGE_NAME=ghcr.io/hyperdxio/hyperdx-all-in-one
+ALL_IN_ONE_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-all-in-one
OTEL_COLLECTOR_IMAGE_NAME=ghcr.io/hyperdxio/hyperdx-otel-collector
OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-otel-collector
CHANGESET_TAG=2.0.0-beta.16
diff --git a/Makefile b/Makefile
index ab6665745b..7028285bca 100644
--- a/Makefile
+++ b/Makefile
@@ -71,12 +71,24 @@ dev-migrate-db:
version:
sh ./version.sh
+.PHONY: release-otel-collector
+release-otel-collector:
+ docker buildx build --platform ${BUILD_PLATFORMS} ./docker/otel-collector \
+ -t ${OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
+ -t ${OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB}:${IMAGE_NIGHTLY_TAG} \
+ -t ${OTEL_COLLECTOR_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
+ -t ${OTEL_COLLECTOR_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG} \
+ --target prod \
+ --push \
+ --cache-from=type=gha \
+ --cache-to=type=gha,mode=max
+
.PHONY: release-local
release-local:
- docker buildx build --squash . -f ./docker/local/Dockerfile \
+ docker buildx build --squash . -f ./docker/hyperdx/Dockerfile \
--build-context clickhouse=./docker/clickhouse \
--build-context otel-collector=./docker/otel-collector \
- --build-context local=./docker/local \
+ --build-context hyperdx=./docker/hyperdx \
--build-context api=./packages/api \
--build-context app=./packages/app \
--platform ${BUILD_PLATFORMS} \
@@ -84,41 +96,15 @@ release-local:
-t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
-t ${LOCAL_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG} \
-t ${LOCAL_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
- --push \
- --cache-from=type=gha \
- --cache-to=type=gha,mode=max
-
-.PHONY: release-local-ui
-release-local-ui:
- docker buildx build . -f ./packages/app/Dockerfile \
- --build-arg IS_LOCAL_MODE=true \
- --build-arg PORT=${HYPERDX_APP_PORT} \
- --target prod \
- --platform ${BUILD_PLATFORMS} \
- -t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}-ui \
- -t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_NIGHTLY_TAG}-ui \
- -t ${LOCAL_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}-ui \
- -t ${LOCAL_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG}-ui \
- --push \
- --cache-from=type=gha \
- --cache-to=type=gha,mode=max
-
-.PHONY: release-otel-collector
-release-otel-collector:
- docker buildx build --platform ${BUILD_PLATFORMS} ./docker/otel-collector \
- -t ${OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
- -t ${OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB}:${IMAGE_NIGHTLY_TAG} \
- -t ${OTEL_COLLECTOR_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
- -t ${OTEL_COLLECTOR_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG} \
- --target prod \
+ --target all-in-one \
--push \
--cache-from=type=gha \
--cache-to=type=gha,mode=max
.PHONY: release-app
release-app:
- docker buildx build --squash . -f ./docker/fullstack/Dockerfile \
- --build-context fullstack=./docker/fullstack \
+ docker buildx build --squash . -f ./docker/hyperdx/Dockerfile \
+ --build-context hyperdx=./docker/hyperdx \
--build-context api=./packages/api \
--build-context app=./packages/app \
--platform ${BUILD_PLATFORMS} \
@@ -131,15 +117,18 @@ release-app:
--cache-from=type=gha \
--cache-to=type=gha,mode=max
-.PHONY: release-extended-app
-release-extended-app:
- docker buildx build --squash . -f ./docker/fullstack/Dockerfile \
- --build-context fullstack=./docker/fullstack \
- --build-context api=./packages/api \
- --build-context app=./packages/app \
- --platform ${BUILD_PLATFORMS} \
- -t ${IMAGE_NAME_DOCKERHUB}:latest \
- --target prod-extended \
- --push \
- --cache-from=type=gha \
- --cache-to=type=gha,mode=max
+# .PHONY: release-local-ui
+# release-local-ui:
+# docker buildx build . -f ./packages/app/Dockerfile \
+# --build-arg IS_LOCAL_MODE=true \
+# --build-arg PORT=${HYPERDX_APP_PORT} \
+# --target prod \
+# --platform ${BUILD_PLATFORMS} \
+# -t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}-ui \
+# -t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_NIGHTLY_TAG}-ui \
+# -t ${LOCAL_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}-ui \
+# -t ${LOCAL_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG}-ui \
+# --push \
+# --cache-from=type=gha \
+# --cache-to=type=gha,mode=max
+
From 08b9f796b3ca0f482b930d119ed2b8f2815b989a Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 21:06:50 -0700
Subject: [PATCH 07/18] feat: introduce 'all-in-one-auth' and
'all-in-one-noauth' stages
---
docker/hyperdx/Dockerfile | 18 ++++++++++++++----
docker/hyperdx/build.sh | 3 ++-
docker/hyperdx/entry.local.auth.sh | 7 +++++++
docker/hyperdx/entry.local.noauth.sh | 7 +++++++
docker/hyperdx/entry.local.sh | 7 ++++++-
5 files changed, 36 insertions(+), 6 deletions(-)
create mode 100755 docker/hyperdx/entry.local.auth.sh
create mode 100755 docker/hyperdx/entry.local.noauth.sh
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 3f0afed086..90f5deb490 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -84,13 +84,13 @@ COPY --from=app_builder /app/app/package.json ./package.json
COPY --chown=node:node --from=hyperdx ./entry.prod.sh /etc/local/entry.sh
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
-# prod-extended ############################################################################################
-FROM scratch AS all-in-one
+# all-in-one base ############################################################################################
+FROM scratch AS all-in-one-base
# Copy base
COPY --from=clickhouse_base / /
COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
-COPY --from=node_base --link /usrlocal./local/bin /usr/local/bin
+COPY --from=node_base --link /usr/local/bin /usr/local/bin
COPY --from=node_base --link /usr/local/lib /usr/local/lib
COPY --from=node_base /usr/lib /usr/lib
COPY --from=node_base /usr/local/include /usr/local/include
@@ -120,9 +120,19 @@ ENV NODE_ENV production
# Set up App
COPY --from=prod /app/api /app/api
COPY --from=prod /app/app /app/app
-COPY --from=hyperdx ./entry.local.sh /etc/local/entry.sh
+COPY --from=hyperdx ./entry.local.sh /etc/local/entry.base.sh
WORKDIR /app/app
# Expose ports
EXPOSE 8080 4317 4318 13133 8123 9000
+
+# all-in-one no auth ############################################################################################
+FROM all-in-one-base AS all-in-one-noauth
+COPY --from=hyperdx ./entry.local.noauth.sh /etc/local/entry.sh
+ENTRYPOINT ["sh", "/etc/local/entry.sh"]
+
+# all-in-one with auth ############################################################################################
+FROM all-in-one-base AS all-in-one-auth
+COPY --from=hyperdx ./entry.local.auth.sh /etc/local/entry.sh
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
+
diff --git a/docker/hyperdx/build.sh b/docker/hyperdx/build.sh
index df6e442518..63eb6e699c 100755
--- a/docker/hyperdx/build.sh
+++ b/docker/hyperdx/build.sh
@@ -1,10 +1,11 @@
#!/bin/bash
# Meant to be run from the root of the repo
+# No Auth
docker build --squash . -f ./docker/hyperdx/Dockerfile \
--build-context clickhouse=./docker/clickhouse \
--build-context otel-collector=./docker/otel-collector \
--build-context hyperdx=./docker/hyperdx \
--build-context api=./packages/api \
--build-context app=./packages/app \
- --target all-in-one -t hyperdx/dev-all-in-one
+ --target all-in-one-noauth -t hyperdx/dev-all-in-one-noauth
diff --git a/docker/hyperdx/entry.local.auth.sh b/docker/hyperdx/entry.local.auth.sh
new file mode 100755
index 0000000000..a6d88f10ea
--- /dev/null
+++ b/docker/hyperdx/entry.local.auth.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# Set auth mode
+export IS_LOCAL_APP_MODE="REQUIRED_AUTH"
+
+# Source the common entry script
+source "/etc/local/entry.base.sh"
diff --git a/docker/hyperdx/entry.local.noauth.sh b/docker/hyperdx/entry.local.noauth.sh
new file mode 100755
index 0000000000..ec34afa369
--- /dev/null
+++ b/docker/hyperdx/entry.local.noauth.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# Set no auth mode
+export IS_LOCAL_APP_MODE="DANGEROUSLY_is_local_app_modeđź’€"
+
+# Source the common entry script
+source "/etc/local/entry.base.sh"
diff --git a/docker/hyperdx/entry.local.sh b/docker/hyperdx/entry.local.sh
index a3fe418479..1a77201d1c 100644
--- a/docker/hyperdx/entry.local.sh
+++ b/docker/hyperdx/entry.local.sh
@@ -15,7 +15,9 @@ export CLICKHOUSE_SERVER_ENDPOINT="ch-server:9000"
export MONGO_URI="mongodb://db:27017/hyperdx"
export EXPRESS_SESSION_SECRET="hyperdx is cool đź‘‹"
-export IS_LOCAL_APP_MODE="DANGEROUSLY_is_local_app_modeđź’€"
+# IS_LOCAL_APP_MODE should be set by the calling script
+# Default to dangerous mode if not set
+export IS_LOCAL_APP_MODE="${IS_LOCAL_APP_MODE}"
export NEXT_TELEMETRY_DISABLED="1"
@@ -25,6 +27,8 @@ echo "127.0.0.1 db" >> /etc/hosts
echo "Visit the HyperDX UI at $FRONTEND_URL/search"
echo ""
+echo "Local App Mode: $IS_LOCAL_APP_MODE"
+echo ""
echo "Send OpenTelemetry data via"
echo "http/protobuf: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318"
echo "gRPC: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317"
@@ -42,6 +46,7 @@ while ! curl -s "http://ch-server:8123" > /dev/null; do
echo "Waiting for Clickhouse to be ready..."
sleep 1
done
+
# Start Otel Collector
otelcol-contrib --config /etc/otelcol-contrib/config.yaml &
From 8dbfa41a3d313f985d5cf447f109db5e691cb0c0 Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 21:17:28 -0700
Subject: [PATCH 08/18] feat: update Makefile
---
Makefile | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index 7028285bca..e524bc6a7d 100644
--- a/Makefile
+++ b/Makefile
@@ -96,7 +96,25 @@ release-local:
-t ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
-t ${LOCAL_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG} \
-t ${LOCAL_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
- --target all-in-one \
+ --target all-in-one-noauth \
+ --push \
+ --cache-from=type=gha \
+ --cache-to=type=gha,mode=max
+
+.PHONY: release-all-in-one
+release-all-in-one:
+ docker buildx build --squash . -f ./docker/hyperdx/Dockerfile \
+ --build-context clickhouse=./docker/clickhouse \
+ --build-context otel-collector=./docker/otel-collector \
+ --build-context hyperdx=./docker/hyperdx \
+ --build-context api=./packages/api \
+ --build-context app=./packages/app \
+ --platform ${BUILD_PLATFORMS} \
+ -t ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_NIGHTLY_TAG} \
+ -t ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
+ -t ${ALL_IN_ONE_IMAGE_NAME}:${IMAGE_NIGHTLY_TAG} \
+ -t ${ALL_IN_ONE_IMAGE_NAME}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} \
+ --target all-in-one-auth \
--push \
--cache-from=type=gha \
--cache-to=type=gha,mode=max
@@ -117,6 +135,7 @@ release-app:
--cache-from=type=gha \
--cache-to=type=gha,mode=max
+# DEPRECATED
# .PHONY: release-local-ui
# release-local-ui:
# docker buildx build . -f ./packages/app/Dockerfile \
From ed0beb7a3a0042944c1699653ea736172a142cd7 Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 21:41:16 -0700
Subject: [PATCH 09/18] feat: command to release stable to dockerhub
---
Makefile | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/Makefile b/Makefile
index e524bc6a7d..3bbdbefd28 100644
--- a/Makefile
+++ b/Makefile
@@ -135,6 +135,21 @@ release-app:
--cache-from=type=gha \
--cache-to=type=gha,mode=max
+.PHONY: release-stable
+release-stable:
+ # hyperdx/hyperdx-all-in-one
+ docker pull ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
+ docker tag ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+ docker push ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+ # hyperdx/hyperdx
+ docker pull ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
+ docker tag ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+ docker push ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+ # hyperdx/hyperdx-local
+ docker pull ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
+ docker tag ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+ docker push ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
+
# DEPRECATED
# .PHONY: release-local-ui
# release-local-ui:
From 3823877ba5044fa2489b4b031986c8f4b332b9e9 Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 21:42:25 -0700
Subject: [PATCH 10/18] feat: update release workflow
---
.github/workflows/release.yml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c6f353cf92..503f2ac0b8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -50,11 +50,10 @@ jobs:
strategy:
matrix:
release:
+ - release-all-in-one
- release-app
- - release-otel-collector
- release-local
- - release-local-ui
- # - release-extended-app
+ - release-otel-collector
steps:
- name: Checkout
uses: actions/checkout@v4
From b5c9ab429790b8fd7cd30bd65a978d14b4969cbd Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Thu, 15 May 2025 21:58:19 -0700
Subject: [PATCH 11/18] docs: add changeset
---
.changeset/tricky-bees-hide.md | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 .changeset/tricky-bees-hide.md
diff --git a/.changeset/tricky-bees-hide.md b/.changeset/tricky-bees-hide.md
new file mode 100644
index 0000000000..98aa53e5bc
--- /dev/null
+++ b/.changeset/tricky-bees-hide.md
@@ -0,0 +1,7 @@
+---
+"@hyperdx/app": patch
+"@hyperdx/api": patch
+"@hyperdx/common-utils": patch
+---
+
+feat: introduce all-one-one (auth vs noauth) multi-stage build
From 84eb17577cd1778831926620745d162dc199e9df Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Fri, 16 May 2025 09:44:38 -0700
Subject: [PATCH 12/18] feat: attach env info to health check
---
packages/api/src/routers/api/root.ts | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/packages/api/src/routers/api/root.ts b/packages/api/src/routers/api/root.ts
index e3d8fae528..7b9e31ba24 100644
--- a/packages/api/src/routers/api/root.ts
+++ b/packages/api/src/routers/api/root.ts
@@ -44,7 +44,12 @@ const registrationSchema = z
const router = express.Router();
router.get('/health', async (req, res) => {
- res.send({ data: 'OK', version: config.CODE_VERSION, ip: req.ip });
+ res.send({
+ data: 'OK',
+ version: config.CODE_VERSION,
+ ip: req.ip,
+ env: config.NODE_ENV,
+ });
});
router.get('/installation', async (req, res, next) => {
From d2456be454572fed3ca24cbebeeb0bcbc5cc31c1 Mon Sep 17 00:00:00 2001
From: Warren <5959690+wrn14897@users.noreply.github.com>
Date: Fri, 16 May 2025 09:58:04 -0700
Subject: [PATCH 13/18] perf: cleanup all-in-one-base stage build
---
docker/hyperdx/Dockerfile | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 90f5deb490..2024c2da32 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -87,42 +87,42 @@ ENTRYPOINT ["sh", "/etc/local/entry.sh"]
# all-in-one base ############################################################################################
FROM scratch AS all-in-one-base
-# Copy base
+# Copy from clickhouse and otel collector bases
COPY --from=clickhouse_base / /
COPY --from=otel_collector_base /otelcol-contrib /usr/local/bin/otelcol-contrib
+
+# Copy Node.js runtime from node base
COPY --from=node_base --link /usr/local/bin /usr/local/bin
COPY --from=node_base --link /usr/local/lib /usr/local/lib
COPY --from=node_base /usr/lib /usr/lib
COPY --from=node_base /usr/local/include /usr/local/include
-
# Set up Clickhouse
COPY --from=clickhouse ./local/*.xml /etc/clickhouse-server
-# overwrite default config
COPY --from=hyperdx ./clickhouseConfig.xml /etc/clickhouse-server/config.xml
+
# Set up Otel Collector
COPY --from=otel-collector ./config.yaml /etc/otelcol-contrib/config.yaml
-# == Install MongoDB v4 Deps ==
-RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories
-RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories
-RUN apk update
-RUN apk add mongodb yaml-cpp=0.6.2-r2
-
-# Install libs used for the start script
-RUN apk add curl
-
-# Set up Mongo directories with proper permissions
-RUN mkdir -p /data/db
+# Install MongoDB and other dependencies (consolidated into a single RUN command)
+RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories && \
+ echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories && \
+ apk update && \
+ apk add --no-cache mongodb yaml-cpp=0.6.2-r2 curl && \
+ mkdir -p /data/db && \
+ rm -rf /var/cache/apk/*
ENV NODE_ENV production
-# Set up App
+# Set up App (copy from prod stage)
COPY --from=prod /app/api /app/api
COPY --from=prod /app/app /app/app
COPY --from=hyperdx ./entry.local.sh /etc/local/entry.base.sh
WORKDIR /app/app
+
+# Add hosts entry in entrypoint script instead of here
+
# Expose ports
EXPOSE 8080 4317 4318 13133 8123 9000
From e1358e0471289f466959828abca2640882fa05b2 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Fri, 16 May 2025 11:13:18 -0700
Subject: [PATCH 14/18] docs: update comment
---
docker/hyperdx/Dockerfile | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 2024c2da32..2697f3a028 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -1,6 +1,11 @@
-# Starts several services in a single container for local use
+# Starts several services in a single container
+# For production build:
# - API (Node)
# - App (Frontend)
+# For all-in-one build:
+# - Clickhouse
+# - Mongo
+# - Otel Collector (otelcol)
ARG NODE_VERSION=22.14.0
ARG CLICKHOUSE_VERSION=24
From 10b75e39d460d7597f2ab3e291fdd35a60ee93b0 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Fri, 16 May 2025 16:54:58 -0700
Subject: [PATCH 15/18] fix: alerting in local mode
---
packages/api/src/controllers/team.ts | 2 +-
packages/api/src/tasks/checkAlerts.ts | 14 ++++++++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/packages/api/src/controllers/team.ts b/packages/api/src/controllers/team.ts
index a65418a773..ee5c26ae18 100644
--- a/packages/api/src/controllers/team.ts
+++ b/packages/api/src/controllers/team.ts
@@ -7,7 +7,7 @@ import { SavedSearch } from '@/models/savedSearch';
import Team from '@/models/team';
const LOCAL_APP_TEAM_ID = '_local_team_';
-const LOCAL_APP_TEAM = {
+export const LOCAL_APP_TEAM = {
_id: LOCAL_APP_TEAM_ID,
id: LOCAL_APP_TEAM_ID,
name: 'Local App Team',
diff --git a/packages/api/src/tasks/checkAlerts.ts b/packages/api/src/tasks/checkAlerts.ts
index 67b50d4633..942c916b82 100644
--- a/packages/api/src/tasks/checkAlerts.ts
+++ b/packages/api/src/tasks/checkAlerts.ts
@@ -21,6 +21,7 @@ import { URLSearchParams } from 'url';
import * as config from '@/config';
import { AlertInput } from '@/controllers/alerts';
import { getConnectionById } from '@/controllers/connection';
+import { LOCAL_APP_TEAM } from '@/controllers/team';
import Alert, {
AlertSource,
AlertState,
@@ -41,11 +42,20 @@ const NOTIFY_FN_NAME = '__hdx_notify_channel__';
const IS_MATCH_FN_NAME = 'is_match';
// TODO(perf): no need to populate the team
-const getAlerts = () =>
- Alert.find({}).populate<{
+const getAlerts = async () => {
+ const alerts = await Alert.find({}).populate<{
team: ITeam;
}>(['team']);
+ return config.IS_LOCAL_APP_MODE
+ ? alerts.map(_alert => {
+ // @ts-ignore
+ _alert.team = LOCAL_APP_TEAM;
+ return _alert;
+ })
+ : alerts;
+};
+
type EnhancedAlert = Awaited>[0];
export const buildLogSearchLink = ({
From 816f7c113cef47b060178162abcbd8e5ad980ae5 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Mon, 19 May 2025 14:54:30 -0700
Subject: [PATCH 16/18] feat: build common-utils on the fly
---
docker/hyperdx/Dockerfile | 66 +++++++++++++++--------------------
docker/hyperdx/entry.local.sh | 4 +--
docker/hyperdx/entry.prod.sh | 4 +--
3 files changed, 33 insertions(+), 41 deletions(-)
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 2697f3a028..3afbc01336 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -19,47 +19,36 @@ FROM otel/opentelemetry-collector-contrib:${OTEL_COLLECTOR_VERSION} AS otel_coll
FROM node:${NODE_VERSION}-alpine AS node_base
-WORKDIR /app/api
-
-COPY ./yarn.lock ./.yarnrc.yml ./
-COPY ./.yarn ./.yarn
-COPY --from=api ./package.json .
-RUN yarn install && yarn cache clean
+WORKDIR /app
-WORKDIR /app/app
+COPY .yarn ./.yarn
+COPY .yarnrc.yml yarn.lock package.json nx.json .prettierrc .prettierignore ./
+COPY ./packages/common-utils ./packages/common-utils
+COPY ./packages/api/jest.config.js ./packages/api/tsconfig.json ./packages/api/package.json ./packages/api/
+COPY ./packages/app/jest.config.js ./packages/app/tsconfig.json ./packages/app/tsconfig.test.json ./packages/app/package.json ./packages/app/next.config.js ./packages/app/mdx.d.ts ./packages/app/.eslintrc.js ./packages/app/
-COPY ./yarn.lock ./.yarnrc.yml ./
-COPY ./.yarn ./.yarn
-COPY --from=app ./package.json ./
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+RUN apk add --no-cache libc6-compat
-RUN yarn install && yarn cache clean
+RUN yarn install --mode=skip-build && yarn cache clean
-## API Builder Image ###############################################################################
-FROM node_base AS api_builder
-
-WORKDIR /app/api
+## API/APP Builder Image ##########################################################################
+FROM node_base AS builder
-COPY --from=api ./tsconfig.json ./
-COPY --from=api ./src ./src
-RUN yarn build && rm -rf node_modules && yarn workspaces focus --production
-
-
-# APP Builder Image ###############################################################################
-FROM node_base AS app_builder
-
-WORKDIR /app/app
+WORKDIR /app
-COPY --from=app ./.eslintrc.js ./next.config.js ./tsconfig.json ./next.config.js ./mdx.d.ts ./.eslintrc.js ./
-COPY --from=app ./src ./src
-COPY --from=app ./pages ./pages
-COPY --from=app ./public ./public
-COPY --from=app ./styles ./styles
+COPY --from=api ./src ./packages/api/src
+COPY --from=app ./src ./packages/app/src
+COPY --from=app ./pages ./packages/app/pages
+COPY --from=app ./public ./packages/app/public
+COPY --from=app ./styles ./packages/app/styles
ENV NEXT_TELEMETRY_DISABLED 1
ENV NEXT_OUTPUT_STANDALONE false
ENV NEXT_PUBLIC_IS_LOCAL_MODE false
-RUN yarn build && rm -rf node_modules && yarn workspaces focus --production
+RUN npx nx run-many --target=build --projects=@hyperdx/common-utils,@hyperdx/api,@hyperdx/app
+RUN rm -rf node_modules && yarn workspaces focus @hyperdx/api @hyperdx/app --production
# prod ############################################################################################
@@ -74,16 +63,19 @@ USER node
# Set up API
WORKDIR /app/api
-COPY --chown=node:node --from=api_builder ./app/api/build ./build
-COPY --chown=node:node --from=api_builder ./app/api/node_modules ./node_modules
+COPY --chown=node:node --from=builder /app/node_modules ./node_modules
+COPY --chown=node:node --from=builder /app/packages/api/build ./packages/api/build
+COPY --chown=node:node --from=builder /app/packages/common-utils/dist ./packages/common-utils/dist
+COPY --chown=node:node --from=node_base /app/packages/common-utils/node_modules ./packages/common-utils/node_modules
# Set up App
WORKDIR /app/app
-COPY --from=app_builder /app/app/next.config.js ./
-COPY --chown=node:node --from=app_builder /app/app/public ./public
-COPY --chown=node:node --from=app_builder /app/app/.next ./.next
-COPY --from=app_builder /app/app/node_modules ./node_modules
-COPY --from=app_builder /app/app/package.json ./package.json
+COPY --chown=node:node --from=builder /app/node_modules ./node_modules
+COPY --chown=node:node --from=builder /app/packages/app/public ./public
+COPY --chown=node:node --from=builder /app/packages/app/.next ./.next
+# COPY --chown=node:node --from=builder /app/packages/app/node_modules ./packages/app/node_modules
+COPY --from=builder /app/packages/app/next.config.js ./next.config.js
+COPY --from=builder /app/packages/app/package.json ./package.json
# Set up start script
COPY --chown=node:node --from=hyperdx ./entry.prod.sh /etc/local/entry.sh
diff --git a/docker/hyperdx/entry.local.sh b/docker/hyperdx/entry.local.sh
index 1a77201d1c..1bd106ff18 100644
--- a/docker/hyperdx/entry.local.sh
+++ b/docker/hyperdx/entry.local.sh
@@ -54,9 +54,9 @@ otelcol-contrib --config /etc/otelcol-contrib/config.yaml &
npx concurrently \
"--kill-others" \
"--names=API,APP,ALERT-TASK" \
- "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/index.js" \
+ "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/packages/api/build/index.js" \
"HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} /app/app/node_modules/.bin/next start -p ${HYPERDX_APP_PORT:-8080}" \
- "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/tasks/index.js check-alerts" \
+ "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/packages/api/build/tasks/index.js check-alerts" \
> /var/log/app.log 2>&1 &
# Wait for any process to exit
diff --git a/docker/hyperdx/entry.prod.sh b/docker/hyperdx/entry.prod.sh
index ef370aca52..0480f94b14 100644
--- a/docker/hyperdx/entry.prod.sh
+++ b/docker/hyperdx/entry.prod.sh
@@ -13,6 +13,6 @@ echo ""
npx concurrently \
"--kill-others" \
"--names=API,APP,ALERT-TASK" \
- "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/index.js" \
+ "PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/packages/api/build/index.js" \
"HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} /app/app/node_modules/.bin/next start -p ${HYPERDX_APP_PORT:-8080}" \
- "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/build/tasks/index.js check-alerts"
+ "node -r /app/api/node_modules/@hyperdx/node-opentelemetry/build/src/tracing /app/api/packages/api/build/tasks/index.js check-alerts"
From 605a3fc1c848434d53ec1702f17e763199238db3 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Mon, 19 May 2025 15:08:22 -0700
Subject: [PATCH 17/18] feedback: rename base entry file
---
docker/hyperdx/Dockerfile | 2 +-
docker/hyperdx/{entry.local.sh => entry.local.base.sh} | 0
2 files changed, 1 insertion(+), 1 deletion(-)
rename docker/hyperdx/{entry.local.sh => entry.local.base.sh} (100%)
diff --git a/docker/hyperdx/Dockerfile b/docker/hyperdx/Dockerfile
index 3afbc01336..81be09c946 100644
--- a/docker/hyperdx/Dockerfile
+++ b/docker/hyperdx/Dockerfile
@@ -114,7 +114,7 @@ ENV NODE_ENV production
# Set up App (copy from prod stage)
COPY --from=prod /app/api /app/api
COPY --from=prod /app/app /app/app
-COPY --from=hyperdx ./entry.local.sh /etc/local/entry.base.sh
+COPY --from=hyperdx ./entry.local.base.sh /etc/local/entry.base.sh
WORKDIR /app/app
diff --git a/docker/hyperdx/entry.local.sh b/docker/hyperdx/entry.local.base.sh
similarity index 100%
rename from docker/hyperdx/entry.local.sh
rename to docker/hyperdx/entry.local.base.sh
From f04669b04384b1860c666f82e951a2fb3781e573 Mon Sep 17 00:00:00 2001
From: Warren Lee <5959690+wrn14897@users.noreply.github.com>
Date: Mon, 19 May 2025 15:28:32 -0700
Subject: [PATCH 18/18] style: remove release-stable
---
Makefile | 15 ---------------
1 file changed, 15 deletions(-)
diff --git a/Makefile b/Makefile
index 3bbdbefd28..e524bc6a7d 100644
--- a/Makefile
+++ b/Makefile
@@ -135,21 +135,6 @@ release-app:
--cache-from=type=gha \
--cache-to=type=gha,mode=max
-.PHONY: release-stable
-release-stable:
- # hyperdx/hyperdx-all-in-one
- docker pull ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
- docker tag ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
- docker push ${ALL_IN_ONE_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
- # hyperdx/hyperdx
- docker pull ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
- docker tag ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
- docker push ${IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
- # hyperdx/hyperdx-local
- docker pull ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG}
- docker tag ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}${IMAGE_VERSION_SUB_TAG} ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
- docker push ${LOCAL_IMAGE_NAME_DOCKERHUB}:${IMAGE_VERSION}
-
# DEPRECATED
# .PHONY: release-local-ui
# release-local-ui: