[Feature] Better setup / install docs / avoid reinventing the wheel #987

Closed
opened 2025-12-29 02:27:04 +01:00 by adam · 5 comments
Owner

Originally created by @tgrushka on GitHub (Mar 26, 2025).

Use case

Thanks for this project. Trying to set up / figure it out.

Considering the simplicity of installation of other popular, well-known projects:

Why can't we just have a command-line install like these have?

This manual config of version numbers is really tedious, especially if we each have to re-invent the wheel to do an automated / semi-auto update process, since this is not part of a packaged system.

Here's what DeepSeek just generated for me (no idea if it works yet), but why can't this repo have an official shell script that we just curl and it does this for us? It would save countless hours across thousands of people.

Thank you....

Description

Here's a script that automatically fetches and installs the latest headscale .deb package for your system's architecture:

#!/bin/bash

set -euo pipefail

# Check required commands
command -v curl >/dev/null || { echo "Error: curl required" >&2; exit 1; }
command -v jq >/dev/null || { echo "Error: jq required" >&2; exit 1; }

# Get latest version
API_URL="https://api.github.com/repos/juanfont/headscale/releases/latest"
TAG=$(curl -s "$API_URL" | jq -r '.tag_name')
VERSION="${TAG#v}"  # Remove 'v' prefix

# Get system architecture
ARCH=$(dpkg --print-architecture)

# Build download URL
DEB_URL="https://github.com/juanfont/headscale/releases/download/${TAG}/headscale_${VERSION}_linux_${ARCH}.deb"

# Download package
echo "Downloading headscale ${VERSION} (${ARCH})..."
curl -L -o headscale.deb "$DEB_URL"

# Install package
echo "Installing..."
sudo apt install -y ./headscale.deb

# Cleanup
rm -f headscale.deb

echo -e "\nInstallation complete!"
echo "Configure headscale: sudo nano /etc/headscale/config.yaml"
echo "Start service: sudo systemctl enable --now headscale"

Features:

  • Automatically detects latest version from GitHub API
  • Uses your system's architecture (amd64/arm64/etc)
  • Uses Debian's package architecture naming convention
  • Handles GitHub's redirects for actual download
  • Clean error checking and dependencies verification

To use:

  • Save as install-headscale.sh
  • chmod +x install-headscale.sh
  • sudo ./install-headscale.sh

The script will:

  • Check for required dependencies (curl + jq)
  • Find the latest release version
  • Determine your system architecture
  • Download the correct package
  • Install using apt
  • Clean up temporary files
  • Show post-install instructions

Note: You may need to install jq first (sudo apt install jq) if you don't have it already.

Contribution

  • I can write the design doc for this feature
  • I can contribute this feature

How can it be implemented?

Create a shell script and curl command line that can be run to automate install/upgrade.
If it's infeasible to do on multiple distros, at least create the recommended one that will run on Ubuntu/Debian.

Originally created by @tgrushka on GitHub (Mar 26, 2025). ### Use case Thanks for this project. Trying to set up / figure it out. Considering the simplicity of installation of other popular, well-known projects: - Rust: https://rustup.rs/ - Homebrew: https://brew.sh/ - many others... Why can't we just have a command-line install like these have? This manual config of version numbers is really tedious, especially if we each have to re-invent the wheel to do an automated / semi-auto update process, since this is not part of a packaged system. Here's what DeepSeek just generated for me (no idea if it works yet), but why can't this repo have an official shell script that we just curl and it does this for us? It would save countless hours across thousands of people. Thank you.... ### Description Here's a script that automatically fetches and installs the latest headscale .deb package for your system's architecture: ```bash #!/bin/bash set -euo pipefail # Check required commands command -v curl >/dev/null || { echo "Error: curl required" >&2; exit 1; } command -v jq >/dev/null || { echo "Error: jq required" >&2; exit 1; } # Get latest version API_URL="https://api.github.com/repos/juanfont/headscale/releases/latest" TAG=$(curl -s "$API_URL" | jq -r '.tag_name') VERSION="${TAG#v}" # Remove 'v' prefix # Get system architecture ARCH=$(dpkg --print-architecture) # Build download URL DEB_URL="https://github.com/juanfont/headscale/releases/download/${TAG}/headscale_${VERSION}_linux_${ARCH}.deb" # Download package echo "Downloading headscale ${VERSION} (${ARCH})..." curl -L -o headscale.deb "$DEB_URL" # Install package echo "Installing..." sudo apt install -y ./headscale.deb # Cleanup rm -f headscale.deb echo -e "\nInstallation complete!" echo "Configure headscale: sudo nano /etc/headscale/config.yaml" echo "Start service: sudo systemctl enable --now headscale" ``` Features: - Automatically detects latest version from GitHub API - Uses your system's architecture (amd64/arm64/etc) - Uses Debian's package architecture naming convention - Handles GitHub's redirects for actual download - Clean error checking and dependencies verification To use: - Save as install-headscale.sh - chmod +x install-headscale.sh - sudo ./install-headscale.sh The script will: - Check for required dependencies (curl + jq) - Find the latest release version - Determine your system architecture - Download the correct package - Install using apt - Clean up temporary files - Show post-install instructions Note: You may need to install jq first (sudo apt install jq) if you don't have it already. ### Contribution - [ ] I can write the design doc for this feature - [ ] I can contribute this feature ### How can it be implemented? Create a shell script and curl command line that can be run to automate install/upgrade. If it's infeasible to do on multiple distros, at least create the recommended one that will run on Ubuntu/Debian.
adam added the enhancementstale labels 2025-12-29 02:27:04 +01:00
adam closed this issue 2025-12-29 02:27:04 +01:00
Author
Owner

