Skip to content

Commit

Permalink
add Dockerfile
Browse files Browse the repository at this point in the history
  • Loading branch information
secreter committed Nov 16, 2018
1 parent c3ae3a7 commit d5e33a6
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 7 deletions.
53 changes: 53 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
FROM node:8-slim

# See https://crbug.com/795759
RUN apt-get update && apt-get install -yq libgconf-2-4

# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update && apt-get install -y wget --no-install-recommends \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get purge --auto-remove -y curl \
&& rm -rf /src/*.deb

# It's a good idea to use dumb-init to help prevent zombie chrome processes.
ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init
RUN chmod +x /usr/local/bin/dumb-init

# Uncomment to skip the chromium download when installing puppeteer. If you do,
# you'll need to launch puppeteer with:
# browser.launch({executablePath: 'google-chrome-unstable'})
# ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true

# Install puppeteer so it's available in the container.
#RUN npm i puppeteer

# Add user so we don't need --no-sandbox.
RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
&& mkdir -p /home/pptruser/Downloads \
&& chown -R pptruser:pptruser /home/pptruser \
&& chown -R pptruser:pptruser /node_modules

# Run everything after as non-privileged user.
USER pptruser

RUN npm install pm2 -g \
&& pm2 install pm2-logrotate \
&& pm2 set pm2-logrotate:max_size 100M \
&& pm2 set pm2-logrotate:retain 100 \
&& mkdir -p /project

WORKDIR /project

COPY . /project

RUN npm install

ENTRYPOINT ["dumb-init", "--"]
CMD ["pm2-runtime", "pm2.json"]
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"main": "",
"scripts": {
"dev": "nodemon ./src/server.js",
"start": "pm2 start ./pm2.json",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "so <[email protected]>",
Expand Down
11 changes: 11 additions & 0 deletions pm2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"apps": [{
"name": "puppeteer",
"script": "src/server.js",
"kill_timeout": 5000,
"error_file": "logs/puppeteer-screenshot-out.log",
"out_file": "logs/puppeteer-screenshot-out.log",
"merge_logs": true,
"max_memory_restart": "1024M"
}]
}
Binary file removed screenshot.png
Binary file not shown.
37 changes: 30 additions & 7 deletions src/controller/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,30 @@ async function postMethod (ctx) {
let params=ctx.request.body
let options={
url:params.url,
screenshot:{},
html:'<a>sss</a>'
screenshot:params.screenshot,
html:params.html,
style:params.style,
script:params.script,
waitFor:params.waitFor,
device:params.device
}
if(!(options=checkOption(options,ctx))) return
ctx.type = options.screenshot.type;
ctx.body=await instance.getImage(options)
}

function checkOption(option,ctx){
let screenshot=option.screenshot
if(!screenshot.fullPage){
delete screenshot.clip
}
let screenshot=option.screenshot||{type:'png'}
let style=option.style
let script =option.script

if(!/^https?:\/\/.+/.test(option.url)){
ctx.body=Boom.badRequest('invalid url').output;
return false
}
if(!screenshot.fullPage){
delete screenshot.clip
}
if(screenshot.type&&!/^jpeg$|^png$/.test(screenshot.type)){
ctx.body=Boom.badRequest('invalid type. Optional [jpeg,png]').output;
return false
Expand All @@ -67,9 +74,25 @@ function checkOption(option,ctx){
ctx.body=Boom.badRequest(`invalid device. Optional [${deviceNames}]`).output;
return false
}else{
option.device=devices[option.device]
option.device=devices[option.device||'iPhone 8']
}
option.screenshot=screenshot

if(style&&typeof style!=='object'){
ctx.body=Boom.badRequest(`style must be an object. {url,content}`).output;
return false
}
if(style&&style.content){
delete style.url
}

if(script&&typeof script!=='object'){
ctx.body=Boom.badRequest(`script must be an object. {url,content,type}`).output;
return false
}
if(script&&script.content){
delete script.url
}

return option
}
Expand Down

0 comments on commit d5e33a6

Please sign in to comment.