From 94812f7ee7cadeedc22f22c06a46432ad2683f71 Mon Sep 17 00:00:00 2001
From: Mortexa <47121888+smortexa@users.noreply.github.com>
Date: Sun, 14 Jan 2024 01:31:37 +0330
Subject: [PATCH] Restructure (#51)

---
 .github/workflows/roadrunner-test.yml         |  10 +-
 .github/workflows/swoole-test.yml             |  10 +-
 Dockerfile.RoadRunner                         | 205 ++++++++++++++++++
 Dockerfile => Dockerfile.Swoole               |  64 ++----
 README.md                                     |  66 +++---
 .../octane/{ => RoadRunner}/.rr.prod.yaml     |   0
 .../supervisord.roadrunner.conf}              |   8 +-
 .../supervisord.swoole.conf}                  |   8 +-
 deployment/{octane => }/php.ini               |   0
 deployment/{octane => }/start-container       |  15 +-
 .../{octane => }/supervisord.horizon.conf     |   0
 deployment/supervisord.scheduler.conf         |  27 +++
 deployment/{octane => }/utilities.sh          |   0
 13 files changed, 301 insertions(+), 112 deletions(-)
 create mode 100644 Dockerfile.RoadRunner
 rename Dockerfile => Dockerfile.Swoole (71%)
 rename deployment/octane/{ => RoadRunner}/.rr.prod.yaml (100%)
 rename deployment/octane/{supervisord.app.roadrunner.conf => RoadRunner/supervisord.roadrunner.conf} (83%)
 rename deployment/octane/{supervisord.app.conf => Swoole/supervisord.swoole.conf} (85%)
 rename deployment/{octane => }/php.ini (100%)
 rename deployment/{octane => }/start-container (73%)
 rename deployment/{octane => }/supervisord.horizon.conf (100%)
 create mode 100644 deployment/supervisord.scheduler.conf
 rename deployment/{octane => }/utilities.sh (100%)

diff --git a/.github/workflows/roadrunner-test.yml b/.github/workflows/roadrunner-test.yml
index b7e0178..49b8812 100644
--- a/.github/workflows/roadrunner-test.yml
+++ b/.github/workflows/roadrunner-test.yml
@@ -60,18 +60,18 @@ jobs:
         working-directory: /var/www/app
 
       - name: Copy required content to dockerize the app
-        run: sudo cp -R Dockerfile .dockerignore deployment/ /var/www/app/
+        run: sudo cp -R Dockerfile.RoadRunner .dockerignore deployment/ /var/www/app/
 
       - name: Build image
-        run: docker build --build-arg OCTANE_SERVER=roadrunner -t app:local -f Dockerfile .
+        run: docker build -t app:local -f Dockerfile.RoadRunner .
         working-directory: /var/www/app
 
-      - name: Run the Docker image
-        run: docker run -d --rm -p 9000:9000 app:local
+      - name: Run the Docker container
+        run: docker run -d --rm -p 80:80 app:local
         working-directory: /var/www/app
 
       - name: Wait for the container
         run: sleep 10s
 
       - name: Check application health
-        run: curl -f -s -o /dev/null -w "%{http_code}" http://localhost:9000
+        run: curl -f -s -o /dev/null -w "%{http_code}" http://localhost
diff --git a/.github/workflows/swoole-test.yml b/.github/workflows/swoole-test.yml
index 61a64c3..e18eb2e 100644
--- a/.github/workflows/swoole-test.yml
+++ b/.github/workflows/swoole-test.yml
@@ -60,18 +60,18 @@ jobs:
         working-directory: /var/www/app
 
       - name: Copy required content to dockerize the app
-        run: sudo cp -R Dockerfile .dockerignore deployment/ /var/www/app/
+        run: sudo cp -R Dockerfile.Swoole .dockerignore deployment/ /var/www/app/
 
       - name: Build image
-        run: docker build -t app:local -f Dockerfile .
+        run: docker build -t app:local -f Dockerfile.Swoole .
         working-directory: /var/www/app
 
-      - name: Run the Docker image
-        run: docker run -d --rm -p 9000:9000 app:local
+      - name: Run the Docker container
+        run: docker run -d --rm -p 80:80 app:local
         working-directory: /var/www/app
 
       - name: Wait for the container
         run: sleep 10s
 
       - name: Check application health
