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:
Collin Duncan 2023-02-13 09:13:39 +01:00
parent c0a8e61187
commit a8927c655a
No known key found for this signature in database
7 changed files with 83 additions and 13 deletions

View file

@ -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

View file

@ -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
} }

View file

@ -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

View file

@ -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) {

View file

@ -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')

View file

@ -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[]

View 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')
}
}
}