mirror of
https://github.com/ArchiveBox/ArchiveBox.git
synced 2026-04-06 07:47:53 +10:00
Restore Homebrew and Debian package manager support
- Add Homebrew formula (brew_dist/archivebox.rb) using virtualenv pattern
with auto-generation via homebrew-pypi-poet in bin/build_brew.sh
- Add Debian packaging via nFPM (pkg/debian/) with thin .deb that pip-installs
archivebox into /opt/archivebox/venv on postinstall
- Add build/release scripts: bin/{build,release}_{brew,deb}.sh
- Update CI workflows to build packages on release and test them
- Update README apt/brew install instructions with working commands
- Update bin/setup.sh to use .deb download instead of old Launchpad PPA
https://claude.ai/code/session_01Vx1EsNrNySgsc8Y67dGzCn
This commit is contained in:
@@ -19,9 +19,13 @@ cd "$REPO_DIR"
|
||||
# the order matters
|
||||
./bin/build_docs.sh
|
||||
./bin/build_pip.sh
|
||||
./bin/build_deb.sh
|
||||
./bin/build_brew.sh
|
||||
./bin/build_docker.sh
|
||||
|
||||
echo "[√] Done. Install the built package by running:"
|
||||
echo " python3 setup.py install"
|
||||
echo " pip install archivebox"
|
||||
echo " # or"
|
||||
echo " pip3 install ."
|
||||
echo " sudo apt install ./dist/archivebox*.deb"
|
||||
echo " # or"
|
||||
echo " brew tap archivebox/archivebox && brew install archivebox"
|
||||
|
||||
101
bin/build_brew.sh
Executable file
101
bin/build_brew.sh
Executable file
@@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
### Bash Environment Setup
|
||||
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
# set -o xtrace
|
||||
set -o errexit
|
||||
set -o errtrace
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
IFS=$'\n'
|
||||
|
||||
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
|
||||
cd "$REPO_DIR"
|
||||
|
||||
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
||||
FORMULA_FILE="$REPO_DIR/brew_dist/archivebox.rb"
|
||||
|
||||
echo "[+] Building Homebrew formula for archivebox==${VERSION}..."
|
||||
|
||||
# Create a temporary virtualenv for generating the formula
|
||||
TMPDIR="$(mktemp -d)"
|
||||
trap "rm -rf $TMPDIR" EXIT
|
||||
|
||||
python3 -m venv "$TMPDIR/venv"
|
||||
source "$TMPDIR/venv/bin/activate"
|
||||
|
||||
pip install --quiet "archivebox==${VERSION}" homebrew-pypi-poet 2>/dev/null
|
||||
|
||||
echo "[+] Generating resource stanzas with homebrew-pypi-poet..."
|
||||
RESOURCES="$(poet archivebox)"
|
||||
|
||||
# Get the sdist URL and SHA256 from PyPI
|
||||
SDIST_URL="$(pip download --no-binary :all: --no-deps -d "$TMPDIR/sdist" "archivebox==${VERSION}" 2>&1 | grep -oP 'https://\S+\.tar\.gz' | head -1 || true)"
|
||||
if [ -z "$SDIST_URL" ]; then
|
||||
SDIST_URL="https://files.pythonhosted.org/packages/source/a/archivebox/archivebox-${VERSION}.tar.gz"
|
||||
fi
|
||||
SDIST_SHA256="$(pip hash "$TMPDIR/sdist/"*.tar.gz 2>/dev/null | grep 'sha256:' | cut -d: -f2 || echo '')"
|
||||
|
||||
deactivate
|
||||
|
||||
echo "[+] Updating formula file: $FORMULA_FILE"
|
||||
|
||||
# Build the formula from the template
|
||||
cat > "$FORMULA_FILE" << RUBY
|
||||
# This formula is auto-generated by bin/build_brew.sh using homebrew-pypi-poet.
|
||||
# To update: run bin/build_brew.sh, or trigger the GitHub Actions homebrew workflow.
|
||||
#
|
||||
# Users install with:
|
||||
# brew tap archivebox/archivebox
|
||||
# brew install archivebox
|
||||
|
||||
class Archivebox < Formula
|
||||
include Language::Python::Virtualenv
|
||||
|
||||
desc "Self-hosted internet archiving solution"
|
||||
homepage "https://github.com/ArchiveBox/ArchiveBox"
|
||||
url "${SDIST_URL}"
|
||||
sha256 "${SDIST_SHA256}"
|
||||
license "MIT"
|
||||
head "https://github.com/ArchiveBox/ArchiveBox.git", branch: "dev"
|
||||
|
||||
depends_on "python@3.13"
|
||||
depends_on "node"
|
||||
depends_on "git"
|
||||
depends_on "wget"
|
||||
depends_on "curl"
|
||||
depends_on "ripgrep"
|
||||
depends_on "yt-dlp"
|
||||
|
||||
# Python dependency resource blocks auto-generated by homebrew-pypi-poet
|
||||
# AUTOGENERATED_RESOURCES_START
|
||||
${RESOURCES}
|
||||
# AUTOGENERATED_RESOURCES_END
|
||||
|
||||
def install
|
||||
virtualenv_install_with_resources
|
||||
end
|
||||
|
||||
def post_install
|
||||
# Install runtime dependencies (plugins, JS extractors, etc.)
|
||||
system bin/"archivebox", "install", "--binproviders", "pip,npm"
|
||||
end
|
||||
|
||||
service do
|
||||
run [opt_bin/"archivebox", "server", "--quick-init", "0.0.0.0:8000"]
|
||||
keep_alive crashed: true
|
||||
working_dir var/"archivebox"
|
||||
log_path var/"log/archivebox.log"
|
||||
error_log_path var/"log/archivebox.log"
|
||||
end
|
||||
|
||||
test do
|
||||
assert_match version.to_s, shell_output("#{bin}/archivebox version")
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
echo "[√] Formula updated: $FORMULA_FILE"
|
||||
echo " Version: ${VERSION}"
|
||||
echo " URL: ${SDIST_URL}"
|
||||
43
bin/build_deb.sh
Executable file
43
bin/build_deb.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
### Bash Environment Setup
|
||||
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
# set -o xtrace
|
||||
set -o errexit
|
||||
set -o errtrace
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
IFS=$'\n'
|
||||
|
||||
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
|
||||
cd "$REPO_DIR"
|
||||
|
||||
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
||||
export VERSION
|
||||
|
||||
# Default to amd64, can be overridden with ARCH=arm64
|
||||
export ARCH="${ARCH:-amd64}"
|
||||
|
||||
echo "[+] Building .deb package for archivebox_${VERSION}_${ARCH}..."
|
||||
|
||||
# Check for nfpm
|
||||
if ! command -v nfpm &>/dev/null; then
|
||||
echo "[!] nfpm not found. Install it with one of:"
|
||||
echo " go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest"
|
||||
echo " uv tool install nfpm"
|
||||
echo " brew install goreleaser/tap/nfpm"
|
||||
echo " curl -sfL https://install.goreleaser.com/github.com/goreleaser/nfpm.sh | sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$REPO_DIR/dist"
|
||||
|
||||
nfpm package \
|
||||
--config "$REPO_DIR/pkg/debian/nfpm.yaml" \
|
||||
--packager deb \
|
||||
--target "$REPO_DIR/dist/"
|
||||
|
||||
echo
|
||||
echo "[√] Built .deb package:"
|
||||
ls -la "$REPO_DIR/dist/"archivebox*.deb
|
||||
@@ -28,6 +28,8 @@ cd "$REPO_DIR"
|
||||
# ./bin/release_docs.sh
|
||||
./bin/release_git.sh "$@"
|
||||
./bin/release_pip.sh "$@"
|
||||
./bin/release_deb.sh "$@"
|
||||
./bin/release_brew.sh "$@"
|
||||
./bin/release_docker.sh "$@"
|
||||
|
||||
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
||||
|
||||
48
bin/release_brew.sh
Executable file
48
bin/release_brew.sh
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
### Bash Environment Setup
|
||||
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
# set -o xtrace
|
||||
set -o errexit
|
||||
set -o errtrace
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
IFS=$'\n'
|
||||
|
||||
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
|
||||
cd "$REPO_DIR"
|
||||
|
||||
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
||||
FORMULA_FILE="$REPO_DIR/brew_dist/archivebox.rb"
|
||||
TAP_REPO="ArchiveBox/homebrew-archivebox"
|
||||
|
||||
if [ ! -f "$FORMULA_FILE" ]; then
|
||||
echo "[!] Formula not found at $FORMULA_FILE"
|
||||
echo " Run ./bin/build_brew.sh first to generate it."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[+] Releasing Homebrew formula for archivebox==${VERSION} to ${TAP_REPO}..."
|
||||
|
||||
# Clone the tap repo, update formula, commit, and push
|
||||
TMPDIR="$(mktemp -d)"
|
||||
trap "rm -rf $TMPDIR" EXIT
|
||||
|
||||
git clone "https://github.com/${TAP_REPO}.git" "$TMPDIR/tap"
|
||||
cp "$FORMULA_FILE" "$TMPDIR/tap/archivebox.rb"
|
||||
|
||||
cd "$TMPDIR/tap"
|
||||
git add archivebox.rb
|
||||
if git diff --cached --quiet; then
|
||||
echo "[i] No changes to formula, skipping release."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git commit -m "Update archivebox to v${VERSION}"
|
||||
git push origin HEAD
|
||||
|
||||
echo "[√] Homebrew formula pushed to ${TAP_REPO}"
|
||||
echo " Users can install with:"
|
||||
echo " brew tap archivebox/archivebox"
|
||||
echo " brew install archivebox"
|
||||
33
bin/release_deb.sh
Executable file
33
bin/release_deb.sh
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
### Bash Environment Setup
|
||||
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
||||
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
|
||||
# set -o xtrace
|
||||
set -o errexit
|
||||
set -o errtrace
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
IFS=$'\n'
|
||||
|
||||
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
|
||||
cd "$REPO_DIR"
|
||||
|
||||
VERSION="$(grep '^version = ' "${REPO_DIR}/pyproject.toml" | awk -F'"' '{print $2}')"
|
||||
|
||||
echo "[+] Releasing .deb package for archivebox==${VERSION}..."
|
||||
|
||||
DEB_FILE="$(ls -1 "$REPO_DIR/dist/"archivebox*.deb 2>/dev/null | head -1)"
|
||||
if [ -z "$DEB_FILE" ]; then
|
||||
echo "[!] No .deb file found in dist/. Run ./bin/build_deb.sh first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[+] Uploading $DEB_FILE to GitHub Release v${VERSION}..."
|
||||
gh release upload "v${VERSION}" "$DEB_FILE" --clobber 2>/dev/null || \
|
||||
gh release create "v${VERSION}" "$DEB_FILE" --title "v${VERSION}" --generate-notes
|
||||
|
||||
echo "[√] .deb package uploaded to GitHub Release v${VERSION}"
|
||||
echo " Users can install with:"
|
||||
echo " curl -fsSL https://github.com/ArchiveBox/ArchiveBox/releases/download/v${VERSION}/archivebox_${VERSION}_amd64.deb -o /tmp/archivebox.deb"
|
||||
echo " sudo apt install /tmp/archivebox.deb"
|
||||
32
bin/setup.sh
32
bin/setup.sh
@@ -122,32 +122,24 @@ echo
|
||||
|
||||
# On Linux:
|
||||
if which apt-get > /dev/null; then
|
||||
echo "[+] Adding ArchiveBox apt repo and signing key to sources..."
|
||||
if ! (sudo apt install -y software-properties-common && sudo add-apt-repository -u ppa:archivebox/archivebox); then
|
||||
echo "deb http://ppa.launchpad.net/archivebox/archivebox/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/archivebox.list
|
||||
echo "deb-src http://ppa.launchpad.net/archivebox/archivebox/ubuntu focal main" | sudo tee -a /etc/apt/sources.list.d/archivebox.list
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C258F79DCC02E369
|
||||
sudo apt-get update -qq
|
||||
fi
|
||||
echo
|
||||
echo "[+] Installing ArchiveBox system dependencies using apt..."
|
||||
sudo apt-get install -y git python3 python3-pip python3-distutils wget curl yt-dlp ffmpeg git nodejs npm ripgrep
|
||||
sudo apt-get install -y libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb libgbm-dev || sudo apt-get install -y chromium || sudo apt-get install -y chromium-browser || true
|
||||
sudo apt-get install -y archivebox
|
||||
sudo apt-get --only-upgrade install -y archivebox
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y git python3 python3-pip python3-venv wget curl yt-dlp ffmpeg git nodejs npm ripgrep
|
||||
sudo apt-get install -y libgtk2.0-0 libgtk-3-0 libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb libgbm-dev || sudo apt-get install -y chromium || sudo apt-get install -y chromium-browser || true
|
||||
echo
|
||||
echo "[+] Installing ArchiveBox python dependencies using pip3..."
|
||||
sudo python3 -m pip install --upgrade --ignore-installed archivebox yt-dlp playwright
|
||||
echo "[+] Downloading and installing ArchiveBox .deb package..."
|
||||
ARCH="$(dpkg --print-architecture)"
|
||||
DEB_URL="https://github.com/ArchiveBox/ArchiveBox/releases/latest/download/archivebox_${ARCH}.deb"
|
||||
curl -fsSL "$DEB_URL" -o /tmp/archivebox.deb && sudo apt install -y /tmp/archivebox.deb && rm /tmp/archivebox.deb || {
|
||||
echo "[!] .deb install failed, falling back to pip install..."
|
||||
sudo python3 -m pip install --upgrade archivebox yt-dlp
|
||||
}
|
||||
# On Mac:
|
||||
elif which brew > /dev/null; then
|
||||
echo "[+] Installing ArchiveBox system dependencies using brew..."
|
||||
echo "[+] Installing ArchiveBox using Homebrew..."
|
||||
brew tap archivebox/archivebox
|
||||
brew update
|
||||
brew install python3 node git wget curl yt-dlp ripgrep
|
||||
brew install --fetch-HEAD -f archivebox
|
||||
echo
|
||||
echo "[+] Installing ArchiveBox python dependencies using pip3..."
|
||||
python3 -m pip install --upgrade --ignore-installed archivebox yt-dlp playwright
|
||||
brew install archivebox
|
||||
elif which pkg > /dev/null; then
|
||||
echo "[+] Installing ArchiveBox system dependencies using pkg and pip (python3.9)..."
|
||||
sudo pkg install -y python3 py39-pip py39-sqlite3 npm wget curl youtube_dl ffmpeg git ripgrep
|
||||
|
||||
Reference in New Issue
Block a user