diff --git a/README.md b/README.md index 1d374af..45bd819 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,54 @@ # msv-webcam-frontend -- `zypper install avif-tools` +0) Get [backend running](https://git.mosad.xyz/localhorst/msv-webcam-backend) +1) copy WebApp to `/var/www/html/msv-buehl-moos.de/webcam/` +2) Import following nginx config: -- `mkdir /opt/msv-webcam-frontend/` -- `cd /opt/msv-webcam-frontend/` -- import `msv_webcam_frontend.py` -- `chmod +x /opt/msv-webcam-frontend/msv_webcam_frontend.py` -- `nano /etc/systemd/system/msv-webcam-frontend.service` -- create dst dir `mkdir -p /var/www/html/msv-buehl-moos.de/webcam/data/camera/` -- `systemctl daemon-reload && systemctl enable --now msv-webcam-frontend.service` +``` +server +{ + listen 80; + listen [::]:80; + server_name msv-buehl-moos.de www.msv-buehl-moos.de; + return 301 https://$host$request_uri; +} -- copy WebApp to `/var/www/html/msv-buehl-moos.de/webcam/` \ No newline at end of file +server +{ + server_name msv-buehl-moos.de www.msv-buehl-moos.de; + listen 443 ssl; + listen [::]:443 ssl; + add_header Strict-Transport-Security max-age=31536000; + ssl_certificate /etc/letsencrypt/live/msv-buehl-moos.de/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/msv-buehl-moos.de/privkey.pem; + + location / + { + client_max_body_size 10G; + proxy_buffering off; + proxy_pass http://127.0.0.1:27964; + proxy_set_header Accept-Encoding ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Serve /webcam/data/camera/ from the FTPS current folder + location /webcam/data/camera/ + { + alias /home/dockeruser/ftps_server/files/current/; + autoindex on; + } + + # Generic /webcam location for the rest of the content + location /webcam + { + root /var/www/html/msv-buehl-moos.de; + index index.html; + } +} + +``` +3) Test config with `nginx -t` +4) Restart nginx with `systemctl restart nginx.service` \ No newline at end of file diff --git a/msv-webcam-frontend.service b/msv-webcam-frontend.service deleted file mode 100644 index ed9e83a..0000000 --- a/msv-webcam-frontend.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=MSV-Webcam-Frontend -After=syslog.target -After=network.target - -[Service] -Type=simple -User=wwwrun -Group=wwwrun -Restart=on-failure -RestartSec=5s -WorkingDirectory=/opt/msv-webcam-frontend/ -ExecStart=/usr/bin/python3 /opt/msv-webcam-frontend/msv_webcam_frontend.py source_dir=/tmp/msv_webcam_current destination_dir=/var/www/html/msv-buehl-moos.de/webcam/data/camera/ timeout=540 min_size=100000 - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/msv_webcam_frontend.py b/msv_webcam_frontend.py deleted file mode 100644 index ce24e6e..0000000 --- a/msv_webcam_frontend.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" Author: Hendrik Schutter, mail@hendrikschutter.com -""" - -import os -import errno -import time -from datetime import datetime -import shutil -import sys -import subprocess -import threading - -signal_pipe_path = "/tmp/msv-webcam-signal-pipe" -signal_pipe_msg = "msv-webcam-new-images" - -def copy_image(src, destination_dir_path): - #print("src: " + str(src)) - #print("dst: " + str(destination_dir_path)) - shutil.copyfile(src, destination_dir_path) - -def convert_to_avif(input, output): - #print("input: " + str(input)) - #print("output: " + str(output)) - temp = subprocess.Popen(['avifenc', '--jobs', 'all', input, output], stdout = subprocess.PIPE) - # get the output as a string - #output = str(temp.communicate()) - #print(output) - temp = subprocess.Popen(['sync',], stdout = subprocess.PIPE) - -def process_new_images(source_dir, destination_dir_path, min_size): - images = os.listdir(source_dir) - for image in images: - if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] != ".avif")): - - if(os.stat(os.path.join(source_dir, image)).st_size >= min_size): - - converted_file_name = (os.path.splitext(os.path.basename(os.path.normpath(image)))[0] + ".avif") - converted_file_path = os.path.join("/tmp/", converted_file_name) - - convert_to_avif(os.path.join(source_dir, image), converted_file_path) - - copy_image(converted_file_path, os.path.join(destination_dir_path, converted_file_name)) - - else: - print("Image " + str(image) + " too small.") - -def remove_old_image(path): - print("Removing following outdated image: " + str(path)) - os.remove(path) - -def watchdog(timeout, source_dir, destination_dir_path): - known_images = list() - - while True: - images = os.listdir(destination_dir_path) - for image in images: - if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] == ".avif")): - current_image = (image, os.stat(os.path.join(destination_dir_path, image)).st_size) - if current_image in known_images: - print("This image is old: " + str(image)) - remove_old_image(os.path.join(destination_dir_path, image)) - - known_images.clear() - - images = os.listdir(destination_dir_path) - for image in images: - if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] == ".avif")): - current_image = (image, os.stat(os.path.join(destination_dir_path, image)).st_size) - known_images.append(current_image) - - time.sleep(timeout) - -def main(): - print("starting ...") - - source_dir = -1 - destination_dir_path = -1 - timeout = -1 - min_size = -1 - - for argument in sys.argv: - if argument.startswith('destination_dir'): - destination_dir_path = argument.split("=")[1] - if argument.startswith('source_dir'): - source_dir = argument.split("=")[1] - if argument.startswith('timeout'): - timeout = int(argument.split("=")[1]) - if argument.startswith('min_size'): - min_size = int(argument.split("=")[1]) - - if ((source_dir == -1) or (destination_dir_path == -1)): - print("Unable to parse config!") - print("Example usage:") - print(" python msv_webcam_frontend.py source_dir=/tmp/msv_webcam_current destination_dir=www/camera/ timeout=540 min_size=100000") - sys.exit(-1) - - - watchdog_thread = threading.Thread(target=watchdog, args=((timeout, source_dir, destination_dir_path))) - watchdog_thread.start() - - #process_new_images(source_dir, destination_dir_path) - #sys.exit(-1) - - while True: - try: - if not os.path.exists(signal_pipe_path): - os.mkfifo(signal_pipe_path) - pipe_fd = os.open(signal_pipe_path, os.O_RDONLY | os.O_NONBLOCK) - with os.fdopen(pipe_fd) as pipe: - while True: - #print("reading pipe") - message = pipe.read() - if message: - #print("Received: " + str(message)) - if(message == signal_pipe_msg): - print("received signal about new images") - process_new_images(source_dir, destination_dir_path, min_size) - time.sleep(1) - except Exception as e: - print(e) - - watchdog_thread.join() - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/www/data/camera/msvcamN.avif b/www/data/camera/msvcamN.avif deleted file mode 100644 index 89d1525..0000000 Binary files a/www/data/camera/msvcamN.avif and /dev/null differ diff --git a/www/data/camera/msvcamS.avif b/www/data/camera/msvcamS.avif deleted file mode 100644 index 0619adf..0000000 Binary files a/www/data/camera/msvcamS.avif and /dev/null differ diff --git a/www/index.html b/www/index.html index a0fcae1..0c3c0df 100644 --- a/www/index.html +++ b/www/index.html @@ -46,7 +46,7 @@
pressewart@msv-buehl-moos.de
-

Last update: 2023/07/18

+

Last update: 2025/08/15

View code in GIT