2023-09-24 20:10:09 -06:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
# This script will attempt to repair a WROLPi installation. It will not use internet.
|
|
|
|
|
|
|
|
|
|
cd /opt/wrolpi || (echo "Cannot repair. /opt/wrolpi does not exist" && exit 1)
|
|
|
|
|
|
|
|
|
|
# Re-execute this script if it wasn't called with sudo.
|
|
|
|
|
if [ $EUID != 0 ]; then
|
|
|
|
|
sudo "$0" "$@"
|
|
|
|
|
exit $?
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
rpi=false
|
|
|
|
|
if (grep 'Raspberry Pi' /proc/cpuinfo >/dev/null); then
|
|
|
|
|
rpi=true
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
set -x
|
|
|
|
|
|
|
|
|
|
# Stop services if they are running.
|
2025-12-11 18:32:55 -07:00
|
|
|
systemctl stop wrolpi-controller.service || :
|
2023-09-24 20:10:09 -06:00
|
|
|
systemctl stop wrolpi-api.service || :
|
|
|
|
|
systemctl stop wrolpi-app.service || :
|
|
|
|
|
systemctl stop wrolpi-kiwix.service || :
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
systemctl stop caddy || :
|
2023-09-24 20:10:09 -06:00
|
|
|
|
2026-02-28 16:11:12 -07:00
|
|
|
# Clear Python bytecode cache from virtual environments to fix potential corruption.
|
|
|
|
|
echo "Clearing Python bytecode cache..."
|
|
|
|
|
find /opt/wrolpi/venv -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || :
|
|
|
|
|
find /opt/wrolpi/venv -name "*.pyc" -delete 2>/dev/null || :
|
|
|
|
|
find /opt/wrolpi/controller/venv -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || :
|
|
|
|
|
find /opt/wrolpi/controller/venv -name "*.pyc" -delete 2>/dev/null || :
|
|
|
|
|
find /opt/wrolpi-help/venv -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || :
|
|
|
|
|
find /opt/wrolpi-help/venv -name "*.pyc" -delete 2>/dev/null || :
|
|
|
|
|
|
2024-10-01 11:29:45 -06:00
|
|
|
# Create the WROLPi user
|
|
|
|
|
grep wrolpi: /etc/passwd || useradd -md /home/wrolpi wrolpi -s "$(command -v bash)"
|
|
|
|
|
[ -f /home/wrolpi/.pgpass ] || cat >/home/wrolpi/.pgpass <<'EOF'
|
|
|
|
|
127.0.0.1:5432:wrolpi:wrolpi:wrolpi
|
|
|
|
|
EOF
|
|
|
|
|
chmod 0600 /home/wrolpi/.pgpass
|
|
|
|
|
|
2024-06-13 09:44:34 -06:00
|
|
|
# Reset any inadvertent changes to the WROLPi repo. Restore ownership in case this repair script fails.
|
2023-10-09 13:17:12 -06:00
|
|
|
git config --global --add safe.directory /opt/wrolpi
|
2023-09-24 20:10:09 -06:00
|
|
|
git reset HEAD --hard
|
2024-06-13 09:44:34 -06:00
|
|
|
chown -R wrolpi:wrolpi /opt/wrolpi
|
2023-09-24 20:10:09 -06:00
|
|
|
|
|
|
|
|
# Copy configs to system.
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
mkdir -p /etc/caddy
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/Caddyfile /etc/caddy/Caddyfile
|
2026-03-29 18:58:31 -06:00
|
|
|
mkdir -p /var/www
|
2023-09-24 20:10:09 -06:00
|
|
|
cp /opt/wrolpi/etc/raspberrypios/50x.html /var/www/50x.html
|
|
|
|
|
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
# Generate certificate for HTTPS.
|
2026-02-24 17:14:56 -07:00
|
|
|
/opt/wrolpi/scripts/generate_certificates.sh
|
2024-06-12 18:44:59 -06:00
|
|
|
|
2026-03-29 18:58:31 -06:00
|
|
|
# Install map fonts from blob (needed for MapLibre map labels).
|
|
|
|
|
MAP_FONTS_BLOB=/opt/wrolpi-blobs/map-fonts.tar.gz
|
|
|
|
|
if [ -f "${MAP_FONTS_BLOB}" ]; then
|
|
|
|
|
mkdir -p /opt/wrolpi/modules/map/static/fonts
|
|
|
|
|
tar -xzf "${MAP_FONTS_BLOB}" -C /opt/wrolpi/modules/map/static/
|
|
|
|
|
fi
|
|
|
|
|
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
# Start Caddy quickly so user can access Controller from React UI
|
|
|
|
|
systemctl start caddy || :
|
2025-12-11 18:32:55 -07:00
|
|
|
|
2023-09-24 20:10:09 -06:00
|
|
|
# WROLPi needs a few privileged commands.
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/90-wrolpi /etc/sudoers.d/90-wrolpi
|
|
|
|
|
chmod 0440 /etc/sudoers.d/90-wrolpi
|
|
|
|
|
# Verify this new file is valid.
|
|
|
|
|
visudo -c -f /etc/sudoers.d/90-wrolpi
|
|
|
|
|
|
|
|
|
|
# Install the systemd services
|
2023-11-22 11:02:30 -07:00
|
|
|
cp /opt/wrolpi/etc/raspberrypios/wrolpi*.service /etc/systemd/system/
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
cp /opt/wrolpi/etc/raspberrypios/wrolpi-*.timer /etc/systemd/system/
|
2023-09-24 20:10:09 -06:00
|
|
|
cp /opt/wrolpi/etc/raspberrypios/wrolpi.target /etc/systemd/system/
|
2025-12-11 18:32:55 -07:00
|
|
|
systemctl enable wrolpi-controller.service
|
2023-09-24 20:10:09 -06:00
|
|
|
systemctl enable wrolpi-api.service
|
|
|
|
|
systemctl enable wrolpi-app.service
|
|
|
|
|
systemctl enable wrolpi-kiwix.service
|
2023-11-22 11:02:30 -07:00
|
|
|
systemctl enable wrolpi-help.service
|
Replace nginx with Caddy for TLS termination and reverse proxying.
- Replace nginx with Caddy as the web server for both Docker and native
(RPi/Debian) deployments. Caddy handles HTTPS termination, reverse
proxying to all services (API, React app, Controller, Kiwix, Help, Map),
and serves the media/download file browsers.
- Generate a Root CA and signed leaf certificates for HTTPS. The Root CA
uses Name Constraints to restrict signing to local addresses only
(.local, localhost, and RFC 1918 private IP ranges), mitigating MITM
risk if the CA key is compromised.
- Add an HTTP landing page that guides users through one-time CA
certificate installation on iOS, Android, macOS, Windows, Linux, and
Firefox, with auto-redirect when the cert is already trusted.
- Add trailing-slash redirects for /controller, /docs, /media, and
/download so bare paths don't fall through to the React catch-all.
- Add a Root CA download link on the Settings page under Configs.
- Update help.sh diagnostics for IPv6 listener detection and HTTP/2
status codes.
- Remove all nginx config files and the https_proxy Docker container.
- Bump wrolpi-help submodule with certificate documentation.
2026-03-07 12:08:27 -07:00
|
|
|
systemctl enable wrolpi-cert-renew.timer
|
2023-09-24 20:10:09 -06:00
|
|
|
|
2025-12-11 18:32:55 -07:00
|
|
|
# Repair Controller (offline-safe - no pip install)
|
|
|
|
|
repair_controller() {
|
|
|
|
|
echo "Checking WROLPi Controller..."
|
|
|
|
|
|
|
|
|
|
# Check venv exists
|
|
|
|
|
if [ ! -f /opt/wrolpi/controller/venv/bin/python ]; then
|
|
|
|
|
echo "ERROR: Controller venv missing!"
|
|
|
|
|
echo "Run install.sh or upgrade.sh (requires internet) to reinstall."
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Check venv is functional
|
|
|
|
|
if ! /opt/wrolpi/controller/venv/bin/python --version > /dev/null 2>&1; then
|
|
|
|
|
echo "ERROR: Controller venv is corrupted!"
|
|
|
|
|
echo "Run install.sh or upgrade.sh (requires internet) to reinstall."
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Check systemd service is installed
|
|
|
|
|
if [ ! -f /etc/systemd/system/wrolpi-controller.service ]; then
|
|
|
|
|
echo "Controller systemd service not installed, copying..."
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/wrolpi-controller.service /etc/systemd/system/
|
|
|
|
|
systemctl daemon-reload
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Ensure service is enabled
|
|
|
|
|
if ! systemctl is-enabled wrolpi-controller > /dev/null 2>&1; then
|
|
|
|
|
echo "Enabling Controller service..."
|
|
|
|
|
systemctl enable wrolpi-controller
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "Controller repair completed"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Run Controller repair if venv exists (skip on fresh install)
|
|
|
|
|
if [ -d /opt/wrolpi/controller/venv ]; then
|
|
|
|
|
repair_controller || echo "Controller repair failed, continuing..."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Start Controller so user can monitor repair in UI.
|
|
|
|
|
systemctl start wrolpi-controller
|
|
|
|
|
|
2024-07-31 15:01:31 -06:00
|
|
|
/usr/bin/systemctl daemon-reload
|
2023-09-24 20:10:09 -06:00
|
|
|
|
|
|
|
|
# WROLPi needs a few privileged commands.
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/90-wrolpi /etc/sudoers.d/90-wrolpi
|
|
|
|
|
chmod 0440 /etc/sudoers.d/90-wrolpi
|
|
|
|
|
# Verify this new file is valid.
|
|
|
|
|
visudo -c -f /etc/sudoers.d/90-wrolpi
|
|
|
|
|
|
|
|
|
|
# Configure Postgresql. Do this after the API is stopped.
|
|
|
|
|
/opt/wrolpi/scripts/initialize_api_db.sh
|
|
|
|
|
# wrolpi user is superuser so they can import maps.
|
2025-01-01 10:59:28 -07:00
|
|
|
sudo -iu postgres psql -c "alter user wrolpi with superuser"
|
2023-09-24 20:10:09 -06:00
|
|
|
|
|
|
|
|
# Create the media directory. This should be mounted by the maintainer.
|
|
|
|
|
[ -d /media/wrolpi ] || mkdir /media/wrolpi
|
2024-03-16 19:57:01 -06:00
|
|
|
# Create config directory if external drive is mounted, and is empty.
|
|
|
|
|
if grep -qs /media/wrolpi /proc/mounts && [ -z "$(ls -A /media/wrolpi)" ] && [ ! -d /media/wrolpi/config ]; then
|
|
|
|
|
mkdir /media/wrolpi/config
|
|
|
|
|
fi
|
2024-12-11 11:52:33 -07:00
|
|
|
|
2025-03-23 09:59:13 -06:00
|
|
|
# Build the frontend app.
|
|
|
|
|
(cd /opt/wrolpi/app && npm run build)
|
|
|
|
|
|
2024-12-11 11:52:33 -07:00
|
|
|
# Change owner of the media directory, ignore any errors because the drive may be fat/exfat/etc.
|
|
|
|
|
chown wrolpi:wrolpi /media/wrolpi 2>/dev/null || echo "Ignoring failure to change media directory permissions."
|
2026-03-29 18:58:31 -06:00
|
|
|
# Ensure the config directory is owned by wrolpi so the API can write config files.
|
|
|
|
|
[ -d /media/wrolpi/config ] && chown -R wrolpi:wrolpi /media/wrolpi/config 2>/dev/null || :
|
2023-09-24 20:10:09 -06:00
|
|
|
|
2026-02-15 14:38:50 -07:00
|
|
|
# Remove immutable flag from blob files before chown (may not exist or may not be set).
|
|
|
|
|
chattr -i /opt/wrolpi-blobs/* 2>/dev/null || :
|
|
|
|
|
|
2023-09-24 20:10:09 -06:00
|
|
|
chown -R wrolpi:wrolpi /home/wrolpi /opt/wrolpi*
|
|
|
|
|
|
2026-02-15 14:38:50 -07:00
|
|
|
# Protect blob files from accidental modification or deletion.
|
|
|
|
|
# These files are critical for initializing WROLPi.
|
2026-03-29 18:58:31 -06:00
|
|
|
if [ -d /opt/wrolpi-blobs ] && ls /opt/wrolpi-blobs/* >/dev/null 2>&1; then
|
2026-02-15 14:38:50 -07:00
|
|
|
chown -R root:root /opt/wrolpi-blobs
|
|
|
|
|
chmod 444 /opt/wrolpi-blobs/*
|
|
|
|
|
chattr +i /opt/wrolpi-blobs/*
|
|
|
|
|
fi
|
|
|
|
|
|
2024-10-13 14:24:11 -06:00
|
|
|
# Copy MOTD once the repair has been successful.
|
2025-08-18 11:33:44 -06:00
|
|
|
cp /opt/wrolpi/etc/raspberrypios/motd/30-wrolpi.motd /etc/update-motd.d/30-wrolpi
|
|
|
|
|
chmod +x /etc/update-motd.d/*
|
2024-10-13 14:24:11 -06:00
|
|
|
|
2026-02-14 17:05:57 -07:00
|
|
|
# Copy desktop shortcuts to existing users (new users get them from /etc/skel).
|
|
|
|
|
if [[ ${rpi} == true ]]; then
|
|
|
|
|
for user_home in /home/wrolpi /home/pi; do
|
|
|
|
|
if [ -d "${user_home}/Desktop" ]; then
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/*.desktop "${user_home}/Desktop/"
|
|
|
|
|
chown -R "$(basename ${user_home})":"$(basename ${user_home})" "${user_home}/Desktop/"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
# Update skeleton for future users.
|
|
|
|
|
mkdir -p /etc/skel/Desktop
|
|
|
|
|
cp /opt/wrolpi/etc/raspberrypios/*.desktop /etc/skel/Desktop/
|
|
|
|
|
fi
|
|
|
|
|
|
2023-11-22 12:36:00 -07:00
|
|
|
systemctl restart wrolpi-help
|
2023-09-24 20:10:09 -06:00
|
|
|
systemctl start wrolpi.target
|
2023-10-03 19:21:12 -06:00
|
|
|
|
|
|
|
|
set +x
|
|
|
|
|
|
|
|
|
|
echo "Repair has completed. You may run /opt/wrolpi/help.sh to check system status."
|