-        run: curl -f -s -o /dev/null -w "%{http_code}" http://localhost:9000
+        run: curl -f -s -o /dev/null -w "%{http_code}" http://localhost
diff --git a/Dockerfile.RoadRunner b/Dockerfile.RoadRunner
new file mode 100644
index 0000000..604c331
--- /dev/null
+++ b/Dockerfile.RoadRunner
@@ -0,0 +1,205 @@
+# Accepted values: 8.2 - 8.1
+ARG PHP_VERSION=8.2
+
+ARG COMPOSER_VERSION=latest
+
+###########################################
+# Build frontend assets with NPM
+###########################################
+
+ARG NODE_VERSION=20-alpine
+
+FROM node:${NODE_VERSION} as build
+
+ENV ROOT=/var/www/html
+
+WORKDIR ${ROOT}
+
+RUN npm config set update-notifier false && npm set progress=false
+
+COPY package*.json ./
+
+RUN if [ -f $ROOT/package-lock.json ]; \
+  then \
+  npm ci --no-optional --loglevel=error --no-audit; \
+  else \
+  npm install --no-optional --loglevel=error --no-audit; \
+  fi
+
+COPY . .
+
+RUN npm run build
+
+###########################################
+
+FROM composer:${COMPOSER_VERSION} AS vendor
+
+FROM php:${PHP_VERSION}-cli-bookworm
+
+LABEL maintainer="Seyed Morteza Ebadi <seyed.me720@gmail.com>"
+
+ARG WWWUSER=1000
+ARG WWWGROUP=1000
+ARG TZ=UTC
+
+ENV DEBIAN_FRONTEND=noninteractive \
+  TERM=xterm-color \
+  WITH_HORIZON=false \
+  WITH_SCHEDULER=false \
+  OCTANE_SERVER=roadrunner \
+  NON_ROOT_USER=octane \
+  ROOT=/var/www/html
+
+WORKDIR ${ROOT}
+
+SHELL ["/bin/bash", "-eou", "pipefail", "-c"]
+
+RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
+  && echo ${TZ} > /etc/timezone
+
+RUN apt-get update; \
+  apt-get upgrade -yqq; \
+  pecl -q channel-update pecl.php.net; \
+  apt-get install -yqq --no-install-recommends --show-progress \
+  apt-utils \
+  gnupg \
+  git \
+  curl \
+  wget \
+  nano \
+  rsync \
+  ncdu \
+  sqlite3 \
+  libcurl4-openssl-dev \
+  ca-certificates \
+  supervisor \
+  libmemcached-dev \
+  libz-dev \
+  libbrotli-dev \
+  libpq-dev \
+  libjpeg-dev \
+  libpng-dev \
+  librsvg2-bin \
+  libfreetype6-dev \
+  libssl-dev \
+  libwebp-dev \
+  libmcrypt-dev \
+  libldap2-dev \
+  libonig-dev \
+  libmagickwand-dev \
+  libzip-dev zip unzip \
+  libargon2-1 \
+  libidn2-0 \
+  libpcre2-8-0 \
+  librdkafka-dev \
+  libpcre3 \
+  libxml2 \
+  libxslt-dev \
+  libzstd1 \
+  libc-ares-dev \
+  procps \
+  postgresql-client \
+  postgis \
+  default-mysql-client \
+  libbz2-dev \
+  zlib1g-dev \
+  libicu-dev \
+  g++ \
+  # Install PHP extensions
+  && docker-php-ext-install \
+  bz2 \
+  pcntl \
+  mbstring \
+  bcmath \
+  sockets \
+  pgsql \
+  pdo_pgsql \
+  opcache \
+  exif \
+  && docker-php-ext-configure pdo_mysql && docker-php-ext-install pdo_mysql \
+  && docker-php-ext-configure zip && docker-php-ext-install zip \
+  && docker-php-ext-configure intl && docker-php-ext-install intl \
+  && docker-php-ext-configure gd \
+  --prefix=/usr \
+  --with-jpeg \
+  --with-webp \
+  --with-freetype && docker-php-ext-install gd \
+  && pecl -q install -o -f redis && docker-php-ext-enable redis \
+  && pecl -q install -o -f imagick && docker-php-ext-enable imagick \
+  && pecl -q install -o -f rdkafka && docker-php-ext-enable rdkafka \
+  && pecl -q install -o -f memcached && docker-php-ext-enable memcached \
+  && pecl -q install -o -f igbinary && docker-php-ext-enable igbinary \
+  && docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine) && docker-php-ext-install ldap \
+  && apt-get -y autoremove \
+  && apt-get clean \
+  && docker-php-source delete \
+  && pecl clear-cache \
+  && rm -R /tmp/pear \
+  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
+  && rm /var/log/lastlog /var/log/faillog
+
+RUN wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64" \
+  -O /usr/bin/supercronic \
+  && chmod +x /usr/bin/supercronic \
+  && mkdir -p /etc/supercronic \
+  && echo "*/1 * * * * php ${ROOT}/artisan schedule:run --verbose --no-interaction" > /etc/supercronic/laravel
+
+RUN userdel --remove --force www-data \
+  && groupadd --force -g ${WWWGROUP} ${NON_ROOT_USER} \
+  && useradd -ms /bin/bash --no-log-init --no-user-group -g ${WWWGROUP} -u ${WWWUSER} ${NON_ROOT_USER}
+
+RUN chown -R ${NON_ROOT_USER}:${NON_ROOT_USER} ${ROOT} /var/{log,run}
+
+RUN chmod -R ug+rw /var/{log,run}
+
+USER ${NON_ROOT_USER}
+
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} --from=vendor /usr/bin/composer /usr/bin/composer
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} composer* ./
+
+RUN composer install \
+  --no-dev \
+  --no-interaction \
+  --no-autoloader \
+  --no-ansi \
+  --no-scripts \
+  --audit
+
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} . .
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} --from=build ${ROOT}/public public
+
+RUN mkdir -p \
+  storage/framework/{sessions,views,cache,testing} \
+  storage/logs \
+  bootstrap/cache
+
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/RoadRunner/supervisord.roadrunner.conf /etc/supervisor/conf.d
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/supervisord.scheduler.conf /etc/supervisor/conf.d/
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/supervisord.horizon.conf /etc/supervisor/conf.d/
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/php.ini /usr/local/etc/php/conf.d/99-octane.ini
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/RoadRunner/.rr.prod.yaml ./.rr.yaml
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/start-container /usr/local/bin/start-container
+
+RUN composer install \
+  --classmap-authoritative \
+  --no-interaction \
+  --no-ansi \
+  --no-dev \
+  && composer clear-cache \
+  && php artisan storage:link
+
+RUN if composer show | grep spiral/roadrunner-cli >/dev/null; then \
+  ./vendor/bin/rr get-binary; else \
+  echo "`spiral/roadrunner-cli` package is not installed. Exiting..."; exit 1; \
+  fi
+
+RUN chmod +x rr /usr/local/bin/start-container
+
+RUN cat deployment/utilities.sh >> ~/.bashrc
+
+EXPOSE 80
+EXPOSE 6001
+
+ENTRYPOINT ["start-container"]
+
+HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD php artisan octane:status || exit 1
diff --git a/Dockerfile b/Dockerfile.Swoole
similarity index 71%
rename from Dockerfile
rename to Dockerfile.Swoole
index b421336..d65ef1c 100644
--- a/Dockerfile
+++ b/Dockerfile.Swoole
@@ -42,24 +42,14 @@ ARG WWWUSER=1000
 ARG WWWGROUP=1000
 ARG TZ=UTC
 
