Skip to content

Commit 2f85ac8

Browse files
committed
feat: enable nitro node-cluster preset
1 parent 08828a4 commit 2f85ac8

File tree

8 files changed

+573
-329
lines changed

8 files changed

+573
-329
lines changed

lib/db/index.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { Selectable } from 'kysely'
2-
32
import type { DatabaseDriverName } from '~/lib/db/drivers'
43

4+
import cluster from 'node:cluster'
5+
56
import { hash } from 'node:crypto'
67
import { Kysely, Migrator } from 'kysely'
78
import { getDatabaseDriver } from '~/lib/db/drivers'
@@ -57,31 +58,33 @@ export async function initializeDatabase() {
5758
// eslint-disable-next-line unicorn/no-process-exit
5859
process.exit(1)
5960
}
60-
logger.info(`Using database driver: ${driverName}`)
61+
if (cluster.isPrimary) logger.info(`Using database driver: ${driverName}`)
6162

6263
const driver = await driverSetup()
6364

6465
_db = new Kysely<Database>({
6566
dialect: driver,
6667
})
6768

68-
logger.info('Migrating database...')
69-
const migrator = new Migrator({
70-
db: _db,
71-
provider: {
72-
async getMigrations() {
73-
return migrations(driverName as DatabaseDriverName)
69+
if (cluster.isPrimary) {
70+
logger.info('Migrating database...')
71+
const migrator = new Migrator({
72+
db: _db,
73+
provider: {
74+
async getMigrations() {
75+
return migrations(driverName as DatabaseDriverName)
76+
},
7477
},
75-
},
76-
})
77-
const { error, results } = await migrator.migrateToLatest()
78-
if (error) {
79-
logger.error('Database migration failed', error)
80-
// eslint-disable-next-line unicorn/no-process-exit
81-
process.exit(1)
78+
})
79+
const { error, results } = await migrator.migrateToLatest()
80+
if (error) {
81+
logger.error('Database migration failed', error)
82+
// eslint-disable-next-line unicorn/no-process-exit
83+
process.exit(1)
84+
}
85+
logger.debug('Migration results', results)
86+
logger.success('Database migrated')
8287
}
83-
logger.debug('Migration results', results)
84-
logger.success('Database migrated')
8588
}
8689

8790
initializationPromise = init()

lib/logger.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { createConsola, LogLevels } from 'consola'
1+
import cluster from 'node:cluster'
22

3+
import { createConsola, LogLevels } from 'consola'
34
import { ENV } from '~/lib/env'
45

56
export const logger = createConsola({
67
defaults: {
7-
tag: 'cache-server',
8+
tag: cluster.isPrimary ? 'cache-server' : `cache-server-node-${cluster.worker?.id}`,
89
},
910
level: ENV.DEBUG ? LogLevels.debug : LogLevels.info,
1011
})

lib/storage/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { Buffer } from 'node:buffer'
2-
32
import type { Readable } from 'node:stream'
43

4+
import cluster from 'node:cluster'
5+
56
import { randomBytes, randomInt } from 'node:crypto'
67
import consola from 'consola'
78
import {
@@ -62,7 +63,7 @@ export async function initializeStorage() {
6263
// eslint-disable-next-line unicorn/no-process-exit
6364
process.exit(1)
6465
}
65-
logger.info(`Using storage driver: ${driverName}`)
66+
if (cluster.isPrimary) logger.info(`Using storage driver: ${driverName}`)
6667

6768
const driver = await driverSetup()
6869
const db = await useDB()

nitro.config.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
33
import { version } from './package.json'
44

55
export default defineNitroConfig({
6-
preset: 'node-server',
6+
preset: 'node-cluster',
77
runtimeConfig: {
88
version: `v${version}${process.env.BUILD_HASH ? ` [${process.env.BUILD_HASH}]` : ''}`,
99
},
@@ -21,8 +21,6 @@ export default defineNitroConfig({
2121
},
2222
alias: {
2323
'@': fileURLToPath(new URL('.', import.meta.url)),
24-
// https://github.com/unjs/consola/issues/276
25-
'consola': 'consola',
2624
},
2725
esbuild: {
2826
options: {

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
"consola": "^3.4.0",
3434
"croner": "^9.0.0",
3535
"execa": "^9.5.2",
36-
"h3": "^1.14.0",
36+
"h3": "npm:[email protected]",
3737
"kysely": "^0.27.5",
3838
"mockttp": "^3.16.0",
3939
"mysql2": "^3.12.0",
40-
"nitropack": "^2.10.4",
40+
"nitropack": "npm:[email protected]",
4141
"pg": "^8.13.1",
4242
"remeda": "^2.21.0",
4343
"typescript": "^5.7.3",
@@ -76,7 +76,9 @@
7676
"onlyBuiltDependencies": [
7777
"@parcel/watcher",
7878
"better-sqlite3",
79-
"esbuild"
79+
"cpu-features",
80+
"esbuild",
81+
"ssh2"
8082
]
8183
}
8284
}

plugins/cleanup.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import cluster from 'node:cluster'
12
import { ENV } from '@/lib/env'
23
import { logger } from '@/lib/logger'
34

@@ -7,6 +8,8 @@ import { Cron } from 'croner'
78
import { useStorageAdapter } from '~/lib/storage'
89

910
export default defineNitroPlugin(() => {
11+
if (!cluster.isPrimary) return
12+
1013
// cache cleanup
1114
if (ENV.CACHE_CLEANUP_OLDER_THAN_DAYS > 0) {
1215
const job = new Cron(ENV.CACHE_CLEANUP_CRON)

plugins/setup.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { H3Error } from 'h3'
1+
import cluster from 'node:cluster'
22

3+
import { H3Error } from 'h3'
34
import { initializeDatabase, useDB } from '~/lib/db'
45
import { ENV } from '~/lib/env'
56
import { logger } from '~/lib/logger'
@@ -8,9 +9,9 @@ import { initializeStorage, useStorageAdapter } from '~/lib/storage'
89

910
export default defineNitroPlugin(async (nitro) => {
1011
const version = useRuntimeConfig().version
11-
logger.info(`🚀 Starting GitHub Actions Cache Server (${version})`)
12+
if (cluster.isPrimary) logger.info(`🚀 Starting GitHub Actions Cache Server (${version})`)
1213

13-
await initializeProxy()
14+
if (cluster.isPrimary) await initializeProxy()
1415
await initializeDatabase()
1516
await initializeStorage()
1617

@@ -37,26 +38,28 @@ export default defineNitroPlugin(async (nitro) => {
3738

3839
if (!version) throw new Error('No version found in runtime config')
3940

40-
const db = await useDB()
41-
const existing = await db
42-
.selectFrom('meta')
43-
.where('key', '=', 'version')
44-
.select('value')
45-
.executeTakeFirst()
41+
if (cluster.isPrimary) {
42+
const db = await useDB()
43+
const existing = await db
44+
.selectFrom('meta')
45+
.where('key', '=', 'version')
46+
.select('value')
47+
.executeTakeFirst()
4648

47-
if (!existing || existing.value !== version) {
48-
logger.info(
49-
`Version changed from ${existing?.value ?? '[no version, first install]'} to ${version}. Pruning cache...`,
50-
)
51-
const adapter = await useStorageAdapter()
52-
await adapter.pruneCaches()
53-
}
49+
if (!existing || existing.value !== version) {
50+
logger.info(
51+
`Version changed from ${existing?.value ?? '[no version, first install]'} to ${version}. Pruning cache...`,
52+
)
53+
const adapter = await useStorageAdapter()
54+
await adapter.pruneCaches()
55+
}
5456

55-
if (existing) {
56-
await db.updateTable('meta').set('value', version).where('key', '=', 'version').execute()
57-
} else {
58-
await db.insertInto('meta').values({ key: 'version', value: version }).execute()
57+
if (existing) {
58+
await db.updateTable('meta').set('value', version).where('key', '=', 'version').execute()
59+
} else {
60+
await db.insertInto('meta').values({ key: 'version', value: version }).execute()
61+
}
5962
}
6063

61-
if (process.send) process.send('nitro:ready')
64+
if (process.send && cluster.isPrimary) process.send('nitro:ready')
6265
})

0 commit comments

Comments
 (0)