From a9f091f30b0428d6e64134255cc01abea1bcaf5f Mon Sep 17 00:00:00 2001 From: MickLesk <47820557+MickLesk@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:10:59 +0200 Subject: [PATCH] scanopy: serve the UI from the binary, drop the source build Upstream confirmed in scanopy/scanopy#698 that scanopy-server-linux-* has carried the built UI since v0.17.13, fixtures and service logos included, served on the same port as the API. The release notes never said so, which is why we kept building it. That removes the source tarball, the Rust toolchain and generate-fixtures, Node with npm ci and npm run build, and SCANOPY_WEB_EXTERNAL_PATH. With the variable set to a directory that no longer has an index.html, v0.17.14 and earlier refuse to start, so the update deletes the line rather than leaving it. build-essential, libssl-dev and pkg-config go too: the release binary is static-pie with no INTERP segment, so it has no runtime library dependencies. /opt/scanopy stays, now only for .env and oidc.toml, and the unit's WorkingDirectory follows it out of the removed backend directory. Since nothing wipes that directory any more, the config survives an update on its own, which is the report upstream passed on of an update coming back without SCANOPY_WEB_EXTERNAL_PATH and the server starting API-only. The update keeps the running binary until the new one answers /api/health and puts it back if it does not, so a bad release leaves a working server instead of a stopped one. check_for_gh_release now keys on scanopy-server, matching the version file the binary deploy writes; the Scanopy key belonged to the tarball that is gone. Existing containers run one extra update, then agree. --- ct/scanopy.sh | 49 +++++++++++++++++++------------------- install/scanopy-install.sh | 29 ++-------------------- 2 files changed, 26 insertions(+), 52 deletions(-) diff --git a/ct/scanopy.sh b/ct/scanopy.sh index 4bcc7f261..2228d89f2 100644 --- a/ct/scanopy.sh +++ b/ct/scanopy.sh @@ -32,42 +32,25 @@ function update_script() { exit fi - if check_for_gh_release "Scanopy" "scanopy/scanopy"; then + if check_for_gh_release "scanopy-server" "scanopy/scanopy"; then msg_info "Stopping services" systemctl stop scanopy-server [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl stop scanopy-daemon msg_ok "Stopped services" - create_backup /opt/scanopy/.env /opt/scanopy/oidc.toml - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" - - restore_backup - - ensure_dependencies pkg-config libssl-dev - TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" - RUST_TOOLCHAIN=$TOOLCHAIN setup_rust - if ! grep -q "PUBLIC_URL" /opt/scanopy/.env; then - sed -i "\|_PATH=|a\\scanopy_PUBLIC_URL=http://${LOCAL_IP}:60072" /opt/scanopy/.env + sed -i "\|_PATH=|a\\SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072" /opt/scanopy/.env fi sed -i 's|_TARGET=.*$|_URL=http://127.0.0.1:60072|' /opt/scanopy/.env + sed -i '/^SCANOPY_WEB_EXTERNAL_PATH=/d' /opt/scanopy/.env + sed -i 's|^WorkingDirectory=/opt/scanopy/backend$|WorkingDirectory=/opt/scanopy|' /etc/systemd/system/scanopy-server.service + systemctl daemon-reload + + cp -f /usr/bin/scanopy-server /usr/bin/scanopy-server.bak 2>/dev/null || true fetch_and_deploy_gh_release "scanopy-server" "scanopy/scanopy" "singlefile" "latest" "/usr/bin" "scanopy-server-linux-$(arch_resolve)" - msg_info "Generating UI Fixtures (patience)" - cd /opt/scanopy/backend - CARGO_PROFILE_RELEASE_LTO=false CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16 CARGO_BUILD_JOBS="$(get_parallel_jobs)" $STD cargo build --release --bin generate-fixtures - $STD ./target/release/generate-fixtures --output-dir /opt/scanopy/ui/src/lib/data - msg_ok "Generated UI Fixtures" - - msg_info "Creating frontend UI" - export PUBLIC_SERVER_HOSTNAME=default - export PUBLIC_SERVER_PORT="" - cd /opt/scanopy/ui - $STD npm ci --no-fund --no-audit - $STD npm run build - msg_ok "Created frontend UI" + rm -rf /opt/scanopy/backend /opt/scanopy/ui if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-$(arch_resolve)" @@ -82,6 +65,22 @@ function update_script() { msg_info "Starting services" systemctl start scanopy-server + healthy=0 + for _ in {1..30}; do + if curl -fsS -o /dev/null http://127.0.0.1:60072/api/health 2>/dev/null; then + healthy=1 + break + fi + sleep 2 + done + if [[ "$healthy" -ne 1 ]]; then + systemctl stop scanopy-server + [[ -f /usr/bin/scanopy-server.bak ]] && mv -f /usr/bin/scanopy-server.bak /usr/bin/scanopy-server + systemctl start scanopy-server + msg_error "New server did not answer /api/health, restored the previous binary" + exit 1 + fi + rm -f /usr/bin/scanopy-server.bak [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon msg_ok "Updated successfully!" fi diff --git a/install/scanopy-install.sh b/install/scanopy-install.sh index 0d0f80470..422e9d52b 100644 --- a/install/scanopy-install.sh +++ b/install/scanopy-install.sh @@ -13,41 +13,16 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt install -y \ - build-essential \ - libssl-dev \ - pkg-config -msg_ok "Installed Dependencies" - PG_VERSION=17 setup_postgresql -NODE_VERSION="24" setup_nodejs PG_DB_NAME="scanopy_db" PG_DB_USER="scanopy" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db -fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" -TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" -RUST_TOOLCHAIN=$TOOLCHAIN setup_rust fetch_and_deploy_gh_release "scanopy-server" "scanopy/scanopy" "singlefile" "latest" "/usr/bin" "scanopy-server-linux-$(arch_resolve)" -msg_info "Generating UI Fixtures (patience)" -cd /opt/scanopy/backend -CARGO_PROFILE_RELEASE_LTO=false CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16 CARGO_BUILD_JOBS="$(get_parallel_jobs)" $STD cargo build --release --bin generate-fixtures -$STD ./target/release/generate-fixtures --output-dir /opt/scanopy/ui/src/lib/data -msg_ok "Generated UI Fixtures" - -msg_info "Creating frontend UI" -export PUBLIC_SERVER_HOSTNAME=default -export PUBLIC_SERVER_PORT="" -cd /opt/scanopy/ui -$STD npm ci --no-fund --no-audit -$STD npm run build -msg_ok "Created frontend UI" - msg_info "Configuring server for first-run" +mkdir -p /opt/scanopy cat </opt/scanopy/.env ### - SERVER SCANOPY_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME -SCANOPY_WEB_EXTERNAL_PATH="/opt/scanopy/ui/build" SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072 SCANOPY_SERVER_PORT=60072 SCANOPY_LOG_LEVEL=info @@ -82,7 +57,7 @@ After=network.target postgresql.service [Service] Type=simple -WorkingDirectory=/opt/scanopy/backend +WorkingDirectory=/opt/scanopy EnvironmentFile=/opt/scanopy/.env ExecStart=/usr/bin/scanopy-server Restart=always