From 08de08c64c38a559a63ddbfba6fe274b248d61fe Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Thu, 28 May 2026 07:02:30 -0700 Subject: [PATCH] release: archivebox 0.9.33rc17 --- archivebox/tests/test_cli_server.py | 57 +++++++++++++++++++ docs/Configuration.md | 25 ++------ .../archivebox.cli.archivebox_server.md | 2 +- .../archivebox/archivebox.config.common.md | 28 +-------- etc/package.json | 2 +- pyproject.toml | 8 +-- 6 files changed, 71 insertions(+), 51 deletions(-) diff --git a/archivebox/tests/test_cli_server.py b/archivebox/tests/test_cli_server.py index 8361a817..e6eba778 100644 --- a/archivebox/tests/test_cli_server.py +++ b/archivebox/tests/test_cli_server.py @@ -7,8 +7,10 @@ Verify server can start (basic smoke tests only, no full server testing). import os import asyncio import json +import signal import subprocess import sys +from datetime import datetime from types import SimpleNamespace @@ -156,3 +158,58 @@ def test_sonic_daemon_event_handler_accepts_real_running_worker(archivebox_daemo await bus.destroy() asyncio.run(run_test()) + + +def test_supervisord_takeover_stops_all_live_process_rows(tmp_path, process, db): + import psutil + from django.utils import timezone + + from archivebox.machine.models import Machine, Process + from archivebox.tests.test_orm_helpers import use_archivebox_db + + assert process.returncode == 0, process.stderr + env = os.environ.copy() + env.update({"DATA_DIR": str(tmp_path), "USE_COLOR": "False", "SHOW_PROGRESS": "False"}) + procs = [] + try: + for _index in range(2): + proc = subprocess.Popen( + [sys.executable, "-m", "archivebox", "run", "--daemon"], + cwd=tmp_path, + env=env, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + start_new_session=True, + ) + procs.append(proc) + started_at = datetime.fromtimestamp(psutil.Process(proc.pid).create_time(), tz=timezone.get_current_timezone()) + with use_archivebox_db(tmp_path): + Process.objects.create( + machine=Machine.current(), + process_type=Process.TypeChoices.SUPERVISORD, + worker_type="supervisord", + pwd=str(tmp_path), + cmd=[sys.executable], + pid=proc.pid, + started_at=started_at, + status=Process.StatusChoices.RUNNING, + timeout=0, + ) + + with use_archivebox_db(tmp_path): + from archivebox.workers.supervisord_util import stop_existing_supervisord_process + + stop_existing_supervisord_process() + + for proc in procs: + proc.wait(timeout=10) + with use_archivebox_db(tmp_path): + assert not Process.objects.filter( + process_type=Process.TypeChoices.SUPERVISORD, + status=Process.StatusChoices.RUNNING, + pwd=str(tmp_path), + ).exists() + finally: + for proc in procs: + if proc.poll() is None: + os.killpg(proc.pid, signal.SIGKILL) diff --git a/docs/Configuration.md b/docs/Configuration.md index 8e46c94f..04fadd91 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -166,35 +166,20 @@ archivebox config --set PUBLIC_ADD_VIEW=False # allow submitting new URLs wit Django's secret key for cryptographic signing (sessions, CSRF tokens, etc.). Automatically generated on first run. --- -#### `BIND_ADDR` +#### `LISTEN_HOST` **Possible Values:** [`127.0.0.1:8000`]/`0.0.0.0:8000`/... -Address and port for the ArchiveBox web server to listen on. +Address and port for the ArchiveBox web server to listen on. This is only the local bind socket, not the public URL. --- -#### `LISTEN_HOST` -**Possible Values:** [`archivebox.localhost:8000`]/`archive.example.com:443`/... -The public hostname and port that ArchiveBox is accessible at. +#### `BASE_URL` +**Possible Values:** [`""`]/`https://archive.example.com`/`http://archivebox.localhost:8000`/... +Canonical public URL used to build links. In subdomain security mode, ArchiveBox automatically derives `admin.`, `web.`, `api.`, `public.`, and `snap-*.` hosts from this base while preserving the scheme and port. --- #### `ALLOWED_HOSTS` **Possible Values:** [`*`]/`archive.example.com,localhost`/... Comma-separated list of allowed HTTP Host header values. Set this to your domain name(s) in production. ---- -#### `CSRF_TRUSTED_ORIGINS` -**Possible Values:** [`http://admin.archivebox.localhost:8000`]/`https://archive.example.com`/... -Comma-separated list of trusted origins for CSRF validation. Must include the scheme (http/https). - ---- -#### `ADMIN_BASE_URL` -**Possible Values:** [`""`]/`/admin/`/... -Base URL path for the Django admin interface. - ---- -#### `ARCHIVE_BASE_URL` -**Possible Values:** [`""`]/`/archive/`/... -Base URL path for serving archived content. - --- #### `SNAPSHOTS_PER_PAGE` **Possible Values:** [`40`]/`100`/... diff --git a/docs/apidocs/archivebox/archivebox.cli.archivebox_server.md b/docs/apidocs/archivebox/archivebox.cli.archivebox_server.md index 4ad8cdf5..96042c48 100644 --- a/docs/apidocs/archivebox/archivebox.cli.archivebox_server.md +++ b/docs/apidocs/archivebox/archivebox.cli.archivebox_server.md @@ -27,7 +27,7 @@ ### API -````{py:function} server(runserver_args: typing.Iterable[str] = (SERVER_CONFIG.BIND_ADDR, ), reload: bool = False, init: bool = False, debug: bool = False, daemonize: bool = False, nothreading: bool = False) -> None +````{py:function} server(runserver_args: typing.Iterable[str] = (SERVER_CONFIG.LISTEN_HOST, ), reload: bool = False, init: bool = False, debug: bool = False, daemonize: bool = False, nothreading: bool = False) -> None :canonical: archivebox.cli.archivebox_server.server ```{autodoc2-docstring} archivebox.cli.archivebox_server.server diff --git a/docs/apidocs/archivebox/archivebox.config.common.md b/docs/apidocs/archivebox/archivebox.config.common.md index e93e9776..fd768c2d 100644 --- a/docs/apidocs/archivebox/archivebox.config.common.md +++ b/docs/apidocs/archivebox/archivebox.config.common.md @@ -377,17 +377,6 @@ Bases: {py:obj}`archivebox.config.configset.BaseConfigSet` ```` -````{py:attribute} BIND_ADDR -:canonical: archivebox.config.common.ServerConfig.BIND_ADDR -:type: str -:value: > - 'Field(...)' - -```{autodoc2-docstring} archivebox.config.common.ServerConfig.BIND_ADDR -``` - -```` - ````{py:attribute} LISTEN_HOST :canonical: archivebox.config.common.ServerConfig.LISTEN_HOST :type: str @@ -399,24 +388,13 @@ Bases: {py:obj}`archivebox.config.configset.BaseConfigSet` ```` -````{py:attribute} ADMIN_BASE_URL -:canonical: archivebox.config.common.ServerConfig.ADMIN_BASE_URL +````{py:attribute} BASE_URL +:canonical: archivebox.config.common.ServerConfig.BASE_URL :type: str :value: > 'Field(...)' -```{autodoc2-docstring} archivebox.config.common.ServerConfig.ADMIN_BASE_URL -``` - -```` - -````{py:attribute} ARCHIVE_BASE_URL -:canonical: archivebox.config.common.ServerConfig.ARCHIVE_BASE_URL -:type: str -:value: > - 'Field(...)' - -```{autodoc2-docstring} archivebox.config.common.ServerConfig.ARCHIVE_BASE_URL +```{autodoc2-docstring} archivebox.config.common.ServerConfig.BASE_URL ``` ```` diff --git a/etc/package.json b/etc/package.json index 981767f0..5f7f3851 100644 --- a/etc/package.json +++ b/etc/package.json @@ -1,6 +1,6 @@ { "name": "archivebox", - "version": "0.9.33rc16", + "version": "0.9.33rc17", "repository": "github:ArchiveBox/ArchiveBox", "license": "MIT", "dependencies": { diff --git a/pyproject.toml b/pyproject.toml index 8ca7aa52..71b2de77 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "archivebox" -version = "0.9.33rc16" +version = "0.9.33rc17" requires-python = ">=3.13" description = "Self-hosted internet archiving solution." authors = [{name = "Nick Sweeting", email = "pyproject.toml@archivebox.io"}] @@ -79,9 +79,9 @@ dependencies = [ ### Extractor dependencies (optional binaries detected at runtime via shutil.which) ### Binary/Package Management "abxbus==2.5.7", # EventBus API - "abxpkg>=1.11.40", # for: detecting, versioning, and installing binaries via apt/brew/pip/npm - "abx-plugins>=1.11.46", # shared ArchiveBox plugin package with Chrome/Puppeteer dependency wiring - "abx-dl>=1.11.46", # shared ArchiveBox downloader package with blocking install preflight + "abxpkg>=1.11.42", # for: detecting, versioning, and installing binaries via apt/brew/pip/npm + "abx-plugins>=1.11.48", # shared ArchiveBox plugin package with Chrome/Puppeteer dependency wiring + "abx-dl>=1.11.48", # shared ArchiveBox downloader package with blocking install preflight ### UUID7 backport for Python <3.14 "uuid7>=0.1.0; python_version < '3.14'", # provides the uuid_extensions module on Python 3.13 ]