mirror of
https://github.com/pockethost/pockethost.git
synced 2025-07-05 20:32:29 +00:00
enh: port pool
This commit is contained in:
parent
90c6a75928
commit
cf63b15e32
@ -51,6 +51,8 @@ export const NODE_ENV = env('NODE_ENV', '')
|
|||||||
export const DEBUG = envb('DEBUG', NODE_ENV === 'development')
|
export const DEBUG = envb('DEBUG', NODE_ENV === 'development')
|
||||||
export const TRACE = envb('TRACE', false)
|
export const TRACE = envb('TRACE', false)
|
||||||
|
|
||||||
|
export const DAEMON_MAX_PORTS = envi(`DAEMON_MAX_PORTS`, 500)
|
||||||
|
|
||||||
export const DAEMON_PB_BACKUP_SLEEP = envi(`DAEMON_PB_BACKUP_SLEEP`, 100)
|
export const DAEMON_PB_BACKUP_SLEEP = envi(`DAEMON_PB_BACKUP_SLEEP`, 100)
|
||||||
export const DAEMON_PB_BACKUP_PAGE_COUNT = envi(
|
export const DAEMON_PB_BACKUP_PAGE_COUNT = envi(
|
||||||
`DAEMON_PB_BACKUP_PAGE_COUNT`,
|
`DAEMON_PB_BACKUP_PAGE_COUNT`,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
|
DAEMON_MAX_PORTS,
|
||||||
DAEMON_PB_PORT_BASE,
|
DAEMON_PB_PORT_BASE,
|
||||||
DAEMON_PB_SEMVER,
|
DAEMON_PB_SEMVER,
|
||||||
DEBUG,
|
DEBUG,
|
||||||
@ -102,7 +103,8 @@ global.EventSource = require('eventsource')
|
|||||||
await instanceService({
|
await instanceService({
|
||||||
logger,
|
logger,
|
||||||
instanceApiCheckIntervalMs: 50,
|
instanceApiCheckIntervalMs: 50,
|
||||||
instanceApiTimeoutMs: 1000,
|
instanceApiTimeoutMs: 5000,
|
||||||
|
maxPorts: DAEMON_MAX_PORTS,
|
||||||
})
|
})
|
||||||
await centralDbService({ logger })
|
await centralDbService({ logger })
|
||||||
// gen:service
|
// gen:service
|
||||||
|
@ -30,7 +30,7 @@ import { AsyncReturnType } from 'type-fest'
|
|||||||
import { instanceLoggerService } from '../InstanceLoggerService'
|
import { instanceLoggerService } from '../InstanceLoggerService'
|
||||||
import { pocketbase } from '../PocketBaseService'
|
import { pocketbase } from '../PocketBaseService'
|
||||||
import { createDenoProcess } from './Deno/DenoProcess'
|
import { createDenoProcess } from './Deno/DenoProcess'
|
||||||
import { portManager } from './PortManager'
|
import { portManager, PortManagerConfig } from './PortManager'
|
||||||
|
|
||||||
enum InstanceApiStatus {
|
enum InstanceApiStatus {
|
||||||
Starting = 'starting',
|
Starting = 'starting',
|
||||||
@ -48,12 +48,17 @@ type InstanceApi = {
|
|||||||
export type InstanceServiceConfig = SingletonBaseConfig & {
|
export type InstanceServiceConfig = SingletonBaseConfig & {
|
||||||
instanceApiTimeoutMs: number
|
instanceApiTimeoutMs: number
|
||||||
instanceApiCheckIntervalMs: number
|
instanceApiCheckIntervalMs: number
|
||||||
}
|
} & PortManagerConfig
|
||||||
|
|
||||||
export type InstanceServiceApi = AsyncReturnType<typeof instanceService>
|
export type InstanceServiceApi = AsyncReturnType<typeof instanceService>
|
||||||
export const instanceService = mkSingleton(
|
export const instanceService = mkSingleton(
|
||||||
async (config: InstanceServiceConfig) => {
|
async (config: InstanceServiceConfig) => {
|
||||||
const { logger, instanceApiTimeoutMs, instanceApiCheckIntervalMs } = config
|
const {
|
||||||
|
logger,
|
||||||
|
instanceApiTimeoutMs,
|
||||||
|
instanceApiCheckIntervalMs,
|
||||||
|
maxPorts,
|
||||||
|
} = config
|
||||||
const instanceServiceLogger = logger.create('InstanceService')
|
const instanceServiceLogger = logger.create('InstanceService')
|
||||||
const { dbg, raw, error, warn } = instanceServiceLogger
|
const { dbg, raw, error, warn } = instanceServiceLogger
|
||||||
const { client } = await clientService()
|
const { client } = await clientService()
|
||||||
@ -202,9 +207,6 @@ export const instanceService = mkSingleton(
|
|||||||
Obtain empty port
|
Obtain empty port
|
||||||
*/
|
*/
|
||||||
dbg(`Obtaining port`)
|
dbg(`Obtaining port`)
|
||||||
healthyGuard()
|
|
||||||
await updateInstanceStatus(instance.id, InstanceStatus.Port)
|
|
||||||
healthyGuard()
|
|
||||||
const [newPort, releasePort] = getNextPort()
|
const [newPort, releasePort] = getNextPort()
|
||||||
shutdownManager.add(() => {
|
shutdownManager.add(() => {
|
||||||
dbg(`Releasing port`)
|
dbg(`Releasing port`)
|
||||||
@ -507,7 +509,7 @@ export const instanceService = mkSingleton(
|
|||||||
`InstanceService`
|
`InstanceService`
|
||||||
)
|
)
|
||||||
|
|
||||||
const { getNextPort } = await portManager({})
|
const { getNextPort } = await portManager({ maxPorts })
|
||||||
|
|
||||||
const shutdown = async () => {
|
const shutdown = async () => {
|
||||||
dbg(`Shutting down instance manager`)
|
dbg(`Shutting down instance manager`)
|
||||||
|
@ -6,7 +6,12 @@ import getPort from 'get-port'
|
|||||||
|
|
||||||
export type PortResult = [number, () => void]
|
export type PortResult = [number, () => void]
|
||||||
|
|
||||||
export const portManager = mkSingleton(async () => {
|
export type PortManagerConfig = {
|
||||||
|
maxPorts: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export const portManager = mkSingleton(async (cfg: PortManagerConfig) => {
|
||||||
|
const { maxPorts } = cfg
|
||||||
const _logger = logger().create(`PortManager`)
|
const _logger = logger().create(`PortManager`)
|
||||||
const { dbg, error } = _logger
|
const { dbg, error } = _logger
|
||||||
|
|
||||||
@ -41,7 +46,7 @@ export const portManager = mkSingleton(async () => {
|
|||||||
})()
|
})()
|
||||||
|
|
||||||
const ports = await (
|
const ports = await (
|
||||||
await Promise.all<PortResult>(range(500).map(getNextPort))
|
await Promise.all<PortResult>(range(maxPorts).map(getNextPort))
|
||||||
).map((portInfo) => portInfo[0])
|
).map((portInfo) => portInfo[0])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user