diff --git a/.docker/.dockerignore b/.docker/.dockerignore deleted file mode 100644 index 93f13619..00000000 --- a/.docker/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -npm-debug.log diff --git a/.docker/nginx.conf b/.docker/nginx.conf deleted file mode 100644 index 17639330..00000000 --- a/.docker/nginx.conf +++ /dev/null @@ -1,45 +0,0 @@ -worker_processes 1; -user nobody nobody; -error_log /tmp/error.log; -pid /tmp/nginx.pid; - -events { - - worker_connections 1024; -} - -http { - - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - client_body_temp_path /tmp/client_body; - fastcgi_temp_path /tmp/fastcgi_temp; - proxy_temp_path /tmp/proxy_temp; - scgi_temp_path /tmp/scgi_temp; - uwsgi_temp_path /tmp/uwsgi_temp; - access_log /tmp/access.log; - error_log /tmp/error.log; - - keepalive_timeout 3000; - server { - listen 80; - listen [::]:80; - index index.html; - server_name localhost; - root /usr/share/nginx/html; - autoindex on; - - location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { - expires -1; - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Credentials true; - add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; - add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - location / { - try_files $uri $uri/ /index.html =404; - } - } -} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..c43179e2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,77 @@ +node_modules +npm-debug.log +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + diff --git a/.esdoc.json b/.esdoc.json index 4d236594..99f1efa6 100644 --- a/.esdoc.json +++ b/.esdoc.json @@ -35,7 +35,7 @@ "title": "Coriolis", "description": "Coriolis Shipyard for Elite Dangerous", "repository": "https://github.com/EDCD/coriolis", - "site": "https://coriolis.edcd.io", + "site": "https://coriolis.io", "author": "https://github.com/edcd", "image": "./src/images/logo/192x192.png" } @@ -81,7 +81,7 @@ "title": "Coriolis", "description": "Coriolis Shipyard for Elite Dangerous", "repository": "https://github.com/EDCD/coriolis", - "site": "https://coriolis.edcd.io", + "site": "https://coriolis.io", "author": "https://github.com/edcd", "image": "./src/images/logo/192x192.png" } @@ -100,4 +100,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.docker/Dockerfile b/Dockerfile similarity index 71% rename from .docker/Dockerfile rename to Dockerfile index 7c6523c0..3c44bd3f 100644 --- a/.docker/Dockerfile +++ b/Dockerfile @@ -6,29 +6,28 @@ WORKDIR /src/app RUN mkdir -p /src/app/coriolis RUN mkdir -p /src/app/coriolis-data -COPY ./coriolis/ /src/app/coriolis -COPY ./coriolis-data/ /src/app/coriolis-data +RUN apk add --update git -RUN apk update -RUN apk add git +COPY . /src/app/coriolis RUN npm i -g npm # Set up coriolis-data WORKDIR /src/app/coriolis-data -RUN git fetch --all +RUN git clone https://github.com/EDCD/coriolis-data.git . +RUN git checkout ${BRANCH} RUN npm install --no-package-lock RUN npm start +# Set up coriolis WORKDIR /src/app/coriolis -RUN git fetch --all RUN npm install --no-package-lock RUN npm run build ### STAGE 2: Production Environment ### -FROM nginx:1.13.12-alpine as web -COPY coriolis/.docker/nginx.conf /etc/nginx/nginx.conf +FROM fholzer/nginx-brotli as web +COPY nginx.conf /etc/nginx/nginx.conf COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html WORKDIR /usr/share/nginx/html EXPOSE 80 diff --git a/.docker/docker-compose.yml b/docker-compose.yml similarity index 100% rename from .docker/docker-compose.yml rename to docker-compose.yml diff --git a/nginx.conf b/nginx.conf index a9938f1e..874aefa0 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,61 +1,96 @@ -worker_processes 2; -error_log ./nginx.error.log; -worker_rlimit_nofile 8192; -pid nginx.pid; +worker_processes 1; +user nobody nobody; +error_log /tmp/error.log; +pid /tmp/nginx.pid; events { - worker_connections 1024; - multi_accept on; + + worker_connections 1024; } http { - access_log off; - charset UTF-8; + include /etc/nginx/mime.types; + default_type application/octet-stream; + sendfile on; + client_body_temp_path /tmp/client_body; + fastcgi_temp_path /tmp/fastcgi_temp; + proxy_temp_path /tmp/proxy_temp; + scgi_temp_path /tmp/scgi_temp; + uwsgi_temp_path /tmp/uwsgi_temp; + access_log /tmp/access.log; + error_log /tmp/error.log; - types { - text/html html htm shtml; - text/css css; - text/xml xml rss; - image/gif gif; - image/jpeg jpeg jpg; - application/x-javascript js; - text/plain txt; - image/png png; - image/svg+xml svg; - image/x-icon ico; - application/pdf pdf; - text/cache-manifest appcache; - } + # https://nginx.org/en/docs/http/ngx_http_gzip_module.html + # Enable gzip compression. + # Default: off + gzip off; - gzip on; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + # Compression level (1-9). + # 5 is a perfect compromise between size and CPU usage, offering about + # 75% reduction for most ASCII files (almost identical to level 9). + # Default: 1 + gzip_comp_level 5; - server { - listen 3301; - server_name localhost; - root ./build/; - index index.html; + # Don't compress anything that's already small and unlikely to shrink much + # if at all (the default is 20 bytes, which is bad as that usually leads to + # larger files after gzipping). + # Default: 20 + gzip_min_length 256; - location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { - expires -1; - add_header Access-Control-Allow-Origin *; + # Compress data even for clients that are connecting to us via proxies, + # identified by the "Via" header (required for CloudFront). + # Default: off + gzip_proxied any; + + # Tell proxies to cache both the gzipped and regular version of a resource + # whenever the client's Accept-Encoding capabilities header varies; + # Avoids the issue where a non-gzip capable client (which is extremely rare + # today) would display gibberish if their proxy gave them the gzipped version. + # Default: off + gzip_vary on; + + # Compress all output labeled with one of the following MIME-types. + # text/html is always compressed by gzip module. + # Default: text/html + gzip_types *; + brotli on; + # brotli_static on; + brotli_types *; + # This should be turned on if you are going to have pre-compressed copies (.gz) of + # static files available. If not it should be left off as it will cause extra I/O + # for the check. It is best if you enable this in a location{} block for + # a specific directory, or on an individual server{} level. + # gzip_static on; + keepalive_timeout 3000; + server { + listen 80; + listen [::]:80; + index index.html; + server_name localhost; + root /usr/share/nginx/html; + autoindex on; + + location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Credentials true; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; + access_log off; + } + location /service-worker.js { + expires -1; + add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - - location / { - try_files $uri $uri/ /index.html =404; - } - location /iframe.html { - try_files $uri $uri/ /iframe.html =404; - } - } + access_log off; + } + location / { + try_files $uri $uri/ /index.html =404; + } + location /iframe.html { + try_files $uri $uri/ /iframe.html =404; + } + } } diff --git a/package.json b/package.json index 28dbe455..f937daee 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "git", "url": "https://github.com/EDCD/coriolis" }, - "homepage": "https://coriolis.edcd.io", + "homepage": "https://coriolis.io", "bugs": "https://github.com/EDCD/coriolis/issues", "private": true, "engine": "node >= 4.8.1", @@ -120,6 +120,7 @@ "webpack-notifier": "^1.6.0", "workbox-webpack-plugin": "^3.6.1" }, + "sideEffects": false, "dependencies": { "@babel/polyfill": "^7.0.0", "browserify-zlib-next": "^1.0.1", diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 0595b41c..8b544b1f 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Router from './Router'; -import { register } from 'register-service-worker' +import { register } from 'register-service-worker'; import { EventEmitter } from 'fbemitter'; import { getLanguage } from './i18n/Language'; import Persist from './stores/Persist'; @@ -72,7 +72,7 @@ export default class Coriolis extends React.Component { route: {}, sizeRatio: Persist.getSizeRatio() }; - this._getAnnouncements() + this._getAnnouncements(); Router('', (r) => this._setPage(ShipyardPage, r)); Router('/import?', (r) => this._importBuild(r)); Router('/import/:data', (r) => this._importBuild(r)); @@ -105,18 +105,20 @@ export default class Coriolis extends React.Component { } r.params.ship = ship.id; r.params.code = ship.toString(); - this._setPage(OutfittingPage, r); + this._setPage(OutfittingPage, r) } catch (err) { this._onError('Failed to import ship', r.path, 0, 0, err); } } - _getAnnouncements() { - return request.get('https://orbis.zone/api/announcement') - .query({showInCoriolis: true}) - .then(announces => { - this.setState({ announcements: announces.body }) - }) + async _getAnnouncements() { + try { + const announces = await request.get('https://orbis.zone/api/announcement') + .query({ showInCoriolis: true }); + this.setState({ announcements: announces.body }); + } catch (err) { + console.error(err) + } } /** @@ -351,27 +353,27 @@ export default class Coriolis extends React.Component { const self = this; if (process.env.NODE_ENV === 'production') { register('/service-worker.js', { - ready (registration) { - console.log('Service worker is active.') + ready(registration) { + console.log('Service worker is active.'); }, - registered (registration) { - console.log('Service worker has been registered.') + registered(registration) { + console.log('Service worker has been registered.'); }, - cached (registration) { - console.log('Content has been cached for offline use.') + cached(registration) { + console.log('Content has been cached for offline use.'); }, - updatefound (registration) { - console.log('New content is downloading.') + updatefound(registration) { + console.log('New content is downloading.'); }, - updated (registration) { + updated(registration) { self.setState({ appCacheUpdate: true }); - console.log('New content is available; please refresh.') + console.log('New content is available; please refresh.'); }, - offline () { - console.log('No internet connection found. App is running in offline mode.') + offline() { + console.log('No internet connection found. App is running in offline mode.'); }, - error (error) { - console.error('Error during service worker registration:', error) + error(error) { + console.error('Error during service worker registration:', error); } }); } @@ -394,21 +396,24 @@ export default class Coriolis extends React.Component { let currentMenu = this.state.currentMenu; return