Add Docker Compose production stack (php-apache, mariadb, node/pm2)

This commit is contained in:
Thanakorn
2026-08-17 13:44:14 +07:00
parent 234814a23c
commit 4c4522169c
9 changed files with 192 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
FROM php:8.3-apache
RUN apt-get update && apt-get install -y --no-install-recommends \
libzip-dev libicu-dev libonig-dev default-mysql-client gettext-base \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd zip intl sockets exif opcache \
&& a2enmod rewrite \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache-recommended.ini
COPY docker/php/entrypoint.sh /usr/local/bin/docker-entrypoint-wms.sh
COPY docker/php/config.php.template /usr/local/etc/wms/config.php.template
RUN chmod +x /usr/local/bin/docker-entrypoint-wms.sh
WORKDIR /var/www/html/wms-app
ENTRYPOINT ["docker-entrypoint-wms.sh"]
CMD ["apache2-foreground"]
+55
View File
@@ -0,0 +1,55 @@
<?php
//<><><><><><><><> MAIN CONFIG (docker-generated) <><><><><><><><>//
if(true){
$isTest = "master";
$base_url = "/wms-app/";
$server_url = $base_url."app/";
$include_url = $_SERVER['DOCUMENT_ROOT'].$server_url;
$db_server = "db";
$db_user = "root";
$db_pass = "${DB_ROOT_PASSWORD}";
$db_type = "mysql";
$db_database = "wms";
$db_database2 = "wms2";
$db_server2 = (!empty($db_server2))?$db_server2:$db_server;
$db_user2 = (!empty($db_user2))?$db_user2:$db_user;
$db_pass2 = (!empty($db_pass2))?$db_pass2:$db_pass;
$db_type2 = (!empty($db_type2))?$db_type2:$db_type;
$time_zone = "Asia/Bangkok";
}
// ── Real-time Node.js server ─────────────────────────────────────────────────
if (!defined('NODE_PUBLIC_URL')) {
define('NODE_PUBLIC_URL', 'http://${PUBLIC_HOST}:3000');
}
if (!defined('NODE_EMIT_URL')) {
define('NODE_EMIT_URL', 'http://node:3000/emit');
}
if (!defined('NODE_EMIT_SECRET')) {
define('NODE_EMIT_SECRET', '${EMIT_SECRET}');
}
// ── Usage packages ───────────────────────────────────────────────────────────
$packages = [
'starter' => [
'daily_limit' => 30,
'weekly_limit' => 100,
'lock_on_limit' => ['dashboard'],
],
];
// unique key — used for SMTP password encryption, keep consistent across deploys
$pinkey = "wms";
$SMTP = [];
$SMTP['server'] = "smtp.gmail.com";
$SMTP['username'] = "${SMTP_USERNAME}";
$SMTP['port'] = "587";
$SMTP['password'] = "${SMTP_PASSWORD}"; // Gmail app password, not your login password
$method = "AES-256-CBC";
$iv = "1234567890123456"; // Must be exactly 16 bytes
$SMTP['password'] = openssl_encrypt($SMTP['password'], $method, $pinkey, 0, $iv);
+27
View File
@@ -0,0 +1,27 @@
#!/bin/sh
set -e
APP_DIR=/var/www/html/wms-app
CONFIG=$APP_DIR/app/config.php
# Generate app/config.php from template on first run only.
# Restrict envsubst to known placeholders so it never touches the app's own
# $variable syntax (envsubst blanks out any $NAME it doesn't recognize).
if [ ! -f "$CONFIG" ]; then
echo "[entrypoint] generating app/config.php"
envsubst '${DB_ROOT_PASSWORD} ${PUBLIC_HOST} ${EMIT_SECRET} ${SMTP_USERNAME} ${SMTP_PASSWORD}' \
< /usr/local/etc/wms/config.php.template > "$CONFIG"
fi
mkdir -p "$APP_DIR/app/uploads"
chown -R www-data:www-data "$APP_DIR/app/uploads"
echo "[entrypoint] waiting for database at db:3306"
until mysqladmin ping -h db -u root -p"$DB_ROOT_PASSWORD" --silent 2>/dev/null; do
sleep 2
done
echo "[entrypoint] running setup.php (idempotent schema sync)"
php "$APP_DIR/setup.php" || true
exec "$@"
+5
View File
@@ -0,0 +1,5 @@
opcache.enable=1
opcache.memory_consumption=64
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=2