Skip to content

Commit 7b46780

Browse files
committed
Moved from swoole to frankenphp
1 parent 2e8b088 commit 7b46780

18 files changed

+364
-226
lines changed

.env.production

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ APP_ENV=production
44
APP_DEBUG=false
55
APP_FORCE_HTTPS=true
66
SESSION_SECURE_COOKIE=true
7-
OCTANE_SERVER=swoole
7+
OCTANE_SERVER=frankenphp
88
PAGINATION_PER_PAGE_DEFAULT=500
99

1010
LOG_CHANNEL=stack

.github/workflows/build-private.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
uses: shivammathur/setup-php@v2
7070
with:
7171
php-version: '8.3'
72-
extensions: mbstring, dom, fileinfo, pgsql, swoole
72+
extensions: mbstring, dom, fileinfo, pgsql
7373

7474
- name: "Install dependencies"
7575
uses: php-actions/composer@v6
@@ -119,6 +119,8 @@ jobs:
119119
uses: docker/build-push-action@v6
120120
with:
121121
context: .
122+
build-args: |
123+
DOCKER_FILES_BASE_PATH=docker/prod/
122124
file: docker/prod/Dockerfile
123125
push: true
124126
tags: ${{ steps.meta.outputs.tags }}

.github/workflows/build-public.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ jobs:
6666
with:
6767
context: .
6868
file: docker/prod/Dockerfile
69+
build-args: |
70+
DOCKER_FILES_BASE_PATH=docker/prod/
6971
platforms: linux/amd64
7072
push: true
7173
tags: ${{ steps.meta.outputs.tags }}

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,9 @@ yarn-error.log
3434
/_ide_helper.php
3535
/.phpstorm.meta.php
3636
/.rnd
37+
38+
/caddy
39+
/frankenphp
40+
/public/frankenphp-worker.php
41+
/data
42+
/confif/caddy

config/octane.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
use Laravel\Octane\Events\WorkerStarting;
1515
use Laravel\Octane\Events\WorkerStopping;
1616
use Laravel\Octane\Listeners\CloseMonologHandlers;
17+
use Laravel\Octane\Listeners\CollectGarbage;
18+
use Laravel\Octane\Listeners\DisconnectFromDatabases;
1719
use Laravel\Octane\Listeners\EnsureUploadedFilesAreValid;
1820
use Laravel\Octane\Listeners\EnsureUploadedFilesCanBeMoved;
1921
use Laravel\Octane\Listeners\FlushOnce;
2022
use Laravel\Octane\Listeners\FlushTemporaryContainerInstances;
23+
use Laravel\Octane\Listeners\FlushUploadedFiles;
2124
use Laravel\Octane\Listeners\ReportException;
2225
use Laravel\Octane\Listeners\StopWorkerIfNecessary;
2326
use Laravel\Octane\Octane;
@@ -37,7 +40,7 @@
3740
|
3841
*/
3942

40-
'server' => env('OCTANE_SERVER', 'swoole'),
43+
'server' => env('OCTANE_SERVER', 'frankenphp'),
4144

4245
/*
4346
|--------------------------------------------------------------------------

docker-compose.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ services:
2828
extra_hosts:
2929
- 'host.docker.internal:host-gateway'
3030
environment:
31-
SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=swoole --watch --host=0.0.0.0 --port=80"
31+
SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=frankenphp --host=0.0.0.0 --admin-port=2019 --port=80 --watch"
32+
XDG_CONFIG_HOME: /var/www/html/config
33+
XDG_DATA_HOME: /var/www/html/data
3234
WWWUSER: '${WWWUSER}'
3335
LARAVEL_SAIL: 1
3436
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'

docker/prod/Dockerfile

Lines changed: 129 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,178 @@
11
# Accepted values: 8.3 - 8.2
22
ARG PHP_VERSION=8.3
33

4-
ARG DOCKER_FILES_BASE_PATH="docker/prod"
4+
ARG FRANKENPHP_VERSION=latest
55

66
ARG COMPOSER_VERSION=latest
77

8+
ARG DOCKER_FILES_BASE_PATH="docker/prod/"
9+
10+
###########################################
11+
# Build frontend assets with NPM
12+
###########################################
13+
14+
#ARG NODE_VERSION=20-alpine
15+
#
16+
#FROM node:${NODE_VERSION} AS build
17+
#
18+
#ENV ROOT=/var/www/html
19+
#
20+
#WORKDIR ${ROOT}
21+
#
22+
#RUN npm config set update-notifier false && npm set progress=false
23+
#
24+
#COPY package*.json ./
25+
#
26+
#RUN if [ -f $ROOT/package-lock.json ]; \
27+
# then \
28+
# npm ci --loglevel=error --no-audit; \
29+
# else \
30+
# npm install --loglevel=error --no-audit; \
31+
# fi
32+
#
33+
#COPY . .
34+
#
35+
#RUN npm run build
36+
837
###########################################
938

1039
FROM composer:${COMPOSER_VERSION} AS vendor
1140

12-
FROM php:${PHP_VERSION}-cli-bookworm AS base
41+
FROM dunglas/frankenphp:${FRANKENPHP_VERSION}-php${PHP_VERSION}
42+
43+
ARG DOCKER_FILES_BASE_PATH
1344

1445
LABEL maintainer="solidtime <hello@solidtime.io>"
1546
LABEL org.opencontainers.image.title="solidtime"
16-
LABEL org.opencontainers.image.description="solidtime is a modern open source timetracker for Freelancers and Agencies"
47+
LABEL org.opencontainers.image.description="solidtime is a modern open source timetracker for freelancers and agencies"
1748
LABEL org.opencontainers.image.source="https://github.com/solidtime-io/solidtime"
1849
LABEL org.opencontainers.image.licenses="AGPL"
1950

2051
ARG WWWUSER=1000
2152
ARG WWWGROUP=1000
2253
ARG TZ=UTC
54+
ARG APP_DIR=/var/www/html
2355

2456
ENV DEBIAN_FRONTEND=noninteractive \
25-
TERM=xterm-color \
26-
WITH_HORIZON=false \
27-
WITH_SCHEDULER=false \
28-
OCTANE_SERVER=swoole \
29-
USER=octane \
30-
ROOT=/var/www/html \
31-
COMPOSER_FUND=0 \
32-
COMPOSER_MAX_PARALLEL_HTTP=24
57+
TERM=xterm-color \
58+
WITH_HORIZON=false \
59+
WITH_SCHEDULER=false \
60+
OCTANE_SERVER=frankenphp \
61+
USER=octane \
62+
ROOT=${APP_DIR} \
63+
COMPOSER_FUND=0 \
64+
COMPOSER_MAX_PARALLEL_HTTP=24 \
65+
XDG_CONFIG_HOME=${APP_DIR}/.config \
66+
XDG_DATA_HOME=${APP_DIR}/.data
3367

3468
WORKDIR ${ROOT}
3569

3670
SHELL ["/bin/bash", "-eou", "pipefail", "-c"]
3771

3872
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
39-
&& echo ${TZ} > /etc/timezone
40-
41-
ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
73+
&& echo ${TZ} > /etc/timezone
4274

4375
RUN apt-get update; \
44-
apt-get upgrade -yqq; \
45-
apt-get install -yqq --no-install-recommends --show-progress \
46-
apt-utils \
47-
curl \
48-
wget \
49-
nano \
50-
ncdu \
51-
ca-certificates \
52-
supervisor \
53-
libsodium-dev \
54-
# Install PHP extensions
55-
&& install-php-extensions \
56-
bz2 \
57-
pcntl \
58-
mbstring \
59-
bcmath \
60-
sockets \
61-
pgsql \
62-
pdo_pgsql \
63-
opcache \
64-
exif \
65-
pdo_mysql \
66-
zip \
67-
intl \
68-
gd \
69-
redis \
70-
rdkafka \
71-
memcached \
72-
igbinary \
73-
ldap \
74-
swoole \
75-
&& apt-get -y autoremove \
76-
&& apt-get clean \
77-
&& docker-php-source delete \
78-
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
79-
&& rm /var/log/lastlog /var/log/faillog
80-
81-
RUN wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64" \
82-
-O /usr/bin/supercronic \
83-
&& chmod +x /usr/bin/supercronic \
84-
&& mkdir -p /etc/supercronic \
85-
&& echo "*/1 * * * * php ${ROOT}/artisan schedule:run --verbose --no-interaction" > /etc/supercronic/laravel
76+
apt-get upgrade -yqq; \
77+
apt-get install -yqq --no-install-recommends --show-progress \
78+
apt-utils \
79+
curl \
80+
wget \
81+
nano \
82+
ncdu \
83+
procps \
84+
ca-certificates \
85+
supervisor \
86+
libsodium-dev \
87+
# Install PHP extensions (included with dunglas/frankenphp)
88+
&& install-php-extensions \
89+
bz2 \
90+
pcntl \
91+
mbstring \
92+
bcmath \
93+
sockets \
94+
pgsql \
95+
pdo_pgsql \
96+
opcache \
97+
exif \
98+
pdo_mysql \
99+
zip \
100+
intl \
101+
gd \
102+
redis \
103+
rdkafka \
104+
memcached \
105+
igbinary \
106+
ldap \
107+
&& apt-get -y autoremove \
108+
&& apt-get clean \
109+
&& docker-php-source delete \
110+
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
111+
&& rm /var/log/lastlog /var/log/faillog
112+
113+
RUN arch="$(uname -m)" \
114+
&& case "$arch" in \
115+
armhf) _cronic_fname='supercronic-linux-arm' ;; \
116+
aarch64) _cronic_fname='supercronic-linux-arm64' ;; \
117+
x86_64) _cronic_fname='supercronic-linux-amd64' ;; \
118+
x86) _cronic_fname='supercronic-linux-386' ;; \
119+
*) echo >&2 "error: unsupported architecture: $arch"; exit 1 ;; \
120+
esac \
121+
&& wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.29/${_cronic_fname}" \
122+
-O /usr/bin/supercronic \
123+
&& chmod +x /usr/bin/supercronic \
124+
&& mkdir -p /etc/supercronic \
125+
&& echo "*/1 * * * * php ${ROOT}/artisan schedule:run --no-interaction" > /etc/supercronic/laravel
86126

87127
RUN userdel --remove --force www-data \
88-
&& groupadd --force -g ${WWWGROUP} ${USER} \
89-
&& useradd -ms /bin/bash --no-log-init --no-user-group -g ${WWWGROUP} -u ${WWWUSER} ${USER}
128+
&& groupadd --force -g ${WWWGROUP} ${USER} \
129+
&& useradd -ms /bin/bash --no-log-init --no-user-group -g ${WWWGROUP} -u ${WWWUSER} ${USER}
90130

91131
RUN chown -R ${USER}:${USER} ${ROOT} /var/{log,run} \
92-
&& chmod -R a+rw /var/{log,run}
132+
&& chmod -R a+rw ${ROOT} /var/{log,run}
93133

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

96136
USER ${USER}
97137

98138
COPY --chown=${USER}:${USER} --from=vendor /usr/bin/composer /usr/bin/composer
139+
#COPY --chown=${USER}:${USER} composer.json composer.lock ./
140+
#
141+
#RUN composer install \
142+
# --no-dev \
143+
# --no-interaction \
144+
# --no-autoloader \
145+
# --no-ansi \
146+
# --no-scripts \
147+
# --audit
99148

100149
COPY --chown=${USER}:${USER} . .
150+
#COPY --chown=${USER}:${USER} --from=build ${ROOT}/public public
101151

102152
RUN mkdir -p \
103-
storage/framework/{sessions,views,cache,testing} \
104-
storage/logs \
105-
bootstrap/cache && chmod -R a+rw storage
106-
107-
COPY --chown=${USER}:${USER} docker/prod/deployment/supervisord.*.conf /etc/supervisor/conf.d/
108-
COPY --chown=${USER}:${USER} docker/prod/deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
109-
COPY --chown=${USER}:${USER} docker/prod/deployment/start-container /usr/local/bin/start-container
110-
111-
RUN cat .env
112-
RUN php artisan env
113-
RUN php artisan storage:link
153+
storage/framework/{sessions,views,cache,testing} \
154+
storage/logs \
155+
bootstrap/cache && chmod -R a+rw storage
156+
157+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/supervisord.conf /etc/supervisor/
158+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/octane/FrankenPHP/supervisord.frankenphp.conf /etc/supervisor/conf.d/
159+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/supervisord.*.conf /etc/supervisor/conf.d/
160+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/start-container /usr/local/bin/start-container
161+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
162+
163+
# FrankenPHP embedded PHP configuration
164+
COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/php.ini /lib/php.ini
165+
166+
#RUN composer install \
167+
# --classmap-authoritative \
168+
# --no-interaction \
169+
# --no-ansi \
170+
# --no-dev \
171+
# && composer clear-cache
114172

115173
RUN chmod +x /usr/local/bin/start-container
116174

117-
RUN cat docker/prod/deployment/utilities.sh >> ~/.bashrc
175+
RUN cat ${DOCKER_FILES_BASE_PATH}deployment/utilities.sh >> ~/.bashrc
118176

119177
EXPOSE 8000
120178

0 commit comments

Comments
 (0)