@tgrushka commented on GitHub (Mar 26, 2025):

And it took two more iterations to get it right and get rid of the sandboxed warning:

(Imagine thousands of users going through the same process that I did and trying to figure it out... Maybe a "first-world problem," but so does this project solve for that matter...)

#!/bin/bash

set -euo pipefail

# Check required commands
command -v curl >/dev/null || { echo "Error: curl required" >&2; exit 1; }
command -v jq >/dev/null || { echo "Error: jq required" >&2; exit 1; }

# Create temp directory with proper permissions
TMPDIR=$(mktemp -d)
chmod 755 "$TMPDIR"  # Critical: Make directory accessible to _apt user
trap 'rm -rf "$TMPDIR"' EXIT

# Get latest version
API_URL="https://api.github.com/repos/juanfont/headscale/releases/latest"
TAG=$(curl -s "$API_URL" | jq -r '.tag_name')
VERSION="${TAG#v}"  # Remove 'v' prefix

# Get system architecture
ARCH=$(dpkg --print-architecture)

# Build download URL
DEB_URL="https://github.com/juanfont/headscale/releases/download/${TAG}/headscale_${VERSION}_linux_${ARCH}.deb"

# Download package to temp directory
DEB_FILE="${TMPDIR}/headscale.deb"
echo "Downloading headscale ${VERSION} (${ARCH})..."
curl -L -o "$DEB_FILE" "$DEB_URL"
chmod 644 "$DEB_FILE"  # Make .deb file readable by all users

# Install package from temp location
echo "Installing..."
sudo apt install -y "$DEB_FILE"

echo -e "\nInstallation complete!"
echo "Configure headscale: sudo nano /etc/headscale/config.yaml"
echo "Check service status: sudo systemctl status headscale"
@tgrushka commented on GitHub (Mar 26, 2025): And it took two more iterations to get it right and get rid of the sandboxed warning: (Imagine thousands of users going through the same process that I did and trying to figure it out... Maybe a "first-world problem," but so does this project solve for that matter...) ```bash #!/bin/bash set -euo pipefail # Check required commands command -v curl >/dev/null || { echo "Error: curl required" >&2; exit 1; } command -v jq >/dev/null || { echo "Error: jq required" >&2; exit 1; } # Create temp directory with proper permissions TMPDIR=$(mktemp -d) chmod 755 "$TMPDIR" # Critical: Make directory accessible to _apt user trap 'rm -rf "$TMPDIR"' EXIT # Get latest version API_URL="https://api.github.com/repos/juanfont/headscale/releases/latest" TAG=$(curl -s "$API_URL" | jq -r '.tag_name') VERSION="${TAG#v}" # Remove 'v' prefix # Get system architecture ARCH=$(dpkg --print-architecture) # Build download URL DEB_URL="https://github.com/juanfont/headscale/releases/download/${TAG}/headscale_${VERSION}_linux_${ARCH}.deb" # Download package to temp directory DEB_FILE="${TMPDIR}/headscale.deb" echo "Downloading headscale ${VERSION} (${ARCH})..." curl -L -o "$DEB_FILE" "$DEB_URL" chmod 644 "$DEB_FILE" # Make .deb file readable by all users # Install package from temp location echo "Installing..." sudo apt install -y "$DEB_FILE" echo -e "\nInstallation complete!" echo "Configure headscale: sudo nano /etc/headscale/config.yaml" echo "Check service status: sudo systemctl status headscale" ```
Author
Owner

@kradalby commented on GitHub (Mar 30, 2025):

Thanks, but I generally dont agree with that this would improve this for thousands, I, and I think a lot of other sysadmins has their own setup (ansible, nix, chef, puppet, saltstack) and would in general be very sceptical to those kind of scripts.

In addition, where should you draw the line for distributions, this only works for debian, what about the other distribution or distro independence.

I would also not really be too comfortable making a script people pipe willy nilly into their setup, quite vulnerable for supply chain attacks, my bash knowledge is not great and in general we can forget to maintain it.

@kradalby commented on GitHub (Mar 30, 2025): Thanks, but I generally dont agree with that this would improve this for thousands, I, and I think a lot of other sysadmins has their own setup (ansible, nix, chef, puppet, saltstack) and would in general be very sceptical to those kind of scripts. In addition, where should you draw the line for distributions, this only works for debian, what about the other distribution or distro independence. I would also not really be too comfortable making a script people pipe willy nilly into their setup, quite vulnerable for supply chain attacks, my bash knowledge is not great and in general we can forget to maintain it.
Author
Owner

@numfin commented on GitHub (Apr 5, 2025):

why would you need script for...

  • copying link that you need from releases page
  • wget <that link>
  • apt install ./that.deb

just 3 actions... wtf is this overengineered ai garbage

@numfin commented on GitHub (Apr 5, 2025): why would you need script for... - copying link that you need from releases page - `wget <that link>` - `apt install ./that.deb` just 3 actions... wtf is this overengineered ai garbage
Author
Owner

@github-actions[bot] commented on GitHub (Jul 5, 2025):

This issue is stale because it has been open for 90 days with no activity.

@github-actions[bot] commented on GitHub (Jul 5, 2025): This issue is stale because it has been open for 90 days with no activity.
Author
Owner

@github-actions[bot] commented on GitHub (Jul 12, 2025):

This issue was closed because it has been inactive for 14 days since being marked as stale.

@github-actions[bot] commented on GitHub (Jul 12, 2025): This issue was closed because it has been inactive for 14 days since being marked as stale.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/headscale#987