Netzteil (DPS-386AP-1) für HP Designjet 5500ps reparieren

Halli Leute,

mit diesem Beitrag möchte ich kurz zeigen, wie ich den Plotter HP Designjet 5500ps mit dem Fehler „Boot Failed – Error: 1f50007 Hard Disk Failure“ reparieren konnte. Ich hoffe ich kann mit diesem Beitrag dem einen oder anderen Bastler weiterhelfen.

Ich möchte an dieser Stelle anmerken: Bei der Reparatur musste ich an Teilen mit Netzspannung arbeiten. Achtung! Hier ist höchste Vorsicht geboten. Bitte nur machen, wenn ihr mehr oder weniger Ahnung habt, was zu tun ist!

Das Problem

Als ich den Plotter HP Designjet 5500ps in die Finger bekommen habe, hat dieser folgenden Fehler angezeigt:

Boot Failed – Error: 1f50007 Hard Disk Failure

Fehler Designjet 5500ps

Fehler Designjet 5500ps: Boot Failed – Error: 1f50007 Hard Disk Failure

Nach ein wenig Recherche im Internet, konnte ich folgende Fehlerquellen finden:

  • Festplatte defekt: Dies kann man ganz einfach prüfen, indem man die Festplatte austauscht. Das System sollte dann die neue Festplatte wieder formatieren und das System sollte starten.
  • Netzteil defekt: Man muss den Stromanschluss für die Festplatte überprüfen. Es sollten jeweils die Spannungen 5V und 12V anliegen.
  • Platine defekt: Wenn das der Fall ist, lohnt es sich wohl nicht mehr, den Drucker zu reparieren.

Als ich die Punkte bei dem vorliegenden Plotter geprüft habe, hat sich herausgestellt, dass zwar 5V an der Festplatte ankommen aber die 12V komplett fehlen. Alles klar: Netzteil defekt.

Das Netzteil

Delta Electronics Netzteil: DPS 386AP-1B

Delta Electronics Netzteil: DPS 386AP-1B

Das Netzteil ist ein Delta Electronics DPS 386AP-1B. Lasst euch nicht von dem „PC-Anschlussstecker“ täuschen. Das Netzteil bringt komplett andere Spannungen und kann nicht einfach durch ein normales Computernetzteil ersetzt werden. Folgende Spannungen werden durch das 300W Netzteil geliefert:

  • +3,3V mit 6,25A
  • +5V mit 1A
  • +12V mit 0,5A
  • +24V mit 4A
  • +36V mit 4,8 A
  • -15V mit 0,025A

Beim Analysieren des Steckers konnte ich folgende Steckerbelegung feststellen:

Steckerbelegung DPS 386AP-1B

Steckerbelegung DPS 386AP-1B

Zusammen mit einem Freund habe ich das Netzteil komplett durchgeschaut. Die Spannungen 36V, 24V und 12V kommen nicht mehr am Stecker an. Die restlichen Spannungen werden noch sauber erstellt. Wir haben zwar das Netzteil untersucht, konnten aber keinen Fehler feststellen.

Die Lösung

Achtung, jetzt wirds schmutzig. Natürlich könnte man das Netzteil einfach austauschen und gut ist (Achtung: Es gibt zwei verschiedene Versionen, achtet darauf, wieder ein 300W Netzteil zu bekommen). Das Netzteil ist aber sehr teuer und man bekommt diese nur gebraucht.

3 Netzteile ersetzen die fehlende Spannung

3 Netzteile ersetzen die fehlende Spannung

Statt das komplette Netzteil zu ersetzen, habe ich in dieser Lösung 3 Netzteile eingebaut die die Spannungen mit der entsprechenden Stromstärke liefern. Es ist alles andere als schön, aber die Lösung ist billig und man muss nur ein wenig basteln. Die Netzteile habe ich bei folgendem Verkäufer recht günstig bekommen:

Die nötigen Stromstärken für die Spannungen sind auf der Leiterplatine unten rechts aufgedruckt. Leider haben zwei Netzteile innen keinen Platz gefunden. Die Lösung sieht dann wie folgt aus:

Das reparierte Netzteil

Das reparierte Netzteil

Das kleine 12V-Netzteil kommt nach innen, das 24V und 36V kommen außen drauf. Alle Stromführenden Leitungen sind isoliert und/oder abgedeckt.

Bitte beachtet: Die Reparatur wurde von mir privat durchgeführt. Ich bin mir sicher, das es nicht 100% korrekt installiert ist. Auf dem Bild fehlen auch die Abdeckungen für die äußeren Netzteile. Diese sind natürlich nochmal abgedeckt, damit man nicht an die Stromführenden Leitungen kommt. Bitte nur nachmachen, wenn man weiß, was man macht.

Vollständige URLs in Dataflow exportierten CSV-Dateien von Magento

Hallo Leute,

Preisvergleichsportale sind ein gutes Mittel um kontrolliert Kunden auf seinen Onlineshop los zu lassen. Dazu nötig ist aber eine CSV-Datei, die alle nötigen Daten enthält. Dies kann man erreichen, indem man sich entweder teure Plugins kauft oder die etwas komplizierte Funktion von Magento nutzt. Es gibt dabei allerdings ein kleines Problem, welches ich mit diesem Beitrag lösen möchte.

Das Problem

Das Problem auf welches ich beim Export von Produktdaten in eine CSV-Datei gestoßen bin: Wenn man die URL zu Produktbildern in der exportierten CSV-Datei haben möchte, wird nicht die vollständige URL angezeigt, also:

p/r/produkt.jpg

statt

https://website.de/media/catalog/product/p/r/produkt.jpg

Die Lösung

Die Lösungsidee klingt simpel: Ich möchte einen Prefix-String vor die Ausgabe schreiben. Klingt einfach, aber benötigt ein wenig Arbeit am Quelltext.

Zunächst muss eine eigenes MapperModel geschrieben werden. Erstellt dazu eine Datei und die fehlenden Ordner in

app/code/local/Mage/Dataflow/Model/Convert/Mapper/MyColumn.php

mit folgendem Inhalt:

<?php
class Mage_Dataflow_Model_Convert_Mapper_MyColumn extends Mage_Dataflow_Model_Convert_Mapper_Column
{
    public function map()
    {
        $batchModel  = $this->getBatchModel();
        $batchExport = $this->getBatchExportModel();

        $batchExportIds = $batchExport
            ->setBatchId($this->getBatchModel()->getId())
            ->getIdCollection();

        $onlySpecified = (bool)$this->getVar('_only_specified') === true;

        if (!$onlySpecified) {
            foreach ($batchExportIds as $batchExportId) {
                $batchExport->load($batchExportId);
                $batchModel->parseFieldList($batchExport->getBatchData());
            }

            return $this;
        }

        if ($this->getVar('map') && is_array($this->getVar('map'))) {
            $attributesToSelect = $this->getVar('map');
        }
        else {
            $attributesToSelect = array();
        }
        if ($this->getVar('prepend') && is_array($this->getVar('prepend'))) {
                $prepend = $this->getVar('prepend');
        } else {
                $prepend = array();
        }
        if (!$attributesToSelect) {
            $this->getBatchExportModel()
                ->setBatchId($this->getBatchModel()->getId())
                ->deleteCollection();

            throw new Exception(Mage::helper('dataflow')->__('Error in field mapping: field list for mapping is not defined.'));
        }

        foreach ($batchExportIds as $batchExportId) {
            $batchExport = $this->getBatchExportModel()->load($batchExportId);
            $row = $batchExport->getBatchData();

            $newRow = array();
            foreach ($attributesToSelect as $field => $mapField) {
                $prepend_2 = isset($prepend[$field]) ? $prepend[$field] : '';
                $newRow[$mapField] = isset($row[$field]) ? $prepend_2 . $row[$field] : null;
            }

            $batchExport->setBatchData($newRow)
                ->setStatus(2)
                ->save();
            $this->getBatchModel()->parseFieldList($batchExport->getBatchData());
        }

        return $this;
    }
}

