server.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'reflect-metadata';
  2. import express from 'express';
  3. import { ApolloServerPluginLandingPageGraphQLPlayground as Playground } from 'apollo-server-core';
  4. import { ApolloServer } from 'apollo-server-express';
  5. import { createServer } from 'http';
  6. import { ZodError } from 'zod';
  7. import cors, { CorsOptions } from 'cors';
  8. import Keyv from 'keyv';
  9. import { KeyvAdapter } from '@apollo/utils.keyvadapter';
  10. import { createSchema } from './schema';
  11. import { ApolloLogs } from './config/logger/apollo.logger';
  12. import logger from './config/logger/logger';
  13. import getSessionMiddleware from './core/middlewares/sessionMiddleware';
  14. import { MyContext } from './types';
  15. import { __prod__ } from './config/constants/constants';
  16. import datasource from './config/datasource';
  17. import appsService from './modules/apps/apps.service';
  18. import { runUpdates } from './core/updates/run';
  19. import recover from './core/updates/recover-migrations';
  20. import startJobs from './core/jobs/jobs';
  21. import { applyJsonConfig, getConfig, setConfig } from './core/config/TipiConfig';
  22. import systemController from './modules/system/system.controller';
  23. import { eventDispatcher, EventTypes } from './core/config/EventDispatcher';
  24. const applyCustomConfig = () => {
  25. try {
  26. applyJsonConfig();
  27. } catch (e) {
  28. logger.error('Error applying settings.json config');
  29. if (e instanceof ZodError) {
  30. Object.keys(e.flatten().fieldErrors).forEach((key) => {
  31. logger.error(`Error in field ${key}`);
  32. });
  33. }
  34. }
  35. };
  36. const corsOptions: CorsOptions = {
  37. credentials: false,
  38. origin: (_, callback) => {
  39. callback(null, true);
  40. },
  41. };
  42. const main = async () => {
  43. try {
  44. eventDispatcher.clear();
  45. applyCustomConfig();
  46. const app = express();
  47. const port = 3001;
  48. app.use(cors(corsOptions));
  49. app.use(express.static(`${getConfig().rootFolder}/repos/${getConfig().appsRepoId}`));
  50. app.use('/status', systemController.status);
  51. app.use(getSessionMiddleware);
  52. await datasource.initialize();
  53. const schema = await createSchema();
  54. const httpServer = createServer(app);
  55. const plugins = [ApolloLogs];
  56. if (!__prod__) {
  57. plugins.push(Playground());
  58. }
  59. const apolloServer = new ApolloServer({
  60. schema,
  61. context: ({ req, res }): MyContext => ({ req, res }),
  62. plugins,
  63. cache: new KeyvAdapter(new Keyv(`redis://${getConfig().REDIS_HOST}:6379`)),
  64. });
  65. await apolloServer.start();
  66. apolloServer.applyMiddleware({ app });
  67. try {
  68. await datasource.runMigrations();
  69. } catch (e) {
  70. logger.error(e);
  71. await recover(datasource);
  72. }
  73. // Run migrations
  74. await runUpdates();
  75. httpServer.listen(port, async () => {
  76. await eventDispatcher.dispatchEventAsync(EventTypes.CLONE_REPO, [getConfig().appsRepoUrl]);
  77. await eventDispatcher.dispatchEventAsync(EventTypes.UPDATE_REPO, [getConfig().appsRepoUrl]);
  78. startJobs();
  79. setConfig('status', 'RUNNING');
  80. // Start apps
  81. appsService.startAllApps();
  82. logger.info(`Server running on port ${port} 🚀 Production => ${__prod__}`);
  83. logger.info(`Config: ${JSON.stringify(getConfig(), null, 2)}`);
  84. });
  85. } catch (error) {
  86. logger.error(error);
  87. }
  88. };
  89. main();