Ausflug zu Pixelfed mit Docker im November 2019

Intro

Dieses Wochenende habe ich mir mal Pixelfed angesehen - eine Art Instagram-Klon. Dieser Blogeintrag dient dazu, die recherchierten Informationen mal alle zusammenzutragen, weil die Dokumentation zu wünschen übrig lässt.

Pixelfed ist ein mit Laravel in PHP erstelltes Projekt. Neben PHP hat es noch weitere Abhängigkeiten zu einer Datenbank: MySQL, PGSQL und sqlite werden wohl unterstützt, wobei MySQL im Moment also default vorgesehen ist. Außerdem kommt noch Redis dazu.

Das klingt super, um es in Docker Container zu packen. Erste Aktivitäten bzgl. Docker sind in dem Projekt auch schon gestartet. Leider nutzt der Initiator des Projekts, Daniel, nicht Docker. Daher ist alles rund um Docker etwas stiefmütterlich gepflegt. Das führt also zu diesem Blog und ein paar Änderungen für Docker, die auch schon in das Projekt eingeflossen sind.

Installation

Wie in der Installtionsdokumentation geschrieben, lädt man sich zunächst eine Kopie des Projekts und erstellt die Produktionsumgebung:

git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed
cd pixelfed
cp .env.example .env

Die Datei .env passt man entsprechend den eigenen Anforderungen an. Hierbei gibt es zu beachten, dass man den APP_KEY mit exakt 32 zufälligen Zeichen befüllt. Der eigentliche Weg wäre gewesen, dieses Feld leer zu lassen und mit dem Befehl php artisan key:generate einen Key zu erstellen. Doch das befüllte bei mir dieses Feld mit einem base64 codierten Schlüssel, mit dem die Applikation nichts anfangen konnte. Also habe ich kurzerhand KeepassXC bemüht, mir 32 Zeichen Zufall zu geben und diese manuall eingetragen. Ich habe noch nicht herausgefunden, welchen Nebeneffekt das haben könnte. Außerdem habe ich das mit key:generate noch mit der Version v0.10.6 getestet. Mittlerweile habe ich auf den heutigen Stand vom dev Branch gewechselt, wo ich nicht noch einmal ausprobiert habe, ob das Problem noch exisitiert.

Wenn die .env stimmig ist, kann man die Container starten und die Datenbank erstellen:

docker-compose up
docker-compose exec app php artisan migrate --force

Feintuning

Administrator

Im Prinzip ist man damit fertig und man kann Pixelfed aufrufen, sich registrieren und es nutzen. Evtl. möchte man noch einen Adminnutzer bestimmen. Das geht mit docker-compose mit dem folgenden Kommando: docker-compose exec app php artisan user:admin ADMINUSER, wobei ADMINUSER durch den Nutzernamen ersetzt wird, der die Rolle zugeteilt bekommen soll.

App Unterstützung

Pixelfed unterstützt mobile Apps (noch nicht vollständig). Um die generelle Unterstützung für mobile Apps zu aktivieren, muss man laut Release Notes von v0.10.6 folgenden Schritte durchführen.

docker-compose exec app php artisan passport:keys

In die Datei .env wird die Zeile OAUTH_ENABLED=true hinzugefügt und anschließend die Änderung dieser Datei neu in den Cache geladen:

docker-compose exec app php artisan config:cache

Das hat bei mir aber nicht ausgereicht, sodass ich die Container mittels down und up neustarten musste. Ein restart hat nicht gereicht:

docker-compose down
docker-compose up

Welche App unterstützt wird, habe ich weiter unten aufgeschrieben.

Orte

Die neue sog. “ComposeUI v4 BETA” für das Hochladen von Bilder unterstützt seit Release v0.10.1, dass man den Ort, wo das Foto erstellt wurde, festlegen kann. Um die Unterstützung für dieses Feature zu aktivieren muss man einmalig folgendes Kommando ausführen während die Docker Container laufen:

docker-compose exec app php artisan import:cities

Damit kann man beim Beitrag erstellen den Ort festlegen. Die Suche nach Orten beachtet die Groß- und Kleinschreibung.

Dateigröße für Uploads

Da ich einen nginx als Proxy für den Docker Container nutze, muss der nginx so konfiguriert werden, dass der Standwert iHv. 1 MB erhöht wird. Man sollte den Wert so erhöhen, dass er größer gleich dem Wert für Uploads ist, der in der Datei .env eingestellt ist.

v0.10.7?

Da das Release v0.10.7 im Moment noch auf sich warten lässt, wurde verkündet, dass man den dev Branch, der bereits 145 Commits neuer als v0.10.6 ist, nutzen soll.

Andere Benutzer finden

Um Nutzer anderer Pixelfed-Instanzen hinzuzufügen, muss man die komplette URL zu dem jeweiligen Profil in das Suchfenster in Pixelfed eingeben. Dann findet Pixelfed den Nutzer der anderen Instanz und man kann ihn hinzufügen.

Offene Punkte

Filter

Was im Moment noch nicht funktioniert, ist die Vorschau von einem Bild für verschiedene Filter. Diese Vorschau sieht man direkt nach dem Upload eines Bildes und sollte eigentlich das Originalbild anzeigen wie es mit verschiedenen Filtern aussieht. Diese Filterbilder können im Moment aber nicht angezeigt werden und die URL auf diese Bilder gibt vom Webserver ein 404 zurück.

PostgreSQL

Wenn man pgsql als Datenbank wählt, kommt man momentan nicht weit, da diese noch nicht richtig unterstützt wird.

Welche App wird unterstützt?

Ich habe Fedilab und Fedilab Lite erfolglos getestet. Die Ansage ist aber, dass Fedilab Lite ab Version 2.23.0 Pixelfed untersützt. Nur doof, dass in F-Droid das Update immer noch nicht angekommen ist. Dort ist Version 2.22.2 noch die aktuellste. 😞

Mein Pixelfed Konto

Wer bis hier gelesen hat und mich auf Pixelfed hinzufügen möchte, kann mich unter folgender Adresse finden: https://pixel.strubbl.de/strubbl

November 2, 2019 · 4 Minuten

Tiny Tiny RSS systemd Service Unit

Inspiriert von TauSys Blogeintrag Tiny Tiny RSS Update-Daemon unter systemd betreiben habe ich mein init.d Script für TT-RSS mal entfernt und durch eine systemd Service Unit ersetzt. Ganz übernehmen konnte ich Tausys Unit nicht, minimale Änderungen mussten her und nun sieht meine Unit so aus:

$ cat /lib/systemd/system/ttrss.service
[Unit]
Description=Tiny Tiny RSS update daemon
After=network.target mysql.service
Requires=network.target remote-fs.target nss-lookup.target mysql.service

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/ttrss
Type=simple
StandardOutput=null
StandardError=journal
ExecStart=/usr/bin/php ./update_daemon2.php
PrivateTmp=true
InaccessibleDirectories=/home /root /boot /opt /mnt /media
ReadOnlyDirectories=/etc /usr
Restart=always

[Install]
WantedBy=multi-user.target

Update 16.8.16: Service umbenannt, StandardOutput=journal, StandardError=journal, Restart=always

Update 22.8.16: StandardOutput=null

September 22, 2015 · 1 Minute

Weitere logcheck Regeln für amavisd-new, dovecot und postfix unter Debian Wheezy

Ich habe soeben wieder logcheck in Betrieb genommen und erst einmal die paar folgenden, weiteren Regeln hinzugefügt bzw. bestehende leicht modifiziert.


