BACKLINK: http://pad.constantvzw.org/p/2016-05-12-wtc-etherspace

Some notes from use (transmediale 2019)
etherdump: main links should go to live pads
etherdump on home: same structure as from menu

archive policy -- questions whether saving history
connection etherbox.lan / etherbox.local


Goal: create an image for a stable etherpad/dump rpi setup for Constant/Events.

Installation (building from scratch)
=============================

Starting point
----------------------
Working with pi image debian_version=7.8 (wheezy)
Did the usual:
    
    apt-get update
    apt-get upgrade

For my particular LCD Rotation for Raspberry Pi Touch screen
# /boot/config.txt
lcd_rotate=2


Set hostname
----------------------------------
# /etc/hostname
etherbox
#/etc/hosts
...
127.0.1.1    etherbox


Installing node
------------------------------
Node for arm-pi, Last version built is 0.10.28?
https://nodejs.org/dist/v0.10.28/
Version of node in apt (nodejs) seems quite out of date (v 0.6.19)

SO to install, following the wonderfully compact instructions given here (https://github.com/tvl83/RaspPaycoin):

*wget https://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
*cd /usr/local && sudo tar --strip-components 1 -xzf ~/node-v0.10.28-linux-arm-pi.tar.gz


Installing etherpad
-----------------------------
*
*wget http://github.com/ether/etherpad-lite/zipball/master
*sudo mv <result> /opt/etherpad
*sudo chown -R pi:pi /opt/etherpad

and get it working (as pi user):
*
*cd /opt/etherpad
*bin/installDeps.sh
*bin/run.sh

Install etherpad as a service
----------------------------------------
Following https://github.com/ether/etherpad-lite/wiki/How-to-deploy-Etherpad-Lite-as-a-service

*adduser --system --home=/opt/etherpad --group etherpad
*sudo chown -R etherpad /opt/etherpad

Setup a log folder for the service   
*sudo mkdir /var/log/etherpad
*chown -R etherpad /var/log/etherpad
*
Ensure app has full access to its source folder:
*chown -R etherpad-lite /path/to/install/dir
*
Make the init script executable:
*chmod +x /etc/init.d/etherpad

Enable it with:
*sudo update-rc.d etherpad defaults

/etc/init.d/etherpad
==================================
#!/bin/sh

### BEGIN INIT INFO
# Provides:          etherpad
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts etherpad
# Description:       starts etherpad using start-stop-daemon
### END INIT INFO

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin"
LOGFILE="/var/log/etherpad/etherpad.log"
EPLITE_DIR="/opt/etherpad"
EPLITE_BIN="bin/safeRun.sh"
USER="etherpad"
GROUP="etherpad"
DESC="Etherpad"
NAME="etherpad"

set -e

. /lib/lsb/init-functions

start() {
  echo "Starting $DESC... "

    start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile /var/run/$NAME.pid --exec $EPLITE_DIR/$EPLITE_BIN -- $LOGFILE || true
  echo "done"
}

#We need this function to ensure the whole process tree will be killed
killtree() {
    local _pid=$1
    local _sig=${2-TERM}
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}

stop() {
  echo "Stopping $DESC... "
  if test -f /var/run/$NAME.pid; then
    while test -d /proc/$(cat /var/run/$NAME.pid); do
      killtree $(cat /var/run/$NAME.pid) 15
      sleep 0.5
    done
    rm /var/run/$NAME.pid
  fi
  echo "done"
}

status() {
  status_of_proc -p /var/run/$NAME.pid "" "etherpad" && exit 0 || exit $?
}

case "$1" in
  start)
      start
      ;;
  stop)
    stop
      ;;
  restart)
      stop
      start
      ;;
  status)
      status
      ;;
  *)
      echo "Usage: $NAME {start|stop|restart|status}" >&2
      exit 1
      ;;
esac

exit 0

==================================


systemd (not used)
---------------------------
sudo nano /etc/systemd/system/etherpad.service

[Unit]
Description=etherpad (real-time collaborative document editing)
After=syslog.target network.target

[Service]
Type=simple
User=etherpad
Group=etherpad
ExecStart=/opt/etherpad/bin/run.sh

[Install]
WantedBy=multi-user.target

THEN

*sysctl enable etherpad
*
to enable the service on boot.
*
*sysctl start etherpad


