Forráskód Böngészése

Add Database init

svalavuo 2 napja
szülő
commit
27500ebaca
3 módosított fájl, 170 hozzáadás és 2 törlés
  1. 9 2
      Dockerfile.unified-working
  2. 16 0
      backend/entrypoint.sh
  3. 145 0
      backend/init-database.php

+ 9 - 2
Dockerfile.unified-working

@@ -71,5 +71,12 @@ EXPOSE 80
 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
     CMD curl -f http://localhost/api/company.php || exit 1
 
-# Start Apache
-CMD ["apache2-foreground"]
+# Copy database initialization script
+COPY backend/init-database.php /var/www/html/init-database.php
+
+# Copy entrypoint script
+COPY backend/entrypoint.sh /var/www/html/entrypoint.sh
+RUN chmod +x /var/www/html/entrypoint.sh
+
+# Start with entrypoint script
+ENTRYPOINT ["/var/www/html/entrypoint.sh"]

+ 16 - 0
backend/entrypoint.sh

@@ -0,0 +1,16 @@
+#!/bin/bash
+set -e
+
+# Run database initialization
+echo "Starting database initialization..."
+php /var/www/html/init-database.php
+if [ $? -eq 0 ]; then
+    echo "Database initialization completed successfully"
+else
+    echo "Database initialization failed"
+    exit 1
+fi
+
+# Start Apache
+echo "Starting Apache..."
+exec apache2-foreground

+ 145 - 0
backend/init-database.php

@@ -0,0 +1,145 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Database Initialization Script
+ * 
+ * This script automatically creates the database and tables if they don't exist.
+ * It runs when the container starts and checks if the database is properly set up.
+ */
+
+// Load environment variables
+function loadEnv($file) {
+    if (!file_exists($file)) {
+        echo "Environment file not found: $file\n";
+        return false;
+    }
+    
+    $lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+    foreach ($lines as $line) {
+        if (strpos($line, '#') === 0) continue;
+        if (strpos($line, '=') === false) continue;
+        
+        list($key, $value) = explode('=', $line, 2);
+        $key = trim($key);
+        $value = trim($value);
+        
+        if (!array_key_exists($key, $_SERVER) && !array_key_exists($key, $_ENV)) {
+            putenv(sprintf('%s=%s', $key, $value));
+            $_ENV[$key] = $value;
+            $_SERVER[$key] = $value;
+        }
+    }
+    return true;
+}
+
+// Load environment from .env file
+loadEnv('.env');
+
+// Get database configuration
+$dbHost = getenv('DB_HOST') ?: 'localhost';
+$dbPort = getenv('DB_PORT') ?: '3306';
+$dbName = getenv('DB_NAME') ?: 'inventory_db';
+$dbUser = getenv('DB_USER') ?: 'root';
+$dbPass = getenv('DB_PASS') ?: '';
+
+echo "Database Initialization Script\n";
+echo "==============================\n";
+echo "Host: $dbHost:$dbPort\n";
+echo "Database: $dbName\n";
+echo "User: $dbUser\n\n";
+
+try {
+    // First connect without database to create it if needed
+    $dsn = "mysql:host=$dbHost;port=$dbPort;charset=utf8mb4";
+    $options = [
+        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+        PDO::ATTR_EMULATE_PREPARES => false,
+    ];
+    
+    $pdo = new PDO($dsn, $dbUser, $dbPass, $options);
+    echo "Connected to MySQL server successfully.\n";
+    
+    // Create database if it doesn't exist
+    $pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
+    echo "Database '$dbName' created or already exists.\n";
+    
+    // Connect to the specific database
+    $pdo->exec("USE `$dbName`");
+    
+    // Check if tables exist by checking if users table exists
+    $stmt = $pdo->query("SHOW TABLES LIKE 'users'");
+    $tablesExist = $stmt->rowCount() > 0;
+    
+    if (!$tablesExist) {
+        echo "Tables do not exist. Creating database schema...\n";
+        
+        // Read and execute the complete setup script
+        $setupFile = __DIR__ . '/setup_database.sql';
+        if (file_exists($setupFile)) {
+            $sql = file_get_contents($setupFile);
+            $statements = array_filter(array_map('trim', explode(';', $sql)));
+            
+            foreach ($statements as $statement) {
+                if (!empty($statement)) {
+                    try {
+                        $pdo->exec($statement);
+                    } catch (PDOException $e) {
+                        echo "Error executing statement: " . $statement . "\n";
+                        echo "Error: " . $e->getMessage() . "\n";
+                    }
+                }
+            }
+            echo "Database schema created successfully.\n";
+        } else {
+            echo "Setup script not found: $setupFile\n";
+            exit(1);
+        }
+        
+        // Create default user if the script exists
+        $defaultUserFile = __DIR__ . '/create_default_user.sql';
+        if (file_exists($defaultUserFile)) {
+            $sql = file_get_contents($defaultUserFile);
+            $statements = array_filter(array_map('trim', explode(';', $sql)));
+            
+            foreach ($statements as $statement) {
+                if (!empty($statement)) {
+                    try {
+                        $pdo->exec($statement);
+                    } catch (PDOException $e) {
+                        echo "Error creating default user: " . $e->getMessage() . "\n";
+                    }
+                }
+            }
+            echo "Default user created.\n";
+        }
+        
+    } else {
+        echo "Database tables already exist. Skipping initialization.\n";
+    }
+    
+    // Verify database setup by checking key tables
+    $requiredTables = ['users', 'items', 'clients', 'projects', 'accounting_entries'];
+    $missingTables = [];
+    
+    foreach ($requiredTables as $table) {
+        $stmt = $pdo->query("SHOW TABLES LIKE '$table'");
+        if ($stmt->rowCount() == 0) {
+            $missingTables[] = $table;
+        }
+    }
+    
+    if (!empty($missingTables)) {
+        echo "Warning: Missing tables: " . implode(', ', $missingTables) . "\n";
+        exit(1);
+    }
+    
+    echo "Database initialization completed successfully!\n";
+    echo "Required tables are present and ready for use.\n";
+    
+} catch (PDOException $e) {
+    echo "Database connection failed: " . $e->getMessage() . "\n";
+    echo "Please check your database configuration.\n";
+    exit(1);
+}