diff --git a/Dockerfile b/Dockerfile index dadd715..544c9da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,6 +39,10 @@ COPY ./libs ./libs RUN npm ci --omit=dev --legacy-peer-deps \ && npm cache clean --force + +ENV NODE_ENV=production +ENV NODE_OPTIONS="--max-http-header-size=65536" + ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] -CMD ["npm", "run", "start:prod"] \ No newline at end of file +CMD ["node", "dist/src/main"] \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f8dbd1b --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +.PHONY: bump-patch bump-minor bump-major help tag-release + +# Default target +help: + @echo "Available targets:" + @echo " bump-patch - Bump patch version (x.x.X) and install dependencies" + @echo " bump-minor - Bump minor version (x.X.x) and install dependencies" + @echo " bump-major - Bump major version (X.x.x) and install dependencies" + @echo " tag-release - Create and push git tag for current version" + +# Bump patch version (0.0.1 -> 0.0.2) +bump-patch: + @echo "Bumping patch version..." + npm version patch --no-git-tag-version + @echo "New version: $$(node -p "require('./package.json').version")" + npm install + +# Bump minor version (0.1.0 -> 0.2.0) +bump-minor: + @echo "Bumping minor version..." + npm version minor --no-git-tag-version + @echo "New version: $$(node -p "require('./package.json').version")" + npm install +# Bump major version (1.0.0 -> 2.0.0) +bump-major: + @echo "Bumping major version..." + npm version major --no-git-tag-version + @echo "New version: $$(node -p "require('./package.json').version")" + npm install + +# Create and push git tag for current version +tag-release: + @VERSION=$$(node -p "require('./package.json').version") && \ + echo "Creating signed tag for version $$VERSION..." && \ + git tag -s "$$VERSION" -m "Release $$VERSION" && \ + git push origin --follow-tags && \ + echo "Signed tag $$VERSION created and pushed" + + + + + diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 9a90b2d..cbba487 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -26,15 +26,3 @@ services: networks: remnawave-node-dev: external: false -# services: -# remnawave-node: -# container_name: remnawave-node -# hostname: remnawave-node -# build: -# context: . -# dockerfile: Dockerfile - -# env_file: -# - .env -# ports: -# - 24000:24000 diff --git a/docker-compose-local.yml b/docker-compose-local.yml new file mode 100644 index 0000000..e73452f --- /dev/null +++ b/docker-compose-local.yml @@ -0,0 +1,10 @@ +services: + remnawave-node-local: + container_name: remnawave-node-local + hostname: remnawave-node-local + build: + context: . + dockerfile: Dockerfile + network_mode: host + env_file: + - .env diff --git a/package-lock.json b/package-lock.json index 0fc5aed..d5d1322 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@remnawave/node", - "version": "2.1.2", + "version": "2.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@remnawave/node", - "version": "2.1.2", + "version": "2.1.3", "license": "AGPL-3.0-only", "dependencies": { "@cjs-exporter/execa": "9.5.2", diff --git a/package.json b/package.json index c9f5131..9a99b2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@remnawave/node", - "version": "2.1.2", + "version": "2.1.3", "description": "Remnawave Node", "private": false, "type": "commonjs", @@ -92,4 +92,4 @@ "tsconfig-paths": "^4.2.0", "typescript": "~5.8.2" } -} \ No newline at end of file +} diff --git a/src/main.ts b/src/main.ts index 7ff8ffa..bcf15d4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -78,7 +78,6 @@ async function bootstrap(): Promise { }); app.useGlobalPipes(new ZodValidationPipe()); - app.enableShutdownHooks(); await app.listen(Number(config.getOrThrow('APP_PORT'))); @@ -97,7 +96,23 @@ async function bootstrap(): Promise { }, ); - internalApp.listen(XRAY_INTERNAL_API_PORT, '127.0.0.1'); + const internalServer = internalApp.listen(XRAY_INTERNAL_API_PORT, '127.0.0.1'); + + let internalServerClosed = false; + + const closeInternalServer = () => { + if (internalServerClosed) return; + internalServerClosed = true; + + internalServer.close(() => { + logger.info('Shutting down...'); + }); + }; + + app.enableShutdownHooks(); + + process.on('SIGINT', closeInternalServer); + process.on('SIGTERM', closeInternalServer); logger.info( '\n' + diff --git a/src/modules/internal/internal.module.ts b/src/modules/internal/internal.module.ts index f9ae658..58afabc 100644 --- a/src/modules/internal/internal.module.ts +++ b/src/modules/internal/internal.module.ts @@ -1,4 +1,4 @@ -import { Global, Module } from '@nestjs/common'; +import { Global, Logger, Module, OnApplicationShutdown } from '@nestjs/common'; import { InternalController } from './internal.controller'; import { InternalService } from './internal.service'; @@ -10,4 +10,10 @@ import { InternalService } from './internal.service'; controllers: [InternalController], exports: [InternalService], }) -export class InternalModule {} +export class InternalModule implements OnApplicationShutdown { + private readonly logger = new Logger(InternalModule.name); + + async onApplicationShutdown(signal?: string): Promise { + this.logger.log(`${signal} received, shutting down...`); + } +} diff --git a/src/modules/remnawave-node.modules.ts b/src/modules/remnawave-node.modules.ts index 2eb8874..ba5ed30 100644 --- a/src/modules/remnawave-node.modules.ts +++ b/src/modules/remnawave-node.modules.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { Logger, Module, OnApplicationShutdown } from '@nestjs/common'; import { HandlerModule } from './handler/handler.module'; import { VisionModule } from './vision/vision.module'; @@ -9,4 +9,10 @@ import { StatsModule } from './stats/stats.module'; imports: [StatsModule, XrayModule, HandlerModule, VisionModule], providers: [], }) -export class RemnawaveNodeModules {} +export class RemnawaveNodeModules implements OnApplicationShutdown { + private readonly logger = new Logger(RemnawaveNodeModules.name); + + async onApplicationShutdown(signal?: string): Promise { + this.logger.log(`${signal} received, shutting down...`); + } +}