├── .gitignore ├── infra └── docker │ ├── mysql │ ├── Dockerfile │ └── my.cnf │ ├── nginx │ ├── Dockerfile │ └── default.conf │ └── php │ ├── xdebug.ini │ ├── php.deploy.ini │ ├── php.development.ini │ └── Dockerfile ├── .github ├── renovate.json ├── workflows │ ├── hadolint-testing.yaml │ ├── create-release-note.yaml │ ├── deploy-build-testing.yaml │ ├── sync-labels.yaml │ ├── laravel-create-project.yaml │ └── laravel-git-clone.yaml ├── release-drafter.yaml └── labels.json ├── .editorconfig ├── .dockerignore ├── LICENSE ├── compose.yaml ├── Makefile ├── README.md └── Taskfile.yml /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | .env 4 | -------------------------------------------------------------------------------- /infra/docker/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:9.0 2 | 3 | ENV TZ=UTC 4 | 5 | COPY ./infra/docker/mysql/*.cnf /etc/mysql/conf.d/ 6 | -------------------------------------------------------------------------------- /infra/docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.27 2 | 3 | WORKDIR /workspace 4 | 5 | ENV TZ=UTC 6 | 7 | COPY ./infra/docker/nginx/*.conf /etc/nginx/conf.d/ 8 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "labels": ["dependencies"], 4 | "extends": [ 5 | "config:base" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /infra/docker/php/xdebug.ini: -------------------------------------------------------------------------------- 1 | [xdebug] 2 | xdebug.mode = debug 3 | xdebug.start_with_request = yes 4 | xdebug.client_host = host.docker.internal 5 | xdebug.client_port = 9003 6 | xdebug.log = /tmp/xdebug.log 7 | xdebug.idekey = "PHPSTORM" 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [Makefile] 18 | indent_style = tab 19 | -------------------------------------------------------------------------------- /.github/workflows/hadolint-testing.yaml: -------------------------------------------------------------------------------- 1 | name: Hadolint Testing 2 | on: 3 | pull_request: 4 | types: [synchronize, opened, reopened] 5 | jobs: 6 | hadolint-testing: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | with: 11 | fetch-depth: 0 12 | - uses: hadolint/hadolint-action@v3.1.0 13 | with: 14 | recursive: true 15 | -------------------------------------------------------------------------------- /.github/workflows/create-release-note.yaml: -------------------------------------------------------------------------------- 1 | name: Create Release Note 2 | on: 3 | push: 4 | branches: [main] 5 | jobs: 6 | release-draft: 7 | permissions: 8 | contents: write 9 | pull-requests: write 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | with: 14 | fetch-depth: 0 15 | - uses: release-drafter/release-drafter@v6 16 | with: 17 | config-name: release-drafter.yaml 18 | commitish: main 19 | env: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | -------------------------------------------------------------------------------- /infra/docker/php/php.deploy.ini: -------------------------------------------------------------------------------- 1 | zend.exception_ignore_args = off 2 | expose_php = off 3 | max_execution_time = 30 4 | max_input_vars = 1000 5 | upload_max_filesize = 64M 6 | post_max_size = 128M 7 | memory_limit = 256M 8 | error_reporting = E_ALL 9 | display_errors = off 10 | display_startup_errors = off 11 | log_errors = on 12 | error_log = /dev/stderr 13 | default_charset = UTF-8 14 | 15 | [Date] 16 | date.timezone = ${TZ} 17 | 18 | [mysqlnd] 19 | mysqlnd.collect_memory_statistics = off 20 | 21 | [Assertion] 22 | zend.assertions = -1 23 | 24 | [mbstring] 25 | mbstring.language = Neutral 26 | -------------------------------------------------------------------------------- /infra/docker/php/php.development.ini: -------------------------------------------------------------------------------- 1 | zend.exception_ignore_args = off 2 | expose_php = on 3 | max_execution_time = 30 4 | max_input_vars = 1000 5 | upload_max_filesize = 64M 6 | post_max_size = 128M 7 | memory_limit = 256M 8 | error_reporting = E_ALL 9 | display_errors = on 10 | display_startup_errors = on 11 | log_errors = on 12 | error_log = /dev/stderr 13 | default_charset = UTF-8 14 | 15 | [Date] 16 | date.timezone = ${TZ} 17 | 18 | [mysqlnd] 19 | mysqlnd.collect_memory_statistics = on 20 | 21 | [Assertion] 22 | zend.assertions = 1 23 | 24 | [mbstring] 25 | mbstring.language = Neutral 26 | -------------------------------------------------------------------------------- /.github/workflows/deploy-build-testing.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy Build Testing 2 | on: 3 | pull_request: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | jobs: 7 | deploy-build-testing: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Git Clone Project 12 | run: git clone https://github.com/laravel/laravel.git src 13 | - name: Docker Version 14 | run: docker version 15 | - name: Docker Compose Settings 16 | run: echo APP_BUILD_TARGET=deploy > .env 17 | - name: Build Docker Images 18 | run: docker compose build app 19 | -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yaml: -------------------------------------------------------------------------------- 1 | name: Sync Labels 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: [main] 6 | jobs: 7 | sync-labels: 8 | permissions: 9 | issues: write 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | with: 14 | fetch-depth: 0 15 | - uses: actions/setup-node@v4 16 | - name: Install dependencies 17 | run: yarn add -D @azu/github-label-setup 18 | - name: Run github-label-setup 19 | run: yarn github-label-setup --token ${{ secrets.GITHUB_TOKEN }} --labels .github/labels.json 20 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /src/node_modules 2 | /src/public/hot 3 | /src/public/storage 4 | /src/storage/app/* 5 | /src/storage/framework/cache/data/* 6 | /src/storage/framework/sessions/* 7 | /src/storage/framework/testing/* 8 | /src/storage/framework/views/* 9 | /src/storage/logs/* 10 | /src/storage/*.key 11 | /src/vendor 12 | /src/.styleci.yml 13 | /src/.phpunit.result.cache 14 | /src/.php-cs-fixer.cache 15 | /src/package.json 16 | /src/phpunit.xml 17 | /src/README.md 18 | /src/phpspec.yml 19 | /src/npm-debug.log 20 | /src/yarn-error.log 21 | /.github 22 | /.git 23 | /.idea 24 | /.vscode 25 | **.env* 26 | **.editorconfig 27 | **.gitattributes 28 | **.gitignore 29 | **.md 30 | -------------------------------------------------------------------------------- /.github/release-drafter.yaml: -------------------------------------------------------------------------------- 1 | name-template: 'v$RESOLVED_VERSION' 2 | tag-template: 'v$RESOLVED_VERSION' 3 | categories: 4 | - title: '🚀 Features' 5 | labels: 6 | - 'enhancement' 7 | - title: '🐞 Bug Fixes' 8 | labels: 9 | - 'bug' 10 | - title: '🧰 Maintenance' 11 | labels: 12 | - 'chore' 13 | - 'dependencies' 14 | - title: '📝 Other Changes' 15 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)' 16 | change-title-escapes: '\<*_&' 17 | version-resolver: 18 | major: 19 | labels: 20 | - 'major' 21 | minor: 22 | labels: 23 | - 'minor' 24 | default: patch 25 | template: | 26 | $CHANGES 27 | footer: | 28 | 29 | ## Full Changelog 30 | 31 | https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION 32 | -------------------------------------------------------------------------------- /infra/docker/mysql/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | # character set / collation 3 | character_set_server = utf8mb4 4 | collation_server = utf8mb4_0900_ai_ci 5 | 6 | # timezone 7 | default-time-zone = SYSTEM 8 | log_timestamps = SYSTEM 9 | 10 | # Error Log 11 | log-error = /var/log/mysql/mysql-error.log 12 | 13 | # Slow Query Log 14 | slow_query_log = 1 15 | slow_query_log_file = /var/log/mysql/mysql-slow.log 16 | long_query_time = 1.0 17 | log_queries_not_using_indexes = 0 18 | 19 | # General Log 20 | general_log = 1 21 | general_log_file = /var/log/mysql/mysql-general.log 22 | 23 | # Binary Log 24 | skip-log-bin 25 | 26 | # Redo Log write threads 27 | innodb_log_writer_threads = 0 28 | 29 | [mysql] 30 | default-character-set = utf8mb4 31 | 32 | [client] 33 | default-character-set = utf8mb4 34 | -------------------------------------------------------------------------------- /infra/docker/nginx/default.conf: -------------------------------------------------------------------------------- 1 | access_log /dev/stdout main; 2 | error_log /dev/stderr warn; 3 | 4 | server { 5 | listen 80; 6 | listen [::]:80; 7 | root /workspace/public; 8 | 9 | add_header X-Frame-Options "SAMEORIGIN"; 10 | add_header X-XSS-Protection "1; mode=block"; 11 | add_header X-Content-Type-Options "nosniff"; 12 | 13 | index index.php; 14 | 15 | charset utf-8; 16 | 17 | location / { 18 | try_files $uri $uri/ /index.php?$query_string; 19 | } 20 | 21 | location = /favicon.ico { access_log off; log_not_found off; } 22 | location = /robots.txt { access_log off; log_not_found off; } 23 | 24 | error_page 404 /index.php; 25 | 26 | location ~ \.php$ { 27 | fastcgi_pass app:9000; 28 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 29 | include fastcgi_params; 30 | } 31 | 32 | location ~ /\.(?!well-known).* { 33 | deny all; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 ucan-lab/docker-laravel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/laravel-create-project.yaml: -------------------------------------------------------------------------------- 1 | name: Laravel Create Project 2 | on: 3 | pull_request: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | jobs: 7 | laravel-create-project: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Docker Version 12 | run: docker version 13 | - name: Docker Compose Settings 14 | run: | 15 | echo APP_BUILD_TARGET=development-xdebug > .env 16 | echo "UID=$(id -u)" >> .env 17 | echo "GID=$(id -g)" >> .env 18 | - name: Build Docker Images 19 | run: docker compose build 20 | - name: Create & Start Docker Containers 21 | run: | 22 | mkdir src 23 | docker compose up -d 24 | - name: OS Version 25 | run: | 26 | docker compose exec app cat /etc/os-release 27 | docker compose exec app cat /etc/debian_version 28 | - name: PHP Version 29 | run: docker compose exec app php --version 30 | - name: Composer Version 31 | run: docker compose exec app composer --version 32 | - name: Create Laravel Project 33 | run: docker compose exec app composer create-project --prefer-dist laravel/laravel . 34 | - name: Laravel Version 35 | run: docker compose exec app php artisan --version 36 | - name: Wait for the MySQL container to start 37 | run: sleep 5s 38 | shell: bash 39 | - name: Laravel Migrate Testing 40 | run: docker compose exec app php artisan migrate 41 | - name: Laravel Rollback Testing 42 | run: docker compose exec app php artisan migrate:refresh 43 | - name: Laravel Seeding Testing 44 | run: docker compose exec app php artisan db:seed 45 | - name: Laravel PHPUnit Testing 46 | run: docker compose exec app php artisan test 47 | -------------------------------------------------------------------------------- /.github/labels.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "bug", 4 | "color": "d73a4a", 5 | "description": "Something isn't working" 6 | }, 7 | { 8 | "name": "chore", 9 | "color": "e2601e", 10 | "description": "Repaying technical debt. Maintenance of tools" 11 | }, 12 | { 13 | "name": "dependencies", 14 | "color": "5319e7", 15 | "description": "Security update" 16 | }, 17 | { 18 | "name": "documentation", 19 | "color": "0075ca", 20 | "description": "Improvements or additions to documentation" 21 | }, 22 | { 23 | "name": "duplicate", 24 | "color": "cfd3d7", 25 | "description": "This issue or pull request already exists" 26 | }, 27 | { 28 | "name": "enhancement", 29 | "color": "a2eeef", 30 | "description": "New feature or request" 31 | }, 32 | { 33 | "name": "good first issue", 34 | "color": "7057ff", 35 | "description": "Good for newcomers" 36 | }, 37 | { 38 | "name": "help wanted", 39 | "color": "008672", 40 | "description": "Extra attention is needed" 41 | }, 42 | { 43 | "name": "invalid", 44 | "color": "e4e669", 45 | "description": "This doesn't seem right" 46 | }, 47 | { 48 | "name": "major", 49 | "color": "07575b", 50 | "description": "Major version up" 51 | }, 52 | { 53 | "name": "minor", 54 | "color": "c4dfe6", 55 | "description": "Minor version up" 56 | }, 57 | { 58 | "name": "question", 59 | "color": "d876e3", 60 | "description": "Further information is requested" 61 | }, 62 | { 63 | "name": "wontfix", 64 | "color": "ffffff", 65 | "description": "This will not be worked on" 66 | } 67 | ] 68 | -------------------------------------------------------------------------------- /compose.yaml: -------------------------------------------------------------------------------- 1 | volumes: 2 | db-store: 3 | 4 | services: 5 | app: 6 | build: 7 | context: . 8 | dockerfile: ./infra/docker/php/Dockerfile 9 | args: 10 | UID: ${UID:-1000} 11 | GID: ${GID:-1000} 12 | target: ${APP_BUILD_TARGET:-development} 13 | volumes: 14 | - type: bind 15 | source: ./src 16 | target: /workspace 17 | environment: 18 | # Please remove this environment variable, after created the Laravel project. Please write in .env 19 | - DB_CONNECTION=${DB_CONNECTION:-mysql} 20 | - DB_HOST=${DB_HOST:-db} 21 | - DB_PORT=${DB_PORT:-3306} 22 | - DB_DATABASE=${DB_DATABASE:-laravel} 23 | - DB_USERNAME=${DB_USERNAME:-phper} 24 | - DB_PASSWORD=${DB_PASSWORD:-secret} 25 | 26 | web: 27 | build: 28 | context: . 29 | dockerfile: ./infra/docker/nginx/Dockerfile 30 | ports: 31 | - target: 80 32 | published: ${WEB_PUBLISHED_PORT:-80} 33 | protocol: tcp 34 | mode: host 35 | volumes: 36 | - type: bind 37 | source: ./src 38 | target: /workspace 39 | 40 | db: 41 | build: 42 | context: . 43 | dockerfile: ./infra/docker/mysql/Dockerfile 44 | ports: 45 | - target: 3306 46 | published: ${DB_PUBLISHED_PORT:-3306} 47 | protocol: tcp 48 | mode: host 49 | volumes: 50 | - type: volume 51 | source: db-store 52 | target: /var/lib/mysql 53 | volume: 54 | nocopy: true 55 | environment: 56 | - MYSQL_DATABASE=${DB_DATABASE:-laravel} 57 | - MYSQL_USER=${DB_USERNAME:-phper} 58 | - MYSQL_PASSWORD=${DB_PASSWORD:-secret} 59 | - MYSQL_ROOT_PASSWORD=${DB_PASSWORD:-secret} 60 | 61 | mailpit: 62 | image: axllent/mailpit 63 | ports: 64 | - target: 8025 65 | published: ${MAILPIT_PUBLISHED_PORT:-8025} 66 | protocol: tcp 67 | mode: host 68 | -------------------------------------------------------------------------------- /.github/workflows/laravel-git-clone.yaml: -------------------------------------------------------------------------------- 1 | name: Laravel Git Clone 2 | on: 3 | pull_request: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | jobs: 7 | laravel-git-clone: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Git Clone Project 12 | run: git clone https://github.com/laravel/laravel.git src 13 | - name: Docker Version 14 | run: docker version 15 | - name: Docker Compose Settings 16 | run: | 17 | echo APP_BUILD_TARGET=development-xdebug > .env 18 | echo "UID=$(id -u)" >> .env 19 | echo "GID=$(id -g)" >> .env 20 | - name: Build Docker Images 21 | run: docker compose build 22 | - name: Create & Start Docker Containers 23 | run: docker compose up -d 24 | - name: OS Version 25 | run: | 26 | docker compose exec app cat /etc/os-release 27 | docker compose exec app cat /etc/debian_version 28 | - name: PHP Version 29 | run: docker compose exec app php --version 30 | - name: Composer Version 31 | run: docker compose exec app composer --version 32 | - name: Composer Install 33 | run: docker compose exec app composer install 34 | - name: Laravel Version 35 | run: docker compose exec app php artisan --version 36 | - name: Laravel Settings 37 | run: | 38 | docker compose exec app cp .env.example .env 39 | docker compose exec app php artisan key:generate 40 | - name: Wait for the MySQL container to start 41 | run: sleep 5s 42 | shell: bash 43 | - name: Laravel Migrate Testing 44 | run: docker compose exec app php artisan migrate 45 | - name: Laravel Rollback Testing 46 | run: docker compose exec app php artisan migrate:refresh 47 | - name: Laravel Seeding Testing 48 | run: docker compose exec app php artisan db:seed 49 | - name: Laravel PHPUnit Testing 50 | run: docker compose exec app php artisan test 51 | -------------------------------------------------------------------------------- /infra/docker/php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.3-fpm-bullseye AS base 2 | 3 | WORKDIR /workspace 4 | 5 | # timezone environment 6 | ENV TZ=UTC \ 7 | # locale 8 | LANG=en_US.UTF-8 \ 9 | LANGUAGE=en_US:en \ 10 | LC_ALL=en_US.UTF-8 \ 11 | # composer environment 12 | COMPOSER_HOME=/composer 13 | 14 | ARG UID=1000 15 | ARG GID=1000 16 | 17 | COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer 18 | 19 | # hadolint ignore=DL3008 20 | RUN <> .env 3 | echo "GID=$$(id -g)" >> .env 4 | install: 5 | @make build 6 | @make up 7 | docker compose exec app composer install 8 | docker compose exec app cp .env.example .env 9 | docker compose exec app php artisan key:generate 10 | docker compose exec app php artisan storage:link 11 | docker compose exec app chmod -R 777 storage bootstrap/cache 12 | @make fresh 13 | create-project: 14 | mkdir src 15 | docker compose build 16 | docker compose up -d 17 | docker compose exec app composer create-project --prefer-dist laravel/laravel . 18 | docker compose exec app php artisan key:generate 19 | docker compose exec app php artisan storage:link 20 | docker compose exec app chmod -R 777 storage bootstrap/cache 21 | @make fresh 22 | build: 23 | docker compose build 24 | up: 25 | docker compose up --detach 26 | stop: 27 | docker compose stop 28 | down: 29 | docker compose down --remove-orphans 30 | down-v: 31 | docker compose down --remove-orphans --volumes 32 | restart: 33 | @make down 34 | @make up 35 | destroy: 36 | docker compose down --rmi all --volumes --remove-orphans 37 | remake: 38 | @make destroy 39 | @make install 40 | ps: 41 | docker compose ps 42 | web: 43 | docker compose exec web bash 44 | app: 45 | docker compose exec app bash 46 | tinker: 47 | docker compose exec app php artisan tinker 48 | dump: 49 | docker compose exec app php artisan dump-server 50 | test: 51 | docker compose exec app php artisan test 52 | migrate: 53 | docker compose exec app php artisan migrate 54 | fresh: 55 | docker compose exec app php artisan migrate:fresh --seed 56 | seed: 57 | docker compose exec app php artisan db:seed 58 | dacapo: 59 | docker compose exec app php artisan dacapo 60 | rollback-test: 61 | docker compose exec app php artisan migrate:fresh 62 | docker compose exec app php artisan migrate:refresh 63 | optimize: 64 | docker compose exec app php artisan optimize 65 | optimize-clear: 66 | docker compose exec app php artisan optimize:clear 67 | cache: 68 | docker compose exec app composer dump-autoload --optimize 69 | @make optimize 70 | docker compose exec app php artisan event:cache 71 | docker compose exec app php artisan view:cache 72 | cache-clear: 73 | docker compose exec app composer clear-cache 74 | @make optimize-clear 75 | docker compose exec app php artisan event:clear 76 | docker compose exec app php artisan view:clear 77 | db: 78 | docker compose exec db bash 79 | sql: 80 | docker compose exec db bash -c 'mysql -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' 81 | redis: 82 | docker compose exec redis redis-cli 83 | ide-helper: 84 | docker compose exec app php artisan clear-compiled 85 | docker compose exec app php artisan ide-helper:generate 86 | docker compose exec app php artisan ide-helper:meta 87 | docker compose exec app php artisan ide-helper:models --write --reset 88 | pint: 89 | docker compose exec app ./vendor/bin/pint --verbose 90 | pint-test: 91 | docker compose exec app ./vendor/bin/pint --verbose --test 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker-laravel 🐳 2 | 3 |

4 | docker-laravel 5 |

6 |

7 | Test laravel-create-project.yml 8 | Test laravel-git-clone.yml 9 | License 10 |

11 | 12 | ## Introduction 13 | 14 | Build a simple laravel development environment with Docker Compose. Support with Windows(WSL2), macOS(Intel and Apple Silicon) and Linux. 15 | 16 | ## Usage 17 | 18 | ### Create an initial Laravel project 19 | 20 | 1. Click [Use this template](https://github.com/ucan-lab/docker-laravel/generate) 21 | 2. Git clone & change directory 22 | 3. Execute the following command 23 | 24 | ```bash 25 | $ task for-linux-env # Linux environment only 26 | $ task create-project 27 | 28 | # or... 29 | 30 | $ make for-linux-env # Linux environment only 31 | $ make create-project 32 | 33 | # or... 34 | 35 | $ echo "UID=$(id -u)" >> .env # Linux environment only 36 | $ echo "GID=$(id -g)" >> .env # Linux environment only 37 | 38 | $ mkdir -p src 39 | $ docker compose build 40 | $ docker compose up -d 41 | $ docker compose exec app composer create-project --prefer-dist laravel/laravel . 42 | $ docker compose exec app php artisan key:generate 43 | $ docker compose exec app php artisan storage:link 44 | $ docker compose exec app chmod -R 777 storage bootstrap/cache 45 | $ docker compose exec app php artisan migrate 46 | ``` 47 | 48 | http://localhost 49 | 50 | ### Create an existing Laravel project 51 | 52 | 1. Git clone & change directory 53 | 2. Execute the following command 54 | 55 | ```bash 56 | $ task for-linux-env # Linux environment only 57 | $ task install 58 | 59 | # or... 60 | 61 | $ make for-linux-env # Linux environment only 62 | $ make install 63 | 64 | # or... 65 | 66 | $ echo "UID=$(id -u)" >> .env # Linux environment only 67 | $ echo "GID=$(id -g)" >> .env # Linux environment only 68 | 69 | $ docker compose build 70 | $ docker compose up -d 71 | $ docker compose exec app composer install 72 | $ docker compose exec app cp .env.example .env 73 | $ docker compose exec app php artisan key:generate 74 | $ docker compose exec app php artisan storage:link 75 | $ docker compose exec app chmod -R 777 storage bootstrap/cache 76 | ``` 77 | 78 | http://localhost 79 | 80 | ## Tips 81 | 82 | - Read this [Taskfile](https://github.com/ucan-lab/docker-laravel/blob/main/Taskfile.yml). 83 | - Read this [Makefile](https://github.com/ucan-lab/docker-laravel/blob/main/Makefile). 84 | - Read this [Wiki](https://github.com/ucan-lab/docker-laravel/wiki). 85 | 86 | ## Container structures 87 | 88 | ```bash 89 | ├── app 90 | ├── web 91 | └── db 92 | ``` 93 | 94 | ### app container 95 | 96 | - Base image 97 | - [php](https://hub.docker.com/_/php):8.3-fpm-bullseye 98 | - [composer](https://hub.docker.com/_/composer):2.7 99 | 100 | ### web container 101 | 102 | - Base image 103 | - [nginx](https://hub.docker.com/_/nginx):1.26 104 | 105 | ### db container 106 | 107 | - Base image 108 | - [mysql](https://hub.docker.com/_/mysql):8.4 109 | 110 | ### mailpit container 111 | 112 | - Base image 113 | - [axllent/mailpit](https://hub.docker.com/r/axllent/mailpit) 114 | -------------------------------------------------------------------------------- /Taskfile.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | tasks: 4 | for-linux-env: 5 | cmds: 6 | - echo "UID=$(id -u)" >> .env 7 | - echo "GID=$(id -g)" >> .env 8 | 9 | install: 10 | cmds: 11 | - task: build 12 | - task: up 13 | - docker compose exec app composer install 14 | - docker compose exec app cp .env.example .env 15 | - docker compose exec app php artisan key:generate 16 | - docker compose exec app php artisan storage:link 17 | - docker compose exec app chmod -R 777 storage bootstrap/cache 18 | - task: fresh 19 | 20 | create-project: 21 | cmds: 22 | - mkdir src 23 | - task: build 24 | - task: up 25 | - docker compose exec app composer create-project --prefer-dist laravel/laravel . 26 | - docker compose exec app php artisan key:generate 27 | - docker compose exec app php artisan storage:link 28 | - docker compose exec app chmod -R 777 storage bootstrap/cache 29 | - task: fresh 30 | 31 | build: 32 | cmds: 33 | - docker compose build 34 | 35 | up: 36 | cmds: 37 | - docker compose up --detach 38 | 39 | down: 40 | cmds: 41 | - docker compose down --remove-orphans 42 | 43 | down-v: 44 | cmds: 45 | - docker compose down --remove-orphans --volumes 46 | 47 | stop: 48 | cmds: 49 | - docker compose stop 50 | 51 | restart: 52 | cmds: 53 | - task: down 54 | - task: up 55 | 56 | destroy: 57 | cmds: 58 | - docker compose down --rmi all --volumes --remove-orphans 59 | 60 | remake: 61 | cmds: 62 | - task: destroy 63 | - task: install 64 | 65 | ps: 66 | cmds: 67 | - docker compose ps 68 | 69 | web: 70 | cmds: 71 | - docker compose exec web bash 72 | 73 | app: 74 | cmds: 75 | - docker compose exec app bash 76 | 77 | tinker: 78 | cmds: 79 | - docker compose exec app php artisan tinker 80 | 81 | dump: 82 | cmds: 83 | - docker compose exec app php artisan dump-server 84 | 85 | test: 86 | cmds: 87 | - docker compose exec app php artisan test 88 | 89 | migrate: 90 | cmds: 91 | - docker compose exec app php artisan migrate 92 | 93 | fresh: 94 | cmds: 95 | - docker compose exec app php artisan migrate:fresh --seed 96 | 97 | seed: 98 | cmds: 99 | - docker compose exec app php artisan db:seed 100 | 101 | dacapo: 102 | cmds: 103 | - docker compose exec app php artisan dacapo 104 | 105 | rollback-test: 106 | cmds: 107 | - docker compose exec app php artisan migrate:fresh 108 | - docker compose exec app php artisan migrate:refresh 109 | 110 | optimize: 111 | cmds: 112 | - docker compose exec app php artisan optimize 113 | 114 | optimize-clear: 115 | cmds: 116 | - docker compose exec app php artisan optimize:clear 117 | 118 | cache: 119 | cmds: 120 | - docker compose exec app composer dump-autoload --optimize 121 | - docker compose exec app php artisan optimize 122 | - docker compose exec app php artisan event:cache 123 | - docker compose exec app php artisan view:cache 124 | 125 | cache-clear: 126 | cmds: 127 | - docker compose exec app composer clear-cache 128 | - docker compose exec app php artisan optimize:clear 129 | - docker compose exec app php artisan event:clear 130 | - docker compose exec app php artisan view:clear 131 | 132 | db: 133 | cmds: 134 | - docker compose exec db bash 135 | 136 | sql: 137 | cmds: 138 | - docker compose exec db bash -c 'mysql -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' 139 | 140 | redis: 141 | cmds: 142 | - docker compose exec redis redis-cli 143 | 144 | ide-helper: 145 | cmds: 146 | - docker compose exec app php artisan clear-compiled 147 | - docker compose exec app php artisan ide-helper:generate 148 | - docker compose exec app php artisan ide-helper:meta 149 | - docker compose exec app php artisan ide-helper:models --write --reset 150 | 151 | pint: 152 | cmds: 153 | - docker compose exec app ./vendor/bin/pint --verbose 154 | 155 | pint-test: 156 | cmds: 157 | - docker compose exec app ./vendor/bin/pint --verbose --test 158 | --------------------------------------------------------------------------------