diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..83d144d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +node_modules/ +npm-debug.log +Dockerfile +docker-compose*.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..730bd32 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM node:10-alpine +EXPOSE 8080 +ENV HOST 0.0.0.0 + + +ARG WORKDIR=/sMirror +RUN mkdir -p $WORKDIR +WORKDIR $WORKDIR + +# See: https://github.com/nodejs/docker-node/pull/367#issuecomment-430807898 +RUN apk --no-cache add git + +# mosquitto +RUN apk --no-cache add mosquitto mosquitto-clients + +RUN npm install http-server -g + + +COPY package.json . +COPY package-lock.json . +RUN npm install + +RUN mkdir -p slave/displays +COPY slave/displays/package.json slave/displays/ +COPY slave/displays/package-lock.json slave/displays/ +RUN cd slave/displays && npm install + +COPY . . +RUN cd slave/displays && npm run-script build + +CMD cd slave/displays && http-server --cors + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..db1bca9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' + +services: + smirror: + image: roschaefer/smirror + build: . + ports: + - 8080:8080 + environment: + - HOST=0.0.0.0 + - TRANSIT_API_KEY=${TRANSIT_API_KEY} + - WEATHER_API_KEY=${WEATHER_API_KEY} + - STOCKS_API_KEY=${STOCKS_API_KEY} diff --git a/now.json b/now.json new file mode 100644 index 0000000..6c5f400 --- /dev/null +++ b/now.json @@ -0,0 +1,10 @@ +{ + "name": "smirror", + "alias": "smirror.now.sh", + "type": "docker", + "env": { + "TRANSIT_API_KEY": "@transit-api-key", + "WEATHER_API_KEY": "@weather-api-key", + "STOCKS_API_KEY": "@stocks-api-key" + } +} diff --git a/slave/displays/assets/src/js/maus.js b/slave/displays/assets/src/js/maus.js index 9409bdc..103dc3b 100644 --- a/slave/displays/assets/src/js/maus.js +++ b/slave/displays/assets/src/js/maus.js @@ -6,11 +6,12 @@ const MAX_ENTRIES = 5; window.onload = () => { // real feed url - uncomment line below - let url = 'http://smirrormaster.local:8080/http://www1.wdr.de/mediathek/video/podcast/channel-sendung-mit-der-maus-100.podcast'; + let url = 'http://www1.wdr.de/mediathek/video/podcast/channel-sendung-mit-der-maus-100.podcast'; // local test feed url //let url = './local-feed.xml'; - RSSParser.parseURL(url, (err, parsed) => { + const CORS_PROXY = "https://cors-anywhere.herokuapp.com/" + RSSParser.parseURL(CORS_PROXY + url, (err, parsed) => { if (err || parsed === undefined) { console.error(err); } else { @@ -30,4 +31,4 @@ window.onload = () => { }); -}; \ No newline at end of file +}; diff --git a/slave/displays/assets/src/js/news.js b/slave/displays/assets/src/js/news.js index 56655a6..76f1c41 100644 --- a/slave/displays/assets/src/js/news.js +++ b/slave/displays/assets/src/js/news.js @@ -3,7 +3,10 @@ import moment from 'moment'; import ProgressBar from './lib/progress-bar.js'; window.onload = () => { - RSSParser.parseURL('http://smirrormaster.local:8080/https://spiegel.de/schlagzeilen/tops/index.rss', (err, parsed) => { + //https://github.com/bobby-brennan/rss-parser#web + const CORS_PROXY = "https://cors-anywhere.herokuapp.com/" + const url = 'https://spiegel.de/schlagzeilen/tops/index.rss' + RSSParser.parseURL(CORS_PROXY + url, (err, parsed) => { let items = parsed.feed.entries.slice(0, 5); let i = 0; @@ -34,4 +37,4 @@ window.onload = () => { }(), 20000); }); -}; \ No newline at end of file +}; diff --git a/slave/displays/assets/src/js/stocks.js b/slave/displays/assets/src/js/stocks.js index cb63fd5..696cab9 100644 --- a/slave/displays/assets/src/js/stocks.js +++ b/slave/displays/assets/src/js/stocks.js @@ -1,5 +1,3 @@ -import keys from './config/keys.js'; - // needs an api key from alphavantage.co -> https://www.alphavantage.co/support/#api-key // list of all stocks to be retrieved @@ -17,7 +15,7 @@ let currentIndex = 0; let urls = []; SYMBOLS.forEach((s) => { - urls.push('https://www.alphavantage.co/query?function=' + TIMESPAN + '&symbol=' + s.symbol + '&interval=60min&apikey=' + keys.stocks); + urls.push('https://www.alphavantage.co/query?function=' + TIMESPAN + '&symbol=' + s.symbol + '&interval=60min&apikey=' + process.env.STOCKS_API_KEY); }); let data = []; @@ -28,7 +26,7 @@ window.onload = () => { SYMBOLS.forEach(s => { - let url = 'http://smirrormaster.local:8080/https://www.alphavantage.co/query?function=' + TIMESPAN + '&symbol=' + s.symbol + '&interval=60min&apikey=' + keys.stocks; + let url = 'https://www.alphavantage.co/query?function=' + TIMESPAN + '&symbol=' + s.symbol + '&interval=60min&apikey=' + process.env.STOCKS_API_KEY; promises.push(fetch(url) .then(response => response.json()) @@ -165,4 +163,4 @@ window.onload = () => { .call(d3.axisLeft(y)); }; -} \ No newline at end of file +} diff --git a/slave/displays/assets/src/js/tagesschau.js b/slave/displays/assets/src/js/tagesschau.js index 2cb66c0..d8747f7 100644 --- a/slave/displays/assets/src/js/tagesschau.js +++ b/slave/displays/assets/src/js/tagesschau.js @@ -2,11 +2,13 @@ require('../../../node_modules/rss-parser/dist/rss-parser.js'); window.onload = () => { // real feed url - uncomment line below - let url = 'http://smirrormaster.local:8080/https://www.tagesschau.de/export/video-podcast/tagesschau-in-100-sekunden/'; + let url = 'https://www.tagesschau.de/export/video-podcast/tagesschau-in-100-sekunden/'; // local test feed url //let url = './local-feed.xml'; - RSSParser.parseURL(url, (err, parsed) => { + //https://github.com/bobby-brennan/rss-parser#web + const CORS_PROXY = "https://cors-anywhere.herokuapp.com/" + RSSParser.parseURL(CORS_PROXY + url, (err, parsed) => { if (err || parsed === undefined) { console.error(err); } else { @@ -19,4 +21,4 @@ window.onload = () => { }); -}; \ No newline at end of file +}; diff --git a/slave/displays/assets/src/js/transit.js b/slave/displays/assets/src/js/transit.js index 69554f9..92fd594 100644 --- a/slave/displays/assets/src/js/transit.js +++ b/slave/displays/assets/src/js/transit.js @@ -1,11 +1,10 @@ import moment from 'moment'; -import keys from './config/keys.js'; const ORIGIN = 'Hinter dem Brunnen 6, Lüneburg'; const DESTINATION = 'Hongkongstr. 1, Hamburg'; -let key = keys.transit; -let base = 'http://smirrormaster.local:8080/https://maps.googleapis.com/maps/api/directions/json'; +let key = process.env.TRANSIT_API_KEY; +let base = 'https://maps.googleapis.com/maps/api/directions/json'; let url = `${base}?origin=${ORIGIN}&destination=${DESTINATION}&mode=transit&alternatives=true&key=${key}`; fetch(url, { @@ -80,4 +79,4 @@ let url = `${base}?origin=${ORIGIN}&destination=${DESTINATION}&mode=transit&alte return updateTime; }(), 1000); - }); \ No newline at end of file + }); diff --git a/slave/displays/assets/src/js/weather.js b/slave/displays/assets/src/js/weather.js index d8fabbf..e7a25b4 100644 --- a/slave/displays/assets/src/js/weather.js +++ b/slave/displays/assets/src/js/weather.js @@ -1,4 +1,3 @@ -import keys from './config/keys.js'; import moment from 'moment'; import timespans from './weather/timespans.js'; import icons from './weather/icons.js'; @@ -6,7 +5,7 @@ import icons from './weather/icons.js'; // api configuration let base = 'https://api.openweathermap.org/data/2.5/'; let location = 'Lüneburg'; -let key = keys.weather; +let key = process.env.WEATHER_API_KEY; let current = `${base}/weather?q=${location}&APPID=${key}`; let forecast = `${base}/forecast?q=${location}&APPID=${key}`; @@ -86,4 +85,4 @@ window.onload = () => { }); -}; \ No newline at end of file +}; diff --git a/slave/index.html b/slave/index.html index 0cbb409..d5d4e15 100644 --- a/slave/index.html +++ b/slave/index.html @@ -17,16 +17,16 @@