Refactor Docker configuration and development setup
- Update .dockerignore with comprehensive ignore patterns for API and client - Modify docker-compose files to improve service configurations - Enhance Nginx configuration for development and production environments - Refactor Dockerfile.api with improved build process - Add docker-setup.sh script for simplified Docker deployment - Update update-credentials.vue page with improved UI - Remove hCaptcha dependency from package-lock.json - Update PHP configuration and entrypoint scripts
This commit is contained in:
@@ -1,65 +1,58 @@
|
||||
# Stage 1: Composer dependencies
|
||||
FROM composer:latest as composer
|
||||
WORKDIR /app
|
||||
COPY api/composer.* ./
|
||||
|
||||
ARG APP_ENV=production
|
||||
RUN if [ "$APP_ENV" = "production" ]; then \
|
||||
composer install --ignore-platform-req=php --no-dev --optimize-autoloader; \
|
||||
else \
|
||||
composer install --ignore-platform-req=php --optimize-autoloader; \
|
||||
fi
|
||||
|
||||
# Stage 2: Final image
|
||||
FROM php:8.3-fpm
|
||||
|
||||
# Install system dependencies and PHP extensions
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
curl \
|
||||
libzip-dev \
|
||||
libpng-dev \
|
||||
libonig-dev \
|
||||
libxml2-dev \
|
||||
zip \
|
||||
unzip \
|
||||
postgresql-client \
|
||||
libpq-dev \
|
||||
&& docker-php-ext-install pdo_pgsql mbstring exif pcntl bcmath gd \
|
||||
unzip \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install composer
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
|
||||
ENV COMPOSER_ALLOW_SUPERUSER=1
|
||||
|
||||
# Install PHP extensions
|
||||
RUN docker-php-ext-install pdo pgsql pdo_pgsql gd bcmath zip \
|
||||
&& pecl install redis \
|
||||
&& docker-php-ext-enable redis
|
||||
|
||||
# Install xdebug if not in production
|
||||
ARG APP_ENV=production
|
||||
RUN if [ "$APP_ENV" != "production" ]; then \
|
||||
pecl install xdebug && \
|
||||
docker-php-ext-enable xdebug; \
|
||||
WORKDIR /usr/share/nginx/html/
|
||||
|
||||
# Create storage directories
|
||||
RUN mkdir -p storage/framework/sessions \
|
||||
storage/framework/views \
|
||||
storage/framework/cache \
|
||||
storage/logs \
|
||||
storage/app/public \
|
||||
bootstrap/cache \
|
||||
&& chown -R www-data:www-data storage bootstrap/cache \
|
||||
&& chmod -R 775 storage bootstrap/cache
|
||||
|
||||
# Copy composer files and helpers.php first
|
||||
COPY api/composer.json api/composer.lock ./
|
||||
COPY api/app/helpers.php ./app/helpers.php
|
||||
|
||||
# Install dependencies without running scripts
|
||||
RUN if [ "$APP_ENV" = "production" ] ; then \
|
||||
composer install --no-dev --no-scripts --ignore-platform-req=php --optimize-autoloader ; \
|
||||
else \
|
||||
composer install --no-scripts --ignore-platform-req=php --optimize-autoloader ; \
|
||||
fi
|
||||
|
||||
# Configure PHP
|
||||
COPY docker/php/php.ini /usr/local/etc/php/conf.d/app.ini
|
||||
COPY docker/php/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
|
||||
# Copy the rest of the application
|
||||
COPY api/ .
|
||||
|
||||
WORKDIR /usr/share/nginx/html
|
||||
|
||||
# Copy application files
|
||||
COPY api/artisan artisan
|
||||
COPY api/bootstrap ./bootstrap
|
||||
COPY api/config ./config
|
||||
COPY api/app ./app
|
||||
COPY api/database ./database
|
||||
COPY api/public ./public
|
||||
COPY api/routes ./routes
|
||||
COPY api/tests ./tests
|
||||
COPY api/resources ./resources
|
||||
COPY api/storage ./storage
|
||||
|
||||
# Copy vendor directory from composer stage
|
||||
COPY --from=composer /app/vendor ./vendor
|
||||
|
||||
# Set permissions
|
||||
RUN chmod -R 775 storage \
|
||||
&& chmod -R 775 bootstrap/cache \
|
||||
&& chown -R www-data:www-data /usr/share/nginx/html
|
||||
# Run composer scripts and clear cache
|
||||
RUN composer dump-autoload -o \
|
||||
&& php artisan package:discover --ansi \
|
||||
&& composer clear-cache \
|
||||
&& chmod -R 775 storage \
|
||||
&& chown -R www-data:www-data storage
|
||||
|
||||
# Setup entrypoint
|
||||
COPY docker/php-fpm-entrypoint /usr/local/bin/opnform-entrypoint
|
||||
RUN chmod a+x /usr/local/bin/*
|
||||
|
||||
|
||||
@@ -4,18 +4,18 @@ map $original_uri $api_uri {
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name opnform;
|
||||
root /usr/share/nginx/html/public;
|
||||
listen 80;
|
||||
server_name opnform;
|
||||
root /usr/share/nginx/html/public;
|
||||
|
||||
access_log /dev/stdout;
|
||||
error_log /dev/stderr error;
|
||||
error_log /dev/stderr error;
|
||||
|
||||
index index.html index.htm index.php;
|
||||
|
||||
location / {
|
||||
proxy_http_version 1.1;
|
||||
proxy_pass http://ui:3000;
|
||||
proxy_pass http://opnform-client:3000;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
@@ -24,16 +24,22 @@ server {
|
||||
}
|
||||
|
||||
location ~/(api|open|local\/temp|forms\/assets)/ {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
set $original_uri $uri;
|
||||
try_files $uri $uri/ /index.php$is_args$args;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass api:9000;
|
||||
fastcgi_pass opnform-api:9000;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/public/index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
|
||||
fastcgi_param REQUEST_URI $api_uri;
|
||||
}
|
||||
|
||||
# Deny access to . files
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,35 +4,16 @@ map $original_uri $api_uri {
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name opnform;
|
||||
root /usr/share/nginx/html/public;
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html/public;
|
||||
|
||||
access_log /dev/stdout;
|
||||
error_log /dev/stderr error;
|
||||
error_log /dev/stderr error;
|
||||
|
||||
index index.html index.htm index.php;
|
||||
|
||||
# Development CORS headers
|
||||
add_header 'Access-Control-Allow-Origin' 'http://localhost:3000' always;
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS, PATCH' always;
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-XSRF-TOKEN' always;
|
||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
|
||||
|
||||
# Handle preflight requests
|
||||
if ($request_method = 'OPTIONS') {
|
||||
add_header 'Access-Control-Allow-Origin' 'http://localhost:3000' always;
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS, PATCH' always;
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-XSRF-TOKEN' always;
|
||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||
add_header 'Access-Control-Max-Age' 1728000;
|
||||
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
||||
add_header 'Content-Length' 0;
|
||||
return 204;
|
||||
}
|
||||
|
||||
# Development proxy settings
|
||||
# Frontend proxy
|
||||
location / {
|
||||
proxy_http_version 1.1;
|
||||
proxy_pass http://ui:3000;
|
||||
@@ -43,23 +24,23 @@ server {
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 86400;
|
||||
proxy_buffering off;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
}
|
||||
|
||||
# HMR websocket support
|
||||
location /_nuxt {
|
||||
proxy_pass http://ui:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
|
||||
# API handling
|
||||
location ~/(api|open|local\/temp|forms\/assets)/ {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
set $original_uri $uri;
|
||||
try_files $uri $uri/ /index.php$is_args$args;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
@@ -67,7 +48,13 @@ server {
|
||||
fastcgi_pass api:9000;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/public/index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
|
||||
fastcgi_param REQUEST_URI $api_uri;
|
||||
fastcgi_read_timeout 300;
|
||||
}
|
||||
|
||||
# Deny access to . files
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ main() {
|
||||
prep_storage
|
||||
wait_for_db
|
||||
apply_db_migrations
|
||||
run_init_project
|
||||
run_init_project
|
||||
run_server "$@"
|
||||
fi
|
||||
}
|
||||
@@ -49,7 +49,7 @@ wait_for_db() {
|
||||
|
||||
apply_db_migrations() {
|
||||
echo "Running DB Migrations"
|
||||
./artisan migrate
|
||||
./artisan migrate --force
|
||||
}
|
||||
|
||||
run_init_project() {
|
||||
@@ -59,7 +59,7 @@ run_init_project() {
|
||||
|
||||
run_server() {
|
||||
echo "Starting server $@"
|
||||
exec /usr/local/bin/docker-php-entrypoint "$@"
|
||||
exec "$@"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
15
docker/php/php-fpm.conf
Normal file
15
docker/php/php-fpm.conf
Normal file
@@ -0,0 +1,15 @@
|
||||
[www]
|
||||
user = www-data
|
||||
group = www-data
|
||||
listen = 9000
|
||||
|
||||
pm = dynamic
|
||||
pm.max_children = 20
|
||||
pm.start_servers = 2
|
||||
pm.min_spare_servers = 1
|
||||
pm.max_spare_servers = 3
|
||||
pm.max_requests = 1000
|
||||
|
||||
clear_env = no
|
||||
catch_workers_output = yes
|
||||
decorate_workers_output = no
|
||||
27
docker/php/php.ini
Normal file
27
docker/php/php.ini
Normal file
@@ -0,0 +1,27 @@
|
||||
; PHP Configuration
|
||||
memory_limit = 512M
|
||||
max_execution_time = 60
|
||||
upload_max_filesize = 64M
|
||||
post_max_size = 64M
|
||||
max_input_vars = 3000
|
||||
|
||||
; Error reporting
|
||||
error_reporting = E_ALL
|
||||
display_errors = Off
|
||||
display_startup_errors = Off
|
||||
log_errors = On
|
||||
error_log = /dev/stderr
|
||||
|
||||
; Date
|
||||
date.timezone = UTC
|
||||
|
||||
; Session
|
||||
session.save_handler = redis
|
||||
session.save_path = "tcp://redis:6379"
|
||||
|
||||
; OpCache
|
||||
opcache.enable=1
|
||||
opcache.memory_consumption=256
|
||||
opcache.max_accelerated_files=20000
|
||||
opcache.validate_timestamps=1
|
||||
opcache.revalidate_freq=0
|
||||
Reference in New Issue
Block a user