Support LiteSpeed /server path via GLOBAL_PREFIX

Allow Nest prefix server/api and overlay dist from git onto the deploy bundle so proxy paths match without a full retar.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-06 09:55:57 +03:30
co-authored by Cursor
parent 2d513a81af
commit b121797263
6 changed files with 19 additions and 11 deletions
+2
View File
@@ -3,4 +3,6 @@
!Dockerfile
!docker-compose.yml
!docker-entrypoint.sh
!dist
!dist/**
!.env.example
+2
View File
@@ -11,6 +11,8 @@ DATABASE_URL=postgresql://fabric:fabric123@localhost:5432/fabric_trade?schema=pu
API_PORT=8585
PORT=3000
# پشت LiteSpeed با URI=/server این را بگذار:
GLOBAL_PREFIX=server/api
API_IMAGE=fabric-trade-api:latest
RUN_SEED=false
+3 -2
View File
@@ -1,5 +1,4 @@
# bookworm کامل (نه slim) تا OpenSSL از قبل داخل ایمیج باشد
# سرورهای ایران معمولاً به deb.debian.org دسترسی ندارند
# bookworm کامل تا OpenSSL آماده باشد (بدون apt روی سرور ایران)
FROM node:22-bookworm
WORKDIR /app
@@ -9,6 +8,8 @@ COPY deploy-bundle.tar.gz /tmp/deploy-bundle.tar.gz
RUN tar -xzf /tmp/deploy-bundle.tar.gz -C /app \
&& rm /tmp/deploy-bundle.tar.gz
# dist و entrypoint از گیت — بدون بازسازی کل باندل
COPY dist /app/dist
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
RUN chmod +x /app/docker-entrypoint.sh
+5 -4
View File
@@ -6,7 +6,8 @@ const swagger_1 = require("@nestjs/swagger");
const app_module_1 = require("./app.module");
async function bootstrap() {
const app = await core_1.NestFactory.create(app_module_1.AppModule);
app.setGlobalPrefix('api');
const globalPrefix = process.env.GLOBAL_PREFIX || 'api';
app.setGlobalPrefix(globalPrefix);
app.enableCors({
origin: true,
credentials: true,
@@ -24,11 +25,11 @@ async function bootstrap() {
.addBearerAuth()
.build();
const document = swagger_1.SwaggerModule.createDocument(app, swaggerConfig);
swagger_1.SwaggerModule.setup('api/docs', app, document);
swagger_1.SwaggerModule.setup(`${globalPrefix}/docs`, app, document);
const port = process.env.PORT ?? 3000;
await app.listen(port);
console.log(`Fabric Trade API listening on http://localhost:${port}/api`);
console.log(`Swagger docs at http://localhost:${port}/api/docs`);
console.log(`Fabric Trade API listening on http://localhost:${port}/${globalPrefix}`);
console.log(`Swagger docs at http://localhost:${port}/${globalPrefix}/docs`);
}
bootstrap();
//# sourceMappingURL=main.js.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,2CAAgD;AAChD,6CAAiE;AACjE,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAEhD,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,GAAG,CAAC,UAAU,CAAC;QACb,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE;KACrD,CAAC,CACH,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,yBAAe,EAAE;SACxC,QAAQ,CAAC,kBAAkB,CAAC;SAC5B,cAAc,CAAC,sBAAsB,CAAC;SACtC,UAAU,CAAC,KAAK,CAAC;SACjB,aAAa,EAAE;SACf,KAAK,EAAE,CAAC;IACX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAClE,uBAAa,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,MAAM,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,WAAW,CAAC,CAAC;AACnE,CAAC;AACD,SAAS,EAAE,CAAC"}
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,2CAAgD;AAChD,6CAAiE;AACjE,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAGhD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,CAAC;IACxD,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAClC,GAAG,CAAC,UAAU,CAAC;QACb,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE;KACrD,CAAC,CACH,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,yBAAe,EAAE;SACxC,QAAQ,CAAC,kBAAkB,CAAC;SAC5B,cAAc,CAAC,sBAAsB,CAAC;SACtC,UAAU,CAAC,KAAK,CAAC;SACjB,aAAa,EAAE;SACf,KAAK,EAAE,CAAC;IACX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAClE,uBAAa,CAAC,KAAK,CAAC,GAAG,YAAY,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,IAAI,YAAY,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,IAAI,YAAY,OAAO,CAAC,CAAC;AAC/E,CAAC;AACD,SAAS,EAAE,CAAC"}
+6 -4
View File
@@ -6,7 +6,9 @@ import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api');
// پشت LiteSpeed روی /server → GLOBAL_PREFIX=server/api
const globalPrefix = process.env.GLOBAL_PREFIX || 'api';
app.setGlobalPrefix(globalPrefix);
app.enableCors({
origin: true,
credentials: true,
@@ -27,11 +29,11 @@ async function bootstrap() {
.addBearerAuth()
.build();
const document = SwaggerModule.createDocument(app, swaggerConfig);
SwaggerModule.setup('api/docs', app, document);
SwaggerModule.setup(`${globalPrefix}/docs`, app, document);
const port = process.env.PORT ?? 3000;
await app.listen(port);
console.log(`Fabric Trade API listening on http://localhost:${port}/api`);
console.log(`Swagger docs at http://localhost:${port}/api/docs`);
console.log(`Fabric Trade API listening on http://localhost:${port}/${globalPrefix}`);
console.log(`Swagger docs at http://localhost:${port}/${globalPrefix}/docs`);
}
bootstrap();