Skip to content

feat: use esbuild for building the api in docker #876

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions .changeset/tricky-laws-march.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hyperdx/api": patch
---

api is now bundled in build and the Dockerfile benefits greatly
7 changes: 2 additions & 5 deletions docker/hyperdx/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ WORKDIR /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/api/jest.config.js ./packages/api/tsconfig.json ./packages/api/package.json ./packages/api/build.js ./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/

# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
Expand Down Expand Up @@ -68,10 +68,7 @@ USER node

# Set up API
WORKDIR /app/api
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
COPY --chown=node:node --from=builder /app/packages/api/dist ./dist

# Set up App
WORKDIR /app/app
Expand Down
4 changes: 2 additions & 2 deletions docker/hyperdx/entry.local.base.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ opampsupervisor --config /etc/otel/supervisor.yaml > /var/log/otel-collector.log
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/packages/api/build/index.js" \
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/dist/tracing.bundle.js /app/api/dist/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/packages/api/build/tasks/index.js check-alerts" \
"node -r /app/api/dist/tracing.bundle.js /app/api/dist/tasks/index.js check-alerts" \
> /var/log/app.log 2>&1 &

echo ""
Expand Down
4 changes: 2 additions & 2 deletions docker/hyperdx/entry.prod.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,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/packages/api/build/index.js" \
"PORT=${HYPERDX_API_PORT:-8000} HYPERDX_APP_PORT=${HYPERDX_APP_PORT:-8080} node -r /app/api/dist/tracing.bundle.js /app/api/dist/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/packages/api/build/tasks/index.js check-alerts"
"node -r /app/api/dist/tracing.bundle.js /app/api/dist/tasks/index.js check-alerts"
42 changes: 42 additions & 0 deletions packages/api/build.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const esbuild = require('esbuild');
const path = require('path');
const fs = require('fs');

async function build() {
try {
// Make sure dist directory exists
const distDir = path.resolve(__dirname, 'dist');
if (!fs.existsSync(distDir)) {
fs.mkdirSync(distDir, { recursive: true });
}

// Build main application
await esbuild.build({
entryPoints: ['src/index.ts', 'src/tasks/index.ts'],
bundle: true,
platform: 'node',
target: 'node22',
outdir: 'dist',
sourcemap: false,
minify: true,
format: 'cjs',
define: {
'process.env.NODE_ENV': '"production"',
},
banner: {
js: '#!/usr/bin/env node',
},
alias: {
// Add path aliases from tsconfig
'@': path.resolve(__dirname, 'src'),
},
});

console.log('Build completed successfully!');
} catch (error) {
console.error('Build failed:', error);
process.exit(1);
}
}

build();
5 changes: 3 additions & 2 deletions packages/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"@types/supertest": "^2.0.12",
"@types/swagger-jsdoc": "^6",
"@types/uuid": "^8.3.4",
"esbuild": "^0.21.0",
"jest": "^28.1.3",
"migrate-mongo": "^11.0.0",
"nodemon": "^2.0.20",
Expand All @@ -89,10 +90,10 @@
"typescript": "^4.9.5"
},
"scripts": {
"start": "node ./build/index.js",
"start": "node ./dist/index.js",
"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",
"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",
"build": "rimraf ./build && tsc && tsc-alias && cp -r src/opamp/proto build/opamp/",
"build": "rimraf ./dist && node ./build.js && esbuild ../../node_modules/@hyperdx/node-opentelemetry/build/src/tracing --bundle --minify --platform=node --outfile=dist/tracing.bundle.js && cp -r src/opamp/proto dist/opamp/",
"lint": "eslint --quiet . --ext .ts",
"lint:fix": "eslint . --ext .ts --fix",
"ci:lint": "yarn lint && yarn tsc --noEmit",
Expand Down
6 changes: 5 additions & 1 deletion packages/api/src/opamp/utils/protobuf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ import * as fs from 'fs';
import * as path from 'path';
import * as protobuf from 'protobufjs';

import { IS_PROD } from '@/config';
import logger from '@/utils/logger';

// Define the root path of the proto file
const PROTO_PATH = path.resolve(__dirname, '../proto/opamp.proto');
const PROTO_PATH = path.resolve(
__dirname,
IS_PROD ? 'opamp/opamp.proto' : '../proto/opamp.proto',
);

// Load the OpAMP proto definition
let root: protobuf.Root;
Expand Down
Loading