Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
laurent-bientz opened this issue Aug 19, 2024 · 3 comments
Labels
enhancement New feature or request

Comments

@laurent-bientz
Copy link

laurent-bientz commented Aug 19, 2024

Hello,

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

Unfortunately (see #956 (comment)), 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 #976 (comment))

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 laurent-bientz added the enhancement New feature or request label Aug 19, 2024
@laurent-bientz
Copy link
Author

laurent-bientz commented Aug 19, 2024

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
Copy link
Owner

dunglas commented Aug 19, 2024

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
Copy link
Author

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 #976 (comment)):

  • github.com/darkweak/souin/plugins/caddy@65cb24114d76a7de3f4e8c7b8ef7df3efd028899
  • github.com/darkweak/souin@65cb24114d76a7de3f4e8c7b8ef7df3efd028899
  • github.com/darkweak/storages/otter/caddy

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants
@dunglas @laurent-bientz and others