-# Accepted values: swoole - roadrunner
-ARG OCTANE_SERVER="swoole"
-
-# Accepted values: app - horizon - scheduler
-ARG CONTAINER_MODE=app
-
-ARG APP_WITH_HORIZON=false
-ARG APP_WITH_SCHEDULER=false
-
 ENV DEBIAN_FRONTEND=noninteractive \
   TERM=xterm-color \
-  CONTAINER_MODE=${CONTAINER_MODE} \
-  APP_WITH_HORIZON=${APP_WITH_HORIZON} \
-  APP_WITH_SCHEDULER=${APP_WITH_SCHEDULER} \
-  OCTANE_SERVER=${OCTANE_SERVER} \
-  NON_ROOT_USER=octane
+  WITH_HORIZON=false \
+  WITH_SCHEDULER=false \
+  OCTANE_SERVER=swoole \
+  NON_ROOT_USER=octane \
+  ROOT=/var/www/html
 
-ENV ROOT=/var/www/html
 WORKDIR ${ROOT}
 
 SHELL ["/bin/bash", "-eou", "pipefail", "-c"]
@@ -78,6 +68,7 @@ RUN apt-get update; \
   wget \
   nano \
   rsync \
+  ncdu \
   sqlite3 \
   libcurl4-openssl-dev \
   ca-certificates \
