123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- #!/bin/bash
- set -e
- print_usage() {
- echo "Usage: $0 <package-type> <target-dir>"
- echo " package-type: Package type to build (deb, rpm, tar)"
- echo " target-dir: Target directory to save the package"
- }
- PACKAGE_TYPE=$1
- TARGET_DIR=$2
- if [ -z "$PACKAGE_TYPE" ] || [ -z "$TARGET_DIR" ]; then
- print_usage
- exit 1
- fi
- if [ "$PACKAGE_TYPE" != "deb" ] && [ "$PACKAGE_TYPE" != "rpm" ] && [ "$PACKAGE_TYPE" != "tar" ]; then
- echo "Unknown package type: $PACKAGE_TYPE"
- print_usage
- exit 1
- fi
- if [ ! -d "$TARGET_DIR" ]; then
- echo "Target path does not exist or is not a directory: $TARGET_DIR"
- exit 1
- fi
- if [ ! -w "$TARGET_DIR" ]; then
- echo "Target path is not writable: $TARGET_DIR"
- exit 1
- fi
- TARGET_DIR=$(realpath $TARGET_DIR)
- BUILDDIR=$(mktemp --tmpdir -d imgproxy.XXXXXXXX)
- trap "rm -rf $BUILDDIR" EXIT
- echo
- echo "Building in $BUILDDIR, target path: $TARGET_DIR"
- cd $BUILDDIR
- # ==============================================================================
- # Copy the package content
- echo
- echo "Copying the package content..."
- mkdir -p opt/imgproxy
- mkdir -p opt/imgproxy/libexec
- cp -r /opt/imgproxy/lib opt/imgproxy/
- cp -r /opt/imgproxy/bin/imgproxy opt/imgproxy/libexec/
- if [ -d /opt/imgproxy/share ]; then
- cp -r /opt/imgproxy/share opt/imgproxy/
- fi
- # ==============================================================================
- # Patching RPATHs
- echo
- echo "Patching RPATHs..."
- # Install patchelf
- apt-get update
- DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends patchelf
- # Patch the RPATH of the imgproxy binary
- patchelf --set-rpath '$ORIGIN/../lib' opt/imgproxy/libexec/imgproxy
- # Path the RPATH of the libvips shared libraries
- find opt/imgproxy/lib -type f -regex '.*/[^/]*\.so\(\.[^/]*\)?' -exec patchelf --set-rpath '$ORIGIN' {} \;
- # ==============================================================================
- # Build the RC file
- echo
- echo "Building the RC files..."
- mkdir -p opt/imgproxy/etc
- SYS_RC_FILE=opt/imgproxy/etc/imgproxy.sys.rc
- cat << 'EOF' > $SYS_RC_FILE
- #!/usr/bin/env bash
- set -e
- # !!!DO NOT EDIT THIS FILE!!!
- #
- # This file is generated by the imgproxy package build script and will be
- # overwritten on the next installation. Use imgproxy.rc instead.
- IMGPROXY_ROOT=$(readlink -f "$(dirname $(readlink -f "$0"))/..")
- EOF
- # Dump all IMGPROXY_ and VIPS_ environment variables to the launch script.
- # Declare them as exported variables with the default value if they are not set.
- ENV_VARS=$(awk 'BEGIN{for(v in ENVIRON) if (match(v, "^(IMGPROXY_|VIPS_).+") != 0) print v}')
- for VAR in $ENV_VARS; do
- # IMGPROXY_MALLOC doesn't work outside of the container
- if [ "$VAR" != "IMGPROXY_MALLOC" ]; then
- printf '%s=${%s:-%q}\n' "$VAR" "$VAR" "${!VAR}" >> $SYS_RC_FILE;
- echo "export $VAR=\${$VAR//\"/opt/imgproxy\"/\"\$IMGPROXY_ROOT\"}" >> $SYS_RC_FILE
- echo >> $SYS_RC_FILE
- fi
- done
- RC_FILE=opt/imgproxy/etc/imgproxy.rc
- cat << 'EOF' > $RC_FILE
- #!/usr/bin/env bash
- set -e
- # IMGPROXY CONFIGURATION FILE
- # ===========================
- #
- # This file is sourced by the imgproxy launch script.
- # You can use it to set environment variables for imgproxy using `export`:
- #
- # export IMGPROXY_MAX_SRC_RESOLUTION=99
- #
- # See https://docs.imgproxy.net/configuration/options for more information
- #
- EOF
- # ==============================================================================
- # Build the launch script
- echo
- echo "Building the launch script..."
- mkdir -p opt/imgproxy/bin
- LAUNCH_SCRIPT=opt/imgproxy/bin/imgproxy
- cat << 'EOF' > $LAUNCH_SCRIPT
- #!/usr/bin/env bash
- set -e
- SCRIPT_DIR=$(dirname $(readlink -f "$0"))
- IMGPROXY_SYS_RC=$(readlink -f "$SCRIPT_DIR/../etc/imgproxy.sys.rc")
- if [ -f "$IMGPROXY_SYS_RC" ]; then
- source $IMGPROXY_SYS_RC
- fi
- IMGPROXY_RC=$(readlink -f "$SCRIPT_DIR/../etc/imgproxy.rc")
- if [ -f "$IMGPROXY_RC" ]; then
- source $IMGPROXY_RC
- fi
- if [ -f "/etc/imgproxy.rc" ] && [ "$(readlink -f "/etc/imgproxy.rc")" != "$IMGPROXY_RC" ]; then
- source /etc/imgproxy.rc
- fi
- IMGPROXY_BIN=$(readlink -f "$SCRIPT_DIR/../libexec/imgproxy")
- $IMGPROXY_BIN $@
- EOF
- # Make the launch script executable
- chmod +x $LAUNCH_SCRIPT
- # Test the launch script
- echo -n "Testing the launch script... "
- if $LAUNCH_SCRIPT version > /dev/null; then
- echo "Success"
- else
- echo "Failed"
- fi
- # ==============================================================================
- # Packaging
- echo
- echo "Packaging..."
- VERSION=$(imgproxy version)
- RELEASE=$(printf '%(%y%m%d%H%M)T\n' -1)
- case $PACKAGE_TYPE in
- # TAR package ----------------------------------------------------------------
- tar)
- RESULT_FILE=imgproxy-$VERSION-$RELEASE.$(dpkg --print-architecture).tar.gz
- tar -czf $RESULT_FILE -C opt imgproxy
- cp $RESULT_FILE $TARGET_DIR
- ;;
- # DEB package ----------------------------------------------------------------
- deb)
- DEB_ARCH=$(dpkg --print-architecture)
- RESULT_FILE=imgproxy-$VERSION-$RELEASE.$DEB_ARCH.deb
- mkdir -p imgproxy
- mv opt imgproxy/
- mkdir -p imgproxy/usr/bin
- ln -s /opt/imgproxy/bin/imgproxy imgproxy/usr/bin/imgproxy
- mkdir -p imgproxy/DEBIAN
- cat << EOF > imgproxy/DEBIAN/control
- Package: imgproxy
- Version: $VERSION-$RELEASE
- Section: base
- Priority: optional
- Architecture: $DEB_ARCH
- Depends: bash, libc6, libstdc++6, fontconfig-config, ca-certificates, media-types
- Maintainer: Foxes With Matches <info@imgproxy.net>
- Homepage: https://imgproxy.net
- Description: imgproxy
- imgproxy is a fast and secure standalone server for resizing and converting remote images.
- EOF
- cat << 'EOF' > imgproxy/DEBIAN/conffiles
- /opt/imgproxy/etc/imgproxy.rc
- EOF
- cat << 'EOF' > imgproxy/DEBIAN/postinst
- #!/bin/bash
- set -e
- if [ ! -f /etc/imgproxy.rc ]; then
- ln -s /opt/imgproxy/etc/imgproxy.rc /etc/imgproxy.rc
- fi
- echo
- echo "imgproxy installed successfully!"
- echo "You can edit /etc/imgproxy.rc to configure imgproxy or set imgproxy environment variables in your shell profile."
- echo "See https://docs.imgproxy.net/configuration/options for more information."
- EOF
- chmod +x imgproxy/DEBIAN/postinst
- cat << 'EOF' > imgproxy/DEBIAN/prerm
- #!/bin/bash
- set -e
- if [ -d /opt/imgproxy/var ]; then
- rm -rf /opt/imgproxy/var
- fi
- if [ "$(readlink -f /etc/imgproxy.rc)" == "$(readlink -f /opt/imgproxy/etc/imgproxy.rc)" ]; then
- rm /etc/imgproxy.rc
- fi
- EOF
- chmod +x imgproxy/DEBIAN/prerm
- dpkg-deb --build imgproxy $RESULT_FILE
- cp $RESULT_FILE $TARGET_DIR
- ;;
- # RPM package ----------------------------------------------------------------
- rpm)
- DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends rpm
- RPM_ARCH=$(rpm --eval '%{_arch}')
- RESULT_FILE=imgproxy-$VERSION-$RELEASE.$RPM_ARCH.rpm
- mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
- mkdir -p rpmbuild/SOURCES/imgproxy
- mv opt rpmbuild/SOURCES/imgproxy/
- mkdir -p rpmbuild/SOURCES/imgproxy/usr/bin
- ln -s /opt/imgproxy/bin/imgproxy rpmbuild/SOURCES/imgproxy/usr/bin/imgproxy
- cat << 'EOF' > rpmbuild/SPECS/imgproxy.spec
- Name: imgproxy
- Version: %{version}
- Release: %{release}
- Summary: imgproxy
- License: MIT
- URL: https://imgproxy.net
- Group: Applications/Internet
- BuildArch: %{_arch}
- AutoReqProv: no
- Requires: bash
- Requires: glibc
- Requires: libstdc++
- Requires: fontconfig
- Requires: ca-certificates
- Requires: shared-mime-info
- Requires(interp): /bin/bash
- Requires(post): /bin/bash
- Requires(preun): /bin/bash
- %description
- imgproxy is a fast and secure standalone server for resizing and converting remote images.
- %prep
- mkdir -p $RPM_BUILD_ROOT
- mv %{_sourcedir}/imgproxy/opt $RPM_BUILD_ROOT/opt
- mv %{_sourcedir}/imgproxy/usr $RPM_BUILD_ROOT/usr
- %files
- /opt/imgproxy
- /usr/bin/imgproxy
- %config(noreplace) /opt/imgproxy/etc/imgproxy.rc
- %post
- if [ ! -f /etc/imgproxy.rc ]; then
- ln -s /opt/imgproxy/etc/imgproxy.rc /etc/imgproxy.rc
- fi
- %preun
- if [ -d /opt/imgproxy/var ]; then
- rm -rf /opt/imgproxy/var
- fi
- if [ "$(readlink -f /etc/imgproxy.rc)" == "$(readlink -f /opt/imgproxy/etc/imgproxy.rc)" ]; then
- rm /etc/imgproxy.rc
- fi
- %clean
- rm -rf $RPM_BUILD_ROOT
- exit
- EOF
- rpmbuild \
- --define "_topdir $(pwd)/rpmbuild" \
- --define "version $VERSION" \
- --define "release $RELEASE" \
- -bb rpmbuild/SPECS/imgproxy.spec
- cp rpmbuild/RPMS/$RPM_ARCH/$RESULT_FILE $TARGET_DIR
- ;;
- *)
- echo "Unknown package type: $PACKAGE_TYPE"
- print_usage
- exit 1
- ;;
- esac
- echo
- echo "Done!"
- echo "Package is saved to $(realpath "$TARGET_DIR/$RESULT_FILE")"
- echo
|