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\">&laquo; Previous %d",
               $_SERVER['PHP_SELF'],
@@ -184,7 +188,7 @@ function show_prev_next($begin, $rows, $skip, $total, 
$extra = [], $table = true
   </td>
   <td>
    &nbsp;
-   <?php 
+   <?php
      if ($begin+$rows < $total) {
        printf("<a href=\"%s?%s\">Next %d &raquo;",
               $_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

Reply via email to