TO rsyslog', current_database());
END IF;
END$$;
+
+DO $$
+BEGIN
+ IF NOT EXISTS (SELECT * FROM pg_user WHERE usename = 'analytics_reader')
+ THEN
+ CREATE ROLE analytics_reader LOGIN;
+
+ GRANT SELECT
+ ON access_logs
+ TO analytics_reader;
+
+ /* Execute for the current database. */
+ EXECUTE FORMAT('GRANT CONNECT
+ ON DATABASE %I
+ TO analytics_reader', current_database());
+ END IF;
+END$$;
/* Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
License: GPL-3.0 or later. */
+DO $$
+BEGIN
+ IF EXISTS (SELECT * FROM pg_user WHERE usename = 'analytics_reader')
+ THEN
+ REVOKE SELECT
+ ON access_logs
+ FROM analytics_reader;
+
+ EXECUTE
+ FORMAT('REVOKE CONNECT
+ ON DATABASE %I
+ FROM analytics_reader;', current_database());
+
+ DROP ROLE analytics_reader;
+ END IF;
+END$$;
+
DO $$
BEGIN
IF EXISTS (SELECT * FROM pg_user WHERE usename = 'rsyslog')
--- /dev/null
+#!/bin/sh
+# Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
+# License: GPL-3.0 or later.
+
+. /etc/environment
+
+_querypath="/${FILENAME}"
+
+echo "HTTP/1.1 200 OK"
+echo "Content-Type: text/html"
+echo ""
+
+/usr/bin/psql --user=analytics_reader --dbname="${analytics_db}" --tuples-only \
+ --no-align --command="\
+SELECT COUNT(*)
+FROM access_logs
+WHERE access_log::json->>'path' = '${_querypath}'"
userid_expires 365d;
access_log ${website_log_file} as_json;
+ root ${prod_dir}/www;
+
+ location ~ /views/(.*)$ {
+ include fastcgi_params;
+ fastcgi_pass unix:/var/run/fcgiwrap.socket;
+
+ fastcgi_param URL ${dollar}uri;
+ fastcgi_param SCRIPT_FILENAME ${dollar}document_root/views.sh;
+ }
location /cv {
root ${prod_dir}/cv;
}
location / {
- root ${prod_dir}/www;
index index.html;
}
}