diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..74f789c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.gitignore +.claude +.cursor +*.md +*.bak +vendor +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9f00952 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +FROM alpine:3.19 + +# Установка PHP и необходимых расширений +RUN apk add --no-cache \ + php83 \ + php83-pdo \ + php83-pdo_mysql \ + php83-session \ + php83-json \ + php83-mbstring \ + php83-openssl \ + php83-phar \ + php83-zlib \ + php83-dom \ + php83-xml \ + php83-tokenizer \ + curl + +# Создаём симлинк php -> php83 +RUN ln -sf /usr/bin/php83 /usr/bin/php + +# Установка Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + +WORKDIR /app + +# Копируем composer файлы и устанавливаем зависимости +COPY composer.json ./ +RUN composer install --no-dev --optimize-autoloader --no-scripts + +# Копируем исходный код +COPY src/ ./src/ +COPY public/ ./public/ + +# Переменные окружения по умолчанию +ENV DB_HOST=localhost +ENV DB_PORT=3306 +ENV DB_CHARSET=utf8mb4 +ENV PHP_ERROR_DISPLAY=false + +EXPOSE 8080 + +# Запуск встроенного PHP сервера +CMD ["php", "-S", "0.0.0.0:8080", "-t", "public"] diff --git a/src/Db.php b/src/Db.php index 6037a34..982d247 100644 --- a/src/Db.php +++ b/src/Db.php @@ -6,6 +6,15 @@ use PDOException; class Db { + private static function getDsn(): string + { + $host = getenv('DB_HOST') ?: 'localhost'; + $port = getenv('DB_PORT') ?: '3306'; + $charset = getenv('DB_CHARSET') ?: 'utf8mb4'; + + return "mysql:host={$host};port={$port};charset={$charset}"; + } + // Простая фабрика PDO по логину/паролю MariaDB из сессии public static function connectFromSession(): PDO { @@ -16,12 +25,9 @@ class Db $user = $_SESSION['db_user']; $pass = $_SESSION['db_pass']; - // TODO: вынести host/port/charset в конфиг .env - $dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4'; - - $pdo = new PDO($dsn, $user, $pass, [ + $pdo = new PDO(self::getDsn(), $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_EMULATE_PREPARES => false, // важная настройка [web:28][web:25] + PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); @@ -30,9 +36,8 @@ class Db public static function testConnection(string $user, string $pass): void { - $dsn = 'mysql:host=localhost;port=3306;charset=utf8mb4'; // MariaDB совместим [web:22][web:28] try { - new PDO($dsn, $user, $pass, [ + new PDO(self::getDsn(), $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]);