From 3f93c24d50ecca3720e3599b4b2d395ac03c4666 Mon Sep 17 00:00:00 2001
From: Bernhard Heinloth <heinloth@cs.fau.de>
Date: Wed, 6 Apr 2022 13:51:56 +0200
Subject: [PATCH] Webfrontend via Docker

---
 server/docker-compose.yml  | 38 ++++++++++++++++++++++++++++++++++++++
 server/docker.sql          |  4 ++++
 server/example-config.php  |  6 +++---
 server/insert_new_user.sql |  2 +-
 server/nginx.conf          | 32 ++++++++++++++++++++++++++++++++
 server/www/index.php       | 18 +++++++++---------
 6 files changed, 87 insertions(+), 13 deletions(-)
 create mode 100644 server/docker-compose.yml
 create mode 100644 server/docker.sql
 create mode 100644 server/nginx.conf

diff --git a/server/docker-compose.yml b/server/docker-compose.yml
new file mode 100644
index 0000000..52829a6
--- /dev/null
+++ b/server/docker-compose.yml
@@ -0,0 +1,38 @@
+version: '3.7'
+services:
+    web:
+        image: inf4/timecube
+        volumes:
+            # Adjust domain
+            - ./nginx.conf:/etc/nginx/sites-enabled/default
+            # Adjust database user and password
+            - ./www/config.php:/timecube/server/www/config.php
+        ports:
+            - 80:80
+        restart: always
+        command: sh -c '/etc/init.d/php7.4-fpm start ; nginx -g "daemon off;"'
+        depends_on:
+            - db
+    db:
+        image: postgres:10.5
+        restart: always
+        environment:
+          - PGUSER=postgres
+          # must be identical to www/config.php (and credentials should be changed!)
+          - POSTGRES_DB=timelog
+          - POSTGRES_USER=timelog
+          - POSTGRES_PASSWORD=YOUR_PASSWORD!
+        ports:
+          - 5438:5432
+        volumes:
+          # lokal volume
+          - db:/var/lib/postgresql/data
+          # create the database tables
+          - ./docker.sql:/docker-entrypoint-initdb.d/0-docker.sql
+          # create the database tables
+          - ./database.sql:/docker-entrypoint-initdb.d/database.sql
+          # fill in user and timecube mac
+          - ./insert_new_user.sql:/docker-entrypoint-initdb.d/insert_new_user.sql
+volumes:
+  db:
+    driver: local
diff --git a/server/docker.sql b/server/docker.sql
new file mode 100644
index 0000000..2a367d1
--- /dev/null
+++ b/server/docker.sql
@@ -0,0 +1,4 @@
+-- Our docker compose will create a user, but not the default postgres one.
+-- Let's do it here.
+
+CREATE ROLE postgres;
diff --git a/server/example-config.php b/server/example-config.php
index 3a06011..d1de78a 100644
--- a/server/example-config.php
+++ b/server/example-config.php
@@ -1,8 +1,8 @@
 <?php
 
-$DBHOST="localhost";
+$DBHOST="db";
 $DBNAME="timelog";
-$DBUSER="USER";
-$DBPASS="PASS";
+$DBUSER="postgres";
+$DBPASS="YOUR_PASSWORD!";
 
 ?>
diff --git a/server/insert_new_user.sql b/server/insert_new_user.sql
index 0a60524..64643d7 100644
--- a/server/insert_new_user.sql
+++ b/server/insert_new_user.sql
@@ -38,7 +38,7 @@ WITH data (     name       ,      email         ,      alias     ,      mac
 ), addside6 AS (
 	INSERT INTO cubesides (mac, side, category) SELECT mac, 6, id FROM addcat6 CROSS JOIN data
 )
-INSERT INTO connection (mac, side, voltage, time)
+INSERT INTO connection (mac, id, voltage, time)
 SELECT mac, id, 0, extract(epoch from now()) FROM data CROSS JOIN addside0;
 
 COMMIT;
diff --git a/server/nginx.conf b/server/nginx.conf
new file mode 100644
index 0000000..ddf0723
--- /dev/null
+++ b/server/nginx.conf
@@ -0,0 +1,32 @@
+server {
+    listen 80 default_server;
+    server_name _;
+    root /timecube/server/www/;
+
+    index index.php;
+
+    location ~ /?config.php$ {
+        return 403;
+    }
+
+    if (!-e $request_filename){
+        rewrite ^/([^/]*)$ /$1/ redirect;
+        rewrite "^/([A-Fa-f0-9]{12})/?(.*)$" /index.php?mac=$1&alias=$1&site=$2 break;
+        rewrite ^/([^/]*)/?(.*)$ /index.php?alias=$1&site=$2 break;
+    }
+
+    location ~ \.php$ {
+        include snippets/fastcgi-php.conf;
+        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
+     }
+
+    location ~ /\.ht {
+        deny all;
+    }
+
+    location / {
+        try_files $uri $uri/ =404;
+    }
+
+
+}
diff --git a/server/www/index.php b/server/www/index.php
index 4681e0b..cc4ae0f 100644
--- a/server/www/index.php
+++ b/server/www/index.php
@@ -123,18 +123,18 @@ switch ($site){
 		status('Eingetragen.', 200, 'OK');
 		break;
 
-    case 'data.csv':
-        header('Content-type: text/comma-separated-values');
-        echo "From;To;Duration;FromISO;ToISO;name;hidden;MAC\n";
-        $stmt_log = $pdo->prepare('SELECT data.begin AS begin, data.stop AS stop, categories.name AS name, categories.hidden AS hidden, data.mac AS mac FROM data JOIN categories ON (data.category = categories.id) WHERE categories.uid = ? ORDER BY begin, stop');
-        if ($stmt_log->execute(array($user['uid'])))
-            while ($row_log = $stmt_log->fetch(PDO::FETCH_ASSOC))
-                echo $row_log['begin'].';'.$row_log['stop'].';'.($row_log['stop']-$row_log['begin']).';'.date('c;',$row_log['begin']).date('c;',$row_log['stop']).$row_log['name'].';'.$row_log['hidden'].';'.$row_log['mac']."\r\n";
-        break;
+	case 'data.csv':
+		header('Content-type: text/comma-separated-values');
+		echo "From;To;Duration;FromISO;ToISO;name;hidden;MAC\n";
+		$stmt_log = $pdo->prepare('SELECT data.begin AS begin, data.stop AS stop, categories.name AS name, categories.hidden AS hidden, data.mac AS mac FROM data JOIN categories ON (data.category = categories.id) WHERE categories.uid = ? ORDER BY begin, stop');
+		if ($stmt_log->execute(array($user['uid'])))
+			while ($row_log = $stmt_log->fetch(PDO::FETCH_ASSOC))
+				echo $row_log['begin'].';'.$row_log['stop'].';'.($row_log['stop']-$row_log['begin']).';'.date('c;',$row_log['begin']).date('c;',$row_log['stop']).$row_log['name'].';'.$row_log['hidden'].';'.$row_log['mac']."\r\n";
+		break;
 
 	case 'dashboard':
 	case 'update':
 	default:
-		include('dashboard.html');
+		readfile('dashboard.html');
 }
 ?>
-- 
GitLab