mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2024-11-29 11:44:30 -05:00
0da7d01dec
This adds a reverse proxy to the backend, that automatically redirects requests that are not handled by the backend to the React dev server running on port 3001. The reverse proxy is only enabled when NODE_ENV is set to 'development'. Signed-off-by: David Mehren <git@herrmehren.de>
82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
import { LogLevel } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import { NestFactory } from '@nestjs/core';
|
|
import { NestExpressApplication } from '@nestjs/platform-express';
|
|
|
|
import { AppModule } from './app.module';
|
|
import { AppConfig } from './config/app.config';
|
|
import { AuthConfig } from './config/auth.config';
|
|
import { MediaConfig } from './config/media.config';
|
|
import { ConsoleLoggerService } from './logger/console-logger.service';
|
|
import { BackendType } from './media/backends/backend-type.enum';
|
|
import { setupFrontendProxy } from './utils/frontend-integration';
|
|
import { setupSessionMiddleware } from './utils/session';
|
|
import { setupValidationPipe } from './utils/setup-pipes';
|
|
import { setupPrivateApiDocs, setupPublicApiDocs } from './utils/swagger';
|
|
|
|
async function bootstrap(): Promise<void> {
|
|
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
|
|
logger: ['error', 'warn', 'log'] as LogLevel[],
|
|
bufferLogs: true,
|
|
});
|
|
const logger = await app.resolve(ConsoleLoggerService);
|
|
logger.log('Switching logger', 'AppBootstrap');
|
|
app.useLogger(logger);
|
|
const configService = app.get(ConfigService);
|
|
const appConfig = configService.get<AppConfig>('appConfig');
|
|
const authConfig = configService.get<AuthConfig>('authConfig');
|
|
const mediaConfig = configService.get<MediaConfig>('mediaConfig');
|
|
|
|
if (!appConfig || !authConfig || !mediaConfig) {
|
|
logger.error('Could not initialize config, aborting.', 'AppBootstrap');
|
|
process.exit(1);
|
|
}
|
|
|
|
setupPublicApiDocs(app);
|
|
logger.log(
|
|
`Serving OpenAPI docs for public api under '/apidoc'`,
|
|
'AppBootstrap',
|
|
);
|
|
if (process.env.NODE_ENV === 'development') {
|
|
setupPrivateApiDocs(app);
|
|
logger.log(
|
|
`Serving OpenAPI docs for private api under '/private/apidoc'`,
|
|
'AppBootstrap',
|
|
);
|
|
setupFrontendProxy(app, logger);
|
|
}
|
|
|
|
setupSessionMiddleware(app, authConfig);
|
|
|
|
app.enableCors({
|
|
origin: appConfig.rendererOrigin,
|
|
});
|
|
logger.log(`Enabling CORS for '${appConfig.rendererOrigin}'`, 'AppBootstrap');
|
|
|
|
app.useGlobalPipes(setupValidationPipe(logger));
|
|
if (mediaConfig.backend.use === BackendType.FILESYSTEM) {
|
|
logger.log(
|
|
`Serving the local folder '${mediaConfig.backend.filesystem.uploadPath}' under '/uploads'`,
|
|
'AppBootstrap',
|
|
);
|
|
app.useStaticAssets(mediaConfig.backend.filesystem.uploadPath, {
|
|
prefix: '/uploads/',
|
|
});
|
|
}
|
|
logger.log(
|
|
`Serving the local folder 'public' under '/public'`,
|
|
'AppBootstrap',
|
|
);
|
|
app.useStaticAssets('public', {
|
|
prefix: '/public/',
|
|
});
|
|
await app.listen(appConfig.port);
|
|
logger.log(`Listening on port ${appConfig.port}`, 'AppBootstrap');
|
|
}
|
|
|
|
void bootstrap();
|