diff --git a/.github/workflows/_tauri.yml b/.github/workflows/_tauri.yml
index ba5b82667..1e28a58fa 100644
--- a/.github/workflows/_tauri.yml
+++ b/.github/workflows/_tauri.yml
@@ -116,7 +116,7 @@ jobs:
- name: Upload deb / msi package
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
- name: ${{ env.ARTIFACT_DST }}-pkg
+ name: ${{ env.ARTIFACT_DST }}-${{ matrix.pkg-extension }}
path: ${{ env.ARTIFACT_SRC }}.${{ matrix.pkg-extension }}
if-no-files-found: error
- name: Upload rpm package
diff --git a/rust/gui-client/build.sh b/rust/gui-client/build.sh
index f0d87911b..0be6eec53 100755
--- a/rust/gui-client/build.sh
+++ b/rust/gui-client/build.sh
@@ -1,87 +1,9 @@
#!/usr/bin/env bash
-# These steps must be synchronized with `gui-smoke-test` in `_rust.yml`.
set -euo pipefail
-# Dir where all the bundles are built
-BUNDLES_DIR=../target/release/bundle/deb
-
-# Prep the RPM container
-docker build . -f ../Dockerfile-rpm -t rpmbuild
-
# Bundle all web assets
pnpm vite build
-# Get rid of any existing debs, since we need to discover the path later
-rm -rf "$BUNDLES_DIR"
-
# Compile Rust and bundle
pnpm tauri build
-
-# Build the RPM file
-docker run \
---rm \
--v $PWD/..:/root/rpmbuild \
--v /usr/lib:/root/libs \
--w /root/rpmbuild/gui-client \
-rpmbuild \
-rpmbuild \
--bb src-tauri/rpm_files/firezone-gui-client.spec \
---define "_topdir /root/rpmbuild/gui-client/rpmbuild"
-
-# Un-mess-up the permissions Docker gave it
-sudo chown --recursive $USER:$USER rpmbuild
-
-# Give it a predictable name
-cp rpmbuild/RPMS/*/firezone-client-gui-*rpm "firezone-client-gui.rpm"
-
-# Delete the deb that Tauri built. We're going to modify and rebuild it.
-rm "$BUNDLES_DIR"/*.deb
-
-# There should be only one directory in `bundle/deb`, we need to modify
-# files inside that dir
-INTERMEDIATE_DIR=$(ls -d "$BUNDLES_DIR"/*/)
-
-# Delete the archives, we will re-create them.
-rm "$INTERMEDIATE_DIR"/*.tar.gz
-
-# The directory layout of `$BUNDLES_DIR` now looks like this:
-# └── firezone-client-gui_1.x.y_$arch
-# ├── control
-# │ ├── control
-# │ └── md5sums
-# ├── data
-# │ └── usr
-# │ ├── bin
-# │ │ └── firezone-client-gui
-# │ ├── lib
-# │ │ ├── systemd
-# │ │ │ └── system
-# │ │ │ └── firezone-client-tunnel.service
-# │ │ └── sysusers.d
-# │ │ └── firezone-client-tunnel.conf
-# │ └── share
-# │ ├── applications
-# │ │ └── firezone-client-gui.desktop
-# │ └── icons
-# │ └── ...
-# └── debian-binary
-
-# Add the scripts
-cp src-tauri/deb_files/postinst src-tauri/deb_files/prerm src-tauri/deb_files/preinst "$INTERMEDIATE_DIR/control/"
-
-# Add the Tunnel service
-cp ../target/release/firezone-client-tunnel "$INTERMEDIATE_DIR/data/usr/bin/"
-
-pushd "$INTERMEDIATE_DIR"
-
-# Rebuild the control tarball
-tar -C "control" -czf "control.tar.gz" control md5sums preinst postinst prerm
-
-# Rebuild the data tarball
-tar -C "data" -czf "data.tar.gz" usr
-
-# Rebuild the deb package, and give it a predictable name that
-# `tauri-rename-linux.sh` can fix
-ar rcs "../firezone-client-gui.deb" debian-binary control.tar.gz data.tar.gz
-popd
diff --git a/rust/gui-client/src-tauri/deb_files/firezone-client-gui.desktop b/rust/gui-client/src-tauri/linux_package/firezone-client-gui.desktop
similarity index 83%
rename from rust/gui-client/src-tauri/deb_files/firezone-client-gui.desktop
rename to rust/gui-client/src-tauri/linux_package/firezone-client-gui.desktop
index 1179759a6..63a7fe782 100644
--- a/rust/gui-client/src-tauri/deb_files/firezone-client-gui.desktop
+++ b/rust/gui-client/src-tauri/linux_package/firezone-client-gui.desktop
@@ -3,6 +3,6 @@ Categories=
Comment=Firezone
Exec={{exec}}
Icon={{icon}}
-Name=Firezone Client
+Name=Firezone
Terminal=false
Type=Application
diff --git a/rust/gui-client/src-tauri/deb_files/firezone-client-tunnel.service b/rust/gui-client/src-tauri/linux_package/firezone-client-tunnel.service
similarity index 100%
rename from rust/gui-client/src-tauri/deb_files/firezone-client-tunnel.service
rename to rust/gui-client/src-tauri/linux_package/firezone-client-tunnel.service
diff --git a/rust/gui-client/src-tauri/deb_files/postinst b/rust/gui-client/src-tauri/linux_package/postinst
similarity index 100%
rename from rust/gui-client/src-tauri/deb_files/postinst
rename to rust/gui-client/src-tauri/linux_package/postinst
diff --git a/rust/gui-client/src-tauri/deb_files/preinst b/rust/gui-client/src-tauri/linux_package/preinst
similarity index 100%
rename from rust/gui-client/src-tauri/deb_files/preinst
rename to rust/gui-client/src-tauri/linux_package/preinst
diff --git a/rust/gui-client/src-tauri/deb_files/prerm b/rust/gui-client/src-tauri/linux_package/prerm
similarity index 100%
rename from rust/gui-client/src-tauri/deb_files/prerm
rename to rust/gui-client/src-tauri/linux_package/prerm
diff --git a/rust/gui-client/src-tauri/deb_files/sysusers.conf b/rust/gui-client/src-tauri/linux_package/sysusers.conf
similarity index 100%
rename from rust/gui-client/src-tauri/deb_files/sysusers.conf
rename to rust/gui-client/src-tauri/linux_package/sysusers.conf
diff --git a/rust/gui-client/src-tauri/rpm_files/firezone-client-gui.desktop b/rust/gui-client/src-tauri/rpm_files/firezone-client-gui.desktop
deleted file mode 100644
index 42ed02cd9..000000000
--- a/rust/gui-client/src-tauri/rpm_files/firezone-client-gui.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Categories=
-Comment=Firezone
-Exec=firezone-client-gui
-Icon=firezone-client-gui
-Name=Firezone Client
-Terminal=false
-Type=Application
diff --git a/rust/gui-client/src-tauri/rpm_files/firezone-gui-client.spec b/rust/gui-client/src-tauri/rpm_files/firezone-gui-client.spec
deleted file mode 100644
index b402daf6c..000000000
--- a/rust/gui-client/src-tauri/rpm_files/firezone-gui-client.spec
+++ /dev/null
@@ -1,202 +0,0 @@
-Name: firezone-client-gui
-# mark:next-gui-version
-Version: 1.4.14
-Release: 1%{?dist}
-Summary: The GUI Client for Firezone
-
-URL: https://firezone.dev
-License: Apache-2.0
-Requires: systemd-resolved
-BuildRequires: systemd-rpm-macros
-
-# For some reason, the Ubuntu version of `rpmbuild` notices that we're providing our own WebKit and other libs, but the CentOS version doesn't. So we explicitly tell it not to worry about all these libs.
-%global __requires_exclude ^(libdbus-1|libgdk-3|libgio-2.0|libglib-2.0|libgtk-3|libjavascriptcoregtk-4.1|libm|libsoup-3.0|libwebkit2gtk-4.1).so.*
-
-%description
-
-%prep
-
-%pre
-# Stop and disable the old service. The service may no longer exist so we ensure this never fails.
-systemctl disable "$OLD_SERVICE_NAME" >/dev/null 2>&1 || true
-systemctl stop "$OLD_SERVICE_NAME" >/dev/null 2>&1 || true
-
-%build
-
-%install
-mkdir -p \
-"%{buildroot}/usr/bin" \
-"%{buildroot}/usr/lib/dev.firezone.client/unused"
-
-BINS="%{_topdir}/../../target/release"
-
-cp "$BINS/firezone-client-tunnel" "%{buildroot}/usr/bin/"
-cp "$BINS/firezone-client-gui" "%{buildroot}/usr/lib/dev.firezone.client/"
-cp "%{_topdir}/../src-tauri/rpm_files/gui-shim.sh" "%{buildroot}/usr/bin/firezone-client-gui"
-
-LIBS="/root/libs/$(uname -m)-linux-gnu"
-
-# DNF expects libc and ld-linux to be packaged, because it checks the exes with ldd or something, but if we actually use them, the GUI process will segfault. So just dump them somewhere unused.
-UNUSED_DIR="%{buildroot}/usr/lib/dev.firezone.client/unused"
-
-%ifarch aarch64
-cp \
-"$LIBS/ld-linux-aarch64.so.1" \
-"$LIBS/libc.so.6" \
-"$UNUSED_DIR"
-%endif
-
-%ifarch x86_64
-cp \
-"$LIBS/ld-linux-x86-64.so.2" \
-"$LIBS/libc.so.6" \
-"$UNUSED_DIR"
-%endif
-
-cp \
-"$LIBS/libappindicator3.so.1" \
-"$LIBS/libayatana-appindicator3.so.1" \
-"$LIBS/libayatana-ido3-0.4.so.0" \
-"$LIBS/libayatana-indicator3.so.7" \
-"$LIBS/libdbus-1.so.3" \
-"$LIBS/libdbusmenu-glib.so.4" \
-"$LIBS/libdbusmenu-gtk3.so.4" \
-"$LIBS/libfreetype.so.6" \
-"$LIBS/libgdk-3.so.0" \
-"$LIBS/libgio-2.0.so.0" \
-"$LIBS/libglib-2.0.so.0" \
-"$LIBS/libgmodule-2.0.so.0" \
-"$LIBS/libgtk-3.so.0" \
-"$LIBS/libicudata.so.70" \
-"$LIBS/libicui18n.so.70" \
-"$LIBS/libicuuc.so.70" \
-"$LIBS/libjavascriptcoregtk-4.1.so.0" \
-"$LIBS/libjpeg.so.8" \
-"$LIBS/libm.so.6" \
-"$LIBS/libmanette-0.2.so.0" \
-"$LIBS/libpcre.so.3" \
-"$LIBS/libpcre2-8.so.0" \
-"$LIBS/libsoup-3.0.so.0" \
-"$LIBS/libstdc++.so.6" \
-"$LIBS/libwayland-client.so.0" \
-"$LIBS/libwayland-server.so.0" \
-"$LIBS/libwebkit2gtk-4.1.so.0" \
-"$LIBS/libxcb.so.1" \
-"$LIBS/libxcb-shm.so.0" \
-"$LIBS/libX11.so.6" \
-"$LIBS/libX11-xcb.so.1" \
-"%{buildroot}/usr/lib/dev.firezone.client/"
-
-ls -lash "%{buildroot}/usr/lib/dev.firezone.client"
-
-WEBKIT_DIR="$(uname -m)-linux-gnu/webkit2gtk-4.1"
-mkdir -p "%{buildroot}/usr/lib/$WEBKIT_DIR"
-
-cp \
-"/root/libs/$WEBKIT_DIR/WebKitNetworkProcess" \
-"/root/libs/$WEBKIT_DIR/WebKitWebProcess" \
-"%{buildroot}/usr/lib/$WEBKIT_DIR"
-
-ICONS="%{buildroot}/usr/share/icons/hicolor"
-
-mkdir -p \
-"%{buildroot}/usr/lib/systemd/system" \
-"%{buildroot}/usr/lib/sysusers.d" \
-"%{buildroot}/usr/share/applications" \
-"$ICONS/32x32/apps" \
-"$ICONS/128x128/apps" \
-"$ICONS/512x512/apps"
-
-cp \
-"%{_topdir}/../src-tauri/deb_files/firezone-client-tunnel.service" \
-"%{buildroot}/usr/lib/systemd/system/"
-
-cp \
-"%{_topdir}/../src-tauri/deb_files/sysusers.conf" \
-"%{buildroot}/usr/lib/sysusers.d/firezone-client-tunnel.conf"
-
-cp \
-"%{_topdir}/../src-tauri/rpm_files/firezone-client-gui.desktop" \
-"%{buildroot}/usr/share/applications/"
-
-cp \
-"%{_topdir}/../src-tauri/icons/32x32.png" \
-"$ICONS/32x32/apps/firezone-client-gui.png"
-
-cp \
-"%{_topdir}/../src-tauri/icons/128x128.png" \
-"$ICONS/128x128/apps/firezone-client-gui.png"
-
-cp \
-"%{_topdir}/../src-tauri/icons/icon.png" \
-"$ICONS/512x512/apps/firezone-client-gui.png"
-
-%files
-/usr/bin/firezone-client-tunnel
-/usr/bin/firezone-client-gui
-/usr/lib/dev.firezone.client/firezone-client-gui
-
-/usr/lib/dev.firezone.client/libappindicator3.so.1
-/usr/lib/dev.firezone.client/libayatana-appindicator3.so.1
-/usr/lib/dev.firezone.client/libayatana-ido3-0.4.so.0
-/usr/lib/dev.firezone.client/libayatana-indicator3.so.7
-/usr/lib/dev.firezone.client/libdbus-1.so.3
-/usr/lib/dev.firezone.client/libdbusmenu-glib.so.4
-/usr/lib/dev.firezone.client/libdbusmenu-gtk3.so.4
-/usr/lib/dev.firezone.client/libfreetype.so.6
-/usr/lib/dev.firezone.client/libgdk-3.so.0
-/usr/lib/dev.firezone.client/libgio-2.0.so.0
-/usr/lib/dev.firezone.client/libglib-2.0.so.0
-/usr/lib/dev.firezone.client/libgmodule-2.0.so.0
-/usr/lib/dev.firezone.client/libgtk-3.so.0
-/usr/lib/dev.firezone.client/libicudata.so.70
-/usr/lib/dev.firezone.client/libicui18n.so.70
-/usr/lib/dev.firezone.client/libicuuc.so.70
-/usr/lib/dev.firezone.client/libjavascriptcoregtk-4.1.so.0
-/usr/lib/dev.firezone.client/libjpeg.so.8
-/usr/lib/dev.firezone.client/libm.so.6
-/usr/lib/dev.firezone.client/libmanette-0.2.so.0
-/usr/lib/dev.firezone.client/libpcre.so.3
-/usr/lib/dev.firezone.client/libpcre2-8.so.0
-/usr/lib/dev.firezone.client/libsoup-3.0.so.0
-/usr/lib/dev.firezone.client/libstdc++.so.6
-/usr/lib/dev.firezone.client/libwayland-client.so.0
-/usr/lib/dev.firezone.client/libwayland-server.so.0
-/usr/lib/dev.firezone.client/libwebkit2gtk-4.1.so.0
-/usr/lib/dev.firezone.client/libxcb.so.1
-/usr/lib/dev.firezone.client/libxcb-shm.so.0
-/usr/lib/dev.firezone.client/libX11.so.6
-/usr/lib/dev.firezone.client/libX11-xcb.so.1
-
-/usr/lib/systemd/system/firezone-client-tunnel.service
-/usr/lib/sysusers.d/firezone-client-tunnel.conf
-
-/usr/share/applications/firezone-client-gui.desktop
-/usr/share/icons/hicolor/32x32/apps/firezone-client-gui.png
-/usr/share/icons/hicolor/128x128/apps/firezone-client-gui.png
-/usr/share/icons/hicolor/512x512/apps/firezone-client-gui.png
-
-%ifarch aarch64
-/usr/lib/aarch64-linux-gnu/webkit2gtk-4.1/WebKitNetworkProcess
-/usr/lib/aarch64-linux-gnu/webkit2gtk-4.1/WebKitWebProcess
-
-/usr/lib/dev.firezone.client/unused/ld-linux-aarch64.so.1
-/usr/lib/dev.firezone.client/unused/libc.so.6
-%endif
-
-%ifarch x86_64
-/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1/WebKitNetworkProcess
-/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1/WebKitWebProcess
-
-/usr/lib/dev.firezone.client/unused/ld-linux-x86-64.so.2
-/usr/lib/dev.firezone.client/unused/libc.so.6
-%endif
-
-%post
-%systemd_post firezone-client-tunnel.service
-
-%preun
-%systemd_preun firezone-client-tunnel.service
-
-%postun
-%systemd_postun_with_restart firezone-client-tunnel.service
diff --git a/rust/gui-client/src-tauri/rpm_files/gui-shim.sh b/rust/gui-client/src-tauri/rpm_files/gui-shim.sh
deleted file mode 100755
index 49f450b98..000000000
--- a/rust/gui-client/src-tauri/rpm_files/gui-shim.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-# Installed as `/usr/bin/firezone-client-gui` on RPM systems since we bundle a bunch of libs
-
-set -euo pipefail
-
-LD_LIBRARY_PATH=/usr/lib/dev.firezone.client exec /usr/lib/dev.firezone.client/firezone-client-gui
diff --git a/rust/gui-client/src-tauri/tauri.conf.json b/rust/gui-client/src-tauri/tauri.conf.json
index 3ee83639d..c75c329ea 100644
--- a/rust/gui-client/src-tauri/tauri.conf.json
+++ b/rust/gui-client/src-tauri/tauri.conf.json
@@ -9,18 +9,35 @@
"shortDescription": "Firezone",
"linux": {
"deb": {
+ "preInstallScript": "./linux_package/preinst",
+ "postInstallScript": "./linux_package/postinst",
+ "preRemoveScript": "./linux_package/prerm",
"files": {
- "/usr/lib/systemd/system/firezone-client-tunnel.service": "./deb_files/firezone-client-tunnel.service",
- "/usr/lib/sysusers.d/firezone-client-tunnel.conf": "./deb_files/sysusers.conf"
+ "/usr/lib/systemd/system/firezone-client-tunnel.service": "./linux_package/firezone-client-tunnel.service",
+ "/usr/lib/sysusers.d/firezone-client-tunnel.conf": "./linux_package/sysusers.conf",
+ "/usr/bin/firezone-client-tunnel": "../../target/release/firezone-client-tunnel"
},
- "desktopTemplate": "./deb_files/firezone-client-gui.desktop"
+ "desktopTemplate": "./linux_package/firezone-client-gui.desktop"
+ },
+ "rpm": {
+ "postInstallScript": "./linux_package/postinst",
+ "preRemoveScript": "./linux_package/prerm",
+ "files": {
+ "/usr/lib/systemd/system/firezone-client-tunnel.service": "./linux_package/firezone-client-tunnel.service",
+ "/usr/lib/sysusers.d/firezone-client-tunnel.conf": "./linux_package/sysusers.conf",
+ "/usr/bin/firezone-client-tunnel": "../../target/release/firezone-client-tunnel"
+ },
+ "desktopTemplate": "./linux_package/firezone-client-gui.desktop"
}
},
- "targets": ["deb", "msi"],
+ "targets": ["deb", "msi", "rpm"],
"windows": {
"wix": {
"bannerPath": "./win_files/banner.png",
- "componentRefs": ["RemoveOldFirezoneService", "FirezoneClientTunnelService"],
+ "componentRefs": [
+ "RemoveOldFirezoneService",
+ "FirezoneClientTunnelService"
+ ],
"dialogImagePath": "./win_files/install_dialog.png",
"fragmentPaths": ["./win_files/service.wxs"],
"template": "./win_files/main.wxs"
diff --git a/scripts/build/tauri-rename-linux.sh b/scripts/build/tauri-rename-linux.sh
index bfec8645b..56b1d665a 100755
--- a/scripts/build/tauri-rename-linux.sh
+++ b/scripts/build/tauri-rename-linux.sh
@@ -5,24 +5,16 @@
set -euox pipefail
# For debugging
-ls "$TARGET_DIR/release" "$TARGET_DIR/release/bundle/deb"
+ls "$TARGET_DIR/release" "$TARGET_DIR/release/bundle/deb" "$TARGET_DIR/release/bundle/rpm"
-# Used for release artifact
# In release mode the name comes from tauri.conf.json
-# Using a glob for the source, there will only be one exe and one deb anyway
-cp "$TARGET_DIR/release/firezone-client-gui" "$BINARY_DEST_PATH"
-cp "$TARGET_DIR/release/firezone-gui-client.dwp" "$BINARY_DEST_PATH.dwp"
-cp "$TARGET_DIR/release/bundle/deb/firezone-client-gui.deb" "$BINARY_DEST_PATH.deb"
-cp "$TARGET_DIR/../gui-client/firezone-client-gui.rpm" "$BINARY_DEST_PATH.rpm"
-# TODO: Debug symbols for Linux
+# Using a glob for the source, there will only be one deb anyway
+cp $TARGET_DIR/release/bundle/deb/firezone-client-gui*.deb "$BINARY_DEST_PATH.deb"
+cp $TARGET_DIR/release/bundle/rpm/firezone-client-gui*.rpm "$BINARY_DEST_PATH.rpm"
function make_hash() {
sha256sum "$1" >"$1.sha256sum.txt"
}
-# Windows calls it `x64`, Debian `amd64`. Standardize on `x86_64` here since that's
-# what Rust uses.
-make_hash "$BINARY_DEST_PATH"
-make_hash "$BINARY_DEST_PATH.dwp"
make_hash "$BINARY_DEST_PATH.deb"
make_hash "$BINARY_DEST_PATH.rpm"
diff --git a/scripts/bump-versions.sh b/scripts/bump-versions.sh
index b2d3b9a4f..cd7b9993c 100755
--- a/scripts/bump-versions.sh
+++ b/scripts/bump-versions.sh
@@ -138,7 +138,6 @@ function gui() {
find website -type f -name "route.ts" -exec sed "${SEDARG[@]}" -e '/mark:current-gui-version/{n;s/[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/'"${current_gui_version}"'/g;}' {} \;
find .github -type f -exec sed "${SEDARG[@]}" -e '/mark:next-gui-version/{n;s/[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/'"${next_gui_version}"'/g;}' {} \;
find rust -path rust/gui-client/node_modules -prune -o -path rust/target -prune -o -name "Cargo.toml" -exec sed "${SEDARG[@]}" -e '/mark:next-gui-version/{n;s/[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/'"${next_gui_version}"'/;}' {} \;
- find rust -path rust/gui-client/node_modules -prune -o -path rust/target -prune -o -name "*.spec" -exec sed "${SEDARG[@]}" -e '/mark:next-gui-version/{n;s/[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/'"${next_gui_version}"'/;}' {} \;
cargo_update_workspace
}
diff --git a/scripts/tests/linux-group.sh b/scripts/tests/linux-group.sh
index 91e924a97..ac728163a 100755
--- a/scripts/tests/linux-group.sh
+++ b/scripts/tests/linux-group.sh
@@ -24,7 +24,7 @@ function debug_exit() {
sudo cp "rust/target/debug/$BINARY_NAME" "/usr/bin/$BINARY_NAME"
# Set up the systemd service
-sudo cp "rust/gui-client/src-tauri/deb_files/$SERVICE_NAME.service" /usr/lib/systemd/system/
+sudo cp "rust/gui-client/src-tauri/linux_package/$SERVICE_NAME.service" /usr/lib/systemd/system/
sudo cp "scripts/tests/systemd/env" "/etc/default/firezone-client-tunnel"
# The firezone group must exist before the daemon starts
diff --git a/website/src/app/kb/client-apps/linux-gui-client/readme.mdx b/website/src/app/kb/client-apps/linux-gui-client/readme.mdx
index a9c37c3b3..56da173f8 100644
--- a/website/src/app/kb/client-apps/linux-gui-client/readme.mdx
+++ b/website/src/app/kb/client-apps/linux-gui-client/readme.mdx
@@ -15,7 +15,7 @@ present to authenticate with your identity provider interactively.
## Prerequisites
- **x86-64** or **ARM64** CPU architecture
-- Ubuntu **22.04** or higher, or CentOS 9 or higher. Other distributions may
+- Ubuntu **22.04** or higher, or CentOS 10 or higher. Other distributions may
work, but are not officially supported.
- **systemd-resolved**. Ubuntu already uses this by default.
@@ -44,49 +44,51 @@ reboot
To auto-start the Client when you log in, run
`firezone-client-gui debug set-autostart true`
-## Installation (CentOS)
+## Installation (CentOS 10)
-### Step 1: Install system tray
+### Step 1: Install repositories
-GNOME Shell 40 in CentOS 9 does not have a system tray by default. Use these
+These are required for both GNOME extensions and the WebKit and other dependencies
+of the Firezone Client.
+
+1. `sudo dnf config-manager --set-enabled crb`
+1. `sudo dnf install epel-release`
+
+### Step 2: Install system tray
+
+GNOME Shell in CentOS does not have a system tray by default. Use these
steps to install it. For other desktops like xfce4 or KDE, the system tray may
already work properly.
-1. `sudo dnf install epel-release` (Needed to get GNOME extensions)
-2. `sudo dnf install gnome-shell-extension-appindicator`
-3. Log out and back in to restart GNOME
-4. `gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com`
+1. `sudo dnf install gnome-shell-extension-appindicator`
+1. Log out and back in to restart GNOME
+1. `gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com`
+1. Optionally: To manage GNOME extensions via a GUI, install `gnome-extensions-app`
-### Step 2: Install Firezone
+### Step 3: Install Firezone
1. Download the RPM:
[Download the latest Linux GUI `.rpm` from GitHub Releases](https://www.github.com/firezone/firezone/releases)
-2. `sudo dnf install systemd-resolved` (Installing it explicitly prevents it
+1. `sudo dnf install systemd-resolved` (Installing it explicitly prevents it
from being auto-removed if Firezone is removed)
-3. `sudo dnf install ./firezone-client-gui-*.rpm`
-4. `sudo usermod -aG firezone-client $USER`
-5. `sudo systemctl enable firezone-client-tunnel.service` (See
- https://www.freedesktop.org/software/systemd/man/latest/systemd.preset.html,
- "It is not recommended to ship preset files within the respective software
- packages implementing the units". The Fedora family of distros also seem to
- have their own policy that installing a service should not auto-start or
- enable it.)
-6. Reboot to finish adding yourself to the group. Logging out and back in is not
+1. `sudo dnf install ./firezone-client-gui-*.rpm`
+1. `sudo usermod -aG firezone-client $USER`
+1. Reboot to finish adding yourself to the group. Logging out and back in is not
enough. This also starts the new services for us.
-7. `sudo cp /etc/resolv.conf /etc/resolv.conf.before-firezone` Back up your
+1. `sudo cp /etc/resolv.conf /etc/resolv.conf.before-firezone` Back up your
resolv.conf file. If anything goes wrong with your DNS, you can copy this
back into place.
-8. `sudo ln --force --symbolic /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf`
+1. `sudo ln --force --symbolic /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf`
This puts `systemd-resolved`, and therefore Firezone, in control of the
system's DNS. `systemd-resolved` does not do this automatically, since it's
under `/etc`.
-9. Run `Firezone Client` from the app menu.
+1. Run `Firezone` from the app menu.
## Usage
### Signing in
-1. Start the GUI by running `Firezone Client` from your desktop environment's
+1. Start the GUI by running `Firezone` from your desktop environment's
application menu or from an interactive shell.
1. At the Welcome screen, click `Sign in`. This will open the Firezone sign-in
page in your default web browser.
diff --git a/website/src/components/Changelog/GUI.tsx b/website/src/components/Changelog/GUI.tsx
index 6a0a990ef..6f2349983 100644
--- a/website/src/components/Changelog/GUI.tsx
+++ b/website/src/components/Changelog/GUI.tsx
@@ -29,6 +29,11 @@ export default function GUI({ os }: { os: OS }) {
to `firezone-client-tunnel.service`.
)}
+ {os === OS.Linux && (
+
+ Increases minimum supported CentOS version to 10.
+
+ )}