[web-master] main: Add docker development setup (#10)
| From: | Niklas Keller via GitHub | Date: | Sun, 11 Apr 2021 19:56:41 +0000 |
| Subject: | [web-master] main: Add docker development setup (#10) | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-29220@lists.php.net to get a copy of this message | ||
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 git@github.com: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 (