Files
MClogger/database/setup_all.sql
SimolZimol 51674ef5fa modified: web/Dockerfile
modified:   web/config.py
2026-04-01 02:27:14 +02:00

402 lines
14 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- MCLogger Komplettes MariaDB Setup
-- Ausführen als root: mysql -u root -p < setup_all.sql
--
-- Erstellt:
-- 1. mclogger_panel Panel-Datenbank (User/Gruppen)
-- 2. mclogger_creds Credentials-DB (verschl. MC-DB-Daten)
-- 3. mclog-1-sejru MC Log-Datenbank (Netzwerk sejru)
--
-- Bitte PASSWÖRTER vor dem Ausführen anpassen!
-- ============================================================
-- ============================================================
-- DATENBANKEN ANLEGEN
-- ============================================================
CREATE DATABASE IF NOT EXISTS `mclogger_panel`
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `mclogger_creds`
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS `mclog-1-sejru`
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ============================================================
-- BENUTZER ANLEGEN (Passwörter UNBEDINGT ändern!)
-- ============================================================
-- Panel-App-Benutzer (Zugriff auf panel + creds DB)
CREATE USER IF NOT EXISTS 'mcl_panel'@'%' IDENTIFIED BY 'PASSWORT_PANEL_AENDERN';
GRANT ALL PRIVILEGES ON `mclogger_panel`.* TO 'mcl_panel'@'%';
GRANT ALL PRIVILEGES ON `mclogger_creds`.* TO 'mcl_panel'@'%';
-- MC-Plugin-Benutzer (schreibt Log-Daten für Netzwerk sejru)
CREATE USER IF NOT EXISTS 'mcl_sejru'@'%' IDENTIFIED BY 'PASSWORT_SEJRU_AENDERN';
GRANT ALL PRIVILEGES ON `mclog-1-sejru`.* TO 'mcl_sejru'@'%';
FLUSH PRIVILEGES;
-- ============================================================
-- DB 1: mclogger_panel
-- Tabellen: users, user_groups, group_members
-- ============================================================
USE `mclogger_panel`;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
salt VARCHAR(64) NOT NULL,
is_site_admin TINYINT(1) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_login TIMESTAMP NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS user_groups (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS group_members (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
group_id INT NOT NULL,
role ENUM('admin','member') DEFAULT 'member',
permissions JSON,
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_user_group (user_id, group_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (group_id) REFERENCES user_groups(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================
-- DB 2: mclogger_creds
-- Tabelle: group_databases (verschlüsselte MC-DB-Zugangsdaten)
-- ============================================================
USE `mclogger_creds`;
CREATE TABLE IF NOT EXISTS group_databases (
id INT AUTO_INCREMENT PRIMARY KEY,
group_id INT UNIQUE NOT NULL,
enc_host TEXT NOT NULL,
enc_port TEXT NOT NULL,
enc_user TEXT NOT NULL,
enc_password TEXT NOT NULL,
enc_database TEXT NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================
-- DB 3: mclog-1-sejru
-- Alle MC-Log-Tabellen für das Netzwerk "sejru"
-- ============================================================
USE `mclog-1-sejru`;
CREATE TABLE IF NOT EXISTS servers (
id INT AUTO_INCREMENT PRIMARY KEY,
server_name VARCHAR(100) NOT NULL,
server_type ENUM('paper','velocity') NOT NULL DEFAULT 'paper',
ip_address VARCHAR(45),
mc_version VARCHAR(20),
first_seen TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
last_seen TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
UNIQUE KEY uq_server_name (server_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS players (
uuid VARCHAR(36) PRIMARY KEY,
username VARCHAR(16) NOT NULL,
display_name VARCHAR(64),
ip_address VARCHAR(45),
locale VARCHAR(20),
first_seen TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
last_seen TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
total_playtime_sec BIGINT DEFAULT 0,
is_op TINYINT(1) DEFAULT 0,
INDEX idx_username (username)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_sessions (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
player_uuid VARCHAR(36) NOT NULL,
player_name VARCHAR(16) NOT NULL,
server_name VARCHAR(100),
login_time TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
logout_time TIMESTAMP(3) NULL,
duration_sec INT,
ip_address VARCHAR(45),
client_version VARCHAR(20),
INDEX idx_ps_uuid (player_uuid),
INDEX idx_ps_server (server_name),
INDEX idx_ps_login (login_time)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_chat (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
player_uuid VARCHAR(36),
player_name VARCHAR(16),
server_name VARCHAR(100),
world VARCHAR(100),
message TEXT NOT NULL,
channel VARCHAR(50) DEFAULT 'global',
INDEX idx_chat_uuid (player_uuid),
INDEX idx_chat_timestamp (timestamp),
INDEX idx_chat_server (server_name),
FULLTEXT INDEX ft_message (message)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_commands (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
player_uuid VARCHAR(36),
player_name VARCHAR(16),
server_name VARCHAR(100),
world VARCHAR(100),
command TEXT NOT NULL,
x DOUBLE,
y DOUBLE,
z DOUBLE,
INDEX idx_cmd_uuid (player_uuid),
INDEX idx_cmd_timestamp (timestamp),
INDEX idx_cmd_server (server_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS block_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type ENUM('break','place','ignite','burn','explode','fade','grow','dispense') NOT NULL,
player_uuid VARCHAR(36),
player_name VARCHAR(16),
server_name VARCHAR(100),
world VARCHAR(100) NOT NULL,
x INT NOT NULL,
y INT NOT NULL,
z INT NOT NULL,
block_type VARCHAR(100) NOT NULL,
block_data VARCHAR(255),
tool VARCHAR(100),
is_silk TINYINT(1) DEFAULT 0,
INDEX idx_be_player (player_uuid),
INDEX idx_be_timestamp (timestamp),
INDEX idx_be_world (world),
INDEX idx_be_type (event_type),
INDEX idx_be_server (server_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_deaths (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
player_uuid VARCHAR(36) NOT NULL,
player_name VARCHAR(16) NOT NULL,
server_name VARCHAR(100),
world VARCHAR(100),
x DOUBLE,
y DOUBLE,
z DOUBLE,
death_message TEXT,
cause VARCHAR(100),
killer_uuid VARCHAR(36),
killer_name VARCHAR(100),
killer_type VARCHAR(100),
exp_level INT,
items_lost JSON,
INDEX idx_deaths_uuid (player_uuid),
INDEX idx_deaths_timestamp (timestamp)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS entity_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type ENUM('spawn','death','damage','tame','breed','transform','explode') NOT NULL,
server_name VARCHAR(100),
world VARCHAR(100),
x DOUBLE,
y DOUBLE,
z DOUBLE,
entity_type VARCHAR(100) NOT NULL,
entity_uuid VARCHAR(36),
entity_name VARCHAR(100),
player_uuid VARCHAR(36),
player_name VARCHAR(16),
cause VARCHAR(100),
damage DOUBLE,
details JSON,
INDEX idx_ee_timestamp (timestamp),
INDEX idx_ee_type (event_type),
INDEX idx_ee_entity (entity_type),
INDEX idx_ee_player (player_uuid),
INDEX idx_ee_server (server_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_teleports (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
player_uuid VARCHAR(36) NOT NULL,
player_name VARCHAR(16) NOT NULL,
server_name VARCHAR(100),
from_world VARCHAR(100),
from_x DOUBLE,
from_y DOUBLE,
from_z DOUBLE,
to_world VARCHAR(100),
to_x DOUBLE,
to_y DOUBLE,
to_z DOUBLE,
cause VARCHAR(100),
INDEX idx_tp_uuid (player_uuid),
INDEX idx_tp_timestamp (timestamp)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS inventory_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type ENUM('pickup','drop','click','craft','enchant','anvil','trade') NOT NULL,
player_uuid VARCHAR(36) NOT NULL,
player_name VARCHAR(16) NOT NULL,
server_name VARCHAR(100),
world VARCHAR(100),
x DOUBLE,
y DOUBLE,
z DOUBLE,
item_type VARCHAR(100),
item_amount INT,
item_meta JSON,
slot INT,
inventory_type VARCHAR(100),
INDEX idx_inv_uuid (player_uuid),
INDEX idx_inv_timestamp (timestamp),
INDEX idx_inv_type (event_type)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS player_stats (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type VARCHAR(100) NOT NULL,
player_uuid VARCHAR(36) NOT NULL,
player_name VARCHAR(16) NOT NULL,
server_name VARCHAR(100),
old_value VARCHAR(255),
new_value VARCHAR(255),
details JSON,
INDEX idx_pst_uuid (player_uuid),
INDEX idx_pst_timestamp (timestamp),
INDEX idx_pst_type (event_type)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS world_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type VARCHAR(100) NOT NULL,
server_name VARCHAR(100),
world VARCHAR(100),
x DOUBLE,
y DOUBLE,
z DOUBLE,
details JSON,
INDEX idx_we_timestamp (timestamp),
INDEX idx_we_world (world),
INDEX idx_we_type (event_type)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS server_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type VARCHAR(100) NOT NULL,
server_name VARCHAR(100),
message TEXT,
details JSON,
INDEX idx_se_timestamp (timestamp),
INDEX idx_se_type (event_type),
INDEX idx_se_server (server_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS proxy_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type ENUM('login','disconnect','server_switch','command','chat','kick','proxy_start','proxy_stop') NOT NULL,
player_uuid VARCHAR(36),
player_name VARCHAR(16),
proxy_name VARCHAR(100),
from_server VARCHAR(100),
to_server VARCHAR(100),
ip_address VARCHAR(45),
details JSON,
INDEX idx_pe_uuid (player_uuid),
INDEX idx_pe_timestamp (timestamp),
INDEX idx_pe_type (event_type),
INDEX idx_pe_proxy (proxy_name)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS sign_edits (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
player_uuid VARCHAR(36),
player_name VARCHAR(16),
server_name VARCHAR(100),
world VARCHAR(100),
x INT,
y INT,
z INT,
line1 VARCHAR(255),
line2 VARCHAR(255),
line3 VARCHAR(255),
line4 VARCHAR(255),
INDEX idx_sign_uuid (player_uuid),
INDEX idx_sign_timestamp (timestamp)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS plugin_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
event_type VARCHAR(100) NOT NULL,
plugin_name VARCHAR(100),
server_name VARCHAR(100),
player_uuid VARCHAR(36),
player_name VARCHAR(16),
actor_uuid VARCHAR(36),
actor_name VARCHAR(64),
target_type VARCHAR(50),
target_id VARCHAR(100),
action VARCHAR(255),
details JSON,
INDEX idx_plev_uuid (player_uuid),
INDEX idx_plev_timestamp (timestamp),
INDEX idx_plev_type (event_type),
INDEX idx_plev_plugin (plugin_name),
INDEX idx_plev_actor (actor_uuid)
) ENGINE=InnoDB;
CREATE OR REPLACE VIEW v_recent_activity AS
SELECT 'chat' AS source, timestamp, player_name, server_name, message AS detail FROM player_chat WHERE timestamp >= NOW() - INTERVAL 24 HOUR
UNION ALL
SELECT 'command' AS source, timestamp, player_name, server_name, command AS detail FROM player_commands WHERE timestamp >= NOW() - INTERVAL 24 HOUR
UNION ALL
SELECT 'block' AS source, timestamp, player_name, server_name, CONCAT(event_type,' ',block_type,' @ ',world,' ',x,',',y,',',z) AS detail FROM block_events WHERE timestamp >= NOW() - INTERVAL 24 HOUR
UNION ALL
SELECT 'death' AS source, timestamp, player_name, server_name, death_message AS detail FROM player_deaths WHERE timestamp >= NOW() - INTERVAL 24 HOUR
ORDER BY timestamp DESC;
-- ============================================================
-- FERTIG
-- ============================================================
SELECT '=== Setup abgeschlossen ===' AS Status;
SELECT TABLE_SCHEMA AS Datenbank, COUNT(*) AS Tabellen
FROM information_schema.TABLES
WHERE TABLE_SCHEMA IN ('mclogger_panel','mclogger_creds','mclog-1-sejru')
GROUP BY TABLE_SCHEMA;