@@ -138,11 +129,8 @@ RUN apt-get update; \
   && pecl -q install -o -f rdkafka && docker-php-ext-enable rdkafka \
   && pecl -q install -o -f memcached && docker-php-ext-enable memcached \
   && pecl -q install -o -f igbinary && docker-php-ext-enable igbinary \
+  && pecl -q install -o -f swoole && docker-php-ext-enable swoole \
   && docker-php-ext-configure ldap --with-libdir=lib/$(gcc -dumpmachine) && docker-php-ext-install ldap \
-  && if [ ${OCTANE_SERVER} = "swoole" ]; then \
-  printf "\n" | pecl -q install -o -f -D 'enable-openssl="yes" enable-http2="yes" enable-swoole-curl="yes" enable-mysqlnd="yes" enable-cares="yes"' swoole \
-  && docker-php-ext-enable swoole; \
-  fi \
   && apt-get -y autoremove \
   && apt-get clean \
   && docker-php-source delete \
@@ -151,20 +139,11 @@ RUN apt-get update; \
   && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
   && rm /var/log/lastlog /var/log/faillog
 
-
-###########################################
-# Laravel scheduler
-###########################################
-
-RUN if [ ${CONTAINER_MODE} = 'scheduler' ] || [ ${APP_WITH_SCHEDULER} = true ]; then \
-  wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.26/supercronic-linux-amd64" \
+RUN wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64" \
   -O /usr/bin/supercronic \
   && chmod +x /usr/bin/supercronic \
   && mkdir -p /etc/supercronic \
-  && echo "*/1 * * * * php ${ROOT}/artisan schedule:run --verbose --no-interaction" > /etc/supercronic/laravel; \
-  fi
-
-###########################################
+  && echo "*/1 * * * * php ${ROOT}/artisan schedule:run --verbose --no-interaction" > /etc/supercronic/laravel
 
 RUN userdel --remove --force www-data \
   && groupadd --force -g ${WWWGROUP} ${NON_ROOT_USER} \
@@ -195,10 +174,11 @@ RUN mkdir -p \
   storage/logs \
   bootstrap/cache
 
-COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/supervisord* /etc/supervisor/conf.d/
-COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/php.ini /usr/local/etc/php/conf.d/99-octane.ini
-COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/.rr.prod.yaml ./.rr.yaml
-COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/start-container /usr/local/bin/start-container
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/octane/Swoole/supervisord.swoole.conf /etc/supervisor/conf.d/
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/supervisord.scheduler.conf /etc/supervisor/conf.d/
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/supervisord.horizon.conf /etc/supervisor/conf.d/
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/php.ini /usr/local/etc/php/conf.d/99-octane.ini
+COPY --chown=${NON_ROOT_USER}:${NON_ROOT_USER} deployment/start-container /usr/local/bin/start-container
 
 RUN composer install \
   --classmap-authoritative \
@@ -208,23 +188,11 @@ RUN composer install \
   && composer clear-cache \
   && php artisan storage:link
 
-RUN if [ ${OCTANE_SERVER} = "roadrunner" ]; then \
-  if composer show | grep spiral/roadrunner-cli >/dev/null; then \
-  ./vendor/bin/rr get-binary; else \
-  echo "spiral/roadrunner-cli package is not installed. exiting..."; exit 1; \
-  fi \
-  fi
-
-RUN if [ -f "rr" ]; then \
-  chmod +x rr; \
-  fi
-
 RUN chmod +x /usr/local/bin/start-container
 
-RUN cat deployment/octane/utilities.sh >> ~/.bashrc
+RUN cat deployment/utilities.sh >> ~/.bashrc
 
-EXPOSE 9000
-EXPOSE 6001
+EXPOSE 80
 
 ENTRYPOINT ["start-container"]
 
diff --git a/README.md b/README.md
index 82b5d00..7d5a3f2 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,10 @@
 # Laravel Octane Dockerfile
 <a href="/LICENSE"><img alt="License" src="https://img.shields.io/github/license/exaco/laravel-octane-dockerfile"></a>
 <a href="https://github.com/exaco/laravel-octane-dockerfile/releases"><img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/exaco/laravel-octane-dockerfile"></a>
