feat: add Docker setup exposing app on port 7876
- Dockerfile: php:apache base, installs PHP extensions + Composer, configures Apache to listen on port 7876, bundles app code, runs composer install at build time - docker-compose.yml: web service (port 7876) + MariaDB LTS with healthcheck; writable volume for DB persistence - docker/entrypoint.sh: generates .env from environment variables at container start, fixes runtime permissions - docker/php.ini: tuned PHP limits (512M memory, 32M upload) - .dockerignore: excludes .git, vendor, logs, cache, old docker dir - .env.example: template for required environment variables Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
17
.dockerignore
Normal file
17
.dockerignore
Normal file
@@ -0,0 +1,17 @@
|
||||
.git
|
||||
.github
|
||||
vendor/
|
||||
.env
|
||||
.env.*
|
||||
logs/*.log
|
||||
logs/*.txt
|
||||
cache/*
|
||||
!cache/.gitkeep
|
||||
domain-monitor-docker/
|
||||
*.bak
|
||||
*.backup
|
||||
*.old
|
||||
*.tmp
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
node_modules/
|
||||
12
.env.example
Normal file
12
.env.example
Normal file
@@ -0,0 +1,12 @@
|
||||
# Copy to .env and fill in real values before running docker compose up
|
||||
|
||||
DB_DATABASE=domain_monitor
|
||||
DB_USERNAME=domain_monitor
|
||||
DB_PASSWORD=changeme
|
||||
DB_ROOT_PASSWORD=rootchangeme
|
||||
|
||||
# Timezone (e.g. Europe/Bucharest)
|
||||
TZ=UTC
|
||||
|
||||
# Set to 'development' to show detailed error pages
|
||||
APP_ENV=production
|
||||
52
Dockerfile
Normal file
52
Dockerfile
Normal file
@@ -0,0 +1,52 @@
|
||||
FROM php:apache
|
||||
|
||||
# Build-time deps for PHP extensions
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
libicu-dev libzip-dev libpng-dev libjpeg62-turbo-dev libfreetype6-dev \
|
||||
libxml2-dev libcurl4-openssl-dev libonig-dev pkg-config unzip git tzdata \
|
||||
&& docker-php-ext-configure gd --with-jpeg --with-freetype \
|
||||
&& docker-php-ext-install -j"$(nproc)" \
|
||||
pdo pdo_mysql mysqli intl zip gd bcmath mbstring curl xml \
|
||||
&& a2enmod rewrite headers \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Composer from official image
|
||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||
|
||||
# Configure Apache to listen on port 7876
|
||||
RUN sed -i 's/Listen 80/Listen 7876/' /etc/apache2/ports.conf \
|
||||
&& sed -i 's/<VirtualHost \*:80>/<VirtualHost *:7876>/' /etc/apache2/sites-available/000-default.conf
|
||||
|
||||
# Set Apache DocumentRoot to /var/www/html/public
|
||||
RUN sed -ri -e 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf
|
||||
|
||||
# Apache request timeout
|
||||
RUN echo "Timeout 300" > /etc/apache2/conf-available/timeouts.conf && a2enconf timeouts
|
||||
|
||||
# PHP config
|
||||
COPY docker/php.ini /usr/local/etc/php/conf.d/custom.ini
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Copy application source
|
||||
COPY . .
|
||||
|
||||
# Install Composer dependencies
|
||||
RUN composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader
|
||||
|
||||
# Base permissions: code owned root:www-data, writable dirs owned www-data
|
||||
RUN chown -R root:www-data /var/www/html \
|
||||
&& find /var/www/html -type d -exec chmod 755 {} \; \
|
||||
&& find /var/www/html -type f -exec chmod 644 {} \; \
|
||||
&& mkdir -p logs cache public/assets/uploads/avatars \
|
||||
&& chown -R www-data:www-data logs cache public/assets/uploads \
|
||||
&& chmod -R 775 logs cache public/assets/uploads \
|
||||
&& chmod 775 /var/www/html
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 7876
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["apache2-foreground"]
|
||||
43
docker-compose.yml
Normal file
43
docker-compose.yml
Normal file
@@ -0,0 +1,43 @@
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
container_name: domnitor-web
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "7876:7876"
|
||||
environment:
|
||||
DB_HOST: db
|
||||
DB_PORT: "3306"
|
||||
DB_DATABASE: ${DB_DATABASE:-domain_monitor}
|
||||
DB_USERNAME: ${DB_USERNAME:-domain_monitor}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-changeme}
|
||||
APP_ENV: ${APP_ENV:-production}
|
||||
TZ: ${TZ:-UTC}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: mariadb:lts
|
||||
container_name: domnitor-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MARIADB_DATABASE: ${DB_DATABASE:-domain_monitor}
|
||||
MARIADB_USER: ${DB_USERNAME:-domain_monitor}
|
||||
MARIADB_PASSWORD: ${DB_PASSWORD:-changeme}
|
||||
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootchangeme}
|
||||
TZ: ${TZ:-UTC}
|
||||
command:
|
||||
- "--character-set-server=utf8mb4"
|
||||
- "--collation-server=utf8mb4_unicode_ci"
|
||||
volumes:
|
||||
- dbdata:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||
start_period: 15s
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
dbdata:
|
||||
44
docker/entrypoint.sh
Normal file
44
docker/entrypoint.sh
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ENV_FILE="/var/www/html/.env"
|
||||
|
||||
upsert_kv() {
|
||||
local key="$1" val="$2"
|
||||
if grep -qE "^${key}=" "$ENV_FILE" 2>/dev/null; then
|
||||
sed -i "s#^${key}=.*#${key}=${val}#" "$ENV_FILE"
|
||||
else
|
||||
printf "%s=%s\n" "$key" "$val" >> "$ENV_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
# Bootstrap .env from template if not present
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
if [ -f /var/www/html/env.example.txt ]; then
|
||||
cp /var/www/html/env.example.txt "$ENV_FILE"
|
||||
else
|
||||
touch "$ENV_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Inject database and app config from environment variables
|
||||
upsert_kv "DB_HOST" "${DB_HOST:-db}"
|
||||
upsert_kv "DB_PORT" "${DB_PORT:-3306}"
|
||||
upsert_kv "DB_DATABASE" "${DB_DATABASE:-domain_monitor}"
|
||||
upsert_kv "DB_USERNAME" "${DB_USERNAME:-domain_monitor}"
|
||||
upsert_kv "DB_PASSWORD" "${DB_PASSWORD:-}"
|
||||
upsert_kv "APP_ENV" "${APP_ENV:-production}"
|
||||
|
||||
[ -n "${APP_ENCRYPTION_KEY:-}" ] && upsert_kv "APP_ENCRYPTION_KEY" "$APP_ENCRYPTION_KEY"
|
||||
[ -n "${SESSION_LIFETIME:-}" ] && upsert_kv "SESSION_LIFETIME" "$SESSION_LIFETIME"
|
||||
|
||||
# Ownership & permissions on runtime-writable paths
|
||||
chown www-data:www-data "$ENV_FILE"
|
||||
chmod 660 "$ENV_FILE"
|
||||
|
||||
for d in logs cache public/assets/uploads; do
|
||||
dir="/var/www/html/$d"
|
||||
[ -d "$dir" ] && chown -R www-data:www-data "$dir" && chmod -R 775 "$dir"
|
||||
done
|
||||
|
||||
exec "$@"
|
||||
19
docker/php.ini
Normal file
19
docker/php.ini
Normal file
@@ -0,0 +1,19 @@
|
||||
; ---- PHP limits ----
|
||||
max_execution_time = 0
|
||||
max_input_time = -1
|
||||
max_input_vars = 3000
|
||||
memory_limit = 512M
|
||||
post_max_size = 32M
|
||||
upload_max_filesize = 16M
|
||||
default_socket_timeout = 120
|
||||
|
||||
; Recommended defaults
|
||||
date.timezone = UTC
|
||||
display_errors = Off
|
||||
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
|
||||
|
||||
; Opcache
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.validate_timestamps=1
|
||||
opcache.revalidate_freq=2
|
||||
Reference in New Issue
Block a user