mirror of
https://github.com/pockethost/pockethost.git
synced 2025-05-20 05:46:41 +00:00
109 lines
2.6 KiB
TypeScript
109 lines
2.6 KiB
TypeScript
import {
|
|
DAEMON_PB_PORT_BASE,
|
|
DAEMON_PB_SEMVER,
|
|
DEBUG,
|
|
PH_BIN_CACHE,
|
|
PUBLIC_APP_DB,
|
|
TRACE,
|
|
} from '$constants'
|
|
import {
|
|
clientService,
|
|
ftpService,
|
|
instanceService,
|
|
pocketbase,
|
|
proxyService,
|
|
realtimeLog,
|
|
rpcService,
|
|
sqliteService,
|
|
} from '$services'
|
|
import { logger as loggerService } from '@pockethost/common'
|
|
import { exec } from 'child_process'
|
|
import { centralDbService } from './services/CentralDbService'
|
|
import { instanceLoggerService } from './services/InstanceLoggerService'
|
|
|
|
loggerService({ debug: DEBUG, trace: TRACE, errorTrace: !DEBUG })
|
|
|
|
// npm install eventsource --save
|
|
global.EventSource = require('eventsource')
|
|
;(async () => {
|
|
const logger = loggerService().create(`server.ts`)
|
|
const { dbg, error, info, warn } = logger
|
|
info(`Starting`)
|
|
|
|
/**
|
|
* Temporary fix until we can figure out why child processes are not
|
|
* being killed when the node process exits.
|
|
*/
|
|
await new Promise<void>((resolve) => {
|
|
exec(`pkill -f 'pocketbase serve'`, (error, stdout, stderr) => {
|
|
if (error && error.signal !== 'SIGTERM') {
|
|
warn(`pkill failed with ${error}: ${stderr}`)
|
|
}
|
|
resolve()
|
|
})
|
|
})
|
|
|
|
const pbService = await pocketbase({
|
|
cachePath: PH_BIN_CACHE,
|
|
checkIntervalMs: 1000 * 5 * 60,
|
|
logger,
|
|
})
|
|
|
|
/**
|
|
* Launch central database
|
|
*/
|
|
{
|
|
info(`Migrating mothership`)
|
|
await (
|
|
await pbService.spawn({
|
|
command: 'migrate',
|
|
isMothership: true,
|
|
version: DAEMON_PB_SEMVER,
|
|
slug: PUBLIC_APP_DB,
|
|
})
|
|
).exited
|
|
info(`Migrating done`)
|
|
}
|
|
info(`Serving`)
|
|
const { url } = await pbService.spawn({
|
|
command: 'serve',
|
|
isMothership: true,
|
|
version: DAEMON_PB_SEMVER,
|
|
slug: PUBLIC_APP_DB,
|
|
port: DAEMON_PB_PORT_BASE,
|
|
})
|
|
|
|
/**
|
|
* Launch services
|
|
*/
|
|
await clientService({ url, logger })
|
|
ftpService({ logger })
|
|
await rpcService({ logger })
|
|
await proxyService({
|
|
logger,
|
|
coreInternalUrl: url,
|
|
})
|
|
await instanceLoggerService({ logger })
|
|
await sqliteService({ logger })
|
|
await realtimeLog({ logger })
|
|
await instanceService({ logger })
|
|
await centralDbService({ logger })
|
|
|
|
info(`Hooking into process exit event`)
|
|
|
|
const shutdown = async (signal: NodeJS.Signals) => {
|
|
info(`Got signal ${signal}`)
|
|
info(`Shutting down`)
|
|
ftpService().shutdown()
|
|
;(await realtimeLog()).shutdown()
|
|
;(await proxyService()).shutdown()
|
|
;(await instanceService()).shutdown()
|
|
;(await rpcService()).shutdown()
|
|
pbService.shutdown()
|
|
}
|
|
|
|
process.on('SIGTERM', shutdown)
|
|
process.on('SIGINT', shutdown)
|
|
process.on('SIGHUP', shutdown)
|
|
})()
|