-<a href="https://github.com/exaco/laravel-octane-dockerfile/pulls"><img alt="GitHub closed pull requests" src="https://img.shields.io/github/issues-pr-closed/exaco/laravel-octane-dockerfile"></a> <a href="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/tests.yml"><img alt="GitHub Workflow Status" src="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/roadrunner-test.yml/badge.svg"></a> <a href="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/tests.yml"><img alt="GitHub Workflow Status" src="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/swoole-test.yml/badge.svg"></a>
+<a href="https://github.com/exaco/laravel-octane-dockerfile/pulls"><img alt="GitHub closed pull requests" src="https://img.shields.io/github/issues-pr-closed/exaco/laravel-octane-dockerfile"></a>
+<a href="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/tests.yml"><img alt="GitHub Workflow Status" src="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/roadrunner-test.yml/badge.svg"></a>
+<a href="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/tests.yml"><img alt="GitHub Workflow Status" src="https://github.com/exaco/laravel-octane-dockerfile/actions/workflows/swoole-test.yml/badge.svg"></a>
+
 
 A pretty configurable, production-ready, and multi-stage Dockerfile for [Laravel Octane](https://github.com/laravel/octane)
 powered web services and microservices.
@@ -13,20 +16,17 @@ The Docker configuration provides the following setup:
 
 ## Container modes
 
-You can build the Docker image in different modes:
-
-| Mode             | `CONTAINER_MODE` ARG | HTTP server | Exposed port |
-|------------------|----------------------|------------| ------------|
-| Octane (default) | `app`                | Swoole / RoadRunner | 9000 |
-| Horizon          | `horizon`            | - | - |
-| Scheduler        | `scheduler`          | - | - |
+You can run the Docker container in different modes:
 
-> If you want to run Horizon in the Octane container, then you should set `APP_WITH_HORIZON` build argument `true`.
-
-> If you want to run Scheduler in the Octane container, then you should set `APP_WITH_SCHEDULER` build argument `true`.
+| Mode             | `CONTAINER_MODE` | HTTP server |
+|------------------|----------------------|------------|
+| Octane (default) | `http`                | Swoole / RoadRunner |
+| Horizon          | `horizon`            | - |
+| Scheduler        | `scheduler`          | - |
 
 ## Usage
 
+### Building Docker image
 1. Clone this repository:
 ```
 git clone --depth 1 git@github.com:exaco/laravel-octane-dockerfile.git
@@ -34,42 +34,31 @@ git clone --depth 1 git@github.com:exaco/laravel-octane-dockerfile.git
 2. Copy cloned directory content including `deployment` directory, `Dockerfile`, and `.dockerignore` into your Octane powered Laravel project
 3. Change the directory to your Laravel project
 4. Build your image:
-
-- Container `app` mode:
-```
-docker build -t <image-name>:<tag> .
-```
-- Container `horizon` mode:
-```
-docker build -t <image-name>:<tag> --build-arg CONTAINER_MODE=horizon .
-```
-- Container `scheduler` mode:
 ```
-docker build -t <image-name>:<tag> --build-arg CONTAINER_MODE=scheduler .
-```
-5. Up the container:
-```
-docker run -p <port>:9000 --rm <image-name>:<tag>
+docker build -t <image-name>:<tag> -f Dockerfile.<your-octane-driver> .
 ```
+### Running the Docker container
 
-## Configuration
+```bash
+# http mode
+docker run -p <port>:9000 --rm <image-name>:<tag>
 
-There is something that you maybe want to configure:
+# horizon mode
+docker run -e CONTAINER_MODE=horizon -p <port>:9000 --rm <image-name>:<tag>
 
-- Swoole HTTP server config in `supervisord.app.conf`
-- PHP configurations in `php.ini`
-- `ENTRYPOINT` Bash script in `entrypoint.sh`
-- Set `PHP_VERSION` using the `--build-arg` option along with the build command
-- Set `TZ` (OS timezone) using the `--build-arg` option along with the build command
+# scheduler mode
+docker run -e CONTAINER_MODE=scheduler -p <port>:9000 --rm <image-name>:<tag>
 
-## Using RoadRunner instead of Swoole
+# http mode with horizon
+docker run -e WITH_HORIZON=true -p <port>:9000 --rm <image-name>:<tag>
 
-1. Ensure you have roadrunner as a dependency in your `composer.json`
-2. Set `OCTANE_SERVER=roadrunner` using the `--build-arg` option along with the build command
+# http mode with scheduler
+docker run -e WITH_SCHEDULER=true -p <port>:9000 --rm <image-name>:<tag>
+```
 
-> You can configure RoadRunner through `deployment/octane/.rr.prod.yaml`.
+## Configuration
 
-## Recommended Swoole options for `octane.php`
+### Recommended `Swoole` options in `octane.php`
 
 ```php
 // config/octane.php
@@ -99,6 +88,7 @@ Also, some useful Bash functions and aliases are added in `utilities.sh` that ma
 - Please be aware of `.dockerignore` content
 
 ## ToDo
+- [ ] Add support for PHP 8.3
 - [x] Add support for Horizon
 - [x] Add support for RoadRunner
 - [ ] Add support for FrankenPHP
diff --git a/deployment/octane/.rr.prod.yaml b/deployment/octane/RoadRunner/.rr.prod.yaml
similarity index 100%
rename from deployment/octane/.rr.prod.yaml
rename to deployment/octane/RoadRunner/.rr.prod.yaml
diff --git a/deployment/octane/supervisord.app.roadrunner.conf b/deployment/octane/RoadRunner/supervisord.roadrunner.conf
similarity index 83%
rename from deployment/octane/supervisord.app.roadrunner.conf
rename to deployment/octane/RoadRunner/supervisord.roadrunner.conf
index 91fbf9f..8d9b6be 100644
--- a/deployment/octane/supervisord.app.roadrunner.conf
+++ b/deployment/octane/RoadRunner/supervisord.roadrunner.conf
@@ -6,7 +6,7 @@ pidfile=/var/run/supervisord.pid
 
 [program:octane]
 process_name=%(program_name)s_%(process_num)02d
-command=php /var/www/html/artisan octane:start --server=roadrunner --host=0.0.0.0 --port=9000 --rpc-port=6001 --workers=auto --max-requests=500 --rr-config=/var/www/html/.rr.yaml
+command=php /var/www/html/artisan octane:start --server=roadrunner --host=0.0.0.0 --port=80 --rpc-port=6001 --rr-config=/var/www/html/.rr.yaml
 user=%(ENV_NON_ROOT_USER)s
 autostart=true
 autorestart=true
@@ -20,7 +20,7 @@ stderr_logfile_maxbytes=0
 process_name=%(program_name)s_%(process_num)02d
 command=php /var/www/html/artisan horizon
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_HORIZON)s
+autostart=%(ENV_WITH_HORIZON)s
 autorestart=true
 stdout_logfile=/var/www/html/horizon.log
 stopwaitsecs=3600
