Skip to content

Instantly share code, notes, and snippets.

@jzr-supove
Last active July 20, 2026 09:15
Show Gist options
  • Select an option

  • Save jzr-supove/dbca9fa72d35dadb8f19b7b67d7ff198 to your computer and use it in GitHub Desktop.

Select an option

Save jzr-supove/dbca9fa72d35dadb8f19b7b67d7ff198 to your computer and use it in GitHub Desktop.
Fedora native Outline Client installer

Download the install-outline-fedora.sh script

Run it:

chmod +x install-outline-fedora.sh
./install-outline-fedora.sh

Then start Outline:

outline-client
#!/usr/bin/env bash
set -Eeuo pipefail
readonly APP_ID="org.getoutline.OutlineClient"
readonly DOWNLOAD_URL="https://s3.amazonaws.com/outline-releases/client/linux/stable/outline-client_amd64.deb"
readonly INSTALL_DIR="/opt/Outline"
WORK_DIR=""
log() {
printf '\n\033[1;34m==>\033[0m %s\n' "$*"
}
error() {
printf '\n\033[1;31mError:\033[0m %s\n' "$*" >&2
exit 1
}
cleanup() {
if [[ -n "${WORK_DIR:-}" && -d "$WORK_DIR" ]]; then
rm -rf "$WORK_DIR"
fi
}
trap cleanup EXIT
# Do not run the entire script as root. It invokes sudo only where needed.
if [[ "$EUID" -eq 0 ]]; then
error "Run this script as your normal user, not with sudo."
fi
# The official Linux package is currently amd64/x86_64.
case "$(uname -m)" in
x86_64 | amd64)
;;
*)
error "Unsupported architecture: $(uname -m). This installer requires x86_64."
;;
esac
log "Requesting administrator access"
sudo -v
log "Removing the broken Flatpak installation"
if command -v flatpak >/dev/null 2>&1; then
flatpak kill "$APP_ID" 2>/dev/null || true
flatpak override --user --reset "$APP_ID" 2>/dev/null || true
if flatpak info "$APP_ID" >/dev/null 2>&1; then
flatpak uninstall -y "$APP_ID"
fi
fi
log "Installing Fedora dependencies"
sudo dnf install -y \
curl \
dpkg \
libcap \
NetworkManager \
gtk3 \
nss \
alsa-lib \
libdrm \
mesa-libgbm \
libnotify \
libXScrnSaver \
libXtst \
libsecret \
at-spi2-core \
libuuid \
xdg-utils \
desktop-file-utils \
hicolor-icon-theme
log "Ensuring NetworkManager and TUN support are available"
sudo systemctl enable --now NetworkManager
if [[ ! -c /dev/net/tun ]]; then
sudo modprobe tun
fi
if [[ ! -c /dev/net/tun ]]; then
error "/dev/net/tun is still unavailable after loading the tun module."
fi
WORK_DIR="$(mktemp -d)"
DEB_FILE="$WORK_DIR/outline-client_amd64.deb"
log "Downloading the official Outline Client package"
curl \
--fail \
--location \
--retry 3 \
--retry-delay 2 \
--connect-timeout 20 \
--output "$DEB_FILE" \
"$DOWNLOAD_URL"
log "Validating the downloaded package"
dpkg-deb --info "$DEB_FILE" >/dev/null ||
error "The downloaded file is not a valid Debian package."
PACKAGE_NAME="$(dpkg-deb --field "$DEB_FILE" Package)"
PACKAGE_ARCH="$(dpkg-deb --field "$DEB_FILE" Architecture)"
PACKAGE_VERSION="$(dpkg-deb --field "$DEB_FILE" Version)"
[[ "$PACKAGE_NAME" == "outline-client" ]] ||
error "Unexpected package name: $PACKAGE_NAME"
[[ "$PACKAGE_ARCH" == "amd64" ]] ||
error "Unexpected package architecture: $PACKAGE_ARCH"
log "Installing Outline Client $PACKAGE_VERSION"
# dpkg cannot register Debian packages properly in Fedora's RPM database.
# Extracting the package payload installs the application without pretending
# that it is an RPM package.
sudo rm -rf "$INSTALL_DIR"
sudo dpkg-deb --extract "$DEB_FILE" /
[[ -x "$INSTALL_DIR/Outline" ]] ||
error "Outline executable was not installed at $INSTALL_DIR/Outline"
[[ -f "$INSTALL_DIR/chrome-sandbox" ]] ||
error "Chromium sandbox executable was not installed."
log "Applying ownership and SELinux labels"
sudo chown -R root:root "$INSTALL_DIR"
sudo restorecon -RF "$INSTALL_DIR" 2>/dev/null || true
log "Configuring the Chromium sandbox"
sudo chown root:root "$INSTALL_DIR/chrome-sandbox"
sudo chmod 4755 "$INSTALL_DIR/chrome-sandbox"
log "Granting the networking capabilities required to create TUN interfaces"
sudo setcap \
'cap_net_admin,cap_dac_override+eip' \
"$INSTALL_DIR/Outline"
log "Creating a command-line launcher"
sudo ln -sfn "$INSTALL_DIR/Outline" /usr/local/bin/outline-client
log "Refreshing desktop application metadata"
sudo update-desktop-database /usr/share/applications 2>/dev/null || true
sudo gtk-update-icon-cache \
--force \
--ignore-theme-index \
/usr/share/icons/hicolor 2>/dev/null || true
log "Verifying the installation"
CAPABILITIES="$(getcap "$INSTALL_DIR/Outline" || true)"
SANDBOX_MODE="$(stat --format='%a' "$INSTALL_DIR/chrome-sandbox")"
printf 'Outline version: %s\n' "$PACKAGE_VERSION"
printf 'Executable: %s\n' "$INSTALL_DIR/Outline"
printf 'Capabilities: %s\n' "${CAPABILITIES:-missing}"
printf 'chrome-sandbox mode: %s\n' "$SANDBOX_MODE"
printf 'TUN device: %s\n' "/dev/net/tun"
[[ "$CAPABILITIES" == *"cap_net_admin"* ]] ||
error "cap_net_admin was not applied successfully."
[[ "$CAPABILITIES" == *"cap_dac_override"* ]] ||
error "cap_dac_override was not applied successfully."
[[ "$SANDBOX_MODE" == "4755" ]] ||
error "chrome-sandbox does not have mode 4755."
cat <<'EOF'
Outline Client was installed successfully.
Launch it from the application menu or run:
outline-client
Do not launch it with sudo.
This installation is not tracked by Fedora's RPM package manager.
Run this installer again to update Outline to the latest stable version.
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment