diff --git a/README.md b/README.md
index 472e3ec4..9bd9ca23 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ network so that any user with a laptop/tablet/phone can connect and use the libr
* [Features](#features)
* [Demo](#demo)
+* [Download](#download)
* [Try WROLPi](#try-wrolpi)
* [Debian 11 Install](#debian-11-install)
* [Raspberry Pi Install](#raspberrypi-install)
@@ -46,7 +47,7 @@ network so that any user with a laptop/tablet/phone can connect and use the libr
- [ ] Synchronizer and/or duplicator
- [ ] Food storage calculator
-## Feature Matrix
+## Module features matrix
| **Module** | **Search** | **View** | **Download** |
|--------------------|:-----------|----------|--------------|
@@ -61,6 +62,10 @@ network so that any user with a laptop/tablet/phone can connect and use the libr

+# Download
+
+Images are available on [wrolpi.org](https://wrolpi.org)
+
# Try WROLPi!
You can try out WROLPi by running the docker containers.
@@ -99,21 +104,14 @@ Install WROLPi onto a fresh Debian 11 system.
4. Start WROLPi
* `sudo systemctl start wrolpi.target`
5. Browse to the IP address of your WROLPi!
-6. Run the map installation script (Optional)
- * `sudo /bin/bash /opt/wrolpi/scripts/install_map_debian_11.sh`
# RaspberryPi Install
-## Download
-
-* Download the latest image from [wrolpi.org](https://wrolpi.org)
-
-## Manual install
Install WROLPi onto a fresh Raspberry Pi.
**Warning: this will clobber anything else on the Raspberry Pi! Do not run this installation script elsewhere!**
-1. Install [Ubuntu Server 20.04](https://cdimage.ubuntu.com/releases/20.04/release/) onto a RaspberryPi.
+1. Install [Raspberry Pi OS](https://www.raspberrypi.com/software/operating-systems/) onto a RaspberryPi.
2. Get the WROLPi installation script
* `wget https://raw.githubusercontent.com/lrnselfreliance/wrolpi/release/install.sh -O /tmp/install.sh`
3. Run the installation script
@@ -132,7 +130,7 @@ Install WROLPi onto a fresh Raspberry Pi.
* External USB hard drive
* Power supply and cables
* WiFi USER device such as a phone, tablet, or laptop.
-1. A WROLPi instance should consume a minimal amount of electricity during WROL event. It is expected power will be
+2. A WROLPi instance should consume a minimal amount of electricity during WROL event. It is expected power will be
scarce when WROLPi is needed most.
## User expectations
@@ -143,13 +141,13 @@ Install WROLPi onto a fresh Raspberry Pi.
## Software properties and capabilities
1. A WROLPi instance should be able to "factory-reset" itself without any outside services.
-1. WROLPi should function completely without any internet services.
-1. A user should have easy access to their data if WROLPi fails:
+2. WROLPi should function completely without any internet services.
+3. A user should have easy access to their data if WROLPi fails:
* For example, a user can watch their videos by navigating a short and intuitive directory structure and opening the
video in their preferred video player.
-1. WROLPi should be self-documented. The UI should contain a tutorial for USERS as well as the MAINTAINER.
+4. WROLPi should be self-documented. The UI should contain a tutorial for USERS as well as the MAINTAINER.
* If the UI isn't functional, the code should be documented such that a user can restore functionality.
-1. WROLPi should favor pre-processing, rather than processing during a WROL event. Such as re-encoding a video, or
+5. WROLPi should favor pre-processing, rather than processing during a WROL event. Such as re-encoding a video, or
processing captions. This is to ensure that when a user adds content during non-WROL time, the processing for optimum
performance is already done for a WROL event.
diff --git a/UPGRADE.md b/UPGRADE.md
index 239486ef..45723700 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -14,8 +14,8 @@
3. Build all docker containers
* `docker-compose build --parallel`
4. Create the map volumes
- * `docker volume create --name=openstreetmap-data`
- * `docker volume create --name=openstreetmap-rendered-tiles`
+ * `docker volume create --name=openstreetmap-data`
+ * `docker volume create --name=openstreetmap-rendered-tiles`
5. Turn on the database
* `docker-compose up -d db`
6. Upgrade the database
@@ -25,9 +25,5 @@
## Upgrading Raspberry Pi or Debian 11 Installation
-1. Get the latest release install script
- * `wget https://raw.githubusercontent.com/lrnselfreliance/wrolpi/release/install.sh -O /tmp/install.sh`
-2. Run the installation script
- * `sudo /bin/bash /tmp/install.sh`
-3. Start WROLPi
- * `sudo systemctl start wrolpi.target`
+1. Run the upgrade script
+ * `sudo /bin/bash /opt/wrolpi/upgrade.sh`
diff --git a/etc/debian11/README.md b/etc/README.md
similarity index 100%
rename from etc/debian11/README.md
rename to etc/README.md
diff --git a/etc/ubuntu20.04/000-default.conf b/etc/raspberrypios/000-default.conf
similarity index 93%
rename from etc/ubuntu20.04/000-default.conf
rename to etc/raspberrypios/000-default.conf
index 06b39e80..4a7495d0 100644
--- a/etc/ubuntu20.04/000-default.conf
+++ b/etc/raspberrypios/000-default.conf
@@ -10,8 +10,8 @@
ServerAdmin webmaster@localhost
- LoadTileConfigFile /usr/local/etc/renderd.conf
- ModTileRenderdSocketName /var/run/renderd/renderd.sock
+ LoadTileConfigFile /etc/renderd.conf
+ ModTileRenderdSocketName /run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
diff --git a/etc/debian11/index.html b/etc/raspberrypios/index.html
similarity index 100%
rename from etc/debian11/index.html
rename to etc/raspberrypios/index.html
diff --git a/etc/ubuntu20.04/mod_tile.conf b/etc/raspberrypios/mod_tile.conf
similarity index 100%
rename from etc/ubuntu20.04/mod_tile.conf
rename to etc/raspberrypios/mod_tile.conf
diff --git a/etc/debian11/ports.conf b/etc/raspberrypios/ports.conf
similarity index 100%
rename from etc/debian11/ports.conf
rename to etc/raspberrypios/ports.conf
diff --git a/etc/raspberrypios/renderd b/etc/raspberrypios/renderd
new file mode 100644
index 00000000..133ef16f
--- /dev/null
+++ b/etc/raspberrypios/renderd
@@ -0,0 +1,153 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: renderd
+# Required-Start: $remote_fs
+# Required-Stop: $remote_fs
+# Should-Start: postgresql
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Mapnik rendering daemon
+# Description: Mapnik rendering daemon.
+### END INIT INFO
+
+# Do NOT "set -e"
+
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="Mapnik rendering daemon"
+NAME=renderd
+DAEMON=/usr/bin/$NAME
+DAEMON_ARGS="-c /etc/renderd.conf"
+PIDSOCKDIR=/var/run/$NAME
+PIDFILE=$PIDSOCKDIR/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+RUNASUSER=_renderd
+
+# Exit if the package is not installed
+[ -x "$DAEMON" ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+# Load the VERBOSE setting and other rcS variables
+. /lib/init/vars.sh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+. /lib/lsb/init-functions
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+ [ -d "$PIDSOCKDIR" ] || mkdir -p $PIDSOCKDIR && chown $RUNASUSER $PIDSOCKDIR
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $RUNASUSER --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $RUNASUSER --exec $DAEMON -- \
+ $DAEMON_ARGS \
+ || return 2
+ # Add code here, if necessary, that waits for the process to be ready
+ # to handle requests from services started subsequently which depend
+ # on this one. As a last resort, sleep for some time.
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
+ RETVAL="$?"
+ [ "$RETVAL" = 2 ] && return 2
+ # Wait for children to finish too if this is a daemon that forks
+ # and if the daemon is only ever run from this initscript.
+ # If the above conditions are not satisfied then add some other code
+ # that waits for the process to drop all resources that could be
+ # needed by services started subsequently. A last resort is to
+ # sleep for some time.
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+ [ "$?" = 2 ] && return 2
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+ #
+ # If the daemon can reload its configuration without
+ # restarting (for example, when it is sent a SIGHUP),
+ # then implement that here.
+ #
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+ return 0
+}
+
+case "$1" in
+ start)
+ log_daemon_msg "Starting $DESC" "$NAME"
+ do_start
+ case "$?" in
+ 0|1) log_end_msg 0 ;;
+ 2) log_end_msg 1 ;;
+ esac
+ ;;
+ stop)
+ log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) log_end_msg 0 ;;
+ 2) log_end_msg 1 ;;
+ esac
+ ;;
+ #reload|force-reload)
+ #
+ # If do_reload() is not implemented then leave this commented out
+ # and leave 'force-reload' as an alias for 'restart'.
+ #
+ #log_daemon_msg "Reloading $DESC" "$NAME"
+ #do_reload
+ #log_end_msg $?
+ #;;
+ restart|force-reload)
+ #
+ # If the "reload" option is implemented then remove the
+ # 'force-reload' alias
+ #
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
+ esac
+ ;;
+ *)
+ # Failed to stop
+ log_end_msg 1
+ ;;
+ esac
+ ;;
+ *)
+ #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
+ exit 3
+ ;;
+esac
+
+:
diff --git a/etc/debian11/renderd.conf b/etc/raspberrypios/renderd.conf
similarity index 91%
rename from etc/debian11/renderd.conf
rename to etc/raspberrypios/renderd.conf
index 21c6e68a..81fae66e 100644
--- a/etc/debian11/renderd.conf
+++ b/etc/raspberrypios/renderd.conf
@@ -11,7 +11,7 @@ font_dir_recurse=true
[ajt]
URI=/hot/
-TILEDIR=/var/lib/mod_tile
+TILEDIR=/var/cache/renderd/tiles
XML=/opt/openstreetmap-carto/mapnik.xml
HOST=localhost
TILESIZE=256
diff --git a/etc/ubuntu20.04/wrolpi-api.service b/etc/raspberrypios/wrolpi-api.service
similarity index 76%
rename from etc/ubuntu20.04/wrolpi-api.service
rename to etc/raspberrypios/wrolpi-api.service
index 069696c1..3533fe9a 100644
--- a/etc/ubuntu20.04/wrolpi-api.service
+++ b/etc/raspberrypios/wrolpi-api.service
@@ -5,7 +5,7 @@ PartOf=wrolpi.target
[Service]
Environment=PYTHONUNBUFFERED=1
-ExecStart=/usr/bin/python3 /opt/wrolpi/main.py -v api
+ExecStart=/opt/wrolpi/venv/bin/python3 /opt/wrolpi/main.py -v api
Group=wrolpi
User=wrolpi
WorkingDirectory=/opt/wrolpi/
diff --git a/etc/raspberrypios/wrolpi-app.service b/etc/raspberrypios/wrolpi-app.service
new file mode 100644
index 00000000..11e59b43
--- /dev/null
+++ b/etc/raspberrypios/wrolpi-app.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=WROLPi React APP
+Wants=wrolpi-api.service
+PartOf=wrolpi.target
+
+[Service]
+ExecStart=/usr/bin/serve -s build -l 5000
+Group=wrolpi
+User=wrolpi
+WorkingDirectory=/opt/wrolpi/app/
+
+[Install]
+WantedBy=default.target
diff --git a/etc/ubuntu20.04/wrolpi.target b/etc/raspberrypios/wrolpi.target
similarity index 100%
rename from etc/ubuntu20.04/wrolpi.target
rename to etc/raspberrypios/wrolpi.target
diff --git a/etc/ubuntu20.04/index.html b/etc/ubuntu20.04/index.html
deleted file mode 100644
index 2ab8047f..00000000
--- a/etc/ubuntu20.04/index.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-