@@ -29,7 +29,7 @@ stopwaitsecs=3600
 process_name=%(program_name)s_%(process_num)02d
 command=supercronic -overlapping /etc/supercronic/laravel
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_SCHEDULER)s
+autostart=%(ENV_WITH_SCHEDULER)s
 autorestart=true
 stdout_logfile=/var/www/html/scheduler.log
 
@@ -37,6 +37,6 @@ stdout_logfile=/var/www/html/scheduler.log
 process_name=%(program_name)s_%(process_num)02d
 command=php /var/www/html/artisan schedule:clear-cache
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_SCHEDULER)s
+autostart=%(ENV_WITH_SCHEDULER)s
 autorestart=false
 stdout_logfile=/var/www/html/scheduler.log
\ No newline at end of file
diff --git a/deployment/octane/supervisord.app.conf b/deployment/octane/Swoole/supervisord.swoole.conf
similarity index 85%
rename from deployment/octane/supervisord.app.conf
rename to deployment/octane/Swoole/supervisord.swoole.conf
index bfac954..a12c3d7 100644
--- a/deployment/octane/supervisord.app.conf
+++ b/deployment/octane/Swoole/supervisord.swoole.conf
@@ -6,7 +6,7 @@ pidfile=/var/run/supervisord.pid
 
 [program:octane]
 process_name=%(program_name)s_%(process_num)02d
-command=php /var/www/html/artisan octane:start --server=swoole --host=0.0.0.0 --port=9000 --workers=auto --task-workers=auto --max-requests=500
+command=php /var/www/html/artisan octane:start --server=swoole --host=0.0.0.0 --port=80
 user=%(ENV_NON_ROOT_USER)s
 autostart=true
 autorestart=true
