setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("CREATE DATABASE IF NOT EXISTS `$db_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); $pdo->exec("USE `$db_name`"); // Create tables $sql = " CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, role ENUM('admin', 'moderator', 'editor', 'user') DEFAULT 'user', avatar_url TEXT, theme_preference ENUM('dark', 'light') DEFAULT 'dark', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS videos ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, release_date DATE, source_type ENUM('upload', 'link') NOT NULL, video_url TEXT NOT NULL, thumbnail_url TEXT, uploader_id INT, views INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (uploader_id) REFERENCES users(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS comments ( id INT AUTO_INCREMENT PRIMARY KEY, video_id INT NOT NULL, user_id INT NOT NULL, comment_text TEXT NOT NULL, is_reported BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS reactions ( id INT AUTO_INCREMENT PRIMARY KEY, comment_id INT NOT NULL, user_id INT NOT NULL, reaction_type ENUM('thumb', 'heart', 'pray', 'insight', 'clap') NOT NULL, UNIQUE KEY unique_reaction (comment_id, user_id, reaction_type), FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS tags ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE IF NOT EXISTS video_tags ( video_id INT NOT NULL, tag_id INT NOT NULL, PRIMARY KEY (video_id, tag_id), FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS bookmarks ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, video_id INT NOT NULL, video_timestamp FLOAT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS logs ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NULL, type VARCHAR(50), message TEXT, ip_address VARCHAR(45), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS settings ( setting_key VARCHAR(50) PRIMARY KEY, setting_value TEXT ); "; $pdo->exec($sql); // Default settings $pdo->exec("INSERT IGNORE INTO settings (setting_key, setting_value) VALUES ('site_title', 'ChurchTube'), ('primary_color', '#7c4dff'), ('secondary_color', '#ff4081'), ('logo_url', ''), ('footer_text', '© 2024 ChurchTube. All rights reserved.')"); // Save config temporarily in session session_start(); $_SESSION['db_config'] = [ 'host' => $db_host, 'name' => $db_name, 'user' => $db_user, 'pass' => $db_pass ]; header('Location: install.php?step=3'); exit; } catch (PDOException $e) { $msg = $e->getMessage(); $hint = ""; if (strpos($msg, 'Access denied') !== false) { $hint = "Hint: Check your username and password. On Ubuntu, 'root' often requires a password or 'sudo' access. Try creating a dedicated database user."; } elseif (strpos($msg, 'Connection refused') !== false || strpos($msg, 'Can\'t connect') !== false) { $hint = "Hint: MySQL might not be running. Try: sudo systemctl start mysql"; } elseif (strpos($msg, 'getaddrinfo failed') !== false) { $hint = "Hint: The host '$db_host' could not be found. If MySQL is local, use 'localhost' or '127.0.0.1'."; } $error = "Database Connection Failed: " . $msg . "

" . $hint; } } elseif ($step === 3) { // Admin Setup session_start(); $db = $_SESSION['db_config']; $admin_user = $_POST['admin_user']; $admin_email = $_POST['admin_email']; $admin_pass = password_hash($_POST['admin_pass'], PASSWORD_DEFAULT); try { $pdo = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['pass']); $stmt = $pdo->prepare("INSERT INTO users (username, email, password, role) VALUES (?, ?, ?, 'admin')"); $stmt->execute([$admin_user, $admin_email, $admin_pass]); // Generate config file $config_content = ""; if (!file_exists('includes')) mkdir('includes'); file_put_contents($config_file, $config_content); session_destroy(); header('Location: install.php?step=4'); exit; } catch (PDOException $e) { $error = "Admin Creation Failed: " . $e->getMessage(); } } } ?> ChurchTube | Installation

ChurchTube

Welcome to ChurchTube

This wizard will help you set up your sermon video platform in just a few minutes.

System Check:
  • =') ? '✅' : '❌' ?> PHP 7.4+ (Current: )
  • PDO MySQL Extension
  • Directory Permissions
  • Upload Limits: /
    Recommendation: Your upload limit is low for videos. Edit /etc/php/7.4/apache2/php.ini and set:
    upload_max_filesize = 500M
    post_max_size = 500M
Get Started

Database Configuration

Create Admin Account

Installation Successful!

Your ChurchTube instance is now ready to use.

🎉
Go to Homepage