Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/app/public
/storage/debugbar
/storage/ssr
/storage/clockwork
/storage/logs
/storage/pail
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/vendor
.env.backup
/.idea/sonarlint
.phpstorm.meta.php
_ide_helper_models.php
_ide_helper.php
.php-cs-fixer.cache
.husky
/.vscode
**/.DS_Store
/public/page-cache
.phpunit.database.checksum
.phpunit.cache
rr
.rr.yaml
frankenphp
.config
.data
.git
26 changes: 15 additions & 11 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
APP_NAME=Laravel
APP_NAME=Eagle
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_DEBUG=false
APP_TIMEZONE=UTC
APP_URL=http://localhost

Expand All @@ -17,26 +17,26 @@ PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12

LOG_CHANNEL=stack
LOG_STACK=single
LOG_STACK=daily,errorlog
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=eagle
DB_USERNAME=root
DB_PASSWORD=
DB_CONNECTION=sqlite #mysql,pgsql
# DB_HOST=127.0.0.1
# DB_PORT=3306
DB_DATABASE=./storage/sqlite/eagle #eagle
# DB_USERNAME=root
# DB_PASSWORD=

SESSION_DRIVER=database
SESSION_DRIVER=database #redis
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null

BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
QUEUE_CONNECTION=database #redis

CACHE_STORE=database
CACHE_PREFIX=
Expand Down Expand Up @@ -72,3 +72,7 @@ AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

VITE_APP_NAME="${APP_NAME}"
DEBUGBAR_ENABLED=false

OCTANE_SERVER=swoole
OCTANE_HTTPS=false
175 changes: 175 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
ARG PHP_VERSION=8.3
ARG COMPOSER_VERSION=latest
ARG BUN_VERSION="latest"
ARG APP_ENV

FROM composer:${COMPOSER_VERSION} AS vendor

FROM php:${PHP_VERSION}-cli-alpine AS base

LABEL maintainer="Liam Seys <liam.seys@gmail.com>"
LABEL org.opencontainers.image.title="Eagle Dockerfile"
LABEL org.opencontainers.image.description="Dockerfile for eagle"
LABEL org.opencontainers.image.source=https://github.com/liamseys/eagle

ARG WWWUSER=1000
ARG WWWGROUP=1000
ARG TZ=UTC
ARG APP_ENV

ENV TERM=xterm-color \
WITH_HORIZON=false \
WITH_SCHEDULER=true \
WITH_WORKER=true \
OCTANE_SERVER=swoole \
TZ=${TZ} \
USER=octane \
APP_ENV=${APP_ENV} \
ROOT=/var/www/html \
COMPOSER_FUND=0 \
COMPOSER_MAX_PARALLEL_HTTP=24

WORKDIR ${ROOT}

SHELL ["/bin/sh", "-eou", "pipefail", "-c"]

RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone

ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN apk update; \
apk upgrade; \
apk add --no-cache \
curl \
wget \
tzdata \
git \
procps \
unzip \
ca-certificates \
supervisor \
libsodium-dev \
brotli \
# Install PHP extensions
&& install-php-extensions \
bz2 \
pcntl \
mbstring \
bcmath \
opcache \
exif \
zip \
intl \
gd \
openswoole \
&& docker-php-source delete \
&& rm -rf /var/cache/apk/* /tmp/* /var/tmp/*

RUN arch="$(apk --print-arch)" \
&& case "$arch" in \
armhf) _cronic_fname='supercronic-linux-arm' ;; \
aarch64) _cronic_fname='supercronic-linux-arm64' ;; \
x86_64) _cronic_fname='supercronic-linux-amd64' ;; \
x86) _cronic_fname='supercronic-linux-386' ;; \
*) echo >&2 "error: unsupported architecture: $arch"; exit 1 ;; \
esac \
&& wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.33/${_cronic_fname}" \
-O /usr/bin/supercronic \
&& chmod +x /usr/bin/supercronic \
&& mkdir -p /etc/supercronic \
&& echo "*/1 * * * * php ${ROOT}/artisan schedule:run --no-interaction" > /etc/supercronic/laravel