@@ -20,7 +20,7 @@ stderr_logfile_maxbytes=0
 process_name=%(program_name)s_%(process_num)02d
 command=php /var/www/html/artisan horizon
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_HORIZON)s
+autostart=%(ENV_WITH_HORIZON)s
 autorestart=true
 stdout_logfile=/var/www/html/horizon.log
 stopwaitsecs=3600
@@ -29,7 +29,7 @@ stopwaitsecs=3600
 process_name=%(program_name)s_%(process_num)02d
 command=supercronic -overlapping /etc/supercronic/laravel
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_SCHEDULER)s
+autostart=%(ENV_WITH_SCHEDULER)s
 autorestart=true
 stdout_logfile=/var/www/html/scheduler.log
 
@@ -37,6 +37,6 @@ stdout_logfile=/var/www/html/scheduler.log
 process_name=%(program_name)s_%(process_num)02d
 command=php /var/www/html/artisan schedule:clear-cache
 user=%(ENV_NON_ROOT_USER)s
-autostart=%(ENV_APP_WITH_SCHEDULER)s
+autostart=%(ENV_WITH_SCHEDULER)s
 autorestart=false
 stdout_logfile=/var/www/html/scheduler.log
\ No newline at end of file
diff --git a/deployment/octane/php.ini b/deployment/php.ini
similarity index 100%
rename from deployment/octane/php.ini
rename to deployment/php.ini
diff --git a/deployment/octane/start-container b/deployment/start-container
similarity index 73%
rename from deployment/octane/start-container
rename to deployment/start-container
index 5180f4f..2f8b1a3 100644
--- a/deployment/octane/start-container
+++ b/deployment/start-container
@@ -1,8 +1,8 @@
 #!/usr/bin/env bash
 set -e
 
-container_mode=${CONTAINER_MODE:-app}
-octane_server=${OCTANE_SERVER:-swoole}
+container_mode=${CONTAINER_MODE:-http}
+octane_server=${OCTANE_SERVER}
 echo "Container mode: $container_mode"
 
 initialStuff() {
@@ -14,13 +14,13 @@ initialStuff() {
 
 if [ "$1" != "" ]; then
     exec "$@"
-elif [ ${container_mode} = "app" ]; then
-    echo "Octane server: $octane_server"
+elif [ ${container_mode} = "http" ]; then
+    echo "Octane Server: $octane_server"
     initialStuff
     if [ ${octane_server}  = "swoole" ]; then
-        exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.app.conf
+        exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.swoole.conf
     elif [ ${octane_server}  = "roadrunner" ]; then
-        exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.app.roadrunner.conf
+        exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.roadrunner.conf
     else
         echo "Invalid Octane server supplied."
         exit 1
@@ -30,8 +30,7 @@ elif [ ${container_mode} = "horizon" ]; then
     exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.horizon.conf
 elif [ ${container_mode} = "scheduler" ]; then
     initialStuff
-    php artisan schedule:clear-cache
-    exec supercronic -overlapping /etc/supercronic/laravel
+    exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.scheduler.conf
 else
     echo "Container mode mismatched."
     exit 1
diff --git a/deployment/octane/supervisord.horizon.conf b/deployment/supervisord.horizon.conf
similarity index 100%
rename from deployment/octane/supervisord.horizon.conf
rename to deployment/supervisord.horizon.conf
diff --git a/deployment/supervisord.scheduler.conf b/deployment/supervisord.scheduler.conf
new file mode 100644
index 0000000..3836217
--- /dev/null
+++ b/deployment/supervisord.scheduler.conf
@@ -0,0 +1,27 @@
+[supervisord]
+nodaemon=true
+user=%(ENV_NON_ROOT_USER)s
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:scheduler]
+process_name=%(program_name)s_%(process_num)02d
+command=supercronic -overlapping /etc/supercronic/laravel
+user=%(ENV_NON_ROOT_USER)s
+autostart=%(ENV_WITH_SCHEDULER)s
+autorestart=true
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
+
+[program:clear-scheduler-cache]
+process_name=%(program_name)s_%(process_num)02d
+command=php /var/www/html/artisan schedule:clear-cache
+user=%(ENV_NON_ROOT_USER)s
+autostart=%(ENV_WITH_SCHEDULER)s
+autorestart=false
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
\ No newline at end of file
diff --git a/deployment/octane/utilities.sh b/deployment/utilities.sh
similarity index 100%
rename from deployment/octane/utilities.sh
rename to deployment/utilities.sh