#!/bin/bash set -e # Generate config.php from env vars using PHP (avoids bash dollar-sign issues) php -r " \$hash = getenv('ADMIN_HASH'); if (empty(\$hash)) { \$pw = getenv('ADMIN_PASSWORD') ?: 'changeme'; \$hash = password_hash(\$pw, PASSWORD_BCRYPT); echo '[entrypoint] Generated hash from ADMIN_PASSWORD' . PHP_EOL; } else { echo '[entrypoint] Using ADMIN_HASH from environment' . PHP_EOL; } \$config = '/dev/null; then echo "[entrypoint] PostgreSQL ready." break fi echo "[entrypoint] Waiting... ($i/30)" sleep 1 done # Write migration script to a temp file to avoid bash/PHP quoting conflicts cat > /tmp/migrate.php << 'PHPEOF' setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "[entrypoint] Applying schema...\n"; $pdo->exec(file_get_contents('/var/www/html/schema.sql')); echo "[entrypoint] Schema OK.\n"; // Settings defaults $pdo->exec("INSERT INTO settings (key, value) VALUES ('auth_enabled','true') ON CONFLICT (key) DO NOTHING"); $pdo->exec("INSERT INTO settings (key, value) VALUES ('auth_twitch_enabled','true') ON CONFLICT (key) DO NOTHING"); $pdo->exec("INSERT INTO settings (key, value) VALUES ('auth_kick_enabled','true') ON CONFLICT (key) DO NOTHING"); echo "[entrypoint] Settings defaults OK.\n"; // Migrations $pdo->exec("ALTER TABLE users ADD COLUMN IF NOT EXISTS banned BOOLEAN NOT NULL DEFAULT FALSE"); echo "[entrypoint] users.banned OK.\n"; $pdo->exec("CREATE TABLE IF NOT EXISTS moderators ( id SERIAL PRIMARY KEY, user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, granted_by TEXT NOT NULL DEFAULT 'admin', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (user_id) )"); echo "[entrypoint] moderators OK.\n"; $pdo->exec("CREATE TABLE IF NOT EXISTS oauth_state ( state TEXT PRIMARY KEY, provider TEXT NOT NULL, verifier TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() )"); echo "[entrypoint] oauth_state OK.\n"; $pdo->exec("ALTER TABLE comments ADD COLUMN IF NOT EXISTS user_id INT REFERENCES users(id) ON DELETE SET NULL"); echo "[entrypoint] comments.user_id OK.\n"; // Community ratings tables $pdo->exec("CREATE TABLE IF NOT EXISTS rater_groups ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() )"); $pdo->exec("CREATE TABLE IF NOT EXISTS rater_group_members ( id SERIAL PRIMARY KEY, group_id INT NOT NULL REFERENCES rater_groups(id) ON DELETE CASCADE, user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, added_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (group_id, user_id) )"); $pdo->exec("CREATE TABLE IF NOT EXISTS community_ratings ( id SERIAL PRIMARY KEY, group_id INT NOT NULL REFERENCES rater_groups(id) ON DELETE CASCADE, streamer_id INT NOT NULL REFERENCES streamers(id) ON DELETE CASCADE, statistiky SMALLINT NOT NULL DEFAULT 0, grafika SMALLINT NOT NULL DEFAULT 0, alerty SMALLINT NOT NULL DEFAULT 0, vychytavky SMALLINT NOT NULL DEFAULT 0, nahled SMALLINT NOT NULL DEFAULT 0, nastaveni SMALLINT NOT NULL DEFAULT 0, odlisnost SMALLINT NOT NULL DEFAULT 0, notes TEXT DEFAULT '', updated_by INT REFERENCES users(id) ON DELETE SET NULL, updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (group_id, streamer_id) )"); $pdo->exec("ALTER TABLE streamers ADD COLUMN IF NOT EXISTS community_locked BOOLEAN NOT NULL DEFAULT FALSE"); $pdo->exec("CREATE INDEX IF NOT EXISTS idx_community_ratings_streamer ON community_ratings(streamer_id)"); $pdo->exec("CREATE INDEX IF NOT EXISTS idx_rater_group_members_user ON rater_group_members(user_id)"); // Link a team to a specific streamer (optional — null = generic team) $pdo->exec("ALTER TABLE rater_groups ADD COLUMN IF NOT EXISTS streamer_id INT REFERENCES streamers(id) ON DELETE SET NULL"); $pdo->exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_rater_groups_streamer ON rater_groups(streamer_id) WHERE streamer_id IS NOT NULL"); // Role within a rater team: 'owner' = the streamer themselves, 'rater' = team moderator/rater $pdo->exec("ALTER TABLE rater_group_members ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT 'rater'"); echo "[entrypoint] community_ratings tables OK.\n"; $fixed = $pdo->exec("UPDATE streamers SET kick_name = name WHERE platform = 'kick' AND (kick_name IS NULL OR kick_name = '')"); if ($fixed > 0) echo "[entrypoint] Fixed kick_name for {$fixed} streamer(s).\n"; PHPEOF php /tmp/migrate.php echo "[entrypoint] Starting Apache..." exec apache2-foreground