diff --git a/ct/netvisor.sh b/ct/netvisor.sh index a9dd39eab..a157a5b59 100644 --- a/ct/netvisor.sh +++ b/ct/netvisor.sh @@ -3,9 +3,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # Copyright (c) 2021-2025 community-scripts ORG # Author: vhsdream # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/netvisor-io/netvisor +# Source: https://github.com/scanopy/scanopy -APP="NetVisor" +APP="Scanopy" var_tags="${var_tags:-analytics}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-3072}" @@ -29,71 +29,74 @@ function update_script() { exit fi - if check_for_gh_release "netvisor" "netvisor-io/netvisor"; then - msg_info "Stopping services" - systemctl stop netvisor-daemon netvisor-server - msg_ok "Stopped services" + msg_info "Stopping services" + systemctl -q disable --now netvisor-daemon netvisor-server + msg_ok "Stopped services" - msg_info "Backing up configurations" - cp /opt/netvisor/.env /opt/netvisor.env.bak - if [[ -f /opt/netvisor/oidc.toml ]]; then - cp /opt/netvisor/oidc.toml /opt/netvisor.oidc.toml - fi - msg_ok "Backed up configurations" + NODE_VERSION="24" setup_nodejs + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "netvisor" "netvisor-io/netvisor" "tarball" "latest" "/opt/netvisor" - - if ! dpkg -l | grep -q "pkg-config"; then - $STD apt install -y pkg-config - fi - if ! dpkg -l | grep -q "libssl-dev"; then - $STD apt install -y libssl-dev - fi - TOOLCHAIN="$(grep "channel" /opt/netvisor/backend/rust-toolchain.toml | awk -F\" '{print $2}')" - RUST_TOOLCHAIN=$TOOLCHAIN setup_rust - - mv /opt/netvisor.env.bak /opt/netvisor/.env - if [[ -f /opt/netvisor.oidc.toml ]]; then - mv /opt/netvisor.oidc.toml /opt/netvisor/oidc.toml - fi - LOCAL_IP="$(hostname -I | awk '{print $1}')" - if ! grep -q "PUBLIC_URL" /opt/netvisor/.env; then - sed -i "\|_PATH=|a\NETVISOR_PUBLIC_URL=http://${LOCAL_IP}:60072" /opt/netvisor/.env - fi - sed -i 's|_TARGET=.*$|_URL=http://127.0.0.1:60072|' /opt/netvisor/.env - - msg_info "Creating frontend UI" - export PUBLIC_SERVER_HOSTNAME=default - export PUBLIC_SERVER_PORT="" - cd /opt/netvisor/ui - $STD npm ci --no-fund --no-audit - $STD npm run build - msg_ok "Created frontend UI" - - msg_info "Building Netvisor-server (patience)" - cd /opt/netvisor/backend - $STD cargo build --release --bin server - mv ./target/release/server /usr/bin/netvisor-server - msg_ok "Built Netvisor-server" - - msg_info "Building Netvisor-daemon" - $STD cargo build --release --bin daemon - cp ./target/release/daemon /usr/bin/netvisor-daemon - msg_ok "Built Netvisor-daemon" - - sed -i -e 's|-target|-url|' \ - -e 's| --server-port |:|' \ - /etc/systemd/system/netvisor-daemon.service - sed -i '/^ \"server_target.*$/d' /root/.config/daemon/config.json - if ! grep -q "WorkingD" /etc/systemd/system/netvisor-server.service; then - sed -i '\|simple$|a\WorkingDirectory=/opt/netvisor/backend' /etc/systemd/system/netvisor-server.service - fi - systemctl daemon-reload - - msg_info "Starting services" - systemctl start netvisor-server netvisor-daemon - msg_ok "Updated successfully!" + if ! dpkg -l | grep -q "pkg-config"; then + $STD apt install -y pkg-config fi + if ! dpkg -l | grep -q "libssl-dev"; then + $STD apt install -y libssl-dev + fi + TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" + RUST_TOOLCHAIN=$TOOLCHAIN setup_rust + + mv /opt/netvisor/.env /opt/scanopy/.env + if [[ -f /opt/netvisor/oidc.toml ]]; then + mv /opt/netvisor/oidc.toml /opt/scanopy/oidc.toml + fi + LOCAL_IP="$(hostname -I | awk '{print $1}')" + if ! grep -q "PUBLIC_URL" /opt/scanopy/.env; then + sed -i "\|_PATH=|a\NETVISOR_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 's/NETVISOR/SCANOPY/g; s|netvisor/|scanopy/|' /opt/scanopy/.env + + 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 "Building Scanopy-server (patience)" + cd /opt/scanopy/backend + $STD cargo build --release --bin server + mv ./target/release/server /usr/bin/scanopy-server + msg_ok "Built Scanopy-server" + + msg_info "Building Scanopy-daemon" + $STD cargo build --release --bin daemon + cp ./target/release/daemon /usr/bin/scanopy-daemon + msg_ok "Built Scanopy-daemon" + + sed -i '/^ \"server_target.*$/d' /root/.config/daemon/config.json + sed -i -e 's|-target|-url|' \ + -e 's| --server-port |:|' \ + -e 's/NetVisor/Scanopy/' \ + -e 's/netvisor/scanopy/' \ + /etc/systemd/system/netvisor-daemon.service + mv /etc/systemd/system/netvisor-daemon.service /etc/systemd/system/scanopy-daemon.service + sed -i -e 's/NetVisor/Scanopy/' \ + -e 's/netvisor/scanopy/g' \ + /etc/systemd/system/netvisor-server.service + mv /etc/systemd/system/netvisor-server.service /etc/systemd/system/scanopy-server.service + systemctl daemon-reload + + msg_info "Starting services" + systemctl -q enable --now scanopy-server scanopy-daemon + msg_ok "Updated successfully!" + + sed -i 's/netvisor/scanopy/' /usr/bin/update + mv ~/NetVisor.creds ~/scanopy.creds + rm ~/.netvisor + rm -rf /opt/netvisor + exit } diff --git a/ct/scanopy.sh b/ct/scanopy.sh new file mode 100644 index 000000000..38d703b48 --- /dev/null +++ b/ct/scanopy.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/scanopy/scanopy + +APP="Scanopy" +var_tags="${var_tags:-analytics}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-3072}" +var_disk="${var_disk:-6}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/scanopy ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "scanopy" "scanopy-io/scanopy"; then + msg_info "Stopping services" + systemctl stop scanopy-daemon scanopy-server + msg_ok "Stopped services" + + msg_info "Backing up configurations" + cp /opt/scanopy/.env /opt/scanopy.env.bak + if [[ -f /opt/scanopy/oidc.toml ]]; then + cp /opt/scanopy/oidc.toml /opt/scanopy.oidc.toml + fi + msg_ok "Backed up configurations" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" + + if ! dpkg -l | grep -q "pkg-config"; then + $STD apt install -y pkg-config + fi + if ! dpkg -l | grep -q "libssl-dev"; then + $STD apt install -y libssl-dev + fi + TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" + RUST_TOOLCHAIN=$TOOLCHAIN setup_rust + + mv /opt/scanopy.env.bak /opt/scanopy/.env + if [[ -f /opt/scanopy.oidc.toml ]]; then + mv /opt/scanopy.oidc.toml /opt/scanopy/oidc.toml + fi + LOCAL_IP="$(hostname -I | awk '{print $1}')" + if ! grep -q "PUBLIC_URL" /opt/scanopy/.env; then + 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 + + 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 "Building scanopy-server (patience)" + cd /opt/scanopy/backend + $STD cargo build --release --bin server + mv ./target/release/server /usr/bin/scanopy-server + msg_ok "Built scanopy-server" + + msg_info "Building scanopy-daemon" + $STD cargo build --release --bin daemon + cp ./target/release/daemon /usr/bin/scanopy-daemon + msg_ok "Built scanopy-daemon" + + msg_info "Starting services" + systemctl start scanopy-server scanopy-daemon + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:60072${CL}" +echo -e "${INFO}${YW} Then create your account, and run the 'configure_daemon.sh' script to setup the daemon.${CL}" diff --git a/frontend/public/json/netvisor.json b/frontend/public/json/scanopy.json similarity index 73% rename from frontend/public/json/netvisor.json rename to frontend/public/json/scanopy.json index 48c928a1d..60e21fc1a 100644 --- a/frontend/public/json/netvisor.json +++ b/frontend/public/json/scanopy.json @@ -1,6 +1,6 @@ { - "name": "NetVisor", - "slug": "netvisor", + "name": "Scanopy", + "slug": "scanopy", "categories": [ 9 ], @@ -9,15 +9,15 @@ "updateable": true, "privileged": false, "interface_port": 60072, - "documentation": "https://github.com/netvisor-io/netvisor", - "config_path": "/opt/netvisor/.env, OIDC: /opt/netvisor/oidc.toml", - "website": "https://netvisor.io", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/netvisor.png", + "documentation": "https://github.com/scanopy/scanopy", + "config_path": "/opt/scanopy/.env, OIDC: /opt/scanopy/oidc.toml", + "website": "https://scanopy.net", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/scanopy.webp", "description": "Automatically discover and visually document network infrastructure", "install_methods": [ { "type": "default", - "script": "ct/netvisor.sh", + "script": "ct/scanopy.sh", "resources": { "cpu": 2, "ram": 3072, diff --git a/install/netvisor-install.sh b/install/netvisor-install.sh deleted file mode 100644 index 30d93842c..000000000 --- a/install/netvisor-install.sh +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: vhsdream -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/netvisor-io/netvisor - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -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="netvisor_db" PG_DB_USER="netvisor" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db - -fetch_and_deploy_gh_release "netvisor" "netvisor-io/netvisor" "tarball" "latest" "/opt/netvisor" - -TOOLCHAIN="$(grep "channel" /opt/netvisor/backend/rust-toolchain.toml | awk -F\" '{print $2}')" -RUST_TOOLCHAIN=$TOOLCHAIN setup_rust - -msg_info "Creating frontend UI" -export PUBLIC_SERVER_HOSTNAME=default -export PUBLIC_SERVER_PORT="" -cd /opt/netvisor/ui -$STD npm ci --no-fund --no-audit -$STD npm run build -msg_ok "Created frontend UI" - -msg_info "Building Netvisor-server (patience)" -cd /opt/netvisor/backend -$STD cargo build --release --bin server -mv ./target/release/server /usr/bin/netvisor-server -msg_ok "Built Netvisor-server" - -msg_info "Building Netvisor-daemon" -$STD cargo build --release --bin daemon -cp ./target/release/daemon /usr/bin/netvisor-daemon -msg_ok "Built Netvisor-daemon" - -msg_info "Configuring server for first-run" -LOCAL_IP="$(hostname -I | awk '{print $1}')" -cat </opt/netvisor/.env -### - SERVER -NETVISOR_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME -NETVISOR_WEB_EXTERNAL_PATH="/opt/netvisor/ui/build" -NETVISOR_PUBLIC_URL=http://${LOCAL_IP}:60072 -NETVISOR_SERVER_PORT=60072 -NETVISOR_LOG_LEVEL=info -NETVISOR_INTEGRATED_DAEMON_URL=http://127.0.0.1:60073 -## - uncomment to disable signups -# NETVISOR_DISABLE_REGISTRATION=true -## - uncomment when using TLS -# NETVISOR_USE_SECURE_SESSION_COOKIES=true -## - see https://github.com/imbolc/axum-client-ip?tab=readme-ov-file#configurable-vs-specific-extractors -## - before uncommenting the below -# NETVISOR_CLIENT_IP_SOURCE= - -### - SMTP (password reset and notifications - optional) -# NETVISOR_SMTP_RELAY=smtp.gmail.com:587 -# NETVISOR_SMTP_USERNAME=your-email@gmail.com -# NETVISOR_SMTP_PASSWORD=your-app-password -# NETVISOR_SMTP_EMAIL=netvisor@yourdomain.tld - -### - INTEGRATED DAEMON -NETVISOR_SERVER_URL=http://127.0.0.1:60072 -NETVISOR_BIND_ADDRESS=0.0.0.0 -NETVISOR_NAME="netvisor-daemon" -NETVISOR_HEARTBEAT_INTERVAL=30 - -### - see https://github.com/netvisor-io/netvisor/blob/main/docs/CONFIGURATION.md for more options -EOF - -cat </etc/systemd/system/netvisor-server.service -[Unit] -Description=NetVisor Network Discovery Server -After=network.target postgresql.service - -[Service] -Type=simple -WorkingDirectory=/opt/netvisor/backend -EnvironmentFile=/opt/netvisor/.env -ExecStart=/usr/bin/netvisor-server -Restart=always -RestartSec=10 -StandardOutput=journal -StandardError=journal - -[Install] -WantedBy=multi-user.target -EOF - -systemctl enable -q --now netvisor-server - -# Creating short script to configure netvisor-daemon -cat <~/configure_daemon.sh -#!/usr/bin/env bash - -echo "Auto-configuring integrated daemon..." - -NETWORK_ID="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT id FROM networks;')" -API_KEY="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT key FROM api_keys;')" - -cat </etc/systemd/system/netvisor-daemon.service -[Unit] -Description=NetVisor Network Discovery Daemon -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -User=root -ExecStart=/usr/bin/netvisor-daemon --server-url http://127.0.0.1:60072 --network-id \${NETWORK_ID} --daemon-api-key \${API_KEY} --mode push -Restart=always -RestartSec=10 -StandardOutput=journal -StandardError=journal - -[Install] -WantedBy=multi-user.target -END - -systemctl enable -q --now netvisor-daemon -echo "NetVisor daemon configured and running" - -EOF -chmod +x ~/configure_daemon.sh -msg_ok "Netvisor server running - please create an account in the UI to continue." - -motd_ssh -customize -cleanup_lxc diff --git a/install/scanopy-install.sh b/install/scanopy-install.sh new file mode 100644 index 000000000..288f78741 --- /dev/null +++ b/install/scanopy-install.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/scanopy/scanopy + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +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 + +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 "Building scanopy-server (patience)" +cd /opt/scanopy/backend +$STD cargo build --release --bin server +mv ./target/release/server /usr/bin/scanopy-server +msg_ok "Built scanopy-server" + +msg_info "Building scanopy-daemon" +$STD cargo build --release --bin daemon +cp ./target/release/daemon /usr/bin/scanopy-daemon +msg_ok "Built scanopy-daemon" + +msg_info "Configuring server for first-run" +LOCAL_IP="$(hostname -I | awk '{print $1}')" +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 +scanopy_INTEGRATED_DAEMON_URL=http://127.0.0.1:60073 +## - uncomment to disable signups +# scanopy_DISABLE_REGISTRATION=true +## - uncomment when using TLS +# scanopy_USE_SECURE_SESSION_COOKIES=true +## - see https://github.com/imbolc/axum-client-ip?tab=readme-ov-file#configurable-vs-specific-extractors +## - before uncommenting the below +# scanopy_CLIENT_IP_SOURCE= + +### - SMTP (password reset and notifications - optional) +# scanopy_SMTP_RELAY=smtp.gmail.com:587 +# scanopy_SMTP_USERNAME=your-email@gmail.com +# scanopy_SMTP_PASSWORD=your-app-password +# scanopy_SMTP_EMAIL=scanopy@yourdomain.tld + +### - INTEGRATED DAEMON +scanopy_SERVER_URL=http://127.0.0.1:60072 +scanopy_BIND_ADDRESS=0.0.0.0 +scanopy_NAME="scanopy-daemon" +scanopy_HEARTBEAT_INTERVAL=30 + +### - see https://github.com/scanopy/scanopy/blob/main/docs/CONFIGURATION.md for more options +EOF + +cat </etc/systemd/system/scanopy-server.service +[Unit] +Description=Scanopy Network Discovery Server +After=network.target postgresql.service + +[Service] +Type=simple +WorkingDirectory=/opt/scanopy/backend +EnvironmentFile=/opt/scanopy/.env +ExecStart=/usr/bin/scanopy-server +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable -q --now scanopy-server + +# Creating short script to configure scanopy-daemon +cat <~/configure_daemon.sh +#!/usr/bin/env bash + +echo "Auto-configuring integrated daemon..." + +NETWORK_ID="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT id FROM networks;')" +API_KEY="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT key FROM api_keys;')" + +cat </etc/systemd/system/scanopy-daemon.service +[Unit] +Description=Scanopy Network Discovery Daemon +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=root +ExecStart=/usr/bin/scanopy-daemon --server-url http://127.0.0.1:60072 --network-id \${NETWORK_ID} --daemon-api-key \${API_KEY} --mode push +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +END + +systemctl enable -q --now scanopy-daemon +echo "Scanopy daemon configured and running" + +EOF +chmod +x ~/configure_daemon.sh +msg_ok "Scanopy server running - please create an account in the UI to continue." + +motd_ssh +customize +cleanup_lxc