mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-02-07 11:36:25 +02:00
348 lines
8.3 KiB
Bash
Executable File
348 lines
8.3 KiB
Bash
Executable File
#!/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
|