diff --git a/logcheck/ignore.d.server/amavisd-new b/logcheck/ignore.d.server/amavisd-new
index 2dce777..d0d8743 100644
--- a/logcheck/ignore.d.server/amavisd-new
+++ b/logcheck/ignore.d.server/amavisd-new
@@ -3,3 +3,5 @@
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) NOTICE: Not sending DSN in response to bulk mail from <[^.]*> containing [[:upper:] ]+, mail intentionally dropped$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) INFO: unfolded [[:digit:]]+ illegal all-whitespace continuation lines$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) WARN: address modified \((sender|recipient)\): <[^>]+> -> <[^>]+>$&lt;br />
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) Passed (BAD-HEADER-[:digit:]|UNCHECKED|CLEAN|SPAM(MY)?) {(RelayedInbound|RelayedTaggedInbound|RelayedOpenRelay|RelayedInternal)(,Quarantined)?},( LOCAL)? (\[[.[:digit:]]+\]:[[:digit:]]+ )?(\[[.:[:alnum:]]+\] )?<([._-=@[:alnum:]]+)?> -> <([._-=@[:alnum:]]+)?>,( quarantine: [._-=/@[:alnum:]]+,)? (Queue-ID: [[:alnum:]]+, )?(Message-ID: &lt;.*>, )?mail_id: [-_[:alnum:]]+, Hits: -?[.[:xdigit:]]*, size: [[:digit:]]+, queued_as: [_[:alnum:]]+, [[:digit:]]+ ms$&lt;br />
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) Blocked BANNED \(.*\) {(No)?BouncedInbound,Quarantined}, (\[[.[:digit:]]+\]:[[:digit:]]+ )?(\[[.:[:alnum:]]+\] )?<([._-=@[:alnum:]]+)?> -> <([._-=@[:alnum:]]+)?>, (quarantine: [[:alnum:]]/.*, )?(Queue-ID: [[:alnum:]]+, )?(Message-ID: &lt;[._-$%@[:alnum:]]+>, )?mail_id: [-_[:alnum:]]+, Hits: -?[.[:xdigit:]]*, size: [[:digit:]]+, (queued_as: [_[:alnum:]]+, )?[[:digit:]]+ ms$&lt;br />
diff --git a/logcheck/ignore.d.server/dovecot b/logcheck/ignore.d.server/dovecot
index 8f4dcb6..643a4e4 100644
--- a/logcheck/ignore.d.server/dovecot
+++ b/logcheck/ignore.d.server/dovecot
@@ -7,12 +7,13 @@
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot-auth: pam_unix\(dovecot:[[:alnum:]]+\): check pass; user unknown$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot-auth: pam_ldap: error trying to bind as user \".*\" \(Invalid credentials\)$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (imap|pop3)-login: Login: [.[:alnum:]@-]+ \[[.:[:xdigit:]]+\]$
-^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Aborted login( \([[:digit:]]+ authentication attempts\))?: (user=<[-_.@[:alnum:]]+>, method=[[:alnum:]-]+, )?rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+(, (TLS( handshake)?|secured))?$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Aborted login( \([[:digit:]]+ authentication attempts\))?: (user=<[-_.@[:alnum:]]+>, method=[[:alnum:]-]+, )?rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+(, (TLS( handshake)?|secured))?
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: (Disconnected|Aborted login)(: Inactivity)? (\(no auth attempts\):|\(auth failed, [[:digit:]]+ attempts\): user=<[-_.@[:alnum:]]+>, method=PLAIN,|\(aborted authentication\): method=PLAIN,) rip=[.[:digit:]]+, lip=[.[:digit:]]+, (TLS|SSL)(( handshaking)?(: Disconnected)?|: SSL_read\(\) syscall failed: Connection reset by peer)?$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Disconnected: ((Too many invalid commands|Inactivity): )?(user=<[-_.@[:alnum:]]+>, )?(method=[[:alnum:]-]+, )?rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+(, (TLS( handshake)?|secured))?$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Disconnected: Logged out$
-^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Login: user=<[-_.@[:alnum:]]+>, method=[[:alnum:]-]+, rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+(, (TLS( handshake)?|secured))?$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Login: user=<[-_.@[:alnum:]]+>, method=[[:alnum:]-]+, rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+(, mpid=[[:digit:]]+)?(, (TLS( handshake)?|secured))?
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: IMAP\([-_.@[:alnum:]]+\): Connection closed(: Connection reset by peer)?( bytes=[[:digit:]]+/[[:digit:]]+)?$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: imap\([-_.@[:alnum:]]+\): Connection closed(: Connection reset by peer)?( in=[[:digit:]]+ out=[[:digit:]]+)?$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: IMAP\([-_.@[:alnum:]]+\): Disconnected(: Logged out| for inactivity|: Disconnected| in [[:upper:]]+|: Too many invalid IMAP commands\.)?( bytes=[[:digit:]]+/[[:digit:]]+)?$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: IMAP\([-_.@[:alnum:]]+\): Fixed index file /[-._/[:alnum:]&#038;]+/dovecot\.index: first_(recent|unseen)_uid_lowwater [[:digit:]]+ -> [[:digit:]]+$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: POP3\([-_.@[:alnum:]]+\): Disconnected(: Logged out| for inactivity|: Disconnected)? top=[[:digit:]]+/[[:digit:]]+, retr=[[:digit:]]+/[[:digit:]]+, del=[[:digit:]]+/[[:digit:]]+, size=[[:digit:]]+$
@@ -22,5 +23,9 @@
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: auth\([[:alnum:]]+\): client in: CONT<hidden>
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: auth\([[:alnum:]]+\): client out: CONT[[:space:]]+[[:digit:]]+[[:space:]]+[[:alnum:]]+$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: ssl-build-param: SSL parameters regeneration completed$
-^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: managesieve-login: Login: user=<[._[:alnum:]-]+>, method=[[:alnum:]-]+, rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+, (TLS( handshake)?|secured)$
-^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: MANAGESIEVE\([._[:alnum:]-]+\): (Connection closed|Disconnected: Logged out)( bytes=[[:digit:]]+/[[:digit:]]+)?$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: managesieve-login: Login: user=<[._[:alnum:]-]+>, method=[[:alnum:]-]+, rip=[.:[:xdigit:]]+, lip=[.:[:xdigit:]]+, (TLS( handshake)?|secured)
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: managesieve\([._[:alnum:]-]+\): (Connection closed|Disconnected: Logged out)( bytes=[[:digit:]]+/[[:digit:]]+)?$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: (Disconnected|Aborted login)(: Inactivity)? \(
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: imap\([-_.@[:alnum:]]+\): Disconnected
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: lda\([-_.@[:alnum:]]+\): sieve: msgid=.*: stored mail into mailbox '[-.[:alnum:]]+'$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: auth-worker\([-_.[:alnum:]]+\): (pg|my)sql\([.:[:xdigit:]]+\): Connected to database [-_.[:alnum:]]+$
diff --git a/logcheck/ignore.d.server/movim b/logcheck/ignore.d.server/movim
new file mode 100644
index 0000000..64eef12
--- /dev/null
+++ b/logcheck/ignore.d.server/movim
@@ -0,0 +1,5 @@
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ movim\[[[:digit:]]+\]: movim.ERROR: Undefined (index|offseti|variable): [[:alnum:]]+ \[\] \[\]$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ movim\[[[:digit:]]+\]: movim.ERROR: array_key_exists() expects parameter 2 to be array, boolean given \[\] \[\]$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ movim\[[[:digit:]]+\]: movim.ERROR: Use of undefined constant FAIL_SAFE - assumed 'FAIL_SAFE' \[\] \[\]$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ movim\[[[:digit:]]+\]: movim.ERROR: Trying to get property of non-object \[\] \[\]$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ movim\[[[:digit:]]+\]: movim.ERROR: Invalid argument supplied for foreach() \[\] \[\]$
diff --git a/logcheck/ignore.d.server/postfix b/logcheck/ignore.d.server/postfix
index 7346aec..297771a 100644
--- a/logcheck/ignore.d.server/postfix
+++ b/logcheck/ignore.d.server/postfix
@@ -168,3 +168,4 @@
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/trivial-rewrite\[[[:digit:]]+\]: warning: valid_ipv4_hostaddr: invalid octet count: ?$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/smtpd\[[[:digit:]]+\]: warning: TLS library problem: [[:digit:]]+:error:[[:xdigit:]]+:SSL routines:SSL23_GET_CLIENT_HELLO:(unknown protocol|http request):s23_srvr\.c:[[:digit:]]+:$
 ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/verify\[[[:digit:]]+\]: cache [-._[:alnum:]/]+ full cleanup: retained=[[:digit:]]+ dropped=[[:digit:]]+ entries$
+^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/smtpd\[[[:digit:]]+\]: warning: hostname [-._[:alnum:]]+ does not resolve to address [.[:digit:]]+$

Updated 07.05.14

Updated 08.05.14

Updated 26.05.14

Updated 27.06.14 (also added movim logcheck rules)

Mai 2, 2014 · 4 Minuten

mysql: symbol lookup error: /usr/lib/libmysqlclient.so.16: undefined symbol

Aus bisher unbekannten Gründen trat bei meinem Server* der Fehler im syslog auf:

mysql: symbol lookup error: /usr/lib/libmysqlclient.so.16: undefined symbol: _ZN5yaSSL8HMaC_MD5C1EPKhj, version libmysqlclient_16

Der Fehler trat außerdem bei folgendem Kommando auf:

mysql -u root -p

Ein

aptitude reinstall libmysqlclient16

reparierte das Problem. Puh!

*Debian Squueze

Dezember 18, 2011 · 1 Minute

Weave Sync und Reg Server Setup unter Debian Lenny

Update vom 16.4.: Der Artikel ist schon einigermaßen veraltet. Daher würd ich den nicht mehr so genau nehmen. Einige Anmerkungen und für einige Probleme haben engagierte Nutzer Kommentare geschrieben.

Wer wie ich mal einen Weave Sync Server unter Debian aufsetzen will, um einen eigenen Server zu haben mit dem das neue Firefox Sync Addon synchronisiert, dem wird die folgende Anleitung helfen.

Voraussetzung für die Anleitung ist ein installierter Apache2 mit mindestens php 5.1, php-json, php-mysql und eine MySQL Installation.

Zunächst hab ich in /var/www ein neues Verzeichnis erstellt und die Server (Sync und Reg Server heruntergeladen, beides entpackt und die Ordner umbenannt:

mkdir weave &#038;&#038; cd weave
wget http://hg.mozilla.org/services/sync-server/archive/tip.tar.gz
wget http://hg.mozilla.org/services/reg-server/archive/tip.tar.gz
tar xfz tip.tar.gz
tar xfz tip.tar.gz.1
mv reg-server-828798f908a0/ reg-server
mv sync-server-55d5049f6eeb/ sync-server

Als nächstes hab ich erstmal einen neuen Vhost für den Apache angelegt und entsprechend der beiden Anleitungen (Sync und Reg) konfiguriert. Die sieht nun so aus:

<VirtualHost myserver.de:80>
        ServerName myserver.de
        Redirect / https://myserver.de
</VirtualHost>
<VirtualHost myserver.de:443>&lt;br />
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/server-cert.pem
        SSLCertificateKeyFile /etc/apache2/ssl/server-key.pem
        ServerAdmin webmaster@myserver.de
        ServerName myserver.de
        DocumentRoot /var/www/weave
        Alias /1.0      /var/www/weave/sync-server/1.0/index.php
        Alias /user/1.0 /var/www/weave/reg-server/1.0/index.php
        Alias /user/1   /var/www/weave/reg-server/1.0/index.php
        Alias /misc/1.0/captcha_html    /var/www/weave/reg-server/1.0/captcha.php
        Alias /misc/1/captcha_html      /var/www/weave/reg-server/1.0/captcha.php
        Alias /weave-registration-static        /var/www/weave/reg-server/1.0/static
        Alias /weave-password-reset             /var/www/weave/reg-server/1.0/forgot_password.php
        CustomLog /var/log/apache2/weave/access.log combined
        ErrorLog /var/log/apache2/weave/error.log
        DirectoryIndex index.php index.html index.htm
        ServerSignature Off
        <Directory "/var/www/weave/">
                Options Indexes FollowSymLinks
                AllowOverride none
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

Anschließend muss eine neue Datenbank erstellt werden. Auf dieser muss dann der folgende SQL-Code ausgeführt werden, der die Tabellen erstellt:

CREATE TABLE `collections` (
  `userid` int(11) NOT NULL,
  `collectionid` smallint(6) NOT NULL,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY  (`userid`,`collectionid`),
  KEY `nameindex` (`userid`,`name`)
) ENGINE=InnoDB;
CREATE TABLE `wbo` (
  `username` int(11) NOT NULL,
  `collection` smallint(6) NOT NULL default '0',
  `id` varbinary(64) NOT NULL default '',
  `parentid` varbinary(64) default NULL,
  `predecessorid` varbinary(64) default NULL,
  `sortindex` int(11) default NULL,
  `modified` bigint(20) default NULL,
  `payload` longtext,
  `payload_size` int(11) default NULL,
  PRIMARY KEY  (`username`,`collection`,`id`),
  KEY `parentindex` (`username`,`collection`,`parentid`),
  KEY `modified` (`username`,`collection`,`modified`),
  KEY `weightindex` (`username`,`collection`,`sortindex`),
  KEY `predecessorindex` (`username`,`collection`,`predecessorid`),
  KEY `size_index` (`username`,`payload_size`)
) ENGINE=InnoDB;
create table users (
 id int(11) NOT NULL PRIMARY KEY auto_increment,
 username varchar(32),
 password_hash varbinary(128),
 email varbinary(64),
 status tinyint(4) default '1',
 alert text,
 reset varbinary(32) default null
) engine=InnoDB;

Schließlich müssen die beiden Server nur noch eingerichtet werden. Zunächst den Sync Server:

cd /var/www/weave/sync-server/1.0/
cp default_constants.php.dist default_constants.php

Anschließend wird die weave_constants.php bearbeitet. Direkt in der Zeile nach <?php werden die folgenden Zeilen eingefügt, die auf die eigenen Bedürfnisse angepasst werden müssen:

define('WEAVE_AUTH_ENGINE', 'mysql');
define('WEAVE_MYSQL_AUTH_HOST', '<db host>');
define('WEAVE_MYSQL_AUTH_DB', '<db name>');
define('WEAVE_MYSQL_AUTH_USER', '<db username>');
define('WEAVE_MYSQL_AUTH_PASS', '<db password>');
define('WEAVE_STORAGE_ENGINE', 'mysql');
define('WEAVE_MYSQL_STORE_READ_HOST', '<db host>');
define('WEAVE_MYSQL_STORE_READ_DB', '<db name>');
define('WEAVE_MYSQL_STORE_READ_USER', '<db username>');
define('WEAVE_MYSQL_STORE_READ_PASS', '<db password>');
define('WEAVE_MYSQL_STORE_WRITE_HOST', WEAVE_MYSQL_STORE_READ_HOST);
define('WEAVE_MYSQL_STORE_WRITE_DB', WEAVE_MYSQL_STORE_READ_DB);
define('WEAVE_MYSQL_STORE_WRITE_USER', WEAVE_MYSQL_STORE_READ_USER);
define('WEAVE_MYSQL_STORE_WRITE_PASS', WEAVE_MYSQL_STORE_READ_PASS);

Nachdem nun der Sync Server konfiguriert ist, muss der Reg Server noch konfiguriert werden.

cd /var/www/weave/reg-server/1.0/
cp weave_user_constants.php.dist weave_user_constants.php

Die kopierte weave_user_constants.php muss nun noch mit folgenden anzupassenden Zeilen nach dem Lizenzblock ergänzt werden:

# ***** END LICENSE BLOCK *****
define('WEAVE_AUTH_ENGINE', 'mysql');
define('WEAVE_MYSQL_AUTH_HOST', '<db host>');
define('WEAVE_MYSQL_AUTH_DB', '<db name>');
define('WEAVE_MYSQL_AUTH_USER', '<db username>');
define('WEAVE_MYSQL_AUTH_PASS', '<db password>');
define('WEAVE_SHA_SALT', '<hier einen langen, zufälligen salt eingeben; wichtig für sha256>');

Das war es eigentlich schon. Wenn ihr beim Einrichten des Plugins nun eure eigene URL https://myserver.de eingebt, solltet ihr euch einen Account erstellen können und mit dem Server synchronisieren können. Ich hatte leider noch ein Problem mit dem Sync Server.

Ich habe auf meinem Server nur die deutsche Locale installiert:

strubbl:~$ locale -a
C
de_DE.utf8
POSIX

Dadurch gab es einen Fehler. Dieser wurde in der Datei /var/www/sync-server/1.0/weave_user/mysql.php in Zeile 84 geworfen. Die Zeile 83 lautet:

if (setlocale(LC_CTYPE, "UTF8", "en_US.UTF-8") == false)

Wenn man die Locale en_US nicht installiert hat, einfach durch die ersetzen, die man hat. Bei mir ist das dann de_DE und die Zeile sieht wie folgt aus:

if (setlocale(LC_CTYPE, "UTF8", "de_DE.UTF-8") == false)

Wenn es endlich alles läuft, wird man auf die Webseite geleitet: First Run.

Richtet man einen zweiten PC mit dem Sync Account ein, wird man dann auf die Webseite geleitet: Second Run.

UPDATE

Der Bjoern hat das Tutorial vor kurzem gecheckt und einige kleine Anmerkungen gemacht. Ich hab z.Z. keinen eigenen Weave Server mehr am Laufen.

Juli 1, 2010 · 4 Minuten