HowTo: odoo on a uberspace
Die ERP- und CRM-Software odoo auf einem uberspace ist eine super Sache, wenn es mal läuft. Doch auf dem Weg dahin gibt's leider einige Stolpersteine.

Wie ich hier und da ja schonmal erwähnt habe, betreibe ich inzwischen alle meine Online-Projekte und -Plattformen auf dazugehörigen uberspaces. Ab und an gibt's aber leider auch einige Schwierigkeiten bei der Installation von Software.
Am Ende liegt es meist daran, dass man bei uberspace nun leider doch keinen Root-Server hat - auch wenn es sich meist so anfühlt!
Meistens gibt's Anleitungen, wie man die entsprechende Software trotzdem auf dem uberspace lauffähig macht, manchmal aber auch nicht. In meinem Fall zum Beispiel, als ich odoo installieren wollte, war letzteres der Fall. Nachdem ich das nun aber auch geschafft habe, kommt hier das HowTo:
Sourcen besorgen
Als erstes besorgen wir uns mal den aktuellen Quell-Code von odoo. Git legt dabei dann automatisch das Verzeichnis odoo an. Da odoo im Home-Verzeichnis installiert werden soll, wechseln wir falls nötig vorher noch dahin.
cd ~
git clone https://github.com/odoo/odoo.git
Datenbank vorbereiten
Dann kümmern wir uns um die Datenbank. Odoo benutzt PostgreSQL, das nicht standardmäßig auf uberspaces läuft. Allerdings gibt's hier ein passendes Script
uberspace-setup-postgresql
Dann einmal kurz aus- und wieder einloggen, damit die Umgebungsvariablen sauber gesetzt werden können.
exit
Nun erzeugen wir ein Passwort und speichern es uns in die Variable ODOO_DB_PASS
export ODOO_DB_PASS=*DasPasswort*
und legen den neuen User "odoo" an. Direkt nach der Befehlseingabe muss das Passwort noch (zweimal) eingegeben werden. Also nicht gleich wieder vergessen ;)
createuser -d -P -e odoo
Als nächstes legen wir die Datenbank für odoo an
createdb -e --encoding=UTF8 --owner=odoo odoo
und setzen die Berechtigungen für den Zugriff.
echo "local odoo odoo password" >> ~/postgresql/pg_hba.conf
Zum Abschluss dann noch fix das Backup anlegen.
uberspace-setup-postgresql-backup
Requirements installieren
Weiter geht's im odoo-Verzeichnis.
cd odoo
Dort liegt eine Datei in der die Requirements hinterlegt sind, welche wir installieren wollen.
pip-2.7 install -r requirements.txt --user
Dann testen wir schnell unsere Node-Version.
node -v
und merken wahrscheinlich, dass die Version zu niedrig ist. Also setzen wir die zu benutzende Version neu
echo "export PATH=/package/host/localhost/nodejs-8/bin:$PATH" >> ~/.bash_profile
source ~/.bash_profile
und testen, ob alles richtig geklappt hat.
node -v
Dann erklären wir npm, dass wir auf einem Shared-Hosting arbeiten
cat > ~/.npmrc << __EOF__
prefix = $HOME
umask 077
__EOF__
und dann installieren wir LessCSS.
npm install -g less less-plugin-clean-css
Außerdem benötigt odoo für PDF-Export wkhtmltopdf.
cd ~/tmp
wget https://bitbucket.org/wkhtmltopdf/wkhtmltopdf/downloads/wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
rpm2cpio wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm | cpio -idmv
cp ~/tmp/usr/local/bin/* ~/bin/
npm install -g wkhtmltopdf --user
Sollte es zu einem Fehler beim Download kommen, schaut einfach nochmal nach dem richtigen Link.
Odoo-Start vorbereiten
Odoo benötigt einen freien Port um zu laufen. Daher wählen wir uberspace-gemäß einen Port zwischen 61000 und 65535 aus, speichern in die Variable ODOO_PORT
export ODOO_PORT=*Der Port*
und prüfen, ob er noch frei ist
netstat -tulpen | grep $ODOO_PORT
Nun sollte keine Ausgabe erfolgen. Falls doch müssen wir einen anderen Port wählen und die letzten beiden Schritte erneut ausführen.
Odoo starten
Nun sollte odoo starten können. Das testen wir mit
python2.7 -u ~/odoo/odoo-bin --xmlrpc-port=$ODOO_PORT --db_host=/home/$USER/tmp/ --db_user=odoo --db_password=$ODOO_DB_PASS
Wenn der Start entsprechend erfolgreich war und keine Fehlermeldung kam, brechen wir den Start wieder mit CRTL+C ab.
Daemon einrichten
Nun richten wir odoo als Dienst ein. Hierzu erstellen wir folgende Verzeichnisse
mkdir ~/etc/run-odoo
mkdir ~/etc/run-odoo/log
und befüllen sie anschließend mit der Config für den Daemon
cat <<__EOF__ > ~/etc/run-odoo/run
#!/bin/sh
export PATH=/package/host/localhost/nodejs-8/bin:/package/host/localhost/postgresql-9.2/bin:/package/host/localhost/php-5.6/bin:/package/host/localhost/perlbrew/bin:/package/host/localhost/gnutls-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/$USER/bin
exec python2.7 -u ~/odoo/odoo-bin --xmlrpc-port=$ODOO_PORT --db_host=/home/$USER/tmp/ --db_user=odoo --db_password=$ODOO_DB_PASS --proxy-mode 2>&1
__EOF__
und der Config für den Log.
cat <<__EOF__ > ~/etc/run-odoo/log/run
#!/bin/sh
exec multilog t ./main
__EOF__
Dann machen wir die beiden Dateien noch ausführbar
chmod +x ~/etc/run-odoo/run
chmod +x ~/etc/run-odoo/log/run
und setzen den entsprechenden Link.
ln -s ~/etc/run-odoo ~/service/odoo
Nun sollte odoo als Dienst starten können.
svc -u ~/service/odoo
Selbstverständlich kontrollieren wir auch das.
svstat ~/service/odoo
Domain und Verschlüsselung
Damit's gleich einfacher wird speichern wir auch die Domain für odoo in einer Variablen.
export ODOO_DOMAIN='odoo.domain.tld'
Dann Verknüpfen wir die Domain mit unserem uberspace-Account
uberspace-add-domain -w -d $ODOO_DOMAIN
und richten die Verschlüsselung ein.
uberspace-letsencrypt
letsencrypt certonly
uberspace-add-certificate -k ~/.config/letsencrypt/live/$ODOO_DOMAIN/privkey.pem -c ~/.config/letsencrypt/live/$ODOO_DOMAIN/cert.pem
Nun sollte der Zugriff per HTTPS schonmal funktionieren, eine automatische Zertifikats-Verlängerung ist aber auch ganz schick.
cat >> ${HOME}/.config/letsencrypt/cli.ini <<__EOF__
# To prevent being forced to agree manually to the terms
agree-tos = True
__EOF__
domain=$(grep -e "[ \t]*domains.*" ~/.config/letsencrypt/cli.ini| sed "s/ //g" |cut -d "=" -f2 | cut -d "," -f1)
cat > ${HOME}/bin/letsencrypt-renew <<__EOF__
#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
# sleep for a random time so not all certificates get renewed at the same time
sleep $(expr $RANDOM % 600)
openssl x509 -checkend $(( 21 * 86400 )) -in ~/.config/letsencrypt/live/${domain}/cert.pem > /dev/null
if [ \$? != 0 ]; then
# run let's encrypt
letsencrypt certonly
# import certificate
uberspace-add-certificate -k ~/.config/letsencrypt/live/${domain}/privkey.pem -c ~/.config/letsencrypt/live/${domain}/cert.pem
fi
__EOF__
chmod +x ${HOME}/bin/letsencrypt-renew
Dann noch fix den Cronjob anlegen.
crontab -e
und folgendes eintragen:
@daily ~/bin/letsencrypt-renew
odoo erreichbar machen
Um odoo nun auch unter der Domain erreichen zu können, legen wir das Verzeichnis für die Domain an
mkdir /var/www/virtual/$USER/$ODOO_DOMAIN
und erstellen eine entsprechende .htaccess-Datei.
cat << __EOF__ > /var/www/virtual/${USER}/${ODOO_DOMAIN}/.htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteRule (.*) http://localhost:$ODOO_PORT/\$1 [P]
__EOF__
Nun sollte odoo per Browser unter der entsprechenden Domain erreichbar sein.
Viel Spaß mit odoo!
In diesem Sinne, bis dann!