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.

HowTo: odoo on a uberspace

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!