diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c127a92 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:15.8 +WORKDIR "/app" +COPY package*.json ./ +RUN npm install +RUN apt-get update +COPY . /app +EXPOSE 3000 +ENTRYPOINT ["bash", "-c"] +CMD ["npm start"] diff --git a/configure-script.js b/configure-script.js new file mode 100644 index 0000000..3b60488 --- /dev/null +++ b/configure-script.js @@ -0,0 +1,75 @@ +//setup +const readline = require('readline'); +const fs = require('fs'); +const crypto = require("crypto"); + +const uuid = (bytes = 16) => crypto.randomBytes(bytes).toString("hex"); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false +}); + +//manually promisify this (util didn't work) +const question = (prompt, def = null) => { + return new Promise((resolve, reject) => { + rl.question(`${prompt}${def ? ` (${def})` : ''}: `, answer => { + //loop on required + if (def === null && !answer) { + return resolve(question(prompt, def)); + } + + return resolve(answer || def); + }); + }); +}; + +//questions +(async () => { + //app configuration + const appName = await question('App Name'); + const webAddr = await question('Web Addr'); + + //generate the files + const ymlfile = ` +version: "3.6" + +services: + ${appName}: + container_name: ${appName} + build: . + volumes: + - static_volume:/app/public + + nginx: + image: nginx + container_name: ${appName}-nginx + restart: always + volumes: + - ./traefik-files:/etc/nginx/conf.d + - static_volume:/static + labels: + - "traefik.enable=true" + - "traefik.http.routers.${appName}router.rule=Host(\`${webAddr}\`)" + - "traefik.http.routers.${appName}router.entrypoints=websecure" + - "traefik.http.routers.${appName}router.tls.certresolver=myresolver" + - "traefik.http.routers.${appName}router.service=${appName}service@docker" + - "traefik.http.services.${appName}service.loadbalancer.server.port=3000" + networks: + - server-network + +volumes: + static_volume: + driver: local + +networks: + server-network: + external: true +`; + + fs.writeFileSync('docker-compose.yml', ymlfile); +})() + .then(() => rl.close()) + .catch(e => console.error(e)) +; diff --git a/traefik-files/default.conf b/traefik-files/default.conf new file mode 100644 index 0000000..f475197 --- /dev/null +++ b/traefik-files/default.conf @@ -0,0 +1,9 @@ +server { + listen 3000; + server_name mechaimmensewarfare.com www.mechaimmensewarfare.com; + + location / { + root /static; + index index.html; + } +} diff --git a/traefik-files/docker-compose.yml b/traefik-files/docker-compose.yml new file mode 100644 index 0000000..195da88 --- /dev/null +++ b/traefik-files/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.6" + +services: + traefik: + image: "traefik:v2.4" + container_name: "traefik" + command: + - "--log.level=ERROR" + - "--api.insecure=false" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.web.address=:80" + - "--entrypoints.web.http.redirections.entryPoint.to=websecure" + - "--entrypoints.web.http.redirections.entryPoint.scheme=https" + - "--entrypoints.web.http.redirections.entrypoint.permanent=true" + - "--entrypoints.websecure.address=:443" + - "--certificatesresolvers.myresolver.acme.tlschallenge=true" + - "--certificatesresolvers.myresolver.acme.email=krgamestudios@gmail.com" + - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" + ports: + - "80:80" + - "443:443" + volumes: + - "./letsencrypt:/letsencrypt" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + networks: + - server-network + +networks: + server-network: + external: true