diff --git a/build-packages.sh b/build-packages.sh index 1467a04cbf..294ace6c3e 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -17,7 +17,7 @@ if ! command -v ruby &>/dev/null; then fi if ! command -v fpm &>/dev/null; then - echo "Error: FPM (rubygem-fpm) is required to create RPM packages." + echo "Error: FPM (rubygem-fpm) is required to create RPM and DEB packages." echo "Install it with: sudo gem install fpm" exit 1 fi @@ -116,4 +116,25 @@ fpm -s dir -t deb -n frankenphp -v "${frankenphp_version}" \ [ "$user_preexists" -eq 0 ] && sudo userdel frankenphp [ "$group_preexists" -eq 0 ] && (sudo groupdel frankenphp || true) +echo "Creating APK package using FPM..." +fpm -s dir -t apk -n frankenphp -v "${frankenphp_version}" \ + --architecture "${arch}" \ + --config-files /etc/frankenphp/Caddyfile \ + --config-files /etc/frankenphp/php.ini \ + --depends "musl" \ + --depends "libstdc++" \ + --after-install ../package/alpine/frankenphp.post-install \ + --before-remove ../package/alpine/frankenphp.pre-deinstall \ + --after-remove ../package/alpine/frankenphp.post-deinstall \ + --iteration "${iteration}" \ + "${bin}=/usr/bin/frankenphp" \ + "../package/alpine/frankenphp.openrc=/etc/init.d/frankenphp" \ + "../package/rhel/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ + "../package/content/=/usr/share/frankenphp" \ + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ + "../package/empty/=/etc/frankenphp/php.d" \ + "../package/empty/=/usr/lib/frankenphp/modules" \ + "../package/empty/=/var/lib/frankenphp" + cd .. diff --git a/build-static.sh b/build-static.sh index 4ec8c4b829..3bf1b7b9bf 100755 --- a/build-static.sh +++ b/build-static.sh @@ -311,7 +311,11 @@ fi go env cd caddy/ if [ -z "${SPC_LIBC}" ] || [ "${SPC_LIBC}" = "musl" ]; then - xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-static-pie ${muslStackSizeFix}' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\"" + if [ "${CC}" = "gcc" ]; then + xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-pie ${muslStackSizeFix}' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\"" + else + xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-static-pie ${muslStackSizeFix}' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\"" + fi elif [ "${SPC_LIBC}" = "glibc" ]; then xcaddyGoBuildFlags="-buildmode=pie -tags cgo,netgo,osusergo,nobadger,nomysql,nopgx -ldflags \"-linkmode=external -extldflags '-pie' ${extraLdflags} -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${LIBPHP_VERSION} Caddy'\"" fi diff --git a/package/alpine/frankenphp.openrc b/package/alpine/frankenphp.openrc new file mode 100755 index 0000000000..23e5e368cc --- /dev/null +++ b/package/alpine/frankenphp.openrc @@ -0,0 +1,28 @@ +#!/sbin/openrc-run + +name="FrankenPHP" +description="Modern PHP app server" + +command="/usr/bin/frankenphp" +command_args="run --environ --config /etc/frankenphp/Caddyfile" +command_user="frankenphp:frankenphp" +command_background="yes" +pidfile="/run/frankenphp/frankenphp.pid" +start_stop_daemon_args="--chdir /var/lib/frankenphp" + +depend() { + need net + after firewall +} + +start_pre() { + checkpath --directory --owner frankenphp:frankenphp --mode 0755 /run/frankenphp + + $command validate --config /etc/frankenphp/Caddyfile +} + +reload() { + ebegin "Reloading $name configuration" + $command reload --config /etc/frankenphp/Caddyfile --force + eend $? +} diff --git a/package/alpine/frankenphp.post-deinstall b/package/alpine/frankenphp.post-deinstall new file mode 100755 index 0000000000..fd102fc3fa --- /dev/null +++ b/package/alpine/frankenphp.post-deinstall @@ -0,0 +1,13 @@ +#!/bin/sh + +if getent passwd frankenphp >/dev/null; then + deluser frankenphp +fi + +if getent group frankenphp >/dev/null; then + delgroup frankenphp +fi + +rmdir /var/lib/frankenphp 2>/dev/null || true + +exit 0 diff --git a/package/alpine/frankenphp.post-install b/package/alpine/frankenphp.post-install new file mode 100755 index 0000000000..5afeea748e --- /dev/null +++ b/package/alpine/frankenphp.post-install @@ -0,0 +1,29 @@ +#!/bin/sh + +if ! getent group frankenphp >/dev/null; then + addgroup -S frankenphp +fi + +if ! getent passwd frankenphp >/dev/null; then + adduser -S -h /var/lib/frankenphp -s /sbin/nologin -G frankenphp -g "FrankenPHP web server" frankenphp +fi + +chown -R frankenphp:frankenphp /var/lib/frankenphp +chmod 755 /var/lib/frankenphp + +# allow binding to privileged ports +if command -v setcap >/dev/null 2>&1; then + setcap cap_net_bind_service=+ep /usr/bin/frankenphp || true +fi + +# trust FrankenPHP certificates +if [ -x /usr/bin/frankenphp ]; then + HOME=/var/lib/frankenphp /usr/bin/frankenphp trust || true +fi + +if command -v rc-update >/dev/null 2>&1; then + rc-update add frankenphp default + rc-service frankenphp start +fi + +exit 0 diff --git a/package/alpine/frankenphp.pre-deinstall b/package/alpine/frankenphp.pre-deinstall new file mode 100755 index 0000000000..59713ea01c --- /dev/null +++ b/package/alpine/frankenphp.pre-deinstall @@ -0,0 +1,11 @@ +#!/bin/sh + +if command -v rc-service >/dev/null 2>&1; then + rc-service frankenphp stop || true +fi + +if command -v rc-update >/dev/null 2>&1; then + rc-update del frankenphp default || true +fi + +exit 0 diff --git a/static-builder-musl.Dockerfile b/static-builder-musl.Dockerfile index e353c9d7eb..a39ae725f3 100644 --- a/static-builder-musl.Dockerfile +++ b/static-builder-musl.Dockerfile @@ -100,6 +100,10 @@ ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp --with-config-fi ENV SPC_REL_TYPE='binary' ENV EXTENSION_DIR='/usr/lib/frankenphp/modules' +ENV CC='gcc' +ENV CXX='g++' +ENV CGO_LDFLAGS_ALLOW='-Wl,--allow-multiple-definition' + RUN --mount=type=secret,id=github-token \ GITHUB_TOKEN=$(cat /run/secrets/github-token) ./build-static.sh && \ rm -Rf dist/static-php-cli/source/*