diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4cad707 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,57 @@ +version: '3.8' + +# Standalone mode — requires: docker network create web +networks: + web: + external: true + +services: + portal: + build: + context: . + dockerfile: docker/Dockerfile + expose: + - "8088" + networks: + - web + environment: + - APP_ENV=production + - APP_URL=https://demo.portal.tgs.com.vn + - DB_HOST=portal-db + - DB_PORT=3306 + - DB_DATABASE=${DB_DATABASE:-portal} + - DB_USERNAME=${DB_USERNAME:-portal} + - DB_PASSWORD=${DB_PASSWORD} + - REDIS_HOST=portal-cache + - REDIS_PORT=6379 + - REDIS_PASSWORD=${REDIS_PASSWORD} + depends_on: + - portal-db + - portal-cache + restart: unless-stopped + + portal-db: + image: mysql:8 + networks: + - web + environment: + - MYSQL_DATABASE=${DB_DATABASE:-portal} + - MYSQL_USER=${DB_USERNAME:-portal} + - MYSQL_PASSWORD=${DB_PASSWORD} + - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + volumes: + - portal_mysql_data:/var/lib/mysql + restart: unless-stopped + + portal-cache: + image: redis:alpine + command: redis-server --requirepass ${REDIS_PASSWORD} + networks: + - web + volumes: + - portal_redis_data:/data + restart: unless-stopped + +volumes: + portal_mysql_data: + portal_redis_data: diff --git a/docker/Caddyfile b/docker/Caddyfile new file mode 100644 index 0000000..b4859d1 --- /dev/null +++ b/docker/Caddyfile @@ -0,0 +1,14 @@ +:8088 { + root * /var/www/html/public + + encode gzip + + php_fastcgi 127.0.0.1:9000 + + file_server + + @notStatic { + not file {path} {path}/ + } + rewrite @notStatic /index.php +} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..5a187cd --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,50 @@ +FROM php:8.2-fpm-alpine + +# Install system dependencies +RUN apk add --no-cache \ + git curl unzip icu-dev libzip-dev libpng-dev libjpeg-turbo-dev \ + freetype-dev libxml2-dev oniguruma-dev linux-headers \ + imagemagick-dev $PHPIZE_DEPS caddy \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j$(nproc) \ + bcmath ctype fileinfo gd intl mbstring \ + pdo pdo_mysql opcache pcntl sockets zip xml \ + && pecl install redis imagick \ + && docker-php-ext-enable redis imagick \ + && apk del $PHPIZE_DEPS linux-headers \ + && rm -rf /tmp/* + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +# Set working directory +WORKDIR /var/www/html + +# Copy application code +COPY . . + +# Install Laravel dependencies +RUN php /usr/bin/composer install \ + --no-dev --optimize-autoloader --no-interaction --no-progress \ + --no-scripts --ignore-platform-req=ext-ssh2 + +# Create required directories and set permissions +RUN mkdir -p \ + storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache/data \ + storage/logs \ + bootstrap/cache \ + && chown -R www-data:www-data storage bootstrap/cache \ + && chmod -R 775 storage bootstrap/cache + +# Caddy config for Laravel +COPY docker/Caddyfile /etc/caddy/Caddyfile + +# Entrypoint +COPY docker/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +EXPOSE 8088 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000..f232f4a --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/sh +set -e + +cd /var/www/html + +# Wait for MySQL to be ready (TCP check) +if [ -n "$DB_HOST" ]; then + echo "Waiting for database at $DB_HOST:${DB_PORT:-3306}..." + until php -r "new PDO('mysql:host=$DB_HOST;port=${DB_PORT:-3306};dbname=$DB_DATABASE', '$DB_USERNAME', '$DB_PASSWORD');" 2>/dev/null; do + sleep 2 + done + echo "Database is ready." +fi + +# Ensure Laravel storage directories exist +mkdir -p storage/framework/sessions \ + storage/framework/views \ + storage/framework/cache/data \ + storage/logs \ + bootstrap/cache +chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true +chmod -R 775 storage bootstrap/cache + +# Run composer post-install scripts (skipped during build) +php /usr/bin/composer dump-autoload --optimize --no-dev 2>/dev/null || true +php artisan package:discover --ansi 2>/dev/null || true + +# Laravel optimizations +php artisan config:cache +php artisan route:cache +php artisan view:cache +php artisan storage:link --force 2>/dev/null || true + +# Start PHP-FPM in background +php-fpm -D + +# Start Caddy in foreground +exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile