diff --git a/.env.example b/.env.example
index 24b9adb..50c1707 100644
--- a/.env.example
+++ b/.env.example
@@ -12,11 +12,11 @@ LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
-DB_HOST=db
+DB_HOST=127.0.0.1 # `mysql` if running with sail/docker
DB_PORT=3306
DB_DATABASE=your_project
-DB_USERNAME=root
-DB_PASSWORD=your_project@root123
+DB_USERNAME=root # `sail` if running with sail/docker
+DB_PASSWORD=your_project@root123 # `password` if running with sail/docker
BROADCAST_DRIVER=log
CACHE_DRIVER=file
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 0d40434..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,45 +0,0 @@
-# Use the official PHP image as the base image
-FROM php:8.2-fpm
-
-# Set the working directory inside the container
-WORKDIR /var/www/html
-
-# Install system dependencies and PHP extensions
-RUN apt-get update && apt-get install -y \
- libpng-dev \
- libjpeg-dev \
- zip \
- unzip \
- && docker-php-ext-configure gd --with-jpeg \
- && docker-php-ext-install gd pdo pdo_mysql
-
-# Install Composer
-RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
-
-# Set environment variable to allow Composer plugins as superuser
-ENV COMPOSER_ALLOW_SUPERUSER=1
-
-# Copy composer.json and composer.lock to container
-COPY composer.json composer.lock ./
-
-# Delete existing vendor directory and composer.lock
-#RUN rm -rf vendor composer.lock
-
-# Install project dependencies
-RUN composer install --no-autoloader
-
-# Copy application code to container
-COPY . .
-
-# Generate autoload files
-RUN composer dump-autoload
-
-# Give Stoage permission
-RUN chown -R $USER:www-data storage
-RUN chown -R $USER:www-data bootstrap/cache
-RUN chmod -R 775 storage
-RUN chmod -R 775 bootstrap/cache
-
-# Expose port 9000 and start the PHP-FPM server
-EXPOSE 9000
-CMD ["php-fpm"]
diff --git a/README.md b/README.md
index 516d476..2fdc570 100644
--- a/README.md
+++ b/README.md
@@ -11,17 +11,25 @@ Unlike traditional API generators or code generators, this project simplifies th
## Features
-- Full Authentication System(using [Laravel jetstream](https://jetstream.laravel.com/introduction.html) package)
-- Role and permission-based Authorization System(using [Laravel-Permission](https://spatie.be/docs/laravel-permission/v5/introduction) package)
-- User management
-- Profile settings
-- Multiple Language Support (with the help of [Filament Translations](https://filamentphp.com/docs/3.x/panels/installation#publishing-translations) and [Larave-Lang](https://laravel-lang.com/) package)
-- Theme Customization (Powered by [Tailwind CSS](https://tailwindcss.com/))
+- **Full Authentication System**: Implement a robust authentication system using [Laravel Jetstream](https://jetstream.laravel.com/introduction.html) package for secure user management and login functionality.
+
+- **Role and Permission-based Authorization System**: Create a flexible authorization system using the [Laravel-Permission](https://spatie.be/docs/laravel-permission/v5/introduction) package, allowing you to define roles and permissions for fine-grained access control.
+
+- **User Management**: Manage users efficiently, including user registration, profile updates, and user roles.
+
+- **Profile Settings**: Enable users to customize their profiles, including personal information and preferences.
+
+- **Multiple Language Support**: Make your application accessible to a global audience with the help of [Filament Translations](https://filamentphp.com/docs/3.x/panels/installation#publishing-translations) and [Laravel Lang](https://laravel-lang.com/) packages for multilingual support.
+
+- **Theme Customization**: Customize the application's appearance and user interface using the power of [Tailwind CSS](https://tailwindcss.com/) to create visually appealing designs.
+
+- **Docker Support**: Easily deploy and manage your application in a Docker container with the convenience of [Laravel Sail](https://laravel.com/docs/10.x/sail) for streamlined development and deployment workflows.
## Version Requirments
- - Node 16+
- - PHP version 8.1+
- - MYSQL version 8.0+
+
+- Node 16+
+- PHP version 8.1+
+- MYSQL version 8.0+
## Quick Start
@@ -87,123 +95,13 @@ For a detailed guide on working with multiple languages and translations, visit
Unlock a world of possibilities with seamless language localization, ensuring your application resonates with a global audience.
-## Required Details Commands to run locally
+## Running the Application with Docker and Laravel Sail
-1.**Create Your Project from the Template:**
-
-Begin by creating your project using the provided template.
-
-2.**Clone the Project:**
-
-Clone the created project repository to your local machine by running the following command, replacing `#your project git url` with your project's Git URL:
-
-```bash
-git clone git@github.com:Innovix-Matrix-Solutions/your-project.git #your project git url
-```
+For a more comprehensive guide, please visit the [WIKI](https://github.com/Innovix-Matrix-Systems/ims-laravel-admin-starter/wiki/Running-the-Application-with-Docker-and-Laravel-Sail) page on GitHub:
-3.**Navigate to the Project Directory:**
+[Running the Application with Docker and Laravel Sail - Wiki](https://github.com/Innovix-Matrix-Systems/ims-laravel-admin-starter/wiki/Running-the-Application-with-Docker-and-Laravel-Sail)
-Move to the project directory using the following command:
-
-Go to the project directory
-
-```bash
-cd your-project
-```
-
-4.**Copy .env.example to .env:**
-
-Before proceeding, copy the .env.example file to .env to set up your environment variables:
-
-```bash
-cp .env.example .env
-```
-
-5.**Install Local Development Packages:**
-To install local development packages, including Husky and other Laravel-specific packages, run the following commands:
-
-```bash
-npm install #for husky and other Laravel packages
-npx husky install #only once
-```
-
-To install Composer packages needed for CS Fixer to run independently outside of the Docker shell, run:
-
-```bash
-composer install
-```
-
-6.**Runnig on Laragon**
-If you prefer not to use Docker for local development, you can use [Laragon](https://github.com/leokhoa/laragon) to set up and run the Dokani backend on your local machine. Laragon is a powerful tool for local web development with a range of features.
-
-7.**Running Migration and Seeder**
-To initialize the database and start with some default data, you can run migrations and seeders using the following commands:
-
-**_Step 1: Migrate the Database_**
-
-The `php artisan migrate` command is used to create database tables based on your application's migration files. Run the following command:
-
-```bash
-php artisan migrate
-```
-
-**_Step 2: Seed the Database_**
-To populate the database with default data, including users or initial records, you can use seeders. Use the php artisan db:seed command to run seeders:
-
-```bash
-php artisan db:seed
-```
-
-**_Step 3: Migrate and Seed in One Command_**
-To both migrate the database and seed it in a single command, you can use:
-
-```bash
-php artisan migrate --seed
-```
-
-This command combines the migration and seeding steps, making it convenient for initial setup.
-
-8.**Generate IDE Helper Files:**
-Generate general IDE helper files for improved code autocompletion and navigation by running:
-
-```bash
-php artisan ide-helper:generate
-```
-
-Generate IDE model helper files without writing to model files using:
-
-```bash
-#use any one of this two commands
-php artisan ide-helper:models -N
-php artisan ide-helper:models --nowrite
-```
-
-9.**Run App health Check:**
-After starting the app, it's essential to verify its health by performing the following steps:
-
-Open your web browser or use a tool like `curl` to access the health check endpoint:
-
-```bash
-http://127.0.0.1:8000/api/healthz
-```
-
-Upon hitting the health check endpoint, the app should respond with a JSON object similar to the following:
-
-```json
-{
- "cache": true,
- "http": true,
- "storage": true,
- "database": true,
- "migration": true
-}
-```
-
-If you receive a response like this, congratulations! Your app is healthy and functioning correctly.
-
-Verifying the health of your application is an essential step to ensure that all components and services are running as expected. This check can help you identify and resolve issues promptly.
-
-Remember to perform this health check regularly, especially after making significant changes to your application or its environment.
+This detailed resource provides step-by-step instructions and additional information to ensure a smooth experience when setting up and running your application with Docker and Laravel Sail.
## Running Test
@@ -213,6 +111,12 @@ To ensure the reliability and correctness of your application, it's essential to
Start by creating a dedicated test database for your application. You can name it `ims-admin-testing` to keep it distinct from your production database.
+ If you're using Docker and Laravel Sail, you can skip this step and instead update the phpunit.xml file to add a testing database:
+
+ ```xml
+
+ ```
+
2. **Run Tests:**
You have two convenient options for running tests:
@@ -225,6 +129,14 @@ To ensure the reliability and correctness of your application, it's essential to
./vendor/bin/pest
```
+ If you are running with Sail, you can use this command:
+
+ ```bash
+ ./vendor/bin/sail test
+ # or if you have an alias configured:
+ sail test
+ ```
+
- **Using Artisan:**
Laravel's Artisan command-line tool provides seamless testing capabilities. Run the tests with the following Artisan command:
@@ -233,6 +145,14 @@ To ensure the reliability and correctness of your application, it's essential to
php artisan test
```
+ If you are running Sail, you can use this command:
+
+ ```bash
+ ./vendor/bin/sail artisan test
+ # or if you have an alias configured:
+ sail artisan test
+ ```
+
Running tests is crucial to ensure the reliability and correctness of your application's functionality. The above commands will initiate the testing process and provide you with valuable insights into the quality of your codebase.
## Performance Tips
@@ -270,6 +190,22 @@ This change will prevent the Debugbar from collecting and displaying view data,
This project provides additional Artisan commands to simplify your workflow and enhance productivity.
+### Generate IDE Helper Files:
+
+Generate general IDE helper files for improved code autocompletion and navigation by running:
+
+```bash
+php artisan ide-helper:generate
+```
+
+Generate IDE model helper files without writing to model files using:
+
+```bash
+#use any one of this two commands
+php artisan ide-helper:models -N
+php artisan ide-helper:models --nowrite
+```
+
### Run PHP CS Fixer
```bash
diff --git a/composer.json b/composer.json
index 36ae84e..297a982 100644
--- a/composer.json
+++ b/composer.json
@@ -28,7 +28,7 @@
"friendsofphp/php-cs-fixer": "^3.34",
"laravel-lang/common": "^4.0",
"laravel/pint": "^1.0",
- "laravel/sail": "^1.18",
+ "laravel/sail": "^1.25",
"laravel/telescope": "^4.16",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
diff --git a/composer.lock b/composer.lock
index 953fe12..23a23ea 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "7bbe150c8aeac925a7c0b6cda42f9c97",
+ "content-hash": "3b763b36837dea2aaaeea217c85b076f",
"packages": [
{
"name": "bacon/bacon-qr-code",
diff --git a/docker-compose.yml b/docker-compose.yml
index 6d5c689..389e379 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,47 +1,81 @@
-version: '3'
services:
- app:
- build:
- context: .
- dockerfile: Dockerfile
- image: your-laravel-app
- ports:
- - "9000:9000" # Map host port 9000 to container port 9000
- volumes:
- - .:/var/www/html
- depends_on:
- - db
-
- db:
- image: mysql:8.1
- restart: unless-stopped
- environment:
- MYSQL_ROOT_PASSWORD: your_project@root123
- MYSQL_DATABASE: your_project
- ports:
- - "3306:3306" # Map host port 3306 to MySQL port 3306
- volumes:
- - mysql_data:/var/lib/mysql
-
- phpmyadmin:
- image: phpmyadmin/phpmyadmin
- environment:
- MYSQL_ROOT_PASSWORD: your_project@root123
- PMA_HOST: db
- PMA_PORT: 3306
- ports:
- - "8080:80" # Map host port 8080 to phpMyAdmin port 80
- depends_on:
- - db
-
- nginx:
- image: nginx:latest
- ports:
- - "8000:80" # Map host port 8000 to Nginx port 80
- volumes:
- - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- depends_on:
- - app
-
+ laravel.test:
+ build:
+ context: ./docker/8.2
+ dockerfile: Dockerfile
+ args:
+ WWWGROUP: '${WWWGROUP}'
+ image: sail-8.2/app
+ extra_hosts:
+ - 'host.docker.internal:host-gateway'
+ ports:
+ - '${APP_PORT:-80}:80'
+ - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
+ environment:
+ WWWUSER: '${WWWUSER}'
+ LARAVEL_SAIL: 1
+ XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
+ XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
+ IGNITION_LOCAL_SITES_PATH: '${PWD}'
+ volumes:
+ - '.:/var/www/html'
+ networks:
+ - sail
+ depends_on:
+ - mysql
+ - redis
+ - mailpit
+ mysql:
+ image: 'mysql/mysql-server:8.0'
+ ports:
+ - '${FORWARD_DB_PORT:-3306}:3306'
+ environment:
+ MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
+ MYSQL_ROOT_HOST: '%'
+ MYSQL_DATABASE: '${DB_DATABASE}'
+ MYSQL_USER: '${DB_USERNAME}'
+ MYSQL_PASSWORD: '${DB_PASSWORD}'
+ MYSQL_ALLOW_EMPTY_PASSWORD: 1
+ volumes:
+ - 'sail-mysql:/var/lib/mysql'
+ - './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
+ networks:
+ - sail
+ healthcheck:
+ test:
+ - CMD
+ - mysqladmin
+ - ping
+ - '-p${DB_PASSWORD}'
+ retries: 3
+ timeout: 5s
+ redis:
+ image: 'redis:alpine'
+ ports:
+ - '${FORWARD_REDIS_PORT:-6379}:6379'
+ volumes:
+ - 'sail-redis:/data'
+ networks:
+ - sail
+ healthcheck:
+ test:
+ - CMD
+ - redis-cli
+ - ping
+ retries: 3
+ timeout: 5s
+ mailpit:
+ image: 'axllent/mailpit:latest'
+ ports:
+ - '${FORWARD_MAILPIT_PORT:-1025}:1025'
+ - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
+ networks:
+ - sail
+networks:
+ sail:
+ driver: bridge
volumes:
- mysql_data:
+ sail-mysql:
+ driver: local
+ sail-redis:
+ driver: local
diff --git a/docker/8.1/Dockerfile b/docker/8.1/Dockerfile
new file mode 100644
index 0000000..bb619ca
--- /dev/null
+++ b/docker/8.1/Dockerfile
@@ -0,0 +1,62 @@
+FROM ubuntu:22.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=18
+ARG POSTGRES_VERSION=15
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && mkdir -p /etc/apt/keyrings \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.1-cli php8.1-dev \
+ php8.1-pgsql php8.1-sqlite3 php8.1-gd php8.1-imagick \
+ php8.1-curl \
+ php8.1-imap php8.1-mysql php8.1-mbstring \
+ php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \
+ php8.1-intl php8.1-readline \
+ php8.1-ldap \
+ php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \
+ php8.1-memcached php8.1-pcov php8.1-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
+ && apt-get update \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && npm install -g bun \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarn.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.1
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.1/php.ini b/docker/8.1/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.1/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.1/start-container b/docker/8.1/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.1/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.1/supervisord.conf b/docker/8.1/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.1/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/8.2/Dockerfile b/docker/8.2/Dockerfile
new file mode 100644
index 0000000..239f0f0
--- /dev/null
+++ b/docker/8.2/Dockerfile
@@ -0,0 +1,63 @@
+FROM ubuntu:22.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=18
+ARG POSTGRES_VERSION=15
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && mkdir -p /etc/apt/keyrings \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.2-cli php8.2-dev \
+ php8.2-pgsql php8.2-sqlite3 php8.2-gd php8.2-imagick \
+ php8.2-curl \
+ php8.2-imap php8.2-mysql php8.2-mbstring \
+ php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \
+ php8.2-intl php8.2-readline \
+ php8.2-ldap \
+ php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \
+ php8.2-memcached php8.2-pcov php8.2-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
+ && apt-get update \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && npm install -g pnpm \
+ && npm install -g bun \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.2
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.2/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.2/php.ini b/docker/8.2/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.2/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.2/start-container b/docker/8.2/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.2/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.2/supervisord.conf b/docker/8.2/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.2/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/8.3/Dockerfile b/docker/8.3/Dockerfile
new file mode 100644
index 0000000..4136f97
--- /dev/null
+++ b/docker/8.3/Dockerfile
@@ -0,0 +1,64 @@
+FROM ubuntu:22.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=18
+ARG POSTGRES_VERSION=15
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && mkdir -p /etc/apt/keyrings \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.3-cli php8.3-dev \
+ php8.3-pgsql php8.3-sqlite3 php8.3-gd \
+ php8.3-curl \
+ php8.3-imap php8.3-mysql php8.3-mbstring \
+ php8.3-xml php8.3-zip php8.3-bcmath php8.3-soap \
+ php8.3-intl php8.3-readline \
+ php8.3-ldap \
+ # php8.3-msgpack php8.3-igbinary php8.3-redis php8.3-swoole \
+ # php8.3-memcached php8.3-pcov php8.3-xdebug \
+ # php8.3-imagick \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
+ && apt-get update \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && npm install -g pnpm \
+ && npm install -g bun \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.3
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.3/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.3/php.ini b/docker/8.3/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.3/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.3/start-container b/docker/8.3/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.3/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.3/supervisord.conf b/docker/8.3/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.3/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/mysql/create-testing-database.sh b/docker/mysql/create-testing-database.sh
new file mode 100644
index 0000000..aeb1826
--- /dev/null
+++ b/docker/mysql/create-testing-database.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL
+ CREATE DATABASE IF NOT EXISTS testing;
+ GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%';
+EOSQL
diff --git a/docker/pgsql/create-testing-database.sql b/docker/pgsql/create-testing-database.sql
new file mode 100644
index 0000000..d84dc07
--- /dev/null
+++ b/docker/pgsql/create-testing-database.sql
@@ -0,0 +1,2 @@
+SELECT 'CREATE DATABASE testing'
+WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'testing')\gexec
diff --git a/nginx/default.conf b/nginx/default.conf
deleted file mode 100644
index 80f3c2a..0000000
--- a/nginx/default.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-server {
- listen 80;
- server_name localhost;
- root /var/www/html/public; # Adjust this path to the Laravel public directory
-
- index index.php index.html;
-
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- }
-
- location ~ \.php$ {
- fastcgi_pass app:9000; # Use the service name defined in your docker-compose.yml
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi_params;
- }
-
- location ~ /\.ht {
- deny all;
- }
-}
-
diff --git a/phpunit.xml b/phpunit.xml
index 698037d..ed19a71 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -21,8 +21,8 @@
-
+