]> git.ekhem.eu.org Git - server.git/commitdiff
[postgres][rsyslog] Insert website logs to a database.
authorJakub Czajka <jakub@ekhem.eu.org>
Sun, 14 Jan 2024 17:40:22 +0000 (18:40 +0100)
committerJakub Czajka <jakub@ekhem.eu.org>
Sun, 14 Jan 2024 21:23:02 +0000 (22:23 +0100)
databases/analytics/analytics_db_create.sql [new file with mode: 0644]
databases/analytics/analytics_db_drop.sql [new file with mode: 0644]
postgres/pg_hba.conf
rsyslog/51-website.conf [new file with mode: 0644]
rsyslog/README [new file with mode: 0644]

diff --git a/databases/analytics/analytics_db_create.sql b/databases/analytics/analytics_db_create.sql
new file mode 100644 (file)
index 0000000..227b795
--- /dev/null
@@ -0,0 +1,24 @@
+-- Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
+-- License: 0BSD.
+
+CREATE TABLE IF NOT EXISTS access_logs (
+   access_log TEXT NOT NULL,
+   created_at DATE NOT NULL
+);
+
+DO $$
+BEGIN
+    IF NOT EXISTS (SELECT * FROM pg_user WHERE usename = 'rsyslog')
+    THEN
+        CREATE ROLE rsyslog LOGIN;
+
+        GRANT INSERT
+        ON access_logs
+        TO rsyslog;
+
+        /* Execute for the current database. */
+        EXECUTE FORMAT('GRANT CONNECT
+                        ON DATABASE %I
+                        TO rsyslog', current_database());
+   END IF;
+END$$;
diff --git a/databases/analytics/analytics_db_drop.sql b/databases/analytics/analytics_db_drop.sql
new file mode 100644 (file)
index 0000000..0be26c4
--- /dev/null
@@ -0,0 +1,21 @@
+-- Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
+-- License: 0BSD.
+
+DO $$
+BEGIN
+    IF EXISTS (SELECT * FROM pg_user WHERE usename = 'rsyslog')
+    THEN
+        REVOKE INSERT
+        ON access_logs
+        FROM rsyslog;
+
+        EXECUTE
+            FORMAT('REVOKE CONNECT
+                    ON DATABASE %I
+                    FROM rsyslog;', current_database());
+
+        DROP ROLE rsyslog;
+    END IF;
+END$$;
+
+DROP TABLE IF EXISTS access_logs;
index ae9be943a5814adb36460ddabd45ef9b4c2304f1..82e47e9d2b996ee4692f31ddff206b4f9dff6b7e 100755 (executable)
@@ -94,6 +94,7 @@ local   all             postgres                                trust
 local   mail_db         dovecot                                 trust
 host    mail_db         dovecot         ::1/128                 trust
 host    mail_db         dkim            ::1/128                 trust
+host    analytics_db    rsyslog         ::1/128                 trust
 local   gym_db          gym_tracker                             trust
 local   matrix_db       synapse_user                            trust
 local   metrics_db      metrics_tracker                         trust
diff --git a/rsyslog/51-website.conf b/rsyslog/51-website.conf
new file mode 100644 (file)
index 0000000..b7a5e97
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
+# License: GPL-3.0 or later.
+
+# Based on https://www.rsyslog.com/doc/configuration/modules/ompgsql.html and
+# https://blog.supersetinc.com/2018/04/09/high-performance-logging-nginx-postgres-using-rsyslog.
+
+module(load="imfile")
+
+input(type="imfile"
+      File="${website_log_file}"
+      Tag="website:")
+
+template(name="insert_access_log" type="list" option.sql="on") {
+  constant(value="INSERT INTO access_logs (access_log, created_at) values ('")
+  property(name="msg")
+  constant(value="','")
+  property(name="timereported" dateformat="pgsql" date.inUTC="on")
+  constant(value="')")
+}
+
+# Load the ompgsql output module
+module(load="ompgsql")
+
+if ( ${dollar}syslogtag == 'website:' ) then {
+  action(type="ompgsql"
+         server="localhost"
+         user="rsyslog"
+         db="${analytics_db}"
+         template="insert_access_log"
+         queue.type="linkedList")
+}
diff --git a/rsyslog/README b/rsyslog/README
new file mode 100644 (file)
index 0000000..0b32f05
--- /dev/null
@@ -0,0 +1,14 @@
+rsyslog
+========
+
+Create database `analytics_db`.
+
+```
+CREATE DATABASE analytics_db;
+```
+
+Execute `analytics_db_create.sql`.
+
+```
+psql --dbname=mail_db --file=databases/analytics/analytics_db_create.sql
+```