Skip to content

Commit ad68877

Browse files
authored
feat: bundle api for image size reduction (#937)
all-in-one image: 1.51 gb -> 1.21 gb app image: 573 mb -> 271 mb Ref HDX-1803
1 parent b3b02b8 commit ad68877

File tree

8 files changed

+286
-18
lines changed

8 files changed

+286
-18
lines changed

.changeset/gentle-cheetahs-carry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hyperdx/api": patch
3+
---
4+
5+
feat: bundle api via esbuild for smaller image distribution

docker/hyperdx/Dockerfile

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ ARG OTEL_COLLECTOR_VERSION=0.126.0
1313
ARG OTEL_COLLECTOR_OPAMPSUPERVISOR_VERSION=0.126.0
1414

1515
# base #############################################################################################
16-
# == Clickhouse/Base Image ==
17-
FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS clickhouse_base
1816
# == Otel Collector Image ==
1917
FROM otel/opentelemetry-collector-contrib:${OTEL_COLLECTOR_VERSION} AS otel_collector_base
2018
FROM otel/opentelemetry-collector-opampsupervisor:${OTEL_COLLECTOR_OPAMPSUPERVISOR_VERSION} AS otel_collector_opampsupervisor_base
@@ -51,8 +49,6 @@ ENV NEXT_TELEMETRY_DISABLED 1
5149
ENV NEXT_OUTPUT_STANDALONE true
5250
ENV NEXT_PUBLIC_IS_LOCAL_MODE false
5351
RUN npx nx run-many --target=build --projects=@hyperdx/common-utils,@hyperdx/api,@hyperdx/app
54-
RUN rm -rf node_modules && yarn workspaces focus @hyperdx/api --production
55-
5652

5753
# prod ############################################################################################
5854
FROM node:${NODE_VERSION}-alpine AS prod
@@ -69,10 +65,7 @@ USER node
6965

7066
# Set up API and App
7167
WORKDIR /app
72-
COPY --chown=node:node --from=builder /app/node_modules ./node_modules
73-
COPY --chown=node:node --from=builder /app/packages/api/build ./packages/api/build
74-
COPY --chown=node:node --from=builder /app/packages/common-utils/dist ./packages/common-utils/dist
75-
COPY --chown=node:node --from=node_base /app/packages/common-utils/node_modules ./packages/common-utils/node_modules
68+
COPY --chown=node:node --from=builder /app/packages/api/dist ./packages/api
7669
COPY --chown=node:node --from=builder /app/packages/app/.next/standalone ./packages/app
7770
COPY --chown=node:node --from=builder /app/packages/app/.next/static ./packages/app/packages/app/.next/static
7871
COPY --chown=node:node --from=builder /app/packages/app/public ./packages/app/packages/app/public
@@ -82,13 +75,12 @@ COPY --chown=node:node --from=hyperdx ./entry.prod.sh /etc/local/entry.sh
8275
ENTRYPOINT ["sh", "/etc/local/entry.sh"]
8376

8477
# all-in-one base ############################################################################################
85-
FROM scratch AS all-in-one-base
78+
FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS all-in-one-base
8679

8780
ARG CODE_VERSION
8881

8982
ENV CODE_VERSION=$CODE_VERSION
90-
# Copy from clickhouse and otel collector bases
91-
COPY --from=clickhouse_base / /
83+
# Copy from otel collector bases
9284
COPY --from=otel_collector_base --chmod=755 /otelcol-contrib /otelcontribcol
9385
COPY --from=otel_collector_opampsupervisor_base --chmod=755 /usr/local/bin/opampsupervisor /usr/local/bin/opampsupervisor
9486

@@ -98,6 +90,9 @@ COPY --from=node_base --link /usr/local/lib /usr/local/lib
9890
COPY --from=node_base /usr/lib /usr/lib
9991
COPY --from=node_base /usr/local/include /usr/local/include
10092

93+
# Install libs used for the start script
94+
RUN npm install -g [email protected]
95+
10196
# Set up Clickhouse
10297
COPY --from=clickhouse ./local/*.xml /etc/clickhouse-server
10398
COPY --from=hyperdx ./clickhouseConfig.xml /etc/clickhouse-server/config.xml

docker/hyperdx/entry.local.base.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ opampsupervisor --config /etc/otel/supervisor.yaml > /var/log/otel-collector.log
6161
npx concurrently \
6262
"--kill-others" \
6363
"--names=API,APP,ALERT-TASK" \
64-
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r ./node_modules/@hyperdx/node-opentelemetry/build/src/tracing ./packages/api/build/index.js" \
64+
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r ./packages/api/tracing ./packages/api/index" \
6565
"cd ./packages/app/packages/app && HOSTNAME='0.0.0.0' HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} PORT=${HYPERDX_APP_PORT:-8080} node server.js" \
66-
"node -r ./node_modules/@hyperdx/node-opentelemetry/build/src/tracing ./packages/api/build/tasks/index.js check-alerts" \
66+
"node -r ./packages/api/tracing ./packages/api/tasks/index check-alerts"
6767
> /var/log/app.log 2>&1 &
6868

6969
echo ""

docker/hyperdx/entry.prod.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ echo ""
1515
npx concurrently \
1616
"--kill-others" \
1717
"--names=API,APP,ALERT-TASK" \
18-
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r ./node_modules/@hyperdx/node-opentelemetry/build/src/tracing ./packages/api/build/index.js" \
18+
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r ./packages/api/tracing ./packages/api/index" \
1919
"cd ./packages/app/packages/app && HOSTNAME='0.0.0.0' HYPERDX_API_PORT=${HYPERDX_API_PORT:-8000} PORT=${HYPERDX_APP_PORT:-8080} node server.js" \
20-
"node -r ./node_modules/@hyperdx/node-opentelemetry/build/src/tracing ./packages/api/build/tasks/index.js check-alerts"
20+
"node -r ./packages/api/tracing ./packages/api/tasks/index check-alerts"

packages/api/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"@types/supertest": "^2.0.12",
7676
"@types/swagger-jsdoc": "^6",
7777
"@types/uuid": "^8.3.4",
78+
"esbuild": "^0.25.5",
7879
"jest": "^28.1.3",
7980
"migrate-mongo": "^11.0.0",
8081
"nodemon": "^2.0.20",
@@ -89,10 +90,10 @@
8990
"typescript": "^4.9.5"
9091
},
9192
"scripts": {
92-
"start": "node ./build/index.js",
93+
"start": "node ./dist/index.js",
9394
"dev": "DOTENV_CONFIG_PATH=.env.development nodemon --signal SIGTERM -e ts,json --exec 'ts-node' --transpile-only -r tsconfig-paths/register -r dotenv-expand/config -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/index.ts",
9495
"dev-task": "DOTENV_CONFIG_PATH=.env.development nodemon --signal SIGTERM -e ts,json --exec 'ts-node' --transpile-only -r tsconfig-paths/register -r dotenv-expand/config -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/tasks/index.ts",
95-
"build": "rimraf ./build && tsc && tsc-alias && cp -r src/opamp/proto build/opamp/",
96+
"build": "tsc && tsc-alias && esbuild ../../node_modules/@hyperdx/node-opentelemetry/build/src/tracing --bundle --minify --platform=node --outfile=dist/tracing.js && esbuild ./build/src/index.js ./build/src/tasks/index.js --bundle --minify --platform=node --target=node22 --outdir=dist --alias:@='./src' && mkdir -p dist/opamp && cp -r src/opamp/proto dist/opamp/proto && rimraf ./build",
9697
"lint": "eslint --quiet . --ext .ts",
9798
"lint:fix": "eslint . --ext .ts --fix",
9899
"ci:lint": "yarn lint && yarn tsc --noEmit",

packages/api/src/opamp/utils/protobuf.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import * as fs from 'fs';
33
import * as path from 'path';
44
import * as protobuf from 'protobufjs';
55

6+
import { IS_PROD } from '@/config';
67
import logger from '@/utils/logger';
78

89
// Define the root path of the proto file
9-
const PROTO_PATH = path.resolve(__dirname, '../proto/opamp.proto');
10+
const PROTO_PATH = path.resolve(
11+
__dirname,
12+
`${IS_PROD ? 'opamp' : '..'}/proto/opamp.proto`,
13+
);
1014

1115
// Load the OpAMP proto definition
1216
let root: protobuf.Root;

packages/api/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"paths": {
55
"@/*": ["./*"]
66
},
7+
"rootDir": ".",
78
"allowSyntheticDefaultImports": true,
89
"downlevelIteration": true,
910
"esModuleInterop": true,

0 commit comments

Comments
 (0)