diff --git a/README.md b/README.md index b3c8f1e..fc07a7a 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,18 @@ This repository will help you produce a debian package. ## TL;DR Make sure you have the required build dependencies: -* docker -* git -* patch -* curl -* apparmor - ``` -apt install docker.io git patch curl apparmor +apt-get update +apt-get install git curl gnupg ca-certificates apparmor build-essential patch sudo psmisc +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg +echo \ + "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` Then: @@ -28,7 +32,7 @@ cd vaultwarden-debian The `build.sh` script will build vaultwarden for the same Debian version which targets vaultwarden. That means, to build vaultwarden v1.19.0, make sure to checkout tag `v1.19.0` of this project. -To compile for a different Debian version, specify the release name (e.g. Buster, Bullseye) using the `-o` option. You can compile for arm32v7, arm64 and amd64 architecture using the `-a` option. Only the Buster (default) release of debian is supported by arm32v7. +To compile for a different Debian version, specify the release name (e.g. buster, bullseye, bookworm) using the `-o` option. You can compile for amd64 or arm64 architecture using the `-a` option. ``` ./build.sh -o bullseye diff --git a/build.sh b/build.sh index 874763f..e1952ca 100755 --- a/build.sh +++ b/build.sh @@ -6,15 +6,16 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" SRC="$DIR/git" DST="$DIR/dist" -OS_VERSION_NAME="buster" +OS_VERSION_NAME="bullseye" DB_TYPE="sqlite" +SYSTEMD_DB="true" ARCH_DIR="amd64" PACKAGENAME="vaultwarden" PACKAGEDIR="vaultwarden" SERVICEUSER="vaultwarden" EXECUTABLENAME="$PACKAGEDIR" -while getopts ":r:o:d:a:p:i:u:e:" opt; do +while getopts ":r:o:d:a:p:i:u:e:s" opt; do case $opt in r) REF="$OPTARG" ;; @@ -32,13 +33,30 @@ while getopts ":r:o:d:a:p:i:u:e:" opt; do ;; e) EXECUTABLENAME="$OPTARG" ;; + s) SYSTEMD_DB="false" + ;; \?) echo "Invalid option -$OPTARG" >&2 ; exit ;; esac done if [ -z "$REF" ]; then REF=$(curl -s https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 1-); fi ARCH=$ARCH_DIR -if [[ "$ARCH" =~ ^arm7 ]]; then ARCH="armhf"; fi +if [[ "$ARCH" =~ ^arm ]]; then ARCH="armhf"; fi + +VAULTWARDEN_DEPS="libc6, libgcc-s1" + +# mysql and postgresql need additional libraries. Sqlite support is built into the vaultwarden binary +case $DB_TYPE in + mysql) + VAULTWARDEN_DEPS="$VAULTWARDEN_DEPS, libmariadb3" + RECOMMENDS="mariadb-server" + ;; + + postgresql) + VAULTWARDEN_DEPS="$VAULTWARDEN_DEPS, libpq5" + RECOMMENDS="postgresql" + ;; +esac # Clone vaultwarden if [ ! -d "$SRC" ]; then @@ -80,34 +98,57 @@ chmod 644 "$DEBIANDIR/conffiles" sed postinst.dist > "$DEBIANDIR/postinst" -f <( echo "$SEDCOMMANDS" ) || exit chmod 755 "$DEBIANDIR/postinst" +# Prepare postrm +sed postrm.dist > "$DEBIANDIR/postrm" -f <( echo "$SEDCOMMANDS" ) || exit +chmod 755 "$DEBIANDIR/postrm" + +# Prepare prerm +sed prerm.dist > "$DEBIANDIR/prerm" -f <( echo "$SEDCOMMANDS" ) || exit +chmod 755 "$DEBIANDIR/prerm" + mkdir -p "$DST" # Prepare Dockerfile +pushd "$SRC/docker" || exit +make +popd || exit sed "$DIR/patch/$ARCH_DIR/Dockerfile.patch" -f <( echo "$SEDCOMMANDS" ) | \ -patch "$SRC/docker/$ARCH_DIR/Dockerfile" --verbose -o "$DIR/Dockerfile" || \ +patch "$SRC/docker/Dockerfile.debian" --verbose -o "$DIR/Dockerfile" || \ exit -sed -E "s/(FROM[[:space:]]*docker.io\/library\/rust:[^-]+)[^[:space:]]+(.+)/\1-${OS_VERSION_NAME}\2/g" -i "$DIR/Dockerfile" -sed -E "s/(FROM[[:space:]]*docker.io\/library\/debian:)[^-]+(-.+)/\1${OS_VERSION_NAME}\2/g" -i "$DIR/Dockerfile" +sed "/docker.io\/library\/rust/s/bookworm/${OS_VERSION_NAME}/g" -i "$DIR/Dockerfile" +sed "/docker.io\/library\/debian/s/bookworm/${OS_VERSION_NAME}/g" -i "$DIR/Dockerfile" # Prepare Controlfile CONTROL="$DEBIANDIR/control" cp "$DIR/control.dist" "$CONTROL" sed -i "s/@@PACKAGENAME@@/$PACKAGENAME/g" "$CONTROL" -sed -i "s/Version:.*/Version: $REF-1-$OS_VERSION_NAME/" "$CONTROL" +sed -i "s/@@VAULTWARDEN_DEPS@@/$VAULTWARDEN_DEPS/g" "$CONTROL" +sed -i "s/Version:.*/Version: $REF-1/" "$CONTROL" sed -i "s/Architecture:.*/Architecture: $ARCH/" "$CONTROL" +if [ -n "$RECOMMENDS" ]; then + echo "Recommends: $RECOMMENDS" >> "$CONTROL" +fi # Prepare Systemd-unit SYSTEMD_UNIT="$DEBIANDIR/$EXECUTABLENAME.service" sed "$DIR/service.dist" > "$SYSTEMD_UNIT" -f <( echo "$SEDCOMMANDS" ) || exit -if [ "$DB_TYPE" = "mysql" ]; then +if [ "$SYSTEMD_DB" = true ] && [ "$DB_TYPE" = "mysql" ]; then sed -i "s/After=network.target/After=network.target mysqld.service\nRequires=mysqld.service/g" "$SYSTEMD_UNIT" -elif [ "$DB_TYPE" = "postgresql" ]; then +elif [ "$SYSTEMD_DB" = true ] && [ "$DB_TYPE" = "postgresql" ]; then sed -i "s/After=network.target/After=network.target postgresql.service\nRequires=postgresql.service/g" "$SYSTEMD_UNIT" fi +# Prepare sysusers +sed sysusers.conf > "$DEBIANDIR/sysusers.conf" -f <( echo "$SEDCOMMANDS" ) || exit +chmod 644 "$DEBIANDIR/sysusers.conf" + +# Prepare tmpfiles +sed tmpfiles.conf > "$DEBIANDIR/tmpfiles.conf" -f <( echo "$SEDCOMMANDS" ) || exit +chmod 644 "$DEBIANDIR/tmpfiles.conf" + echo "[INFO] docker build -t vaultwarden-deb $DIR --build-arg DB=$DB_TYPE" -docker build -t vaultwarden-deb "$SRC" --build-arg DB="$DB_TYPE" --target dpkg -f "$DIR/Dockerfile" +docker buildx build -t vaultwarden-deb "$SRC" --build-arg DB="$DB_TYPE" --target dpkg -f "$DIR/Dockerfile" CID=$(docker run -d vaultwarden-deb) docker cp "$CID:/outdir/${PACKAGEDIR}.deb" "$DST/${PACKAGEDIR}-${OS_VERSION_NAME}-${REF}-${DB_TYPE}-${ARCH_DIR}.deb" diff --git a/control.dist b/control.dist index a462fb0..86160cf 100644 --- a/control.dist +++ b/control.dist @@ -3,5 +3,6 @@ Architecture: - Maintainer: Greizgh Priority: optional Version: - +Depends: @@VAULTWARDEN_DEPS@@, systemd | systemd-standalone-sysusers | opensysusers, systemd | default-systemd-tmpfiles | systemd-tmpfiles | systemd-standalone-tmpfiles Description: Unofficial Bitwarden compatible server written in Rust Homepage: https://github.com/greizgh/vaultwarden-debian diff --git a/patch/amd64/Dockerfile.patch b/patch/amd64/Dockerfile.patch index fbc204f..8224059 100644 --- a/patch/amd64/Dockerfile.patch +++ b/patch/amd64/Dockerfile.patch @@ -1,26 +1,31 @@ ---- git/docker/amd64/Dockerfile 2022-12-24 16:59:28.554597529 +0100 -+++ Dockerfile 2022-12-24 18:12:24.069923032 +0100 -@@ -84,6 +84,26 @@ - # hadolint ignore=DL3059 +--- git/docker/amd64/Dockerfile 2023-07-29 15:42:52.131945764 -0500 ++++ Dockerfile 2023-07-29 16:18:19.915440456 -0500 +@@ -77,6 +77,31 @@ + # your actual source files being built RUN cargo build --features ${DB} --release +####################### dpkg target ########################## +FROM build as dpkg +RUN mkdir /outdir +RUN mkdir -p /vaultwarden_package/DEBIAN -+RUN mkdir -p /vaultwarden_package/usr/local/bin +RUN mkdir -p /vaultwarden_package/usr/lib/systemd/system ++RUN mkdir -p /vaultwarden_package/usr/lib/sysusers.d ++RUN mkdir -p /vaultwarden_package/usr/lib/tmpfiles.d +RUN mkdir -p /vaultwarden_package/etc/@@PACKAGEDIR@@ +RUN mkdir -p /vaultwarden_package/usr/share/@@PACKAGEDIR@@ + +WORKDIR /vaultwarden_package +COPY debian/control /vaultwarden_package/DEBIAN/control +COPY debian/postinst /vaultwarden_package/DEBIAN/postinst ++COPY debian/postrm /vaultwarden_package/DEBIAN/postrm ++COPY debian/prerm /vaultwarden_package/DEBIAN/prerm +COPY debian/conffiles /vaultwarden_package/DEBIAN/conffiles -+COPY debian/config.env /vaultwarden_package/etc/@@PACKAGEDIR@@ ++COPY --chmod=600 debian/config.env /vaultwarden_package/etc/@@PACKAGEDIR@@ +COPY debian/@@EXECUTABLENAME@@.service /vaultwarden_package/usr/lib/systemd/system ++COPY debian/sysusers.conf /vaultwarden_package/usr/lib/sysusers.d/@@PACKAGEDIR@@.conf ++COPY debian/tmpfiles.conf /vaultwarden_package/usr/lib/tmpfiles.d/@@PACKAGEDIR@@.conf +COPY --from=vault /web-vault /vaultwarden_package/usr/share/@@PACKAGEDIR@@/web-vault -+COPY --from=build app/target/release/vaultwarden /vaultwarden_package/usr/local/bin/@@EXECUTABLENAME@@ ++COPY --from=build app/target/final/vaultwarden /vaultwarden_package/usr/bin/@@EXECUTABLENAME@@ + +RUN dpkg-deb --build . /outdir/@@PACKAGEDIR@@.deb + diff --git a/patch/arm64 b/patch/arm64 new file mode 120000 index 0000000..33a9268 --- /dev/null +++ b/patch/arm64 @@ -0,0 +1 @@ +amd64 \ No newline at end of file diff --git a/patch/arm64/Dockerfile.patch b/patch/arm64/Dockerfile.patch deleted file mode 100644 index 5432d71..0000000 --- a/patch/arm64/Dockerfile.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/docker/arm64/Dockerfile b/docker/arm64/Dockerfile -index 117517a..2c82058 100644 ---- a/docker/arm64/Dockerfile -+++ b/docker/arm64/Dockerfile -@@ -96,6 +96,26 @@ RUN touch src/main.rs - # your actual source files being built - RUN cargo build --features ${DB} --release --target=aarch64-unknown-linux-gnu - -+####################### dpkg target ########################## -+FROM build as dpkg -+RUN mkdir /outdir -+RUN mkdir -p /vaultwarden_package/DEBIAN -+RUN mkdir -p /vaultwarden_package/usr/local/bin -+RUN mkdir -p /vaultwarden_package/usr/lib/systemd/system -+RUN mkdir -p /vaultwarden_package/etc/@@PACKAGEDIR@@ -+RUN mkdir -p /vaultwarden_package/usr/share/@@PACKAGEDIR@@ -+ -+WORKDIR /vaultwarden_package -+COPY debian/control /vaultwarden_package/DEBIAN/control -+COPY debian/postinst /vaultwarden_package/DEBIAN/postinst -+COPY debian/conffiles /vaultwarden_package/DEBIAN/conffiles -+COPY debian/config.env /vaultwarden_package/etc/@@PACKAGEDIR@@ -+COPY debian/@@EXECUTABLENAME@@.service /vaultwarden_package/usr/lib/systemd/system -+COPY --from=vault /web-vault /vaultwarden_package/usr/share/@@PACKAGEDIR@@/web-vault -+COPY --from=build app/target/aarch64-unknown-linux-gnu/release/vaultwarden /vaultwarden_package/usr/local/bin/@@EXECUTABLENAME@@ -+ -+RUN dpkg-deb --build . /outdir/@@PACKAGEDIR@@.deb -+ - ######################## RUNTIME IMAGE ######################## - # Create a new stage with a minimal image - # because we already have a binary built diff --git a/patch/armv7/Dockerfile.patch b/patch/armv7/Dockerfile.patch deleted file mode 100644 index 9f2f0a3..0000000 --- a/patch/armv7/Dockerfile.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- git/docker/armv7/Dockerfile 2022-12-24 15:34:46.644360901 +0100 -+++ Dockerfile 2022-12-24 18:15:38.065904150 +0100 -@@ -104,6 +104,26 @@ - # hadolint ignore=DL3059 - RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-gnueabihf - -+####################### dpkg target ########################## -+FROM build as dpkg -+RUN mkdir /outdir -+RUN mkdir -p /vaultwarden_package/DEBIAN -+RUN mkdir -p /vaultwarden_package/usr/local/bin -+RUN mkdir -p /vaultwarden_package/usr/lib/systemd/system -+RUN mkdir -p /vaultwarden_package/etc/@@PACKAGEDIR@@ -+RUN mkdir -p /vaultwarden_package/usr/share/@@PACKAGEDIR@@ -+ -+WORKDIR /vaultwarden_package -+COPY debian/control /vaultwarden_package/DEBIAN/control -+COPY debian/postinst /vaultwarden_package/DEBIAN/postinst -+COPY debian/conffiles /vaultwarden_package/DEBIAN/conffiles -+COPY debian/config.env /vaultwarden_package/etc/@@PACKAGEDIR@@ -+COPY debian/@@EXECUTABLENAME@@.service /vaultwarden_package/usr/lib/systemd/system -+COPY --from=vault /web-vault /vaultwarden_package/usr/share/@@PACKAGEDIR@@/web-vault -+COPY --from=build app/target/armv7-unknown-linux-gnueabihf/release/vaultwarden /vaultwarden_package/usr/local/bin/@@EXECUTABLENAME@@ -+ -+RUN dpkg-deb --build . /outdir/@@PACKAGEDIR@@.deb -+ - ######################## RUNTIME IMAGE ######################## - # Create a new stage with a minimal image - # because we already have a binary built diff --git a/postinst.dist b/postinst.dist index 02cbec3..b94ff0b 100755 --- a/postinst.dist +++ b/postinst.dist @@ -1,10 +1,32 @@ #!/bin/sh -if [ -f /etc/@@PACKAGEDIR@@/Rocket.toml ] -then - mv /etc/@@PACKAGEDIR@@/Rocket.toml /etc/@@PACKAGEDIR@@/Rocket.toml.deprecated +set -e + +# Automatically added by dh_installsysusers/13.11.4 +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + systemd-sysusers ${DPKG_ROOT:+--root="$DPKG_ROOT"} @@PACKAGEDIR@@.conf +fi + +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + if [ -x "$(command -v systemd-tmpfiles)" ]; then + systemd-tmpfiles ${DPKG_ROOT:+--root="$DPKG_ROOT"} --create @@PACKAGEDIR@@.conf >/dev/null || true + fi +fi + +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + if deb-systemd-helper --quiet is-enabled '@@PACKAGEDIR@@.service'; then + # Creates new symlinks on upgrades if the unit file has changed. + deb-systemd-helper enable '@@PACKAGEDIR@@.service' >/dev/null || true + else + # Update the statefile to add new symlinks (if any), which need to be + # cleaned up on purge. Also remove old symlinks. + deb-systemd-helper update-state '@@PACKAGEDIR@@.service' >/dev/null || true + fi +fi +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true + if systemctl --system is-active '@@PACKAGEDIR@@.service'; then + deb-systemd-invoke restart '@@PACKAGEDIR@@.service' >/dev/null || true + fi + fi fi -DIR_MODE=0700 adduser --system --group --home /var/lib/@@PACKAGEDIR@@ @@SERVICEUSER@@ -chmod 700 /var/lib/@@PACKAGEDIR@@ -chmod 600 /etc/@@PACKAGEDIR@@/config.env -systemctl daemon-reload -systemctl restart vaultwarden.service diff --git a/postrm.dist b/postrm.dist new file mode 100755 index 0000000..aec9fef --- /dev/null +++ b/postrm.dist @@ -0,0 +1,14 @@ +#!/bin/sh +set -e +# Automatically added by dh_installsystemd/13.11.4 +if [ "$1" = remove ] && [ -d /run/systemd/system ] ; then + systemctl --system daemon-reload >/dev/null || true +fi +# End automatically added section +# Automatically added by dh_installsystemd/13.11.4 +if [ "$1" = "purge" ]; then + if [ -x "/usr/bin/deb-systemd-helper" ]; then + deb-systemd-helper purge '@@PACKAGEDIR@@.service' >/dev/null || true + fi +fi +# End automatically added section diff --git a/prerm.dist b/prerm.dist new file mode 100755 index 0000000..7b74ad9 --- /dev/null +++ b/prerm.dist @@ -0,0 +1,7 @@ +#!/bin/sh +set -e +# Automatically added by dh_installsystemd/13.11.4 +if [ -z "${DPKG_ROOT:-}" ] && [ "$1" = remove ] && [ -d /run/systemd/system ] ; then + deb-systemd-invoke stop '@@PACKAGEDIR@@.service' >/dev/null || true +fi +# End automatically added section diff --git a/service.dist b/service.dist index e8db6b2..e8ba2bd 100644 --- a/service.dist +++ b/service.dist @@ -1,11 +1,11 @@ [Unit] -Description=Bitwarden API server +Description=Vaultwarden API server After=network.target [Service] Type=simple User=@@SERVICEUSER@@ -ExecStart=/usr/local/bin/@@EXECUTABLENAME@@ +ExecStart=/usr/bin/@@EXECUTABLENAME@@ PrivateTmp=true PrivateDevices=true ProtectHome=true diff --git a/sysusers.conf b/sysusers.conf new file mode 100644 index 0000000..4007b3d --- /dev/null +++ b/sysusers.conf @@ -0,0 +1,2 @@ +# Setup the user for the @@PACKAGEDIR@@ service +u @@SERVICEUSER@@ - "@@PACKAGEDIR@@ service user" /var/lib/@@PACKAGEDIR@@ diff --git a/tmpfiles.conf b/tmpfiles.conf new file mode 100644 index 0000000..fb8e16e --- /dev/null +++ b/tmpfiles.conf @@ -0,0 +1,4 @@ +# Data directory for @@PACKAGEDIR@@ +d /var/lib/@@PACKAGEDIR@@ 0700 @@SERVICEUSER@@ root - - +# Adjust the permissions of this file to be owned by @@SERVICEUSER@@ +z /etc/@@PACKAGEDIR@@/config.env 0600 @@SERVICEUSER@@ root - -