From fa7ad2a24d808dd6f9c2126598def157431611d4 Mon Sep 17 00:00:00 2001 From: Chung Leong Date: Fri, 21 Dec 2018 22:53:16 +0100 Subject: [PATCH] Added Docker and Nginx configs. --- server/docker-compose.yml | 51 +++++++++ server/index.js | 217 ++++++++++++++++++++++++++++++++++++++ server/nginx/caching.conf | 14 +++ server/nginx/default.conf | 44 ++++++++ 4 files changed, 326 insertions(+) create mode 100644 server/docker-compose.yml create mode 100644 server/index.js create mode 100644 server/nginx/caching.conf create mode 100644 server/nginx/default.conf diff --git a/server/docker-compose.yml b/server/docker-compose.yml new file mode 100644 index 0000000..cb9148b --- /dev/null +++ b/server/docker-compose.yml @@ -0,0 +1,51 @@ +version: "2" +services: + db: + image: mysql:5.7 + ports: + - 3306:3306 + volumes: + - db_data:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: somewordpress + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + restart: always + wordpress: + depends_on: + - db + image: wordpress:latest + ports: + - 8888:80 + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: wordpress + WORDPRESS_DB_PASSWORD: wordpress + restart: always + node: + image: node:8 + ports: + - 8080:80 + volumes: + - ..:/opt/example + - ./cache:/var/cache/nginx + command: [ node, /opt/example/server/index.js ] + environment: + WORDPRESS_HOST: wordpress + NGINX_HOST: nginx + NGINX_CACHE: /var/cache/nginx/data + restart: always + nginx: + depends_on: + - wordpress + - node + image: nginx:latest + volumes: + - ./nginx:/etc/nginx/conf.d + - ./cache:/var/cache/nginx + ports: + - "8000:80" + restart: always +volumes: + db_data: diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..c1be98f --- /dev/null +++ b/server/index.js @@ -0,0 +1,217 @@ +const FS = require('fs'); +const OS = require('os'); +const Express = require('express'); +const CrossFetch = require('cross-fetch'); +const DNSCache = require('dnscache'); +const Crypto = require('crypto'); +const SpiderDetector = require('spider-detector') +const ReactDOMServer = require('react-dom/server'); +const ClientApp = require('./client/app'); + +// enable DNS caching +let dnsCache = DNSCache({ enable: true, ttl: 300, cachesize: 100 }); + +const basePath = `/`; +const perPage = 10; +const serverPort = 80; +const wordpressHost = process.env.WORDPRESS_HOST; +const nginxHost = process.env.NGINX_HOST; +const nginxCache = process.env.NGINX_CACHE; + +let wordpressIP; +dnsCache.lookup(wordpressHost, (err, result) => { + if (!err) { + wordpressIP = `::ffff:${result}`; + } +}); + +let app = Express(); +app.set('json spaces', 2); +app.use(SpiderDetector.middleware()); +app.use(`/`, Express.static(`${__dirname}/www`)); +app.get('/.mtime', handleTimestampRequest); +app.get(`/*`, handlePageRequest); +app.purge(`/*`, handlePurgeRequest); +app.use(handleError); +app.listen(serverPort); + +async function handlePageRequest(req, res, next) { + try { + let host = `http://${nginxHost}`; + let path = req.url; + let noScript = (req.query.js === '0') + let target = (req.isSpider() || noScript) ? 'seo' : 'hydrate'; + let sourceURLs = []; + // create a fetch() that remembers the URLs used + let fetch = (url, options) => { + console.log(`Fetching: ${url}`); + if (url.startsWith(host)) { + var relURL = url.substr(host.length); + sourceURLs.push(relURL); + } + return CrossFetch(url, options); + }; + let options = { host, path, target, fetch }; + let rootNode = await ClientApp.render(options); + let appHTML = ReactDOMServer.renderToString(rootNode); + let indexHTMLPath = `${__dirname}/client/index.html`; + let html = await replaceHTMLComment(indexHTMLPath, 'APP', appHTML); + + if (target === 'hydrate') { + // add