Es handelt sich dabei um eine Kopie der Funktion map() aus der Datei /app/code/core/Mage/Dataflow/Model/Convert/Mapper/Column.php mit kleineren Anpassungen in Zeile 30-34 und Zeile 49-50. Im Grunde haben wir uns jetzt eine eigene Funktion geschaffen, der wir eine weitere Variable „prepend“ übergeben können, welche dann zu den Werten einer bestimmten Spalte hinzugefügt wird.

Nun müssen wir noch die Datei

app/code/core/Mage/Dataflow/Model/Convert/Profile/Collection.php

in das Verzeichnis

app/code/local/Mage/Dataflow/Model/Convert/Profile/Collection.php

kopieren und eine Zeile im Code anpassen (Achtung dazu muss ein weiterer Ordner hinzugefügt werden). Sucht nach folgender Passage im Code (müsste bei Zeile 165 sein):

 /** @var $varNode Varien_Simplexml_Element */
            foreach ($actionNode->var as $key => $varNode) {
                if ($varNode['name'] == 'map') {
                    $mapData = array();
                    foreach ($varNode->map as $mapNode) {
                        $mapData[(string)$mapNode['name']] = (string)$mapNode;
                    }
                    $container->setVar((string)$varNode['name'], $mapData);
                }  else {

und erweitert die if-Abfrage wie folgt:

 /** @var $varNode Varien_Simplexml_Element */
            foreach ($actionNode->var as $key => $varNode) {
                if ($varNode['name'] == 'map' || $varNode['name'] == 'prepend') {
                    $mapData = array();
                    foreach ($varNode->map as $mapNode) {
                        $mapData[(string)$mapNode['name']] = (string)$mapNode;
                    }
                    $container->setVar((string)$varNode['name'], $mapData);
                }  else {

Dies ist nötig, damit die Variable mit dem Namen „prepend“ auch aufgelöst wird.

Funktionsweise

Die Funktionsweise kann man am besten an einem Beispiel erklären. Ich habe dazu in der Administrationsoberfläche von Magento über System -> Import/Export -> Dataflow – Erweiterte Profile ein Profil angelegt.

2014-07-17 09_53_02-Erweiterte wiederkehrende Leistungen _ Import und Export _ System _ Magento Admi

 

Das erstellte Beispiel soll SKU (Artikelnummer), Artikelname und das Produktfoto in eine CSV exportieren.

<action type="catalog/convert_adapter_product" method="load">
	<var name="store"><![CDATA[2]]></var>
	<var name="filter/qty/from"><![CDATA[1]]></var>
	<var name="filter/qty/to"><![CDATA[999999999]]></var>
	<var name="filter/status"><![CDATA[1]]></var>
</action>

<action type="catalog/convert_parser_product" method="unparse">
	<var name="store"><![CDATA[2]]></var>
</action>

<action type="dataflow/convert_mapper_myColumn" method="map">
	<var name="map">
		<map name="sku"><![CDATA[Artikelnummer]]></map>
		<map name="name"><![CDATA[Artikelbezeichnung]]></map>
		<map name="image"><![CDATA[image]]></map>
	</var>
	<var name="prepend">
		<map name="image"><![CDATA[https://www.bier-kaufen.de/media/catalog/product]]></map>
	</var>
	<var name="_only_specified">true</var>
</action>

<action type="dataflow/convert_parser_csv" method="unparse">
	<var name="delimiter"><![CDATA[,]]></var>
	<var name="enclose"><![CDATA["]]></var>
	<var name="fieldnames">true</var>
</action>

<action type="dataflow/convert_adapter_io" method="save">
	<var name="type">file</var>
	<var name="path">var/export/bika/</var>
	<var name="filename"><![CDATA[products.csv]]></var>
</action>

Da vielleicht nicht jeder schon mit Dataflow-XML-Dateien gearbeitet hat, möchte ich dieses kleine Beispiel zerlegen und erklären. Die XML teilt sich in 5 Bereiche auf:

<action type="catalog/convert_adapter_product" method="load">
	<var name="store"><![CDATA[2]]></var>
	<var name="filter/qty/from"><![CDATA[1]]></var>
	<var name="filter/qty/to"><![CDATA[999999999]]></var>
	<var name="filter/status"><![CDATA[1]]></var>
</action>

<action type="catalog/convert_parser_product" method="unparse">
	<var name="store"><![CDATA[2]]></var>
</action>

In diesem ersten Bereich werden allgemeine Artikelfilter festgelegt. Als z.B.:

  • Es soll store=2 (der Shop den ich verwenden möchte) verwendet werden
  • Es sollen nur Artikel angezeigt werden, mit einem Lagerbestand von 1 bis 999999999
  • Es sollen nur Artikel angezeigt werden, deren status=1 (aktiv) ist.
<action type="dataflow/convert_mapper_myColumn" method="map">
	<var name="map">
		<map name="sku"><![CDATA[Artikelnummer]]></map>
		<map name="name"><![CDATA[Artikelbezeichnung]]></map>
		<map name="image"><![CDATA[BildURL]]></map>
	</var>
	<var name="prepend">
		<map name="image"><![CDATA[https://www.bier-kaufen.de/media/catalog/product]]></map>
	</var>
	<var name="_only_specified">true</var>
</action>

Hier ist nun der interessante Bereich, weswegen der ganze Aufwand getrieben wird. Die Map-Funktion mapped das Feld in der Datenbank auf das Feld in der CSV-Datei. In diesem Beispiel also:

  • Datenbankfeld  „sku“ wird auf die Spalte „Artikelnummer“ in der CSV gemapped
  • Datenbankfeld „name“ wird auf die Spalte „Artikelbezeichnung“ in der CSV gemapped
  • Datenbankfeld „image“ wird auf die Spalte „BildURL“ in der CSV gemapped

Bitte beachtet, dass hier unser eigener Mapper type=“dataflow/convert_mapper_myColumn“ statt dem normalen type=“dataflow/convert_mapper_Column“ verwendet wird.

In der zweiten Variable „prepend“ legen wir dann fest, dass das Feld „image“ noch zusätzlich den Prefix „https://www.bier-kaufen.de/media/catalog/product“ vorangestellt werden soll. Dies kann natürlich mit jedem anderen Feld auch gemacht werden.

<action type="dataflow/convert_parser_csv" method="unparse">
	<var name="delimiter"><![CDATA[,]]></var>
	<var name="enclose"><![CDATA["]]></var>
	<var name="fieldnames">true</var>
</action>

In diesem Teil der XML wird festgelegt wie die CSV-Datei aussehen soll. Also was als Separator verwendet werden soll, oder dass die erste Zeile die Spaltenbezeichnung sein soll.

<action type="dataflow/convert_adapter_io" method="save">
	<var name="type">file</var>
	<var name="path">var/export/bika/</var>
	<var name="filename"><![CDATA[products.csv]]></var>
</action>

Am Schluss legen wir dann nur noch fest, wo die Datei gespeichert wird. Wenn wir nun den Export starten, fällt eine CSV-Datei mit dem gewünschten Inhalt und einer kompletten URL beim Bild heraus.

Fazit

Ich finde es schade, dass Magento eine solche Funktionalität nicht schon von Haus aus mitbringt. Bei der Recherche einer Lösung bin ich auf viele Betroffene gestoßen. Die hier beschriebene Umsetzung ist leider auch nicht 100%-ig schön, weil wir die „Collection.php“ komplett mit einer Eigenen ersetzen. Wenn hier jemand bessere Lösungen hat, immer her damit :). Man sollte bei jedem Update von Magento zur Sicherheit prüfen, ob noch alles so funktioniert, wie gewollt.

Mir haben bei der Lösungsfindung zwei Blog- bzw. Stackoverflow-Beiträge geholfen:

  • http://stackoverflow.com/questions/21789380/magento-advanced-profiles-export-prepend-url-to-image-path um zu verstehen was geändert werden muss
  • http://www.magentocommerce.com/knowledge-base/entry/introduction-to-magento-dataflow um zu verstehen wie Dataflow arbeitet

Ich würde mich über Feedback sehr freuen 🙂 und hoffe dem einen oder anderen weitergeholfen zu haben.

Wie wehre ich mich gegen Werbepost am Beispiel kaffee-partner.de

Halli Leute,

wenn man ein Unternehmen gründet kommt man schnell in diverse Verzeichnisse und kann sich bald vor Werbepost nicht mehr retten. Aber auch privat kommt oft viel Unerwünschtes. Ich möchte euch einige Mittel vorstellen, wie ihr euch aktiv dagegen wehren könnt. Das Ganze geht natürlich am Besten an einem Beispiel und ich habe hierzu die besonders hartnäckige Firma „Kaffee Partner“ gewählt. Zunächst aber erst mal ein paar allgemeine Punkte.

Wie kann ich mich gegen unverwünschte Werbepost wehren?

1. Eintragen in die Robinson-Liste

Die Robinsonliste ist eine Schutzliste, in die sich jeder eintragen kann. Seriöse Firmen prüfen, bevor sie Werbepost verschicken, ob die Adresse hier eingetragen ist. Ist dies der Fall, wird die Werbepost nicht versandt. Natürlich halten sich nicht alle Firmen an die Liste, aber die Werbeflut wird enorm verkleinert.

Der Eintrag in die Robinsonliste geht über die Website: www.robinsonliste.de

2. Aktiv die Weiternutzung der Daten verbieten und die Löschung von Personenbezogenen Daten verlangen

Die Werbepost einfach weg zu werfen ist der falsche Weg. Klar geht es schnell, aber wenn man sich nicht wehrt, wird die Werbeflut nur größer und größer. Jeder deutsche Staatsbürger hat das Recht, die Lösung seiner Daten zu verlangen und darf natürlich auch die weitere Nutzung untersagen. Hierzu gibt es verschiedene Blankos im Internet. Ich habe mich an Folgendem orientiert:

Sehr geehrte Damen und Herren,

in Ihrer Kundendatei sind personenbezogene Daten meine Person betreffend gespeichert. Für den Fall einer Weiterveräußerung dieser Daten widerrufe ich meine Einwilligung in die Nutzung, Speicherung und Weitergabe und fordere Sie auf, gemäß § 35 Bundesdatenschutzgesetz (BDSG) alle Daten, die Sie von mir gespeichert haben, unverzüglich zu löschen.

Ich bitte Sie, dafür zu sorgen, dass die Löschung auch von den Stellen durchgeführt wird, denen Sie meine Daten übermittelt haben, insbesondere auch von Unternehmen, die Daten in Ihrem Auftrag verarbeiten.

Bitte bestätigen Sie mir kurz die Berücksichtigung meines Widerrufs und den umfänglichen Vollzug der Datenlöschung.I ch setze Ihnen zur Erfüllung meiner Forderungen eine Frist bis zum [Eine Frist von 2 Wochen ab Zusendung der Unterlassungserkläurng]. Sollten Sie dieses Schreiben ignorieren, werde ich mich an den zuständigen Landesdatenschutzbeauftragten wenden. Außerdem behalte ich mir weitere rechtliche Schritte vor.

Diesen Text in euren Briefkopf packen, unterschreiben und per Post oder Fax an die Firma senden. Beides sind rechtssichere Wege und beim Fax habt ihr sogar noch den Vorteil einer Sende-/Empfangsbestätigung.

3. Selbst Daten sammeln

Für die spätere Beweisführung ist es besonders wichtig, dass ihr alle Schreiben und Briefumschläge aufhebt. Also, das Schreiben an sich und sogar das Kuvert in dem es euch zugesandt wurde. Auch das Schreiben, das ihr an die Firma sendet ist wichtig, sowie jeglicher sonstige Schriftverkehr.

Ihr werdet euch jetzt fragen, warum man diesen Aufwand treiben muss, aber wenn gar nichts mehr hilft kann man sich auch an den Datenschutzbeauftragten wenden oder weitere rechtliche Schritte einleiten und dann ist der Schriftwechsel Gold wert.

4. Den Landesbeauftragten für Datenschutz einschalten

Wenn alles nichts hilft und ihr trotz Unterlassungserklärung weiter Post erhaltet, empfehle ich euch den „sanften rechtlichen Weg“. Wer hätte es geglaubt, aber jedes Bundesland hat einen eigenen Beauftragten für Datenschutz. Die sind genau für sowas zuständig und der Ablauf ist ziemlich einfach. Sucht euch zunächst den richtigen Datenschutzbeauftragten raus. Es ist immer der Beauftragte des Bundeslandes zuständig, in welchem die Werbefirma sitzt (im Fall Kaffee-Partner, Osnabrück z.B. Niedersachsen). Eine Liste der Beauftragten ist hier zu finden: https://www.datenschutz-bayern.de/ (Menüpunkt „Zuständigkeiten“). Dann einfach eine Email mit einer kurzen Fallbeschreibung an die richtige Stelle senden und fertig ist das Ganze.

Ich habe leider noch keine Erfahrungen, in wiefern man hier dann Antwort erhält, was unternommen wurde oder was man noch machen kann. Ich werde euch aber im aktuellen Fall Kaffee Partner auf dem laufenden halten.

Der Fall Kaffee-Partner

Ich habe euch nun ein paar Tricks gezeigt wie man sich gegen lästige Werbefirmen wehren kann. Ein besonders hartnäckiger Fall ist Kaffee-Partner.de und ich möchte euch kurz zeigen, was ich unternommen habe.

Kaffee-Partner vertreibt Vollautomaten, Leihverträge und Leasingzeugsel rund um Kaffee und sitzt in Osnabrück. Da ich keinen Kaffee trinke, ist das für mich eher uninteressante Werbung und ich habe der Zustellung zu 100% nicht zugesagt.

14.12.2013 – Erste Werbebotschaft

Kaffee Partner unerwünschte Werbung Kaffee Partner unerwünschte Werbung

Ich habe von „Kaffee Partner“ per Post direkt an mich einen Werbeflyer
erhalten. Die Adresse war „Timo Schindler, Hard- und Softwarehandel…“. Ich habe diesen Firmennamen lediglich bei der Gewerbeanmeldung verwendet. Die Daten sind offenbar
aus dem Register entnommen worden. Die Werbung ist total toll personalisiert und ich fühle mich natürlich sofort angesprochen und bin interessiert….. nicht.

15.12.2013 – Aufforderung zur Löschung meiner Daten

Schreiben für Kaffee Partner

Ich habe mir schon ein hübsches Blanko zurecht gelegt und investiere gerne das Porto. Bei den meisten Firmen klappt das super und die lästige Werbung war einmal. Gesagt getan, die Firma Kaffee-Partner hat Post von mir erhalten und wurde über meinen Widerruf der Einwilligung (die ich nie gegeben habe) und Löschung meiner personenbezogenen Daten informiert bzw. aufgefordert. Der Text stammt von einem Blanko und darf gerne von jedem weiter verwendet werden.

23.05.2014 – Zweite Werbebotschaft

Kaffee Partner unerwünschte Werbung Kaffee Partner unerwünschte Werbung

 

kaffee-partner6

Wieder habe ich Post von „Kaffee Partner“ erhalten. Aber hey, sie haben diesmal immerhin hübsches Hochglanzpapier verwendet. Am Schreiben selbst hat sich aber nichts geändert. Ich hab euch auch mal den Kuvert eingescannt. „Infopost“ ist aber ein schöner Name für Spam… Offenbar hat also meine Aufforderung nichts gebracht.

26.05.2014 – Landesdatenschutzbeauftragter ist eingeschaltet

Nach einem sehr netten Telefonat mit dem bayrischen und niedersächsischen Leuten für Datenschutz habe ich, wie oben beschreiben, eine Email mit allen Daten an die richtige Stelle geschickt. Nun heißt es mal abwarten, was weiter passiert. Ich werde euch mit Updates auf dem Laufenden halten.

Fazit – Bringt das überhaupt was?

Ich praktiziere diese „Techniken“ nun schon seit etwa einem Jahr und muss sagen, das sich die Flut der Werbepost deutlich verringert hat. Lediglich ein paar hartnäckige Fälle sind dabei. Von manchen erhält man sogar sehr nette „Entschuldigungsschreiben“ und wird informiert, das sowas ja natürlich nicht mehr passiert. Hier ein Beispiel von Daimler:

daimler1 daimler2Der Fall kaffee-partner.de zeigt aber auch, das es einige lästige und nervige Amateur-Vereine gibt, die sich nicht an geltendes Recht halten. Diesen kann man nur auf den Schlips treten, in dem man sich wehrt. In diesem Sinne: Happy Brief-schreibing ;).

 

Einzelne Owncloud Ordner können nicht mehr erreicht werden

Halli Leute,

hier eine kleiner Kurzbeitrag. Ich hatte folgendes Problem:

Ich habe zwei Ownclouds auf einem Server laufen. Die eine Owncloud ist über „Externer Speicher“ in der Anderen eingebunden. Nun hatte ich das Problem, das plötzlich das Sync-Tool im Windows nicht mehr weiter gesynct hat, bevor ich nicht den externen Speicher (also die zweite Owncloud) ausgebunden hab. Im Onlinetool tauchte die Ordner zwar auf, aber bei „Größe“ stand nur „?“ und man konnte nicht mehr in die Ordner gelangen.

Die Lösung des ganzen war eine Reindexierung der Daten:

php console.php files:scan --all

Durch diesen Befehl werden alle Daten neu indexiert. Leider sind aber meine Ownclouds etwas größer, weshalb das PHP-Script so viel RAM verschlungen hat, das das Skript irgendwann gekillt wurde. Die zweite Lösung:

  1. Auf die Datenbank einloggen
  2. In der jeweiligen Datenbank folgenden Befehl ausführen: TRUNCATE oc_filecache;

Dadurch wird der Datei-Cache in der Datenbank geleert und Owncloud baut diesen selbstständig wieder auf.

Dadurch konnte ich die Dateien wieder erreichen. Übrigens waren die Fehler die geworfen wurden:

  • Im Synctool (nachdem ich den Log aktiviert hatte):  ** error Strings:  („Interne Fehlernummer 1060 aufgetreten. 500 Internal Server Error“)
  • Online im Fehlerprotokoll: Resource not found.

Das Log im Synctool habe ich mit dieser Anleitung aktiviert: Wie aktiviere ich das Logging beim Owncloud Sync-Client

Ich hoffe mal ich kann dem einen oder anderen weiterhelfen.

Dovecot 2 mit Postfix auf Debian 7 Wheezy installieren und konfigurieren

Dies ist der Dritte Teil der Postfix Konfiguration. In den ersten zwei Teilen habe ich gezeigt wie man Postfix auf Debian 7 Wheezy mit TLS und IPv6 installiert und dazu den Spamassassin mit Postfix konfiguriert. Nun möchte ich zeigen wie man lokale Emailpostfächer erstellt (also keine reinen Weiterleitungen) und wie man mit IMAP bzw. SMTP darauf zugreifen kann.

Dovecot installieren

In diesem Beispiel wollen wir vollkommen auf POP3 verzichten, daher installieren wir nur die nötigen Pakete für IMAP.

aptitude install dovecot-core dovecot-imapd

Postfix informieren, das Dovecot installiert wird

Wir müssen Postfix noch mitteilen das wir nun Dovecot verwenden. Folgendes muss in der Datei /etc/postfix/main.cf geändert werden:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
home_mailbox = Maildir/

Mit dieser Konfiguration werden die Emails im Homeverzeichnis des jeweiligen lokalen Benutzers abgelegt. Da ich die Emailadressen virtuell mappe (siehe Postfix installieren und konfigurieren) muss ich Postfix auch mitteilen, an welches Lokale Konto ausgeliefert werden soll. Ein Beispiel könnte wie folgt aussehen:

#################################
#                               #
#         examia.de             #
#                               #
#################################
examia.de                                        DOMAIN
webmaster@examia.de                             mail@examia.de
hostmaster@examia.de                            mail@examia.de
postmaster@examia.de                            mail@examia.de
admin@examia.de                                 mail@examia.de
mail@examia.de                                  mail_examia.de@localhost

Mit diesem Setting werden webmaster@examia.de, hostmaster@examia.de, postmaster@examia.de admin@examia.de auf mail@examia.de umgeleitet und mail@examia.de wird an das lokale Emailkonto des Benutzers mail_examia.de zugestellt.

Dovecot konfigurieren

Nun folgt noch die Konfiguration von Dovecot, ohne die man keinen Spaß haben wird. Die Konfiguration ist in mehrere Dateien aufgeteilt.

TLS einrichten bzw. Verbindungssicherheit festlegen

Zunächst muss die Datei /etc/dovecot/conf.d/10-ssl.conf bearbeitet werden.

# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = yes

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert =

In dieser Konfiguration verwende ich die selben Zertifikate wie bereits auch schon bei postfix. Wie diese Zertifikate erstellt werden können, siehe <a title="Postfix mit TLS und IPv6 auf Debian 7 Wheezy installieren und konfigurieren" href="https://www.timoschindler.de/postfix-mit-tls-und-ipv6-auf-debian-7-wheezy-installieren-und-konfigurieren/">Postfix installieren und einrichten</a>.

Anschließend ist die Datei /etc/dovecot/conf.d/10-auth.conf zu bearbeiten.
[shell]
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
disable_plaintext_auth = yes

So stellen wir sicher, das ein Login mit Plaintextpasswort nicht möglich ist, außer man verwendet eine verschlüsselte Verbindung. Warum dies nötig ist, brauche ich denke ich nicht erklären.

IMAP-Konfiguration ändern

In dieser Konfiguration werden die Mails immer im Homeverzeichnis des jeweiligen Benutzers gespeichert. Damit auch IMAP dort gespeichert wird, muss /etc/dovecot/conf.d/10-mail.conf wie folgt bearbeitet werden.

mail_location = maildir:~/Maildir

Das wars auch schon mit der Konfiguration. Nun muss lediglich Dovecot neugestartet werden und alles sollte funktionieren. Die Logausgabe von Dovecot erfolgt in /var/log/mail.info. Sollte etwas nicht klappen, kann hier nach der Ursache geforscht werden.

/etc/init.d/dovecot restart

Neues lokales Emailkonto erstellen

Damit wir aber auch Emails auf eine lokale Adresse bekommen können, müssen wir zunächst einen Benutzer ohne Shell erstellen und ein Passwort vergeben. Anschließend muss die Adresse noch bei Postfix registriert werden und wir sind fertig und Mails werden auf das lokale Emailkonto zugestellt.

User anlegen

Ein User ist mit wenigen Handgriffen erstellt. Zusätzlich muss noch der Ordner erstellt werden und die richtigen Rechte vergeben werden.

useradd -s /usr/sbin/nologin mail_domain.de
passwd mail_domain.de
mkdir /home/mail_domain.de
chown -R mail_domain.de:mail_domain.de /home/mail_domain.de

Mit diesen Befehlen haben wir alles nötige erledigt. Die Befehle sollten selbsterklärend sein. Ab diesem Zeitpunkt kann man sich bereits z.B. mit Thunderbird zu seinem lokalen Konto verbinden. Wie die Logindaten aussehen, zeige ich weiter unten.

Konfiguration bei Thunderbird

In Kürze: Was tun bei einer neuen Emailadresse

Diese Anleitung setzt voraus, das ihr den Postfix und Dovecot so konfiguriert habt, wie in diesen Anleitungen.

  1. Domain in /etc/postfix/virtual/domains hinzufügen
  2. Emailadressen in /etc/postfix/virtual/addresses konfigurieren
  3. Postmap erstellen: postmap /etc/postfix/virtual/addresses
  4. Benutzer hinzufügen: useradd -s /usr/sbin/nologin mail_domain.de
  5. Passwort hinzfügen: passwd mail_domain.de
  6. Home-Verzeichnis erstellen: mkdir /home/mail_domain.de
  7. Rechte vergeben: chown -R mail_domain.de:mail_domain.de /home/mail_domain.de
  8. Konto bei Thunderbird einfügen
  9. Email-Adressen testen
  10. Fertig 🙂

Spamassassin mit Postfix unter Debian 7 Wheezy

Dies ist der zweite Teil in der Anleitung zu Postfix, also ist die Fortsetzung zu Postfix unter Debian 7 installieren. Diese Anleitung fügt nun den Spamfilter Spamassassin zu Postfix hinzu. Für mich war es auch das erste Mal, aber die Konfiguration ging schneller, als gedacht.

Spamassassin wird dabei so konfiguriert, dass Spam zwar als Spam markiert wird, aber keine Email gelöscht wird. Das Filtern übernimmt dann euer Mailprogramm.

Voraussetzungen

Ihr benutzt die neuste Version von Debian 7 und habt Postfix bereits installiert. Ob dies nach der oben genannten Anleitung geschehen ist oder nicht, ist zunächst egal.

Spamassassin installieren

Zunächst installieren wir uns Spamassassin:

aptitude update
aptitude install spamassassin spamc

Das war’s auch schon. Es werden natürlich viele benötigte Pakete mit installiert, aber der Overhead hält sich in Grenzen.

User mit beschränkten Rechten erstellen

Spamassassin läuft standardmäßig mit root Rechten. Da dies eine Sicherheitslücke ist und einfach zu beheben ist, erstellen wir zunächst einen eingeschränkten Benutzer und Gruppe:

groupadd -g 5555 spamd
useradd -u 5555 -g spamd -s /sbin/nologin -d /usr/local/spamassassin spamd
mkdir -p /usr/local/spamassassin/log
chown spamd:spamd -R /usr/local/spamassassin

Spamassassin konfigurieren

Die Konfigurationsdatei zu Spamassassin liegt unter /etc/default/spamassassin. Öffnet die Datei mit einem Editor eurer Wahl und passt die Konfigurationsdatei wie folgt an:

# /etc/default/spamassassin
# Duncan Findlay

# WARNING: please read README.spamd before using.
# There may be security risks.

# Change to one to enable spamd
ENABLED=1
SPAM_HOME="/usr/local/spamassassin"

# Options
# See man spamd for possible options. The -d option is automatically added.

# SpamAssassin uses a preforking model, so be careful! You need to
# make sure --max-children is not set to anything higher than 5,
# unless you know what you're doing.

OPTIONS="--create-prefs --max-children 5 --helper-home-dir ${SPAM_HOME} --username spamd"

# Pid file
# Where should spamd write its PID to file? If you use the -u or
# --username option above, this needs to be writable by that user.
# Otherwise, the init script will not be able to shut spamd down.
PIDFILE="${SPAM_HOME}/spamd.pid"

# Set nice level of spamd
#NICE="--nicelevel 15"

# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=0

Die Kommentare sollten alle Einstellungen bereits ausreichend erklären. Nun bearbeiten wir noch die Einstellungen von Spamassassin in /etc/spamassassin/local.cf
Ich habe hier nur die Teile aufgeführt, die ich aktiviert oder verändert habe. Wiedermal sollten die Kommentare alles erklären.

#   Add *****SPAM***** to the Subject header of spam e-mails
#
rewrite_header Subject *****SPAM*****

#   Save spam messages as a message/rfc822 MIME attachment instead of
#   modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 0

#   Set the threshold at which a message is considered spam (default: 5.0)
#

required_score 2.0
#   Use Bayesian classifier (default: 1)
#
use_bayes 1

#   Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn 1

Das wars‘ auch schon mit der Konfiguration von Spamassassin. Nun muss lediglich Spamassassin noch in Postfix integriert werden.

Spamassassin in Postfix integrieren

Damit die Mails auch von Spamassassin „betrachtet“ werden können, müssen wir Postfix noch nicht konfigurieren. Dazu muss die Datei /etc/postfix/master.cf angepasst werden:
Der Eintrag

smtp      inet  n       -       -       -       -       smtpd

muss wie folgt ergänzt werden:

smtp      inet  n       -       -       -       -       smtpd
        -o content_filter=spamassassin

Am Ende der Datei noch folgendes ergänzen:

spamassassin unix -     n       n       -       -       pipe
        user=spamd argv=/usr/bin/spamc -f -e
        /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Tada! Das wars. Nun nur noch alles neustarten und fertig ist unser System.

/etc/init.d/spamassassin restart
/etc/init.d/postfix restart

Spamassassin testen

Natürlich wollen wir jetzt auch gleich mal testen, ob Spam richtig erkannt wird. Beobachtet zunächst die Logdatei:

tail -f /var/log/mail.info

Nun senden eine Email an euren Mailserver mit folgendem Inhalt:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Die Mail wird dann von Spamassassin automatisch erkannt und mit *****SPAM***** deklariert. Achtung: Die üblichen Mailprogramme sortieren die Mails gleich automatisch aus.

Fertig. Nun läuft Spamassassin und Spam wird automatisch aussortiert. Spamassassin holt sich jede Nacht die neusten Regeln und hält sich selbst aktuell.

Wie immer würde ich mich über Kritik, Anregungen und Kommentare jeglicher Art freuen :).

Postfix mit TLS und IPv6 auf Debian 7 Wheezy installieren und konfigurieren

Halli Leute! Vielleicht habt ihr es schon gemerkt, dass ich mir einen neuen Server einrichte ,denn heute gibts ne Anleitung, wie ich mir Postfix mit Spamassasin und Procmail einrichte, damit mein Mailserver nicht mehr so mit Spam überschüttet wird.

Voraussetzungen

Diese Anleitung ist für Debian 7 Wheezy geschrieben, sollte aber auch auf anderen Debian basierten Systemen funktionieren. Standardmäßig ist exim als Mailserver installiert. Die Installation von Postfix wird diesen automatisch entfernen, da ein Server keine zwei Mailserver haben darf. Für die Anleitung wird ein Root-Zugriff benötigt. Als Editor verwende ich vim (das darf euch aber reichlich egal sein ;)). Grundverständnisse von Konsole und das Bearbeiten von Dateien setzte ich aus gegeben voraus.

Der Server beherbergt verschiedene Domains und Webseiten und verschiedenste Postfächer und Weiterleitungen.

Postfix

Postfix ist ein mächtiger Mailserver der unsere Postfächer und Domains verwaltet. Weitere Informationen über Postfix sind hier zu finden: Wikipediaeintrag zu Postfix.

Ich habe mich für Postfix entschieden, da dies der quasi Standard bei Linux-Maschinen ist. Ich bin mir sicher, es gibt viele schöne Alternativen, aber ich habe mich bereits sehr an Postfix gewöhnt.

Postfix Installation

Zunächst müssen wir uns natürlich erst mal Postfix installieren und konfigurieren.

aptitude install postfix

Postfix wird installiert und eine Installationsprozedur wird gestartet. Zunächst soll man den Typ der Mailkonfiguration wählen:

  • No configuration
  • Internet Site
  • Internet with smarthost
  • Satelite system
  • Local only

Wir wählen natürlich „Internet Site“. Anschließend fragt die Installation welches unser mail name ist. Dies ist in der Regel eine Domain. Da wir aber mehrere Domains mit dem Server abhandeln wollen, setzten wir hier eine Defaultadresse (sucht euch eine eurer Domains aus). Das wars auch schon mit der Installation.

Postfix konfiguration

Zunächst muss festgelegt werden, für welche Domains Emails akzeptiert werden sollen. Ich verwalte dies über eine extra Datei. Dazu erstellen wir zunächst einen Ordner und dann die entsprechende Datei:

mkdir /etc/postfix/virtual/
vim /etc/postfix/virtual/domains

In der Datei sollte eine Liste von Domains stehen, für die der Mailserver Mails akzeptieren soll. Beispielsweise also etwas wie das:

domain1.net
domain1.de
domain2.de
domain3.com

Nun müssen wir eine Datei anelgen, in dem die Emailweiterleitungen bzw. Konten verwaltet werden.

vim /etc/postfix/virtual/addresses

Eine Beispielkonfiguration könnte wie folgt aussehen:

#################################
#                               #
#          domain1.de           #
#                               #
#################################
domain1.de                       DOMAIN
@domain1.de                      nichtempfehlenswert@gmx.de
mail@domain1.de                  blablub@gmail.com
hans@domain1.de                  hans@localhost

Die Bedeutung der Konfiguration:

  • # : Dies ist ein stink normaler Kommentar, damit man sich in seiner Konfiguration auch ein bisschen zurechtfindet.
  • domain1.de DOMAIN : Dies legt die Domain fest. Für jede Domain die berücksichtigt werden soll, muss ein solcher Identifyer in der Konfiguration vorhanden sein.
  • @domain1.de : Diese Zeile würde alle Emails an die Emailadresse nichtempfehlenswert@gmx.de weiterleiten. Dies ist, wie die Email schon sagt nicht wirklich empfehlenswert, da das ein hohes Spamaufkommen provoziert.
  • mail@domain1.de wird an die Adresse blablub@gmail.de weitergeleitet
  • hans@domain1.de wird an das lokale Emailkonto hans@localhost weitergeleitet

Der Postfix weiß natürlich noch nichts von unseren neu erstellten Dateien, deshalb müssen wir diese zunächst in der Konfigurationsdatei vermerken. Die Datei /etc/postfix/main.cf muss wie folgt verändert werden:

mydestination = somedomain.de, localhost.localdomain, localhost, /etc/postfix/virtual/domains
virtual_maps = hash:/etc/postfix/virtual/addresses

Der Eintrag mydestination sollte bereits vorhanden sein. virtual_maps musste ich bei mir erst erstellen. Nun weiß Postfix schon einmal über unsere Konfiugrationsdateien Bescheid. Nun müssen wir aber noch zwei Befehle ausführen:

postmap /etc/postfix/virtual/addresses
/etc/init.d/postfix reload

Der erste Befehl macht die Adressen in der Datei „addresses“ für postfix verfügbar. Dieser Befehl muss bei jeder Änderung durchgeführt werden! Schreibt euch diesen Befehl am besten gleich in einen Kommentar in die Datei „addresses“ mit rein, damit ihr ihn nicht vergesst. Der zweite Befehl startet den Postfix-Mailserver neu und macht die Änderungen an der Konfiguration sichtbar.

Nun sollte bereits ein Mailempfang möglich sein. Testet dies indem ihr euch selbst eine Email schickt.

Beachtet dazu immer /var/log/mail.info auf etwaige Fehler.

TLS für Postfix einrichten

Um die Kommunikation verschlüsselt ablaufen zu lassen, ist eine TLS-Verschlüsselung dringend zu empfehlen. Es gibt kostenlose Zertifikate, so z.B. von www.startssl.com. Diese sind gültig und werden von nahezu jedem Client angenommen. Dazu müsst ihr euch zunächst einen Account bei startssl.com einrichten. Lasst euch nicht von dem überaus hässlichen Design abschrecken. startssl.com bietet einen kostenlosen Service, der einfach nur Gold wert ist.

Wenn ihr einen Account habt, müsst ihr zunächst die Domain eures Mailservers validieren. Dazu einfach im Usermenü auf „Validation Wizzard“ klicken und anschließend „Domain Name Validation“. Füllt nun alles aus und lasst euch eine Email zuschicken (dazu müsst ihr die angezeigte Email natürlich zunächst in eure /etc/postfix/virtual/addresses eintragen).

Nachdem die Validierung erfolgt ist, klickt auf „Certificate Wizzard“ und wählt anschließend „Web-Server Validation“ aus. Der erste Schritt kann übersprungen werden, da wir uns unser eigenes Zertifikat erstellen:

mkdir /etc/postfix/certs
cd /etc/postfix/certs
openssl req -new -newkey rsa:4048 -nodes -keyout private.key -out website.de.csr
chmod 400 private.key

Mit dem ersten Befehl erstellt ihr zunächst ein neues Verzeichnis für die Zertifikate. Anschließend wechseln wir in dieses Verzeichnis mit „cd“. Nun erstellen wir uns einen eigenen privaten Schlüssel und gleichzeitig auch ein csr (Request-Zertifikat für startssl.com). Ihr werdet einige Dinge gefragt, füllt diese so gut wie möglich aus. Die optionalen Angaben können ausgelassen werden. Einzig bei „Common Name“ müsst ihr die Domain des Mailservers eintragen. Mit dem letzten Befehl ändern wir die rechte des privaten Schlüssels. Sichert diesen und stellt außerdem sicher, dass niemand in den Besitz dieses Schlüssels gerät!

Bei Startssl solltet ihr euch nun bei dem Schritt „Submit Certificate Request“ befinden. Öffnet die Date „website.de.csr“ und kopiert den Inhalt in das Textfeld.

Folgt nun den Schritten bis ihr euer Zertifikat in einem Textfeld angezeigt bekommt. Kopiert dieses und erstellt auf eurem Server im Verzeichnis certs die Datei „website.de.crt“ und kopiert den kompletten Inhalt in diese Datei und speichert diese.

Nun laden wir mit dem Befehl

wget --no-check-certificate https://www.startssl.com/certs/ca-bundle.pem -O startssl-ca-bundle.pem

das Zertifikatbundel von startssl herunter. Damit sagen wir unserem Server, das wir Startssl vertrauen. Führt diesen Befehl wieder im certs-Ordner aus.

Nun müssen wir der Konfiguration von Postfix nur noch die Zertifikatdaten geben. Die Konfiguration ist manchmal etwas anders, hier gibt es jetzt mal meine, damit ihr vergleichen könnt (die Konfiguration ist wieder in der main.cf).

# TLS parameters
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/certs/private.key
smtpd_tls_cert_file = /etc/postfix/certs/website.de.crt
smtpd_tls_CAfile = /etc/postfix/certs/startssl-ca-bundle.pem
smtp_tls_CAfile = $smtpd_tls_CAfile
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Es ist geschafft. Ab hier funktioniert schon mal der Postfix für den Mailversand. Alle weiteren Schritte sind nun nicht mehr zwingend erforderlich, werden jedoch dringend empfohlen!

Postfix abhärten

Um das System ein wenig widerstandsfähiger gegen Spam zu machen, hier ein paar kleine Einstellungen, die ihr in die main.cf eintragen könnt. Bitte testet dann aber den Mailversand, ob noch alles korrekt funktioniert. Die Doku dazu findet ihr hier: Postfix Doku

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_helo_restrictions = reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname

Postfix IPv6 fähig machen

Tja, ich glaube, ich brauche euch nicht erklären, warum es langsam echt nötig wird, die Server für IPv6 vorzubereiten. Für diese Anleitung wird vorausgesetzt, dass euer Server bereits IPV6 kann. Vergesst auch nicht, den DNS-Eintrag eurer Domain richtig einzustellen. Dem Mailserver bringen wir das Ganze dann auch noch bei :).

Um den Mailserver richtig zu konfigurieren ist eigentlich nicht viel nötig. Es reicht folgender Eintrag:

inet_protocols = all
smtp_bind_address6 = 2a01:4f8:202:5028::2

Mit „inet_protocols“ legt ihr fest, dass auch IPv6 akzeptiert werden soll. Mit dem Eintrag „smtp_bind_address6“ legt ihr die IPv6-Adresse des Mailservers fest. Dieser Eintrag sollte mit dem Eintrag im DNS-Record übereinstimmen. Um zu testen, ob alles klappt, könnt ihr temporär „inet_protocols = ipv6“ einstellen und eine Email an eine @gmail.com-Adresse schicken. Bei Gmail bin ich mir sicher, dass diese auch IPv6 akzeptieren. Schaut auch immer wieder ins Logfile. Kommt die Mail an, hat alles geklappt und euer Server ist richtig konfiguriert. Stellt anschließend wieder auf „all“ um. Es ist zwingend notwendig, den Mailserver neu zu starten, nachdem das Protokoll geändert wurde. Ein Reload ist nicht ausreichend.

Zusammenfassung

Postfix ist soweit eingerichtet. Je nach Umfang hat man damit schon wirklich viel zu tun, aber die Einstellung lohnt sich auf jeden Fall. Beim Schreiben der Anleitung hab ich die Erfahrung gemacht, dass an diversen anderen Stellen noch weitere Einstellungen gemacht werden müssen. So muss z.B. der DNS-Server umgestellt werden. Wie dieser eingerichtet wird, werde ich an einer anderen Stelle noch weiter erläutern.

Auch die Installation von Spamassassin und Procmail werde ich in einem anderen Beitrag verwursten. Wie dies geht könnt ihr im Beitrag Spamassassin für Postfix auf Debian 7 einrichten nachlesen.

Redmine 2.5.0 auf Debian 7 Wheezy mit Apache Passenger

Heute gibts mal wieder eine kleine Anleitung. Dieses mal installieren wir Redmine 2.5.0 auf Debian 7 Wheezy mit Apache und dem Applikationsserver Passenger. Das Installieren von Redmine ist immer ein riesen Heckmeck aber man kommt einigermaßen gut zurecht wenn man ein paar Kleinigkeiten beachtet. Freut euch auf das erste Update der Software ;), da geht dann wieder alles von vorne los. Nichts desto trotz ist Redmine einfach genial für das Verwalten verschiedenster Projekte. Mit dieser Anleitung könnt ihr eine frische Installation erstellen oder eine alte Version migrieren. Funktioniert beides wunderbar und beide Wege sind in dieser Anleitung beschrieben.

Benötigte Pakete installieren

Ich setzte hier mal voraus, dass ihr bereits einen Debian 7 Server mit LAMP-Konfiguration aufgesetzt habt. Es fehlen lediglich ein paar Pakete und Gems für Ruby.

aptitude install ruby libapache2-mod-passenger libmagickwand-dev libmagickcore-dev ruby1.9.3 libmysqlclient-dev imagemagick
gem install bundler
bundle install --without development test

Mit den Befehlen haben wir auch gleich den bundler installiert und mit „bundle install –without development test“ haben wir alle gems installiert die für die Redmine-Installation nötig sind.

Redmine herunterladen und entpacken

Einfach auf www.redmine.org den aktuellen Downloadlink suchen und kopieren. Mit dem Befehl

wget http://www.redmine.org/releases/redmine-2.5.0.tar.gz

Dann die tar.gz-Datei herunterladen und mit

tar -xzf redmine-2.5.0.tar.gz

entpacken. Ich habe das Verzeichnis /sr/www/htdocs/ gewählt. Für die richtigen Rechte muss noch folgender Befehl ausgeführt werden

chown -R www-data:www-data redmine-2.5.0

Redmine konfigurieren

Nun geht es los und wir müssen uns mal um die Konfiguration kümmern. In dieser Anleitung setze ich voraus, dass ihr bereits eine Datenbank erstellt habt. Für den geübten Linuxnutzer empfehle ich die Konsole ansonsten geht auch mal phpmyadmin und andere Programme zum administrieren der Datenbanken. Dazu kopieren wir uns die Beispiel-Config-Datei und bearbeiten diese:

cd redmine-2.5.0/config
cp database.yml.example database.yml
vim database.yml

Folgende Einstellungen müssen entsprechend der Datenbank angepasst werden:

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: root
  password: ""
  encoding: utf8

Es ist dabei egal ob ihr eine leere Datenbank erstellt oder eine alte Redmineversion auf eine neue Version migrieren wollte. Redmine kommt auf jeden Fall damit klar. Für die Migration einfach die alte Datenbank einstellen. Der nächste Schritt migriert dann auf die neue Version.

Redmine benötigt auch ein paar neue Ordner.  Dazu einfach in den Redmine-Root-Ordner gehen und folgende Befehle ausführen:

mkdir tmp tmp/pdf public/plugin_assets
chown -R www-data:www-data files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets

Wer eine Installation migriert muss nun auch die Files aus der alten Installation übertragen. Dazu einfach den Ordner files kopieren (und eventuell die Rechte anpassen). Außerdem sollten auch die Plugins nicht vergessen werden.

Redmine installieren

Nun legen wir noch einen secret_token an. Dieser wird für die Sicherheit von Redmine benötigt. Anschließend wird die Datenbank gefüllt. Es ist dabei egal ob es sich um eine alte Datenbank aus einer älteren Version handelt die ihr migrieren wollt oder um eine leere Datenbank. Redmine wird alles für euch erledigen. Zum Ausführen der Befehle muss in den Ordner von Redmine gewechselt werden.

rake generate_secret_token
RAILS_ENV=production rake db:migrate

Anschließend wollen wir erst einmal testen ob alles geklappt hat. Dazu einfach folgenden Befehl ausführen:

ruby script/rails server webrick -e production

Öffnet einfach einen Browser mit der Domain bzw. der IP-Adresse eures Servers und dem Port 3000 (z.B. www.beispielseite.de:3000 ). Wenn alles geklappt hat sollte das Loginfenster erscheinen. Wer eine alte Installation migriert hat sollte sich mit den alten Benutzerdaten wieder einloggen können.

Redmine mit Passenger und Apache2 ausführen

Nun wollen wir aber das ganze mit Apache2 und dem Application-Server Passenger ausführen. Dazu müssen zunächst folgende Pakete zusätzlich installiert werden:

aptitude install build-essential apache2-prefork-dev libapr1-dev libssl-dev zlib1g-dev libcurl4-openssl-dev libssl-dev libapr1-dev libaprutil1-dev rubygems
gem install passenger

Und anschließend sollte der folgende Befehl ohne Probleme ausführbar sein. Sollte dennoch etwas fehlen, wird der Befehl erklären was weiter zu machen ist.

passenger-install-apache2-module

Am Ende der Installation wird eine Ergänzung zur Konfiguration ausgegeben. Dies sollte ungefähr so aussehen:

LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.38/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
   PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.38
   PassengerDefaultRuby /usr/bin/ruby1.9.1
</IfModule>

Der Code wird vom Programm automatisch am Ende ausgegeben und kann leicht abweichen. Dieser Teil muss in folgenden Dateien ergänzt werden /etc/apache2/mods-available/passenger.load und /etc/apache2/mods-available/passenger.conf (einfach mit vim öffnen und unten anhängen bzw ersetzen). Nun aktivieren wir den passenger-mod mit dem Befehl:

a2enmod passenger

Sollte etwas mit der Konfiguration nicht geklappt haben startet der Apache2-Server nicht. Beachtet hier die Ausgabe des Apache-Log-Files bzw. die Fehlermeldungen. Jetzt müssen wir noch den guten alten Apache richtig konfigurieren. Hier ist eurer Fantasie freien Lauf gelassen. Ich möchte redmine als Subdomain laufen lassen. Dazu muss die entsprechende Datei unter /etc/apache2/sites-available/ konfigurieren. Mein Beispiel sieht wie folgt aus:

#################################
#                               #
#      redmine.website.de       #
#                               #
#################################

<VirtualHost *:80>
        ServerName redmine.website.de
        DocumentRoot /srv/www/htdocs/website.de/redmine/public

        #Extra logs for this page
        ErrorLog /var/log/apache2/website.de/redmine/error.log
        LogLevel warn
        CustomLog /var/log/apache2/website.de/redmine/access.log combined

        #Redirects http:// to https://
        Redirect permanent / https://redmine.website.de/
</VirtualHost>

<VirtualHost *:443>
        ServerName redmine.website.de
        ServerAdmin mail@website.de

        DocumentRoot "/srv/www/htdocs/website.de/redmine/public"

        #Extra logs for this page
        ErrorLog /var/log/apache2/website.de/redmine/error.log
        LogLevel warn
        CustomLog /var/log/apache2/website.de/redmine/access.log combined

        #DefaultInitEnv RAILS_ENV production
        RailsBaseURI /redmine
        <Directory /srv/www/htdocs/website.de/redmine/public>
                Options Indexes FollowSymLinks -MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/website.de/redmine.website.de.crt
        SSLCertificateKeyFile /etc/apache2/ssl/00basic-certificates/private.pem
        SSLCACertificateFile /etc/apache2/ssl/00basic-certificates/ca.pem
        SSLCertificateChainFile /etc/apache2/ssl/00basic-certificates/sub.class2.server.ca.pem
        SSLHonorCipherOrder On
        SSLProtocol all -SSLv2
        SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:!RC4:HIGH:!MD5:!aNULL:!EDH
</VirtualHost>

Mit dieser Konfiguration wird die gesamte Kommunikation über eine sichere SSL-Verbindung abgehandelt und die Seite ist dann unter https://redmine.website.de erreichbar. Jetzt nur noch ein einziges mal den Apache2-Server neustarten und wir sind fertig.

apachectl restart

Wir haben fertig!

Ich hoffe ich konnte euch mit dieser kleinen Anleitung ein bisschen Hilfe geben. Redmine ist wirklich super und die etwas komplizierte Installation sollte euch nicht abschrecken. Wenn ihr Fehler findet, Fragen habt oder eine Methode wisst wie es besser und einfacher geht, schreibt mir bitte. Vielleicht können wir die Anleitung gemeinsam noch weiter verfeinern :).

Irland mit Steffi und Monty

Tjaja, das war eine schöne Reise nach Irland. Wie ihr am Datum erkennen könnt, bin ich etwas spät dran für den zeitnahen Beitrag zum Urlaub, aber ich bin einfach nicht dazu gekommen. Die Geschichten fallen etwas kürzer aus, dafür aber umso mehr Fotos. In diesem Sinne, viel Spaß.

Wer zur Hölle ist Monty?

Tja.. Das konnten wir am Anfang auch nicht so wirklich genau sagen. Stellt euch folgende Situation vor: Ihr wollt Wandern gehen und sucht euch eine schöne Strecke raus. Nach einer Stunde kommt ihr aus dem Wald und mitten in der Landschaft stehen 3 Häuser ohne Zaun… Und siehe da.. was rennt denn da auf einen zu? Ist es ein kleiner Bär?… Ist es ein ziemlich dicker Hund? … Nein es ist Monty !

DSC050112

Monty hat sich als sehr braven, zutraulichen und anhänglichen Hund herausgestellt…. Sehr sehr anhänglicher Hund! So anhänglich, dass er uns nachgelaufen ist und wir nicht wussten was wir mit ihm anfangen sollten. Wir haben uns versteckt, wollten ihn mit Wurst ablenken und dann weglaufen: Alles keine Chance. Monty stand immer brav zur Seite und ist und die ganze Strecke über nachgelaufen. Natürlich war in keinem der drei Häuser jemand anzutreffen. Tja… Aus völliger Ratlosigkeit sind wir weiter, und haben gehofft, irgendwann auf jemanden zu stoßen, der uns weiterhelfen kann. Übringes war uns der Name Monty nicht von vorn herein bekannt. Kein Schildchen am Halsband. Keine Leine, nichts. Nach einiger Zeit ist uns dann jemand über den Weg gelaufen. Sie berichtete uns: „Ach ja.. das ist Monty. Der macht das immer so. Der läuft euch jetzt bis zu einem bestimmten Punkt nach und dreht dann um.“ Der Punkt war genau am Ende des Rundwegs… War ne schöne Runde mit Monty und hat zu einigen verdutzten Gesichtern geführt, als ein paar entgegenkommende Wanderer uns fragten: „Ist das eurer?“ und du antwortest „Ne. Wir kennen den Hund gar nicht.“ ;).

Jetzt aber endlich mal zu den anderen Bildern. Es war alles in allem ein wunderschöner Urlaub und wir hatten wirklich sehr sehr viel Glück mit dem Wetter. Wir konnten tolle neue Leute kennen lernen und haben wunderschöne Landstriche gesehn :). Alles in Allem eine Empfehlung!

Programmcode in Lyx und Latex sauber darstellen

Tja es gibt immer wieder was zu lernen und heute ist es das Programmlisting bei LyX bzw. LaTeX.

Wer kennt es nicht? Man hat einen schönen Programmeditor und hat sich durchs Programmieren schon so an das Codelayout gewöhnt, dass man es am liebsten gleich bei seiner Arbeit verwenden möchte. Gesagt getan. Mit folgendem Code erreicht man das ganz einfach.

%Farben fuer Programmlisting
\usepackage{listings,xcolor}
\definecolor{pl_background}{rgb}{0.95,0.95,0.95}
\definecolor{pl_comment}{rgb}{0.12, 0.38, 0.18 }
\definecolor{pl_ifelse}{rgb}{0.74,0.74,.29}
\definecolor{pl_keyword}{rgb}{0.37, 0.08, 0.25}
\definecolor{pl_string}{rgb}{0.06, 0.10, 0.98}
% Vordefiniertes Programmlisting
\lstset{
language = php,
basicstyle = \small\sffamily,
backgroundcolor = \color{pl_background},
stringstyle = \color{pl_string},
keywordstyle = \color{pl_keyword}\bfseries,
commentstyle = \color{pl_comment}\itshape,
frame = lrbt,
numbers = left,
showstringspaces = false,
breaklines = true,
xleftmargin = 15pt,
emph = [1]{php},
emphstyle = [1]\color{black},
emph = [2]{if,and,or,else},
emphstyle = [2]\color{pl_ifelse}}

Dieses Beispiel verwendet PHP als Programmcode und lehnt sich an das Design von Eclipse an. Das Ergebnis sieht man dann in folgendem Screenshot:

Programmlisting in Latex und Lyx mit Eclipse-Style

Der oben gezeigte Code muss in den Latex-Vorspann eingefügt werden. Bei Lyx geht das einfach über Dokument –> Einstellungen –> Latex Vorspann. Die Latex-Geeks wissen das sicher auch bei Latex ;).

Ein Programmlisting kann entweder über Einfügen –> Programmlisting eingefügt werden, oder über Einfügen –> Datei –> Unterdokument. Die zweite Methode ist deutlich angenehmer, weil hier die Formatierung (Einrückungen, Leerzeichen etc) der eingefügten Dateien übernommen wird.

Zum Ändern der Farben empfehle ich auch noch diese Seite: http://www.farb-tabelle.de/de/rgb2hex.htm Damit kann man schnell und einfach Farben in den RGB-Raum übersetzten.

Beim Einfügen des Programmlistings per externe Datei, beachtet bitte auch die zwei Felder für den Untertitel (Legende) des Listings und die Marke um sich im Text darauf beziehen zu können:

Programmlisting in Lyx mit Marke und Legende

Ich hoffe ich konnte dem einen oder anderen weiterhelfen. Fragen, Anregungen und Kommentare sind herzlich willkommen :).