Dockerfile was incorrect, trying to fix this and expose a testing method on server as I am having issues with M1 processor with puppeteer as well
This commit is contained in:
parent
c0a8e61187
commit
a8927c655a
7 changed files with 83 additions and 13 deletions
|
|
@ -17,7 +17,8 @@ COPY --chown=node:node src src
|
||||||
COPY --chown=node:node tsconfig.json tsconfig.json
|
COPY --chown=node:node tsconfig.json tsconfig.json
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM node:18 as dependencies
|
FROM node:18 as app
|
||||||
|
LABEL org.opencontainers.image.source https://github.com/cgduncan7/autobaan
|
||||||
|
|
||||||
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
|
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
|
||||||
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium
|
ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium
|
||||||
|
|
@ -28,6 +29,7 @@ RUN npm i -g node-gyp
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN chown -R node:node .
|
RUN chown -R node:node .
|
||||||
|
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
COPY --chown=node:node package.json package.json
|
COPY --chown=node:node package.json package.json
|
||||||
COPY --chown=node:node package-lock.json package-lock.json
|
COPY --chown=node:node package-lock.json package-lock.json
|
||||||
|
|
||||||
|
|
@ -35,10 +37,5 @@ USER node
|
||||||
|
|
||||||
RUN CXX=g++-12 npm install --omit=dev
|
RUN CXX=g++-12 npm install --omit=dev
|
||||||
|
|
||||||
FROM dependencies as app
|
|
||||||
LABEL org.opencontainers.image.source https://github.com/cgduncan7/autobaan
|
|
||||||
|
|
||||||
COPY --from=builder /app/dist ./dist
|
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
ENTRYPOINT node dist/server/index.js
|
ENTRYPOINT node dist/server/index.js
|
||||||
|
|
@ -8,7 +8,9 @@ const getDatabase = () => new sqlite.Database(resolve('./db/autobaan_db'))
|
||||||
export const run = async (sql: string, params?: unknown) => {
|
export const run = async (sql: string, params?: unknown) => {
|
||||||
const db = getDatabase()
|
const db = getDatabase()
|
||||||
await new Promise<void>((res, rej) => {
|
await new Promise<void>((res, rej) => {
|
||||||
asyncLocalStorage.getStore()?.debug(`<database> run ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
asyncLocalStorage
|
||||||
|
.getStore()
|
||||||
|
?.debug(`<database> run ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||||
db.run(sql, params, (err) => {
|
db.run(sql, params, (err) => {
|
||||||
if (err) rej(err)
|
if (err) rej(err)
|
||||||
res()
|
res()
|
||||||
|
|
@ -20,13 +22,14 @@ export const run = async (sql: string, params?: unknown) => {
|
||||||
export const all = async <T>(sql: string, params?: unknown) => {
|
export const all = async <T>(sql: string, params?: unknown) => {
|
||||||
const db = getDatabase()
|
const db = getDatabase()
|
||||||
const rows = await new Promise<T[]>((res, rej) => {
|
const rows = await new Promise<T[]>((res, rej) => {
|
||||||
asyncLocalStorage.getStore()?.debug(`<database> all ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
asyncLocalStorage
|
||||||
|
.getStore()
|
||||||
|
?.debug(`<database> all ~> ${sql.replace(/\s*\n\s*/g, ' ')} (${params})`)
|
||||||
db.all(sql, params, (err, rows) => {
|
db.all(sql, params, (err, rows) => {
|
||||||
if (err) rej(err)
|
if (err) rej(err)
|
||||||
res(rows)
|
res(rows)
|
||||||
})
|
})
|
||||||
}
|
})
|
||||||
)
|
|
||||||
db.close()
|
db.close()
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ const getRunner = () => {
|
||||||
if (!runner) {
|
if (!runner) {
|
||||||
runner = new Runner({
|
runner = new Runner({
|
||||||
headless: true,
|
headless: true,
|
||||||
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return runner
|
return runner
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,32 @@ export class Runner {
|
||||||
BrowserLaunchArgumentOptions &
|
BrowserLaunchArgumentOptions &
|
||||||
BrowserConnectOptions
|
BrowserConnectOptions
|
||||||
) {
|
) {
|
||||||
this.options = options
|
const defaultArgs = [
|
||||||
|
'--disable-gpu',
|
||||||
|
'--disable-dev-shm-usage',
|
||||||
|
'--disable-setuid-sandbox',
|
||||||
|
'--no-sandbox',
|
||||||
|
]
|
||||||
|
this.options = { args: defaultArgs, ...options }
|
||||||
|
}
|
||||||
|
|
||||||
|
public async test() {
|
||||||
|
l.getStore()?.debug('Runner test')
|
||||||
|
try {
|
||||||
|
if (!this.browser) {
|
||||||
|
this.browser = await puppeteer.launch(this.options)
|
||||||
|
}
|
||||||
|
} catch (error: unknown) {
|
||||||
|
l.getStore()?.error('Browser error', { error: (error as Error).message })
|
||||||
|
throw new PuppeteerBrowserLaunchError(error as Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.page = await this.browser?.newPage()
|
||||||
|
} catch (error) {
|
||||||
|
l.getStore()?.error('Page error', { error: (error as Error).message })
|
||||||
|
throw new PuppeteerNewPageError(error as Error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async run(reservation: Reservation) {
|
public async run(reservation: Reservation) {
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,11 @@ import { v4 } from 'uuid'
|
||||||
import { asyncLocalStorage, Logger, LogLevel } from '../../common/logger'
|
import { asyncLocalStorage, Logger, LogLevel } from '../../common/logger'
|
||||||
import { CronRouter } from './routes/cron'
|
import { CronRouter } from './routes/cron'
|
||||||
import { ReservationsRouter } from './routes/reservations'
|
import { ReservationsRouter } from './routes/reservations'
|
||||||
|
import { RunnerRouter } from './routes/runner'
|
||||||
|
|
||||||
const cronRouter = new CronRouter()
|
const cronRouter = new CronRouter()
|
||||||
const reservationsRouter = new ReservationsRouter()
|
const reservationsRouter = new ReservationsRouter()
|
||||||
|
const runnerRouter = new RunnerRouter()
|
||||||
|
|
||||||
// Handles POST requests to /reservations
|
// Handles POST requests to /reservations
|
||||||
const server = http.createServer(async (req, res) => {
|
const server = http.createServer(async (req, res) => {
|
||||||
|
|
@ -32,6 +34,10 @@ const server = http.createServer(async (req, res) => {
|
||||||
await reservationsRouter.handleRequest(req, res)
|
await reservationsRouter.handleRequest(req, res)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
case /^\/runner/.test(url): {
|
||||||
|
await runnerRouter.handleRequest(req, res)
|
||||||
|
break
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
logger?.info('Not found', { url, method, location: 'root' })
|
logger?.info('Not found', { url, method, location: 'root' })
|
||||||
res.writeHead(404, 'Not found')
|
res.writeHead(404, 'Not found')
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,11 @@ export class ReservationsRouter extends Router {
|
||||||
date = dayjs(rawDate)
|
date = dayjs(rawDate)
|
||||||
}
|
}
|
||||||
|
|
||||||
l.getStore()?.debug('Fetching reservations', { pageNumber, pageSize, date: date?.format() })
|
l.getStore()?.debug('Fetching reservations', {
|
||||||
|
pageNumber,
|
||||||
|
pageSize,
|
||||||
|
date: date?.format(),
|
||||||
|
})
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let reservations: Reservation[]
|
let reservations: Reservation[]
|
||||||
|
|
|
||||||
36
src/server/http/routes/runner.ts
Normal file
36
src/server/http/routes/runner.ts
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
import { IncomingMessage, ServerResponse } from 'http'
|
||||||
|
import { asyncLocalStorage as l } from '../../../common/logger'
|
||||||
|
import { Router } from './index'
|
||||||
|
import { getStatus, startTasks, stopTasks } from '../../cron'
|
||||||
|
import { Runner } from '../../../common/runner'
|
||||||
|
|
||||||
|
export class RunnerRouter extends Router {
|
||||||
|
public async handleRequest(
|
||||||
|
req: IncomingMessage,
|
||||||
|
res: ServerResponse<IncomingMessage>
|
||||||
|
) {
|
||||||
|
const { url = '', method } = req
|
||||||
|
const [route] = url.split('?')
|
||||||
|
switch (true) {
|
||||||
|
case /^\/runner\/test$/.test(route) && method === 'GET': {
|
||||||
|
await this.GET_runner_test(req, res)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
this.handle404(req, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async GET_runner_test(
|
||||||
|
_req: IncomingMessage,
|
||||||
|
res: ServerResponse<IncomingMessage>
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
await new Runner({ headless: false }).test()
|
||||||
|
res.writeHead(200, 'OK')
|
||||||
|
} catch (e) {
|
||||||
|
res.writeHead(500, 'Internal server error')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue