diff --git a/admin/src/System/System.js b/admin/src/System/System.js index 2d7e619..46597c6 100644 --- a/admin/src/System/System.js +++ b/admin/src/System/System.js @@ -288,7 +288,7 @@ const System = () => { '",\n\t\t\t"apiKey": "' + system.key + '"\n\t\t}\n\t],\n\t"uploadServer": "' + - process.env.REACT_APP_BACKEND_SERVER + + process.env.REACT_APP_UPLOAD_SERVER + '"\n}'; switch (system.systemType) { diff --git a/backend/controllers/groups.js b/backend/controllers/groups.js index ce4c40c..8b13789 100644 --- a/backend/controllers/groups.js +++ b/backend/controllers/groups.js @@ -1,13 +1 @@ -const Group = require("../models/group"); -exports.get_groups = async function (req, res) { - const grp_results = await Group.find({ shortName: req.params.shortName.toLowerCase()}).sort("position").catch(err => { - console.error(err); - res.status(500); - res.json({ success: false, message: err }); - return; - }); - - res.contentType('json'); - res.send(JSON.stringify(grp_results)); -} diff --git a/backend/controllers/talkgroups.js b/backend/controllers/talkgroups.js index b3cacc9..2297239 100644 --- a/backend/controllers/talkgroups.js +++ b/backend/controllers/talkgroups.js @@ -1,20 +1,53 @@ const Talkgroup = require("../models/talkgroup"); +const Group = require("../models/group"); -exports.get_talkgroups = async function (req, res) { - const tg_results = await Talkgroup.find({ 'shortName': req.params.shortName.toLowerCase()}).catch(err => { +let groups = {}; +let talkgroups = {}; + +async function load_talkgroups(shortName) { + const tg_results = await Talkgroup.find({ 'shortName': shortName }).catch(err => { console.error(err); res.status(500); res.json({ success: false, message: err }); return; - }); - - var talkgroups = {}; + }); + + let temp = {} for (var tg in tg_results) { - var talkgroup = {_id: tg_results[tg]._id, num: tg_results[tg].num, alpha: tg_results[tg].alpha, description: tg_results[tg].description} - talkgroups[tg_results[tg].num] = talkgroup; + var talkgroup = { _id: tg_results[tg]._id, num: tg_results[tg].num, alpha: tg_results[tg].alpha, description: tg_results[tg].description } + temp[tg_results[tg].num] = talkgroup; } + + return temp; +} + +exports.get_talkgroups = async function (req, res) { + const shortName = req.params.shortName.toLowerCase(); +/* + if (talkgroups.hasOwnProperty(shortName)) { + talkgroups = talkgroups[shortName]; + } else { + }*/ + + let talkgroups = await load_talkgroups(shortName); + res.contentType('json'); res.send(JSON.stringify({ talkgroups: talkgroups })); } + + +exports.get_groups = async function (req, res) { + const shortName = req.params.shortName.toLowerCase(); + + const grp_results = await Group.find({ shortName: req.params.shortName.toLowerCase() }).sort("position").catch(err => { + console.error(err); + res.status(500); + res.json({ success: false, message: err }); + return; + }); + + res.contentType('json'); + res.send(JSON.stringify(grp_results)); +} diff --git a/backend/index.js b/backend/index.js index 89483d9..2e7365c 100644 --- a/backend/index.js +++ b/backend/index.js @@ -6,7 +6,7 @@ var calls = require("./controllers/calls"); var uploads = require("./controllers/uploads"); var systems = require("./controllers/systems"); var talkgroups = require("./controllers/talkgroups"); -var groups = require("./controllers/groups"); + var stats = require("./controllers/stats"); var sys_stats = require("./sys_stats"); var events = require("./controllers/events"); @@ -130,7 +130,7 @@ app.post('/:shortName/authorize', systems.authorize_system); app.get('/:shortName/talkgroups', talkgroups.get_talkgroups); /*------ GROUPS ----------*/ -app.get('/:shortName/groups', groups.get_groups); +app.get('/:shortName/groups', talkgroups.get_groups); /*------ EVENTS ----------*/ diff --git a/certbot-compose.yml b/certbot-compose.yml index 388c1cb..21cfd9d 100644 --- a/certbot-compose.yml +++ b/certbot-compose.yml @@ -27,7 +27,7 @@ services: - ${PWD}/data/certbot/conf/:/etc/letsencrypt/:rw entrypoint: "certbot certonly --webroot -w /var/www/certbot \ --email ${REACT_APP_ADMIN_EMAIL} \ - -d ${DOMAIN_NAME} -d www.${DOMAIN_NAME} -d api.${DOMAIN_NAME} -d admin.${DOMAIN_NAME} -d account.${DOMAIN_NAME} \ + -d ${DOMAIN_NAME} -d www.${DOMAIN_NAME} -d api.${DOMAIN_NAME} -d admin.${DOMAIN_NAME} -d account.${DOMAIN_NAME} -d upload.${DOMAIN_NAME}\ --rsa-key-size 4096 \ --agree-tos \ --force-renewal" diff --git a/docker-compose.yml b/docker-compose.yml index 7b26ff4..0c9b746 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -104,6 +104,7 @@ services: context: ./admin args: - REACT_APP_BACKEND_SERVER + - REACT_APP_UPLOAD_SERVER - REACT_APP_ADMIN_SERVER - REACT_APP_ACCOUNT_SERVER - REACT_APP_FRONTEND_SERVER @@ -113,6 +114,7 @@ services: image: "admin:${TAG}-${STAGE}" environment: - REACT_APP_BACKEND_SERVER + - REACT_APP_UPLOAD_SERVER - REACT_APP_ADMIN_SERVER - REACT_APP_ACCOUNT_SERVER - REACT_APP_FRONTEND_SERVER diff --git a/nginx-proxy/prod/vhosts/site.template b/nginx-proxy/prod/vhosts/site.template index 5d0f33a..8350fbe 100644 --- a/nginx-proxy/prod/vhosts/site.template +++ b/nginx-proxy/prod/vhosts/site.template @@ -52,6 +52,34 @@ server { } } + +server { + listen 443 ssl; + ssl_certificate /etc/letsencrypt/live/${DOMAIN_NAME}/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/${DOMAIN_NAME}/privkey.pem; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + ssl_stapling on; + ssl_stapling_verify on; + add_header Strict-Transport-Security max-age=15768000; + + server_name upload.${DOMAIN_NAME}; + + location /~*/upload { + proxy_pass http://backend:3005; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + include /etc/nginx/proxy.conf; + access_log off; + } +} + server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/${DOMAIN_NAME}/fullchain.pem; diff --git a/nginx-proxy/test/vhosts/site.template b/nginx-proxy/test/vhosts/site.template index aa12004..185e774 100644 --- a/nginx-proxy/test/vhosts/site.template +++ b/nginx-proxy/test/vhosts/site.template @@ -83,3 +83,24 @@ server { access_log off; } } + +server { + listen 80; + + server_name upload.${DOMAIN_NAME}; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location /~*/upload { + proxy_pass http://backend:3005; + include /etc/nginx/proxy.conf; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + access_log off; + } +} diff --git a/prod.env.example b/prod.env.example index 24ddb02..8546cb9 100644 --- a/prod.env.example +++ b/prod.env.example @@ -17,6 +17,7 @@ export NODE_ENV="production" export PROTOCOL="https://" export REACT_APP_BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" +export REACT_APP_UPLOAD_SERVER="${PROTOCOL}upload.${DOMAIN_NAME}" export REACT_APP_FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" export REACT_APP_ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" export REACT_APP_ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}" diff --git a/test.env.example b/test.env.example index e740fb6..f88d9c3 100644 --- a/test.env.example +++ b/test.env.example @@ -17,6 +17,7 @@ export NODE_ENV="test" export PROTOCOL="http://" export REACT_APP_BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" +export REACT_APP_UPLOAD_SERVER="${PROTOCOL}upload.${DOMAIN_NAME}" export REACT_APP_FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" export REACT_APP_ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" export REACT_APP_ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}"