From 591f3d4743aac0295f615bdfb554f3439811e8b5 Mon Sep 17 00:00:00 2001 From: Twyco Date: Fri, 27 Mar 2026 20:11:01 +0100 Subject: [PATCH] added docker --- .dockerignore | 49 +++++++++++++++++++++++++ .env.example | 69 ++++++++++-------------------------- .env.mariadb.example | 4 +++ .gitignore | 1 + docker-compose.yml | 69 ++++++++++++++++++++++++++++++++++++ docker/nginx/Dockerfile | 20 +++++++++++ docker/nginx/nginx.conf | 33 +++++++++++++++++ docker/php-fpm/Dockerfile | 66 ++++++++++++++++++++++++++++++++++ docker/php-fpm/entrypoint.sh | 11 ++++++ 9 files changed, 272 insertions(+), 50 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.mariadb.example create mode 100644 docker-compose.yml create mode 100644 docker/nginx/Dockerfile create mode 100644 docker/nginx/nginx.conf create mode 100644 docker/php-fpm/Dockerfile create mode 100644 docker/php-fpm/entrypoint.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d7d2431 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,49 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.gitattributes +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.next +**/.cache +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/docker-compose* +**/compose.y*ml +**/compose.*.y*ml +!**/composer.json +!**/composer.lock +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +vendor +**/.DS_Store +.editorconfig +.env.example +.env.mariadb +.env.mariadb.example +.env.production +LICENSE +README.md + +# Ignore development-related files and directories +# For development environment, we will use mount bind to mount the source code to the container +# So we don't need to copy the source code to the container for development +tests/ +phpunit.xml +phpunit.xml.dist diff --git a/.env.example b/.env.example index c0660ea..f44b3bc 100644 --- a/.env.example +++ b/.env.example @@ -1,65 +1,34 @@ -APP_NAME=Laravel +APP_NAME=kanbangit APP_ENV=local APP_KEY= APP_DEBUG=true +APP_TIMEZONE=Europe/Berlin APP_URL=http://localhost +API_KEY= APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US -APP_MAINTENANCE_DRIVER=file -# APP_MAINTENANCE_STORE=database +LOG_STACK=daily -# PHP_CLI_SERVER_WORKERS=4 +DB_CONNECTION=mariadb +DB_HOST=kanbangit-db +DB_PORT=3306 +DB_DATABASE=kanbangit +DB_USERNAME= +DB_PASSWORD= -BCRYPT_ROUNDS=12 - -LOG_CHANNEL=stack -LOG_STACK=single -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=sqlite -# DB_HOST=127.0.0.1 -# DB_PORT=3306 -# DB_DATABASE=laravel -# DB_USERNAME=root -# DB_PASSWORD= - -SESSION_DRIVER=database -SESSION_LIFETIME=120 -SESSION_ENCRYPT=false -SESSION_PATH=/ -SESSION_DOMAIN=null - -BROADCAST_CONNECTION=log -FILESYSTEM_DISK=local -QUEUE_CONNECTION=database - -CACHE_STORE=database -# CACHE_PREFIX= - -MEMCACHED_HOST=127.0.0.1 - -REDIS_CLIENT=phpredis -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=log -MAIL_SCHEME=null -MAIL_HOST=127.0.0.1 -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_FROM_ADDRESS="hello@example.com" +#Default +MAIL_MAILER=smtp +MAIL_HOST=mail.example.de +MAIL_PORT=587 +MAIL_USERNAME=no-reply@example.com +MAIL_PASSWORD= +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=no-reply@example.com MAIL_FROM_NAME="${APP_NAME}" -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false +FILESYSTEM_DISK=public VITE_APP_NAME="${APP_NAME}" diff --git a/.env.mariadb.example b/.env.mariadb.example new file mode 100644 index 0000000..5200427 --- /dev/null +++ b/.env.mariadb.example @@ -0,0 +1,4 @@ +MARIADB_DATABASE=kanbangit +MARIADB_USER=kanbangit +MARIADB_PASSWORD= +MARIADB_ROOT_PASSWORD= diff --git a/.gitignore b/.gitignore index 5504403..a27aa7e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ .DS_Store .env .env.backup +.env.mariadb .env.production .phpactor.json .phpunit.result.cache diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..07cd981 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,69 @@ +services: + web: + container_name: kanbangit-web + build: + context: . + dockerfile: ./docker/nginx/Dockerfile + restart: unless-stopped + ports: + - "8080:80" + volumes: + - kanbangit-storage:/var/www/storage:ro + - kanbangit-public-assets:/var/www/public/build:ro + env_file: + - .env.production + networks: + - kanbangit-web + depends_on: + php-fpm: + condition: service_healthy + + php-fpm: + container_name: kanbangit-php-fpm + build: + context: . + dockerfile: ./docker/php-fpm/Dockerfile + target: production + restart: unless-stopped + volumes: + - kanbangit-storage:/var/www/storage + - kanbangit-public-assets:/var/www/public/build + env_file: + - .env.production + networks: + - kanbangit-web + - kanbangit-db + healthcheck: + test: ["CMD-SHELL", "php-fpm-healthcheck || exit 1"] + interval: 10s + timeout: 5s + retries: 3 + depends_on: + mariadb: + condition: service_healthy + + mariadb: + container_name: kanbangit-db + image: mariadb:11.4 + restart: unless-stopped + env_file: + - .env.mariadb + command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + volumes: + - mariadb-data-production:/var/lib/mysql + networks: + - kanbangit-db + healthcheck: + test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ] + start_period: 10s + interval: 10s + timeout: 5s + retries: 3 +networks: + kanbangit-db: + kanbangit-web: + +volumes: + mariadb-data-production: + kanbangit-storage: + kanbangit-public-assets: diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile new file mode 100644 index 0000000..35e463b --- /dev/null +++ b/docker/nginx/Dockerfile @@ -0,0 +1,20 @@ +FROM php:8.4-cli-bookworm AS builder +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl ca-certificates git unzip \ + && rm -rf /var/lib/apt/lists/* +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ + && apt-get update && apt-get install -y --no-install-recommends nodejs \ + && rm -rf /var/lib/apt/lists/* +RUN curl -sS https://getcomposer.org/installer | php -- \ + --install-dir=/usr/local/bin --filename=composer +WORKDIR /var/www +COPY . /var/www +RUN composer install --no-dev --prefer-dist --no-interaction --no-progress --optimize-autoloader +RUN npm ci && npm run build + +FROM nginx:alpine +COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf +COPY --from=builder /var/www/public /var/www/public +WORKDIR /var/www/public +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf new file mode 100644 index 0000000..09390d3 --- /dev/null +++ b/docker/nginx/nginx.conf @@ -0,0 +1,33 @@ +events { + worker_connections 1024; +} +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + client_max_body_size 100m; + + server { + listen 80; + server_name localhost; + root /var/www/public; + index index.php index.html; + location / { + try_files $uri $uri/ /index.php?$query_string; + } + location ^~ /storage/ { + alias /var/www/storage/app/public/; + try_files $uri =404; + access_log off; + expires 7d; + add_header Cache-Control "public"; + } + location ~ \.php$ { + fastcgi_pass php-fpm:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + } +} diff --git a/docker/php-fpm/Dockerfile b/docker/php-fpm/Dockerfile new file mode 100644 index 0000000..99bb566 --- /dev/null +++ b/docker/php-fpm/Dockerfile @@ -0,0 +1,66 @@ +FROM php:8.4-fpm AS builder +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + unzip \ + libpq-dev \ + libonig-dev \ + libssl-dev \ + libxml2-dev \ + libcurl4-openssl-dev \ + libicu-dev \ + libzip-dev \ + libmagickwand-dev \ + libpng-dev \ + libjpeg-dev \ + libfreetype6-dev \ + && docker-php-ext-install -j$(nproc) \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + opcache \ + intl \ + zip \ + bcmath \ + soap \ + && docker-php-ext-configure gd --with-jpeg --with-freetype \ + && docker-php-ext-install -j$(nproc) gd \ + && pecl install imagick \ + && docker-php-ext-enable imagick \ + && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +WORKDIR /var/www +COPY . /var/www +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ + && composer install --no-dev --optimize-autoloader --no-interaction --no-progress --prefer-dist +FROM php:8.4-fpm AS production +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpq-dev \ + libicu-dev \ + libzip-dev \ + libfcgi-bin \ + procps \ + libmagickwand-dev \ + && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN curl -o /usr/local/bin/php-fpm-healthcheck \ + https://raw.githubusercontent.com/renatomefi/php-fpm-healthcheck/master/php-fpm-healthcheck \ + && chmod +x /usr/local/bin/php-fpm-healthcheck +COPY ./docker/php-fpm/entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh +COPY ./storage /var/www/storage-init +COPY --from=builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ +COPY --from=builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/ +COPY --from=builder /usr/local/bin/docker-php-ext-* /usr/local/bin/ +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +RUN printf '%s\n' \ +'[global]' \ +'daemonize = no' \ +'' \ +'[www]' \ +'pm.status_path = /status' \ +> /usr/local/etc/php-fpm.d/zz-docker.conf +COPY --from=builder /var/www /var/www +WORKDIR /var/www +RUN chown -R www-data:www-data /var/www +USER www-data +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +EXPOSE 9000 +CMD ["php-fpm"] diff --git a/docker/php-fpm/entrypoint.sh b/docker/php-fpm/entrypoint.sh new file mode 100644 index 0000000..683145a --- /dev/null +++ b/docker/php-fpm/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e +if [ ! "$(ls -A /var/www/storage)" ]; then + echo "Initializing storage directory..." + cp -R /var/www/storage-init/. /var/www/storage + chown -R www-data:www-data /var/www/storage +fi +rm -rf /var/www/storage-init +php artisan config:cache +php artisan route:cache +exec "$@" -- 2.54.0