Shrinking the image to make a snapshot
----------------------------------------------------------
resize2fs?


Apache
-------------
*sudo apt-get install apache2


Moving the webserver to use a USB stick
---------------------------------------------------------
It's handy that files are stored/served from removable USB sticks.

https://wiki.debian.org/usbmount

sudo apt-get install usbmount

( main script is at: /usr/share/usbmount/usbmount )

Edit the conf file to not use sync (slower), and add webserver as owner/group of mounted devices.

# /etc/usbmount/usbmount.conf
#MOUNTOPTIONS="sync,noexec,nodev,noatime,nodiratime"                                                          
MOUNTOPTIONS="noexec,nodev,noatime,nodiratime"
# ...
FS_MOUNTOPTIONS="uid=www-data,gid=www-data"

MAKE THE PI'S ROOT THE DOCUMENT ROOT!

Change /var/www to / in "default"

# /etc/apache2/sites-available/default
         DocumentRoot /

        <Directory /media>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>


Still TO DO
* create etherbox project (to contain the various scripts) ??!!
* drag and drop file upload... tweak existing script
* editable descriptions ?!... tweak existing script...
* FRAMING LINK(s) TO PAD
* etherdump

* customize usbmount to use label (this would just be very cool, PLUS give the possibility to stabilize the mount point / link)
* unmount  button...
* Make a nice .htacess / descriptions for root incorporating this blog post ?!
https://peter.upfold.org.uk/blog/2006/07/18/a-guide-to-files-and-folders-on-linux/

* OR.... HOW COULD .htaccess files be synced to PAD content ?!?!?
* if in fact EVERY file could be opened in etherpad...
AHA ether BOX becomes a reality...
(BUT.... this is maybe more meta than the etherbox needs to be ?!)

Speaking of meta...
If the instructions to setup the box are on the box itself, it can also link directly to (pads) of changed files themselves... with changes SHOWN using etherpad :!!!

NEED to test limits of slashes in URLs for etherpad.

IDEALLY... this could work to reveal only as much / little of the system as a given usage requires
(more locked down -- just a specific USB stick, or even FOLDER)...
MORE OPEN... the entire system from root downward.

HOW COULD VIEW IN ETHERPAD be implemented as an etherpad plugin (ie when the page is missing... PULL from actual file contents)

https://github.com/ether/etherpad-lite/wiki/Creating-a-plugin
the hooks:
http://etherpad.org/doc/v1.5.7/#index_hooks
padCreate http://etherpad.org/doc/v1.5.7/#index_padcreate
padCreate, Load, Update
padInitToolbar


post lunch sprint...


Install etherdump
----------------------------
git clone https://gitlab.com/activearchives/etherdump.git
sudo apt-get install python-pip
sudo pip install python-dateutil html5lib jinja2
cd etherdump
sudo python setup.py install

directory listing
------------------------
http://howto.unixdev.net/dirlist.html

wed 2 mar 2016
* changed docroot to /media/usb (single stick simplicity!)
* etherpad via proxy (port 80!)
* index css + javascript (versions)
* etherdump button just for /etherdump folder
* etherdump index build
* Install / test / improve droptodownload.cgi
* Install / text editable descriptions
* file clicker to show in iframe (if not directory)

*snapshots (dump files + image)


Creating a proxy for etherpad (serving from port 80)

Add to end of /etc/apache2/sites-available/default
*
*  # ETHERPAD PROXY
*  Redirect /pad /pad/
*  LoadModule  proxy_module         /usr/lib/apache2/modules/mod_proxy.so
*  LoadModule  proxy_http_module    /usr/lib/apache2/modules/mod_proxy_http.so
*  LoadModule  headers_module       /usr/lib/apache2/modules/mod_headers.so
*  LoadModule  deflate_module       /usr/lib/apache2/modules/mod_deflate.so
*  ProxyVia On
*  ProxyRequests Off
*  ProxyPass /pad/ http://localhost:9001/
*  ProxyPassReverse /pad/ http://localhost:9001/
*  ProxyPreserveHost on
*  <Proxy *>
*    Options FollowSymLinks MultiViews
*    AllowOverride All
*    Order allow,deny
*    allow from all
*  </Proxy>

</VirtualHost>