From 2b6b8042826ad22d9247c6ffe880bb26d48a3739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxi=20Quo=C3=9F?= Date: Sat, 26 Feb 2022 03:10:12 +0100 Subject: [PATCH] docker env vars, remove notifications from backend --- Dockerfile | 2 -- app/backend/backend/settings.py | 4 +-- app/backend/setup.py | 20 ++++++++---- app/backend/wol/admin.py | 2 +- app/backend/wol/consumers.py | 2 -- app/backend/wol/models.py | 1 - app/frontend/package-lock.json | 58 +++++++++++++++++++++++---------- app/frontend/package.json | 2 ++ app/frontend/rollup.config.js | 10 +++++- app/frontend/src/store.js | 2 +- app/run.sh | 6 ++-- docker-compose-sqlite.yml | 30 ++++++++--------- 12 files changed, 88 insertions(+), 51 deletions(-) diff --git a/Dockerfile b/Dockerfile index c82069ec..0830311f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,8 +18,6 @@ COPY app/frontend/package*.json ./ COPY app/frontend/src ./src COPY app/frontend/public ./public COPY app/frontend/rollup.config.js ./ -RUN npm install -RUN npm run build FROM base WORKDIR /app diff --git a/app/backend/backend/settings.py b/app/backend/backend/settings.py index e8ca76ad..bd62bd4d 100644 --- a/app/backend/backend/settings.py +++ b/app/backend/backend/settings.py @@ -151,9 +151,9 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/4.0/topics/i18n/ -LANGUAGE_CODE = os.getenv("DJANGO_LANGUAGE_CODE") +LANGUAGE_CODE = os.getenv("DJANGO_LANGUAGE_CODE", "en") -TIME_ZONE = os.getenv("DJANGO_TIME_ZONE") +TIME_ZONE = os.getenv("DJANGO_TIME_ZONE", "UTC") USE_I18N = True diff --git a/app/backend/setup.py b/app/backend/setup.py index ee7573e1..0d339570 100644 --- a/app/backend/setup.py +++ b/app/backend/setup.py @@ -1,26 +1,32 @@ import os from django.contrib.auth.models import User +from django.core.management.utils import get_random_secret_key +from django_celery_beat.models import IntervalSchedule, PeriodicTask from wol.models import Settings, Websocket -from django_celery_beat.models import PeriodicTask, IntervalSchedule - # create superuser -if not User.objects.filter(username=os.getenv("DJANGO_SUPERUSER_USER")).exists(): - User.objects.create_superuser(os.getenv("DJANGO_SUPERUSER_USER"), password=os.getenv("DJANGO_SUPERUSER_PASSWORD")) -else: - print('Django user exists') +if os.getenv("DJANGO_SUPERUSER_USER") and os.getenv("DJANGO_SUPERUSER_PASSWORD"): + if not User.objects.filter(username=os.getenv("DJANGO_SUPERUSER_USER")).exists(): + User.objects.create_superuser(os.getenv("DJANGO_SUPERUSER_USER"), password=os.getenv("DJANGO_SUPERUSER_PASSWORD")) + else: + print('Django user exists') + +# create django secret key +if not os.getenv("DJANGO_SUPERUSER_PASSWORD"): + os.environ["DJANGO_SECRET_KEY"] = get_random_secret_key() # reset visitors [i.delete() for i in Websocket.objects.all()] Websocket.objects.create(visitors=0) # notifications +if not os.getenv("PING_INTERVAL"): + os.environ["PING_INTERVAL"] = 5 Settings.objects.update_or_create( id=1, defaults={ - "enable_notifications": os.getenv("ENABLE_NOTIFICATIONS"), "interval": os.getenv("PING_INTERVAL") } ) diff --git a/app/backend/wol/admin.py b/app/backend/wol/admin.py index e659c4c8..2503fd05 100644 --- a/app/backend/wol/admin.py +++ b/app/backend/wol/admin.py @@ -17,7 +17,7 @@ class PortAdmin(admin.ModelAdmin): list_filter = ["number", "name"] class SettingsAdmin(admin.ModelAdmin): - list_display = ["enable_notifications", "sort_by", "scan_address", "interval"] + list_display = ["sort_by", "scan_address", "interval"] admin.site.register(Device, DeviceAdmin) diff --git a/app/backend/wol/consumers.py b/app/backend/wol/consumers.py index 5b396bc7..b09bdd27 100644 --- a/app/backend/wol/consumers.py +++ b/app/backend/wol/consumers.py @@ -221,7 +221,6 @@ class WSConsumer(AsyncWebsocketConsumer): def get_settings(self): conf = Settings.objects.get(id=1) data = { - "notifications": conf.enable_notifications, "discovery": conf.scan_address, "interval": conf.interval, "scan_network": [] @@ -235,7 +234,6 @@ class WSConsumer(AsyncWebsocketConsumer): Settings.objects.update_or_create( id=1, defaults={ - "enable_notifications": data["notifications"], "scan_address": data["discovery"], "interval": data["interval"] } diff --git a/app/backend/wol/models.py b/app/backend/wol/models.py index 04c2a5de..a8dfdc6f 100644 --- a/app/backend/wol/models.py +++ b/app/backend/wol/models.py @@ -20,7 +20,6 @@ class Websocket(models.Model): visitors = models.PositiveSmallIntegerField(blank=False, null=False, default=0) class Settings(models.Model): - enable_notifications = models.BooleanField(default=True) sort_by = models.SlugField(default="name") scan_address = models.GenericIPAddressField(null=True, blank=True) interval = models.PositiveSmallIntegerField(null=True, blank=True) diff --git a/app/frontend/package-lock.json b/app/frontend/package-lock.json index 277ad863..87132c8c 100644 --- a/app/frontend/package-lock.json +++ b/app/frontend/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "dependencies": { "@fortawesome/fontawesome-free": "^6.0.0", + "@rollup/plugin-replace": "^4.0.0", "bootstrap": "^5.1.3", + "dotenv": "^16.0.0", "node-sass": "^7.0.1", "postcss": "^8.4.6", "sirv-cli": "^2.0.0", @@ -185,11 +187,22 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -205,8 +218,7 @@ "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, "node_modules/@tootallnate/once": { "version": "1.1.2", @@ -219,8 +231,7 @@ "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@types/fs-extra": { "version": "8.1.2", @@ -843,6 +854,14 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "engines": { + "node": ">=12" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1041,7 +1060,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2337,7 +2355,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -2646,7 +2663,6 @@ "version": "2.67.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz", "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==", - "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -3757,11 +3773,19 @@ "resolve": "^1.19.0" } }, + "@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -3771,8 +3795,7 @@ "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" } } }, @@ -3784,8 +3807,7 @@ "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "@types/fs-extra": { "version": "8.1.2", @@ -4270,6 +4292,11 @@ "path-type": "^4.0.0" } }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4435,7 +4462,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { @@ -5417,8 +5443,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "postcss": { "version": "8.4.6", @@ -5639,7 +5664,6 @@ "version": "2.67.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz", "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==", - "dev": true, "requires": { "fsevents": "~2.3.2" } diff --git a/app/frontend/package.json b/app/frontend/package.json index 14d5e690..71ad1f39 100644 --- a/app/frontend/package.json +++ b/app/frontend/package.json @@ -20,7 +20,9 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^6.0.0", + "@rollup/plugin-replace": "^4.0.0", "bootstrap": "^5.1.3", + "dotenv": "^16.0.0", "node-sass": "^7.0.1", "postcss": "^8.4.6", "sirv-cli": "^2.0.0", diff --git a/app/frontend/rollup.config.js b/app/frontend/rollup.config.js index d850236b..eb42c171 100644 --- a/app/frontend/rollup.config.js +++ b/app/frontend/rollup.config.js @@ -6,6 +6,10 @@ import { terser } from 'rollup-plugin-terser'; import css from 'rollup-plugin-css-only'; import preprocess from 'svelte-preprocess'; import copy from 'rollup-plugin-copy'; +import dotenv from "dotenv"; +import replace from '@rollup/plugin-replace'; + +dotenv.config() const production = !process.env.ROLLUP_WATCH; @@ -44,7 +48,11 @@ export default { // enable run-time checks when not in production dev: !production, }, - preprocess: preprocess() + preprocess: preprocess(), + }), + replace({ + BACKEND_PORT: JSON.stringify(process.env.BACKEND_PORT), + preventAssignment: true }), // we'll extract any component CSS out into // a separate file - better for performance diff --git a/app/frontend/src/store.js b/app/frontend/src/store.js index 12f5f2e9..7d06a42d 100644 --- a/app/frontend/src/store.js +++ b/app/frontend/src/store.js @@ -3,7 +3,7 @@ import { } from 'svelte/store'; const messageStore = writable(''); -const socket = new WebSocket("ws://" + location.hostname + ":8000/wol/"); +const socket = new WebSocket(`ws://${location.hostname}:${BACKEND_PORT}/wol/`); // Connection opened socket.addEventListener('open', function (event) { diff --git a/app/run.sh b/app/run.sh index 5f7b2b32..09f21eed 100755 --- a/app/run.sh +++ b/app/run.sh @@ -26,8 +26,10 @@ python3 manage.py collectstatic --noinput python3 manage.py shell < setup.py python3 -m celery -A backend worker & python3 -m celery -A backend beat & -python3 -m gunicorn --bind 0.0.0.0:"$DJANGO_PORT" --workers 4 backend.asgi:application -k uvicorn.workers.UvicornWorker & +python3 -m gunicorn --bind 0.0.0.0:"${BACKEND_PORT}" --workers 4 backend.asgi:application -k uvicorn.workers.UvicornWorker & # start frontend cd /app/frontend/ || exit -npm start +npm install +npm run build +PORT=$FRONTEND_PORT npm start diff --git a/docker-compose-sqlite.yml b/docker-compose-sqlite.yml index 466e4968..20799c97 100644 --- a/docker-compose-sqlite.yml +++ b/docker-compose-sqlite.yml @@ -1,27 +1,27 @@ version: "3" services: - upsnap_django: - container_name: upsnap_django + app: + container_name: upsnap_app #image: seriousm4x/upsnap:latest build: . network_mode: host restart: unless-stopped environment: - - DJANGO_SUPERUSER_USER=admin - - DJANGO_SUPERUSER_PASSWORD=admin - - DJANGO_SECRET_KEY=secret - - DJANGO_DEBUG=True - - DJANGO_LANGUAGE_CODE=de - - DJANGO_TIME_ZONE=Europe/Berlin - - DJANGO_PORT=8000 - - REDIS_HOST=127.0.0.1 - - REDIS_PORT=6379 - - DB_TYPE=sqlite - - PING_INTERVAL=5 - - ENABLE_NOTIFICATIONS=True + - FRONTEND_PORT=8000 + - BACKEND_PORT=8001 + - DB_TYPE=sqlite # required + - REDIS_HOST=127.0.0.1 # required (make sure to use the same ip as below) + - REDIS_PORT=6379 # required (make sure to use the same port as below) + - PING_INTERVAL=5 # optional (default: 5 seconds) + - DJANGO_SUPERUSER_USER=admin # optional (default: backend login disabled) + - DJANGO_SUPERUSER_PASSWORD=admin # optional (default: backend login disabled) + - DJANGO_SECRET_KEY=secret # optional (default: randomly generated) + - DJANGO_DEBUG=True # optional (default: False) + - DJANGO_LANGUAGE_CODE=de # optional (default: en) + - DJANGO_TIME_ZONE=Europe/Berlin # optional (default: UTC) depends_on: - upsnap_redis - upsnap_redis: + redis: container_name: upsnap_redis image: redis:alpine ports: