dunglas / frankenphp

🧟 The modern PHP app server
https://frankenphp.dev
MIT License
6.67k stars 220 forks source link

Question: how to build a standalone frankenphp binary with Caddy cache-handler #982

Open laurent-bientz opened 3 weeks ago

laurent-bientz commented 3 weeks ago

Hello,

On production we're currently using the frankenphp standalone binaries with the Api Platform distribution.

Unfortunately (see https://github.com/dunglas/frankenphp/issues/956#issuecomment-2271581693), there is no frankenphp binaries distributed with HTTP cache into Caddy, no problem with that, @dunglas and @darkweak explained well why)

On local / development environment, we found a way to build a frankenphp binary with HTTP cache on Docker (thanks to xcaddy build, see https://github.com/dunglas/frankenphp/issues/976#issuecomment-2296049125)

FROM dunglas/frankenphp:latest-builder AS builder
COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy

RUN apt-get update && apt-get install --no-install-recommends -y \
    git

ENV CGO_ENABLED=1 XCADDY_SETCAP=1 XCADDY_GO_BUILD_FLAGS="-ldflags \"-w -s -extldflags '-Wl,-z,stack-size=0x80000'\""
RUN xcaddy build \
    --output /usr/local/bin/frankenphp \
    --with github.com/dunglas/frankenphp=./ \
    --with github.com/dunglas/frankenphp/caddy=./caddy/ \
    --with github.com/dunglas/mercure/caddy \
    --with github.com/dunglas/vulcain/caddy \
    --with github.com/dunglas/caddy-cbrotli \
    --with github.com/darkweak/souin/plugins/caddy@65cb24114d76a7de3f4e8c7b8ef7df3efd028899 \
    --with github.com/darkweak/souin@65cb24114d76a7de3f4e8c7b8ef7df3efd028899 \
    --with github.com/darkweak/storages/otter/caddy

FROM dunglas/frankenphp:latest AS frankenphp_upstream
COPY --from=builder --link /usr/local/bin/frankenphp /usr/local/bin/frankenphp

It works well on the Symfony prod env under Docker but we're not using Docker on our production server 😁

Naively, I try to extract the binary built on Docker (docker cp {containerId}:/usr/local/bin/frankenphp frankenphp-http-cache), then transferring the executable on my production server (Ubuntu 20 LTS) and trying to use it 🙄

sudo +x frankenphp-http-cache
./frankenphp-http-cache -v
> ./frankenphp-http-cache: error while loading shared libraries: libphp.so: cannot open shared object file: No such file or directory

You'll tell me "it's not the same architecture, Debian versus Ubuntu, etc." and you're probably right 🙂

So my question is simple: how can I build and use a standalone frankenphp binary with HTTP cache packaged in the Caddy web server?

I read the chapter Create a Static Build in the doc but I see nothing to add extra caddy plugins (Souin) on the fly with the build-static.sh but maybe I'm wrong, I'm really new into the Go/Caddy ecosystems 😑

I also see these lines, I guess I can add (without much conviction) the Caddy plugins (darkweak/souin, darkweak/souin/plugins/caddy and darkweak/storages/otter/caddy) to this list and try to use the static-builder provided with the docker image?

If there is a a simpler method, any help would be welcome 👍

Thanks a lot

laurent-bientz commented 3 weeks ago

Note that I tried to use the build-static.sh without changing anything:

git clone https://github.com/dunglas/frankenphp
cd frankenphp
./build-static.sh

it fails after a long time running:

/bin/bash /home/www/franken-builder/dist/static-php-cli/source/php-src/libtool --silent --preserve-dup-deps --tag=CC --mode=compile x86_64-linux-musl-gcc -Iext/gd/ -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/ -I/home/www/franken-builder/dist/static-php-cli/source/php-src/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/main -I/home/www/franken-builder/dist/static-php-cli/source/php-src -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/date/lib -I/home/www/franken-builder/dist/static-php-cli/buildroot/include/libxml2 -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include -I/home/www/franken-builder/dist/static-php-cli/buildroot/include -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/libpng16 -I/include -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/webp -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/freetype2 -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/ImageMagick-7 -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/mbstring/libmbfl -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/mbstring/libmbfl/mbfl -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libxlsxwriter/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libexpat/expat/lib -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libxlsxio/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/TSRM -I/home/www/franken-builder/dist/static-php-cli/source/php-src/Zend  -I/home/www/franken-builder/dist/static-php-cli/buildroot/include -D_GNU_SOURCE -D_REENTRANT -pthread  -fno-common -Wformat-truncation -Wlogical-op -Wduplicated-cond -Wno-clobbered -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -ffp-contract=off -fvisibility=hidden -pthread -Wimplicit-fallthrough=1 -DZTS -DZEND_MAX_EXECUTION_TIMERS  -g -Os -fno-ident -fPIE -Wno-strict-prototypes -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/libgd -c /home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/libgd/gd_ss.c -o ext/gd/libgd/gd_ss.lo  -MMD -MF ext/gd/libgd/gd_ss.dep -MT ext/gd/libgd/gd_ss.lo
/bin/bash /home/www/franken-builder/dist/static-php-cli/source/php-src/libtool --silent --preserve-dup-deps --tag=CC --mode=compile x86_64-linux-musl-gcc -Iext/gd/ -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/ -I/home/www/franken-builder/dist/static-php-cli/source/php-src/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/main -I/home/www/franken-builder/dist/static-php-cli/source/php-src -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/date/lib -I/home/www/franken-builder/dist/static-php-cli/buildroot/include/libxml2 -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include -I/home/www/franken-builder/dist/static-php-cli/buildroot/include -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/libpng16 -I/include -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/webp -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/freetype2 -I/home/www/franken-builder/dist/static-php-cli/buildroot/lib/pkgconfig/../../include/ImageMagick-7 -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/mbstring/libmbfl -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/mbstring/libmbfl/mbfl -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libxlsxwriter/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libexpat/expat/lib -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/library/libxlsxio/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/xlswriter/include -I/home/www/franken-builder/dist/static-php-cli/source/php-src/TSRM -I/home/www/franken-builder/dist/static-php-cli/source/php-src/Zend  -I/home/www/franken-builder/dist/static-php-cli/buildroot/include -D_GNU_SOURCE -D_REENTRANT -pthread  -fno-common -Wformat-truncation -Wlogical-op -Wduplicated-cond -Wno-clobbered -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -ffp-contract=off -fvisibility=hidden -pthread -Wimplicit-fallthrough=1 -DZTS -DZEND_MAX_EXECUTION_TIMERS  -g -Os -fno-ident -fPIE -Wno-strict-prototypes -I/home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/libgd -c /home/www/franken-builder/dist/static-php-cli/source/php-src/ext/gd/libgd/gd_io_ss.c -o ext/gd/libgd/gd_io_ss.lo  -MMD -MF ext/gd/libgd/gd_io_ss.dep -MT ext/gd/libgd/gd_io_ss.lo
x86_64-linux-musl-gcc: fatal error: Killed signal terminated program cc1
compilation terminated.
make: *** [Makefile:944: ext/fileinfo/libmagic/apprentice.lo] Error 1
make: *** Waiting for unfinished jobs....
[18:11:06] [ERRO] Uncaught SPC\exception\RuntimeException: Command run failed with code[2]: cd '/home/www/franken-builder/dist/static-php-cli/source/php-src' && make -j2 INSTALL_ROOT=/home/www/franken-builder/dist/static-php-cli/buildroot EXTRA_CFLAGS='-g -Os -fno-ident -fPIE' EXTRA_LIBS='/home/www/franken-builder/dist/static-php-cli/buildroot/lib/libyaml.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libtidy.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/liblz4.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libsqlite3.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libpq.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libpgport.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libpgcommon.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libreadline.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libonig.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/liblber.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libldap.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libsodium.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libMagick++-7.Q16HDRI.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libMagickWand-7.Q16HDRI.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libMagickCore-7.Q16HDRI.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libzip.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libtiff.a  /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libncurses.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libgmp.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libfreetype.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libjpeg.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libturbojpeg.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libwebp.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libwebpdecoder.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libwebpdemux.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libwebpmux.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libsharpyuv.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libavif.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libpng16.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libcurl.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libzstd.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libxml2.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libicui18n.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libicuio.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libicuuc.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libicudata.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libiconv.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libcharset.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libbrotlidec.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libbrotlienc.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libssh2.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libssl.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libcrypto.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libz.a /home/www/franken-builder/dist/static-php-cli/buildroot/lib/libbz2.a -lstdc++  -lgomp  ' EXTRA_LDFLAGS_PROGRAM='-all-static' install at /home/www/franken-builder/dist/static-php-cli/src/globals/functions.php(147)
[18:11:06] [ERRO] #0 /home/www/franken-builder/dist/static-php-cli/src/SPC/util/UnixShell.php(51): f_passthru()
#1 /home/www/franken-builder/dist/static-php-cli/src/SPC/builder/linux/LinuxBuilder.php(300): SPC\util\UnixShell->exec()
#2 /home/www/franken-builder/dist/static-php-cli/src/SPC/builder/linux/LinuxBuilder.php(196): SPC\builder\linux\LinuxBuilder->buildEmbed()
#3 /home/www/franken-builder/dist/static-php-cli/src/SPC/command/BuildCliCommand.php(173): SPC\builder\linux\LinuxBuilder->buildPHP()
#4 /home/www/franken-builder/dist/static-php-cli/src/SPC/command/BaseCommand.php(101): SPC\command\BuildCliCommand->handle()
#5 /home/www/franken-builder/dist/static-php-cli/vendor/symfony/console/Command/Command.php(326): SPC\command\BaseCommand->execute()
#6 /home/www/franken-builder/dist/static-php-cli/vendor/symfony/console/Application.php(1078): Symfony\Component\Console\Command\Command->run()
#7 /home/www/franken-builder/dist/static-php-cli/vendor/symfony/console/Application.php(324): Symfony\Component\Console\Application->doRunCommand()
#8 /home/www/franken-builder/dist/static-php-cli/vendor/symfony/console/Application.php(175): Symfony\Component\Console\Application->doRun()
#9 /home/www/franken-builder/dist/static-php-cli/bin/spc(21): Symfony\Component\Console\Application->run()
#10 {main}
dunglas commented 3 weeks ago

On Linux, you should run the static-builder Docker image to build the static binary. Otherwise, the host needs special preparation that is tricky to do (musl etc).

laurent-bientz commented 3 weeks ago

Thanks @dunglas, I'm able to build the base static binary.

Unfortunately it seems there is no way to add custom caddy modules in the final static build with your docker image right?

I need to add the following modules (with go get or directly by editing go.mod & go.sum - see https://github.com/dunglas/frankenphp/issues/976#issuecomment-2296049125):

According to https://frankenphp.dev/docs/static/#customizing-the-build, I can't see any env vars to specify extra caddy modules as we can do for php extensions for instance.

Don't hesitate to tell me if I'm wrong (and how to do this) but it seems that it's currently impossible to have a static build of frankenphp with custom caddy modules.

I tries to edit locally https://github.com/dunglas/frankenphp/blob/main/caddy/go.mod without no effect at all, it seems everything come from your docker image dunglas/frankenphp:static-builder