140 lines
7.2 KiB
Bash
140 lines
7.2 KiB
Bash
#!/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 = '<?php' . PHP_EOL
|
|
. 'define(\'DB_HOST\',\'' . (getenv('DB_HOST') ?: 'postgres') . '\');' . PHP_EOL
|
|
. 'define(\'DB_PORT\',\'' . (getenv('DB_PORT') ?: '5432') . '\');' . PHP_EOL
|
|
. 'define(\'DB_NAME\',\'' . (getenv('DB_NAME') ?: 'streamers_db') . '\');' . PHP_EOL
|
|
. 'define(\'DB_USER\',\'' . (getenv('DB_USER') ?: 'streamers_user') . '\');' . PHP_EOL
|
|
. 'define(\'DB_PASS\',\'' . addslashes(getenv('DB_PASS') ?: 'changeme') . '\');' . PHP_EOL
|
|
. 'define(\'ADMIN_HASH\',\'' . addslashes(\$hash) . '\');' . PHP_EOL
|
|
. 'define(\'SESSION_SECRET\',\'' . addslashes(getenv('SESSION_SECRET') ?: 'change_me_32chars') . '\');' . PHP_EOL
|
|
. 'define(\'TWITCH_CLIENT_ID\',\'' . (getenv('TWITCH_CLIENT_ID') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'TWITCH_CLIENT_SECRET\',\'' . (getenv('TWITCH_CLIENT_SECRET') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'TWITCH_OAUTH_CLIENT_ID\',\'' . (getenv('TWITCH_OAUTH_CLIENT_ID') ?: getenv('TWITCH_CLIENT_ID') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'TWITCH_OAUTH_CLIENT_SECRET\',\'' . (getenv('TWITCH_OAUTH_CLIENT_SECRET') ?: getenv('TWITCH_CLIENT_SECRET') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'TWITCH_OAUTH_REDIRECT_URI\',\'' . (getenv('TWITCH_OAUTH_REDIRECT_URI') ?: 'https://rating.naughtybulldogs.eu/api/oauth?provider=twitch') . '\');' . PHP_EOL
|
|
. 'define(\'KICK_OAUTH_CLIENT_ID\',\'' . (getenv('KICK_OAUTH_CLIENT_ID') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'KICK_OAUTH_CLIENT_SECRET\',\'' . (getenv('KICK_OAUTH_CLIENT_SECRET') ?: '') . '\');' . PHP_EOL
|
|
. 'define(\'KICK_OAUTH_REDIRECT_URI\',\'' . (getenv('KICK_OAUTH_REDIRECT_URI') ?: 'https://rating.naughtybulldogs.eu/api/oauth?provider=kick') . '\');' . PHP_EOL
|
|
. 'define(\'KICK_API_BASE\',\'https://kick.com/api/v2/channels\');' . PHP_EOL
|
|
. 'define(\'LIVE_CACHE_TTL\',' . (int)(getenv('LIVE_CACHE_TTL') ?: 120) . ');' . PHP_EOL
|
|
. 'define(\'ALLOWED_ORIGIN\',\'' . (getenv('ALLOWED_ORIGIN') ?: '*') . '\');' . PHP_EOL;
|
|
file_put_contents('/var/www/html/config.php', \$config);
|
|
echo '[entrypoint] config.php written' . PHP_EOL;
|
|
"
|
|
|
|
echo "[entrypoint] Waiting for PostgreSQL at ${DB_HOST:-postgres}:${DB_PORT:-5432}..."
|
|
for i in $(seq 1 30); do
|
|
if php -r "
|
|
try {
|
|
new PDO('pgsql:host=${DB_HOST:-postgres};port=${DB_PORT:-5432};dbname=${DB_NAME:-streamers_db}','${DB_USER:-streamers_user}','${DB_PASS:-changeme}');
|
|
exit(0);
|
|
} catch (Exception \$e) { exit(1); }
|
|
" 2>/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'
|
|
<?php
|
|
$dsn = sprintf('pgsql:host=%s;port=%s;dbname=%s', getenv('DB_HOST') ?: 'postgres', getenv('DB_PORT') ?: '5432', getenv('DB_NAME') ?: 'streamers_db');
|
|
$pdo = new PDO($dsn, getenv('DB_USER') ?: 'streamers_user', getenv('DB_PASS') ?: 'changeme');
|
|
$pdo->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
|