Author: Niklas Keller (kelunik) Committer: GitHub (web-flow) Pusher: nikic Date: 2021-04-11T21:56:50+02:00
Commit: https://github.com/php/web-master/commit/bcb226b644d7fb8264e48930ed8852342251485b Raw diff: https://github.com/php/web-master/commit/bcb226b644d7fb8264e48930ed8852342251485b.diff Add docker development setup (#10) * Add docker development setup * Centralize DB credentials * Remove symlink in favor of separate static file serving * Update generated composer files Changed paths: A docker-compose.yml A docker/Dockerfile A docker/controller.php A docker/test.sql A shared M README.md M composer.json M composer.lock M include/functions.inc M src/DB.php M vendor/composer/InstalledVersions.php M vendor/composer/installed.php Diff: diff --git a/README.md b/README.md index 79a3175..df6d785 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,18 @@ PHP user management system ========================== -Local setup: +#### Docker ```shell -# TODO: This is supposed to be submodule, but not actually registered as one. -git clone [email protected]:php/web-shared.git shared -ln -s ../shared public/shared +docker-compose up --build +``` + +You can reset the data volumes using `docker-compose down -v`. + +#### Manual + +```shell +git submodule update --init # Create database and users: CREATE DATABASE phpmasterdb; diff --git a/composer.json b/composer.json index c43cc3d..ad2f0b0 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "require": { "php": ">=8.0", "ext-pdo": "*", + "ext-mysql": "*", "ext-json": "*", "ext-zlib": "*", "michelf/php-markdown": "^1.9", diff --git a/composer.lock b/composer.lock index 15b97af..47445ae 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "02178efeb7cd6e85f79a3ebf8975258e", + "content-hash": "71478d634b6cc8cd95e2949798a09436", "packages": [ { "name": "michelf/php-markdown", @@ -145,6 +145,7 @@ "platform": { "php": ">=8.0", "ext-pdo": "*", + "ext-mysql": "*", "ext-json": "*", "ext-zlib": "*" }, diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ae2e509 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,45 @@ +version: '3' + +services: + db: + image: mysql:8.0.23 + volumes: + - db_data:/var/lib/mysql + - ${PWD}/schema.sql:/docker-entrypoint-initdb.d/001-schema.sql + - ${PWD}/docker/test.sql:/docker-entrypoint-initdb.d/002-test.sql + restart: always + environment: + MYSQL_RANDOM_ROOT_PASSWORD: '1' + MYSQL_USER: 'php_main' + MYSQL_PASSWORD: 'test_51ebe2993a2568c6fbb1cfb4c4277991' + MYSQL_DATABASE: 'php_main' + + web: + depends_on: + - db + image: php-web-main:latest + build: + context: ./docker + restart: always + command: php -S 0.0.0.0:8000 -d include_path="/app/include/" -derror_reporting="E_ALL&~E_DEPRECATED" -t /app/public /app/docker/controller.php + ports: + - "127.0.0.1:8000:8000" + volumes: + - ${PWD}:/app + environment: + DATABASE_HOST: 'db' + DATABASE_USER: 'php_main' + DATABASE_PASSWORD: 'test_51ebe2993a2568c6fbb1cfb4c4277991' + DATABASE_NAME: 'php_main' + + static: + image: caddy:2 + restart: always + command: caddy file-server --listen :8002 --root /app + ports: + - "127.0.0.1:8002:8002" + volumes: + - ${PWD}/shared:/app + +volumes: + db_data: {} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..01195d0 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM php:8.0-cli + +RUN apt-get update && apt-get install -y \ + unzip \ + && docker-php-source extract \ + && php -r 'file_put_contents("mysql.zip", file_get_contents("https://github.com/php/pecl-database-mysql/archive/refs/heads/master.zip"));' \ + && unzip -q mysql.zip \ + && cd pecl-database-mysql-master \ + && phpize \ + && ./configure \ + && make -j$(nproc) install \ + && docker-php-ext-enable mysql \ + && docker-php-source delete \ No newline at end of file diff --git a/docker/controller.php b/docker/controller.php new file mode 100644 index 0000000..aa722f1 --- /dev/null +++ b/docker/controller.php @@ -0,0 +1,8 @@ +<?php + +if (\str_starts_with($_SERVER['REQUEST_URI'], '/shared/')) { + header('Location: http://localhost:8002' . \substr($_SERVER['REQUEST_URI'], \strlen('/shared'))); + exit; +} + +return false; \ No newline at end of file diff --git a/docker/test.sql b/docker/test.sql new file mode 100644 index 0000000..e3abf87 --- /dev/null +++ b/docker/test.sql @@ -0,0 +1 @@ +INSERT INTO users (username, svnpasswd, cvsaccess) VALUES ('test', '$2y$10$iGHyxmfHI62Xyr3DPf8faOPCvmU1UMVMlhJQ/FqooqgPJ3STMHTyG', 1); diff --git a/include/functions.inc b/include/functions.inc index 9528f5d..ece0a79 100644 --- a/include/functions.inc +++ b/include/functions.inc @@ -1,5 +1,7 @@ <?php +use App\DB; + require_once __DIR__ . '/../vendor/autoload.php'; $ts = $_SERVER['REQUEST_TIME']; @@ -8,7 +10,7 @@ if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { die("Magic quotes should not be enabled."); } -if (ini_get('filter.default') != 'unsafe_raw') { +if (ini_get('filter.default') !== 'unsafe_raw') { die("filter.default should not be set."); } @@ -17,7 +19,7 @@ if (ini_get('filter.default') != 'unsafe_raw') { // used in scripts which should only be called from particular machines function require_token() { - if (!isset($_GET['token']) || md5($_GET['token']) != "19a3ec370affe2d899755f005e5cd90e") { + if (!isset($_GET['token']) || md5($_GET['token']) !== "19a3ec370affe2d899755f005e5cd90e") { die("Token not correct."); } } @@ -92,18 +94,20 @@ function warn($message) { echo format_warn($message); } function db_connect($dieonerror = TRUE) { - if (!@mysql_connect("localhost", "nobody", "")) { + if (!@mysql_connect(DB::getHost(), DB::getUser(), DB::getPassword())) { if ($dieonerror) { die(format_warn("Unable to connect to database!")); } return FALSE; } - elseif (!mysql_select_db("phpmasterdb")) { + + if (!mysql_select_db(DB::getDatabase())) { if ($dieonerror) { die(format_warn("Unable to select database!")); } return FALSE; } + return TRUE; } @@ -165,7 +169,7 @@ function show_prev_next($begin, $rows, $skip, $total, $extra = [], $table = true <?php endif ?> <tr> <td> - <?php + <?php if ($begin > 0) { printf("<a href=\"%s?%s\">« Previous %d", $_SERVER['PHP_SELF'], @@ -184,7 +188,7 @@ function show_prev_next($begin, $rows, $skip, $total, $extra = [], $table = true </td> <td> - <?php + <?php if ($begin+$rows < $total) { printf("<a href=\"%s?%s\">Next %d »", $_SERVER['PHP_SELF'], @@ -212,14 +216,14 @@ function is_sqlite_type_available($avails, $check) { // All possible sqlite types associated with our assigned bitwise values $all = ['sqlite' => 1, 'sqlite3' => 2, 'pdo_sqlite' => 4, 'pdo_sqlite2' => 8]; - + if (!$avails || empty($all[$check])) { return false; } $avail = (int) $all[$check]; $avails = (int) $avails; - + if (($avails & $avail) === $avail) { return true; } @@ -373,26 +377,26 @@ function is_admin($user) { function is_mirror_site_admin($user) { $admins = [ - "jimw", - "rasmus", - "andrei", - "zeev", - "andi", - "sas", + "jimw", + "rasmus", + "andrei", + "zeev", + "andi", + "sas", "thies", - "rubys", - "ssb", - "imajes", - "goba", - "derick", - "cortesi", - "wez", - "bjori", - "philip", - "danbrown", - "tyrael", - "dm", - "kalle", + "rubys", + "ssb", + "imajes", + "goba", + "derick", + "cortesi", + "wez", + "bjori", + "philip", + "danbrown", + "tyrael", + "dm", + "kalle", "googleguy", "nikic" ]; diff --git a/shared b/shared new file mode 160000 index 0000000..3145cfc --- /dev/null +++ b/shared @@ -0,0 +1 @@ +Subproject commit 3145cfccf8ba00d25b7a9d8e9a658beeb7786407 diff --git a/src/DB.php b/src/DB.php index db1f84f..9adf7c6 100644 --- a/src/DB.php +++ b/src/DB.php @@ -4,10 +4,35 @@ use PDO; -final class DB extends PDO { - public static function connect() { - $dbh = new self('mysql:host=localhost;dbname=phpmasterdb', 'nobody', ''); - $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - return $dbh; +final class DB extends PDO +{ + public static function connect(): self + { + $connectionConfig = 'mysql:host=' . self::getHost() . ';dbname=' . self::getDatabase(); + + $db = new self($connectionConfig, self::getUser(), self::getPassword()); + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + return $db; + } + + public static function getHost(): string + { + return \getenv("DATABASE_HOST") ?: "localhost"; + } + + public static function getUser(): string + { + return \getenv("DATABASE_USER") ?: "nobody"; + } + + public static function getPassword(): string + { + return \getenv("DATABASE_PASSWORD") ?: ""; + } + + public static function getDatabase(): string + { + return \getenv("DATABASE_NAME") ?: "phpmasterdb"; } } \ No newline at end of file diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index 9cce95b..ec39567 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -30,7 +30,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => '6d94ee66d392e36e925e984dc43058e71e86c8a4', + 'reference' => 'f062ccb6ae876e33bdaebc5ccf5ec2dab53862e3', 'name' => 'php/web-master', ), 'versions' => @@ -51,7 +51,7 @@ class InstalledVersions 'aliases' => array ( ), - 'reference' => '6d94ee66d392e36e925e984dc43058e71e86c8a4', + 'reference' => 'f062ccb6ae876e33bdaebc5ccf5ec2dab53862e3', ), 'phpmailer/phpmailer' => array ( diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index a13c251..c3891dc 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -6,7 +6,7 @@ 'aliases' => array ( ), - 'reference' => '6d94ee66d392e36e925e984dc43058e71e86c8a4', + 'reference' => 'f062ccb6ae876e33bdaebc5ccf5ec2dab53862e3', 'name' => 'php/web-master', ), 'versions' => @@ -27,7 +27,7 @@ 'aliases' => array ( ), - 'reference' => '6d94ee66d392e36e925e984dc43058e71e86c8a4', + 'reference' => 'f062ccb6ae876e33bdaebc5ccf5ec2dab53862e3', ), 'phpmailer/phpmailer' => array ( -- PHP Webmaster List Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