RUN addgroup -g ${WWWGROUP} ${USER} \
&& adduser -D -h ${ROOT} -G ${USER} -u ${WWWUSER} -s /bin/sh ${USER}

RUN mkdir -p /var/log/supervisor /var/run/supervisor \
&& chown -R ${USER}:${USER} ${ROOT} /var/log /var/run \
&& chmod -R a+rw ${ROOT} /var/log /var/run

RUN cp ${PHP_INI_DIR}/php.ini-production ${PHP_INI_DIR}/php.ini

USER ${USER}

COPY --link --chown=${WWWUSER}:${WWWUSER} --from=vendor /usr/bin/composer /usr/bin/composer

COPY --link --chown=${WWWUSER}:${WWWUSER} docker/supervisord.conf /etc/
COPY --link --chown=${WWWUSER}:${WWWUSER} docker/supervisord.swoole.conf /etc/supervisor/conf.d/
COPY --link --chown=${WWWUSER}:${WWWUSER} docker/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
COPY --link --chown=${WWWUSER}:${WWWUSER} docker/start-container /usr/local/bin/start-container
COPY --link --chown=${WWWUSER}:${WWWUSER} docker/healthcheck /usr/local/bin/healthcheck

RUN chmod +x /usr/local/bin/start-container /usr/local/bin/healthcheck

###########################################

FROM base AS common

USER ${USER}

COPY --link --chown=${WWWUSER}:${WWWUSER} . .

RUN composer install \
--no-dev \
--no-interaction \
--no-autoloader \
--no-ansi \
--no-scripts \
--audit

###########################################
# Build frontend assets with Bun
###########################################

FROM oven/bun:${BUN_VERSION} AS build

ARG APP_ENV

ENV ROOT=/var/www/html \
APP_ENV=${APP_ENV} \
NODE_ENV=${APP_ENV:-production}

WORKDIR ${ROOT}

COPY --link package.json bun.lock* ./

RUN bun install --frozen-lockfile

COPY --link . .
COPY --link --from=common ${ROOT}/vendor vendor

RUN bun run build

###########################################

FROM common AS runner

USER ${USER}

ENV WITH_HORIZON=false \
WITH_SCHEDULER=true \
WITH_WORKER=true

COPY --link --chown=${WWWUSER}:${WWWUSER} . .
COPY --link --chown=${WWWUSER}:${WWWUSER} --from=build ${ROOT}/public public

RUN mkdir -p \
storage/framework/sessions \
storage/framework/views \
storage/framework/cache \
storage/framework/testing \
storage/logs \
bootstrap/cache && chmod -R a+rw storage

RUN composer install \
--classmap-authoritative \
--no-interaction \
--no-ansi \
--no-dev \
&& composer clear-cache

EXPOSE 8000

ENTRYPOINT ["start-container"]

HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD healthcheck || exit 1
45 changes: 45 additions & 0 deletions app/Providers/HorizonServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Laravel\Horizon\Horizon;
use Laravel\Horizon\HorizonApplicationServiceProvider;

class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
parent::boot();

// Horizon::routeSmsNotificationsTo('15556667777');
// Horizon::routeMailNotificationsTo('example@example.com');
// Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
}

/**
* Register the Horizon gate.
*
* This gate determines who can access Horizon in non-local environments.
*/
protected function gate(): void
{
Gate::define('viewHorizon', function ($user) {
return in_array($user->email, [
//
]);
});
}

protected function authorization(): void
{
$this->gate();

Horizon::auth(function ($request) {
return Gate::check('viewHorizon', [$request->user()]);
});
}
}
1 change: 1 addition & 0 deletions bootstrap/providers.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
App\Providers\AppServiceProvider::class,
App\Providers\Filament\AppPanelProvider::class,
App\Providers\Filament\ClientPanelProvider::class,
App\Providers\HorizonServiceProvider::class,
];
Loading