<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cronjob Archive - Das ist die Welt von Thomas</title>
	<atom:link href="https://www.schiffler.eu/thema/cronjob/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.schiffler.eu/thema/cronjob/</link>
	<description>meine Gedanken, mal strukturiert, mal nicht ...</description>
	<lastBuildDate>Thu, 14 Jul 2022 07:02:56 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.schiffler.eu/wp-content/uploads/2025/07/cropped-Profilfoto_2024-32x32.png</url>
	<title>cronjob Archive - Das ist die Welt von Thomas</title>
	<link>https://www.schiffler.eu/thema/cronjob/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>E-Mail Anhänge nach ecoDMS importieren &#8211; mit Python 3</title>
		<link>https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/</link>
					<comments>https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/#comments</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Thu, 14 Jul 2022 06:59:41 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[Automatisierung]]></category>
		<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[Datensicherung]]></category>
		<category><![CDATA[E-Mail]]></category>
		<category><![CDATA[ecoDMS]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.schiffler.eu/?p=1734</guid>

					<description><![CDATA[<p>Im August 2020 veröffentlichte ich den Beitrag &#8222;E-Mail PDF-Anhang speichern – Python-Script für ecoDMS Übergabe&#8220; welcher sich mit dem Thema &#8230; <a href="https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/" class="more-link">More <span class="screen-reader-text">E-Mail Anhänge nach ecoDMS importieren &#8211; mit Python 3</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/">E-Mail Anhänge nach ecoDMS importieren &#8211; mit Python 3</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Im August 2020 veröffentlichte ich den Beitrag &#8222;<a href="https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/" target="_blank" rel="noreferrer noopener">E-Mail PDF-Anhang speichern – Python-Script für ecoDMS Übergabe</a>&#8220; welcher sich mit dem Thema E-Mail Anhänge nach ecoDMS importieren beschäftigte. Als Basis für diesen Beitrag setzte ich damals auf Python in der Version 2. Nachdem ich in diesem Beitrag nun einige Kommentare erhalten habe dass das Script nicht mit Python 3 lauffähig ist habe ich hier nun endlich das Update.</p>



<h2 class="wp-block-heading">Warum dieses Script?</h2>



<p class="wp-block-paragraph">Wie bereits aus anderen Beiträgen hier bekannt bin ich ein Freund des papierlosen Büros. Aus diesem Grund setze ich bei mir auf das DMS-System ecoDMS. Dies funktioniert auch wunderbar mit einer Ausnahme. EcoDMS bietet keinen Import von Mails an was für mich eine mittlere Katastrophe darstellt. Die meisten Rechnungen kommen inzwischen digital per PDF in meinen Posteingang. Diese möchte ich gerne an eine definierte E-Mail Adresse weiterleiten so dass der Import ins DMS automatisch erfolgen kann. </p>



<h2 class="wp-block-heading">Wie funktioniert das Python 3 Script zum Downloaden von PDF-Anhängen?</h2>



<p class="wp-block-paragraph">Das Script selbst ist recht einfach. Es verbindet sich über die <a href="https://pypi.org/project/imbox/" target="_blank" rel="noreferrer noopener">Python IMAP Library</a> zu dem definierten Postfach. Dort wird in allen Mails geprüft, ob PDF-Anhänge vorliegen. Falls das der Fall ist wird der Anhang in das Zielverzeichnis von ecoDMS heruntergeladen. Anschliessend wird die Mail gelöscht. </p>



<p class="wp-block-paragraph">In meinem Fall wird das Script mehrmals täglich über einen Cronjob ausgeführt. Die definierte Postfach-Adresse ist nur mir bekannt so kann ich Mails, welche einen Anhang beinhalten der ins DMS muss einfach dort hin weiterleiten. </p>



<h2 class="wp-block-heading">E-Mail Anhänge nach ecoDMS importieren &#8211; das Script</h2>



<p class="wp-block-paragraph">Bevor das Script funktioniert muss noch die benötige Python-Library installiert werden. Dies erfolgt über den folgenden Befehl:</p>



<pre class="wp-block-code"><code>pip3 install imbox # alternativ auch pip install imbox</code></pre>



<p class="wp-block-paragraph">Anschliessen müssen noch die Parameter für den Hostname, Username und Passwort für das definierte Postfach hinterlegt werden. Schon kann das Script ausgeführt werden und tut was es soll (hoffentlich zumidnest).</p>



<pre class="wp-block-code"><code>#!/usr/bin/env python
"""
importDmsMailsPy3.py

Check emails at :const:`PROVIDER` for attachments and save them to
:const:`SAVEDIR`.
"""
import os
from imbox import Imbox #pip3 install imbox
import traceback

PROVIDER = 'XXXX'
USER = 'XXXX'
PASSWORD = 'XXXX'

SAVE_DIR = '/opt/ecodms/workdir/scaninput/'

def getNotExistingFileName(saveDir, srcFileName):
    counter = 1
    if (srcFileName.endswith("pdf?=")):
        srcFileName = "scanbymail.pdf"
    while (True):
        currentName = srcFileName
        if (counter > 1):
            currentName = str(counter) + "_" + srcFileName
        if (os.path.isfile(saveDir + currentName)):
            counter = counter + 1
        else:
            return currentName

def save_attachment(attachment):
    attachmentFileName = attachment.get('filename')
    print('Handle Attachment {0!r}.'.format(attachmentFileName))
    if attachmentFileName.endswith(("pdf", "PDF", "Pdf", "PDf", "pDF", "pdF", "PdF", "pdf?=")):
        targetName = attachmentFileName.replace("/", "_")
        targetName = getNotExistingFileName(SAVE_DIR, targetName)
        download_path = f"{SAVE_DIR}/{targetName}"
        with open(download_path, "wb") as download:
            download.write(attachment.get('content').read())
            print('Found and saved attachment {0!r}.'.format(targetName))

def main():
    try:
        mailBox = Imbox (PROVIDER, username=USER, password=PASSWORD, ssl=True, ssl_context=None, starttls=False)
        mailBoxContent = mailBox.messages()

        for (mailId, mail) in mailBoxContent:
            mailBox.mark_seen(mailId)

            for idx, attachment in enumerate(mail.attachments):
                try:
                    save_attachment(attachment)
                except:
                    print(traceback.print_exc())

            mailBox.delete(mailId)
    finally:
        mailBox.logout()

if __name__ == '__main__':
    main()
</code></pre>



<p class="wp-block-paragraph">Anbei das Script noch als Download:</p>



<div data-wp-interactive="core/file" class="wp-block-file"><object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.schiffler.eu/wp-content/uploads/2022/07/importDmsMailsPy3.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Einbettung von Einbettung von importDmsMailsPy3.."></object><a id="wp-block-file--media-5e2e7309-1b9b-44f6-a467-c925898d2f0c" href="https://www.schiffler.eu/wp-content/uploads/2022/07/importDmsMailsPy3.pdf">importDmsMailsPy3</a><a href="https://www.schiffler.eu/wp-content/uploads/2022/07/importDmsMailsPy3.pdf" class="wp-block-file__button" download aria-describedby="wp-block-file--media-5e2e7309-1b9b-44f6-a467-c925898d2f0c">Herunterladen</a></div>



<h2 class="wp-block-heading">Vorsicht</h2>



<p class="wp-block-paragraph">Das Script löscht bei jedem Lauf ALLE Mails in dem Postfach. Bei der Verwendung bitte auf jeden Fall darauf achten, dass für den Import ein eigenes Postfach definiert ist in welchem nur die Mails vorliegen, welche ins DMS übergeben werden sollen. </p>



<p class="wp-block-paragraph">Wer möchte kann das Script natürlich gerne verwenden und auf seine Bedürfnisse anpassen. Natürlich übernehme ich keine Garantie für die Funktion des Scriptes, die Verwendung erfolgt auf eigene Gefahr <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/">E-Mail Anhänge nach ecoDMS importieren &#8211; mit Python 3</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>E-Mail PDF-Anhang speichern &#8211; Python-Script für ecoDMS Übergabe</title>
		<link>https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/</link>
					<comments>https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/#comments</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Sat, 08 Aug 2020 10:16:00 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[Automatisierung]]></category>
		<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[Datensicherung]]></category>
		<category><![CDATA[E-Mail]]></category>
		<category><![CDATA[ecoDMS]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.schiffler.eu/?p=517</guid>

					<description><![CDATA[<p>Nachdem ich zuhause das DMS-System aufgesetzt und meine ganzen Dokumente digitalisiert habe stand das Thema der PDF-Dokumente welche per Mail &#8230; <a href="https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/" class="more-link">More <span class="screen-reader-text">E-Mail PDF-Anhang speichern &#8211; Python-Script für ecoDMS Übergabe</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/">E-Mail PDF-Anhang speichern &#8211; Python-Script für ecoDMS Übergabe</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nachdem ich zuhause das DMS-System aufgesetzt und meine ganzen Dokumente digitalisiert habe stand das Thema der PDF-Dokumente welche per Mail reinkommen auf dem Plan. Ein Script welches mir E-Mail PDF-Anhang speichern kann musst her. </p>



<h2 class="wp-block-heading">Archivierung von Rechnungen aus E-Mails</h2>



<p class="wp-block-paragraph">Egal wo man heute etwas bestellt, meist kommen die Rechnungen in elektronischer Form. Doch wie kann ich diese Rechnungen nun am Einfachsten in meinem DMS-System archivieren? Eigentlich ging ich davon aus dass ein System wie z.B. ecoDMS ein solches E-Mail Gateway automatisiert mitliefert, leider war dies jedoch nicht der Fall. </p>



<p class="wp-block-paragraph">Somit musste eine eigene Lösung her. Kein Problem, ein kleines Script sollte das Problem schnell Lösen. Die Grundidee: Ich erzeuge mir ein Mailpostfach an welches ich alle E-Mails, deren PDF-Anhänge archiviert werden sollen weiterleite. Dieses Postfach wird von einem Cronjob abgeholt, die PDF-Anhänge aus den Mails heruntergeladen und in den Übergabeordner von ecoDMS gelegt. </p>



<p class="wp-block-paragraph">Nach einigen Versuchen ist das folgende Python-Script entstanden welches bei mir nun schon seit <a href="https://www.schiffler.eu/tag/papierloses-buero/">über 2 Jahren produktiv</a> im Einsatz ist und stabil seinen Dienst verrichtet.</p>



<h2 class="wp-block-heading">E-Mail PDF-Anhang speichern &#8211; Python-Script</h2>



<pre class="wp-block-code"><code>#!/usr/bin/env python
"""
importDmsMails.py

Check emails at :const:`PROVIDER` for attachments and save them to
:const:`SAVEDIR`.
"""
from __future__ import absolute_import, division, print_function
import email
import os
import poplib

PROVIDER = 'XXXX'
USER = 'XXXX'
PASSWORD = 'XXXX'

SAVE_DIR = '/opt/ecodms/workdir/scaninput/'

def getNotExistingFileName(saveDir, srcFileName):
    counter = 1
    if (srcFileName.endswith("pdf?=")):
        srcFileName = "scanbymail.pdf"
    while (True):
        currentName = srcFileName
        if (counter &gt; 1):
            currentName = str(counter) + "_" + srcFileName
        if (os.path.isfile(saveDir + currentName)):
            counter = counter + 1
        else:
            return currentName

def save_attachments(mail_string):
    attachments = list()
    for part in email.message_from_string(mail_string).walk():
        name = part.get_filename()
        if name:
            print('Handle Attachment {0!r}.'.format(name))
            if name.lower().endswith(("pdf", "pdf?=")):
                data = part.get_payload(decode=True)
                name = name.replace("/", "_")
                targetFileName = getNotExistingFileName(SAVE_DIR, name)
                f = file(os.path.join(SAVE_DIR, targetFileName), 'wb')
                f.write(data)
                f.close()
                print('Found and saved attachment {0!r}.'.format(targetFileName))

def main():
    try:
        client = poplib.POP3_SSL(PROVIDER)
        client.user(USER)
        client.pass_(PASSWORD)
        message_numbers = (int(s.split()&#91;0]) for s in client.list()&#91;1])
        for message_number in message_numbers:
            save_attachments('\n'.join(client.retr(message_number)&#91;1]))
            client.dele(message_number)
    finally:
        client.quit()


if __name__ == '__main__':
    main()</code></pre>



<h2 class="wp-block-heading">Was genau tut das Script?</h2>



<p class="wp-block-paragraph">Das hier aufgeführte Python-Script wird bei mir regelmäßig durch einen Cronjob ausgeführt. Das Script verbindet sich zu meinem Mailserver und lädt sich alle Mails herunter. Hängt an einer Mail ein PDF-Anhang so wird dieser Anhang im Eingangsverzeichnis von ecoDMS gesichert. Bei der Speicherung der Datei prüft das Script ob hier bereits eine Datei mit gleichem Namen vorliegt. Ist dies der Fall so wird der Dateiname durch einen Zähler erweitert so dass keine bereits existierende Datei überschrieben wird. </p>



<p class="wp-block-paragraph">Wer möchte kann das Script natürlich gerne verwenden und auf seine Bedürfnisse anpassen. Natürlich übernehme ich keine Garantie für die Funktion des Scriptes, die Verwendung erfolgt auf eigene Gefahr <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Update &#8211; 11. Juni 2021</h2>



<p class="wp-block-paragraph">Ich habe gestern eine Mail erhalten welche mich auf ein Problem hinwies. Thomas erhielt beim Ausführen des Scriptes den folgenden Fehler:</p>



<pre class="wp-block-code"><code>python3 importDmsMails.py
Traceback (most recent call last):

  File "importDmsMails.py", line 61, in &lt;module&gt;

    main()

  File "importDmsMails.py", line 54, in main

    save_attachments('\n'.join(client.retr(message_number)&#91;1]))

TypeError: sequence item 0: expected str instance, bytes found</code></pre>



<p class="wp-block-paragraph">Bei der Analyse der Meldung stellte sich heraus, dass ich eine andere Python-Version als Thomas verwende. Bei mir läuft Python in der Version 2.7.10, bei ihm auf Python 3. </p>



<p class="wp-block-paragraph">Ich habe für dieses Problem eine neue Version des Scriptes bereit gestellt. Mehr dazu findet Ihr hier:<br><a href="https://www.schiffler.eu/e-mail-anhaenge-nach-ecodms-importieren-mit-python-3/" target="_blank" rel="noreferrer noopener">E-Mail Anhänge nach ecoDMS importieren – mit Python 3</a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/">E-Mail PDF-Anhang speichern &#8211; Python-Script für ecoDMS Übergabe</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/e-mail-pdf-anhang-speichern-python-script/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>ecoDMS Backup &#8211; automatische Datensicherung im Serverbetrieb</title>
		<link>https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/</link>
					<comments>https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/#comments</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Mon, 27 Jul 2020 05:05:00 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[Automatisierung]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[Datensicherung]]></category>
		<category><![CDATA[ecoDMS]]></category>
		<category><![CDATA[papierloses Büro]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.schiffler.eu/?p=515</guid>

					<description><![CDATA[<p>In meinem ersten Beitrag zum Thema &#8218;papierloses Büro&#8218; habe ich bereits darüber informiert dass ich bei mir zuhause ein DMS-System &#8230; <a href="https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/" class="more-link">More <span class="screen-reader-text">ecoDMS Backup &#8211; automatische Datensicherung im Serverbetrieb</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/">ecoDMS Backup &#8211; automatische Datensicherung im Serverbetrieb</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In meinem ersten Beitrag zum Thema &#8218;<a href="https://www.schiffler.eu/papierloses-buero-fuer-zuhause-mit-ecodms-ein-kinderspiel/">papierloses Büro</a>&#8218; habe ich bereits darüber informiert dass ich bei mir zuhause ein DMS-System einsetze. Um genauer zu sein das ecoDMS-System. Hier möchte ich kurz beschreiben wie mein ecoDMS Backup Konzept aufgebaut ist.</p>



<h2 class="wp-block-heading">Warum ist das Backup so wichtig?</h2>



<p class="wp-block-paragraph">Wer sich selbst dazu entschließt zuhause auf ein papierloses Büro umzusteigen macht sich ein Stück weit von der Technik abhängig. Alle Dokumente welche archivierungswürdig sind werden, wenn man es konsequent macht, eingescannt und dann vernichtet. Die digitale Papierablage hat einige Vorteile, allerdings eben auch den gravierenden Nachteil dass ein Festplattencrash alle Daten vernichten kann. </p>



<p class="wp-block-paragraph">Aus diesem Grund muss ein gutes Backupkonzept her welches dafür sorgt, dass die Daten auch im Fall eines Festplattencrashs oder eines Einbruchs mit dem Diebstahl eines Computers (auch wenn das eher unwahrscheinlich ist) noch vorliegen. </p>



<h2 class="wp-block-heading">Empfehlung: Datensicherung extern sichern</h2>



<p class="wp-block-paragraph">Immer wieder, wenn ich mich mit Bekannten zum Thema der Datensicherung unterhalte stellen sich mir die Nackenhaare auf. Was bringt ein Backup wenn selbiges auf dem gleichen Computer oder sogar noch auf der gleichen Festplatte liegt? Da gibt es Selbstständige Unternehmer welche Ihre Datensicherung &#8222;ab und zu&#8220; einmal erledigen und die USB-Festplatte dann angeschlossen am Rechner lassen. </p>



<p class="wp-block-paragraph">Aus meiner Sicht muss eine Datensicherung nicht nur den zu sichernden Rechner sondern im Idealfall auch noch das Gebäude in welchem die zu sichernden Rechner sich befinden verlassen. Nur so lassen sich die Daten auch z.B. nach einem Einbruch oder einem Brand wieder herstellen.</p>



<div class="wp-block-image"><figure class="aligncenter size-medium"><a href="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-konzept.jpg"><img fetchpriority="high" decoding="async" width="300" height="265" src="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-konzept-300x265.jpg" alt="ecoDMS Backup Konzept - Datenverteilung" class="wp-image-685" srcset="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-konzept-300x265.jpg 300w, https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-konzept.jpg 684w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>ecoDMS Backup Konzept &#8211; Datenverteilung</figcaption></figure></div>



<p class="wp-block-paragraph">In meinem Fall erzeuge ich im ersten Schritt das Backup auf einem im internen Netzwerk befindlichen NAS-System. Die Festplatten im NAS-System sind gespiegelt so dass, falls eine ausfällt, die Daten noch immer verfügbar sind. </p>



<p class="wp-block-paragraph">Das NAS-System steht im gleichen Schrank wie auch der ecoDMS Server. Aus diesem Grund sichere ich das ecoDMS Backup noch auf einen extra angemieteten Cloudspeicher im Internet. Natürlich ist das Backup, welches auf den Cloudspeicher übertragen wird, verschlüsselt so dass der unberechtigte Zugriff erschwert wird. Diesen Teil der Datensicherung führe ich übrigens per <a href="https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/">rsync und curlftpfs aus &#8211; siehe Blogpost</a>.</p>



<h2 class="wp-block-heading">ecoDMS Backup &#8211; Datensicherung eigentlich ganz einfach</h2>



<p class="wp-block-paragraph">Bei mir selbst läuft das ecoDMS-System auf einem Server (welcher hier eh schon im 7&#215;24 Betrieb läuft) mit. Dieser Server läuft mit Ubuntu, ich habe die Pfade bei der Installation von ecoDMS auf den Standard-Pfaden belassen.</p>



<p class="wp-block-paragraph">ecoDMS liefert bereits von Hause aus ein gutes und lauffähiges Commandshell-Script für das Backup mit. Das Script ist recht einfach aufgebaut und muss nur über die Shell aufgerufen werden. Als Parameter übergeben wir das Verzeichnis in welches das Backup gesichert werden soll. </p>



<p class="wp-block-paragraph">In meinem Fall habe ich unter <em>/srv/datashare/serversicherung</em> ein Verzeichnis auf meinem NAS-System gemountet. Das Backup selbst soll im Unterverzeichnis <em>ecoDMS </em>abgelegt werden. Um das Script nun auszuführen genügend die folgenden Schritte:</p>



<pre class="wp-block-code"><code>cd /opt/ecodms/ecodmsserver/tools
./ecoDMSBackupConsole /srv/datashare/serversicherung/ecodms</code></pre>



<p class="wp-block-paragraph">Das Script selbst läuft einen ganzen Moment und sichert alle notwendigen Daten. Dazu gehören nicht nur die indizierten PDF-Dokumente sondern natürlich auch die gesamte Datenbank sowie alle Dokumente welche bereits übergeben aber noch nicht indiziert werden konnten. Gut finde ich dass hier jedes mal ein vollständiges Backup gezogen wird und ich somit für jeden Lauf eine vollständige Datensicherung vorliegen habe.</p>



<div class="wp-block-image"><figure class="aligncenter size-medium"><a href="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-dateiliste.jpg"><img decoding="async" width="300" height="137" src="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-dateiliste-300x137.jpg" alt="ecoDMS Backup - Liste der Backups" class="wp-image-688" srcset="https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-dateiliste-300x137.jpg 300w, https://www.schiffler.eu/wp-content/uploads/2020/06/202006-ecodms-backup-dateiliste.jpg 412w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>ecoDMS Backup &#8211; Liste der Backups</figcaption></figure></div>



<h2 class="wp-block-heading">Datensicherung auf externe Rechner spiegeln</h2>



<p class="wp-block-paragraph">Nun liegt also das ecoDMS Backup auf dem internen NAS herum. Das ist für den ersten Schritt schonmal schön, doch was passiert wenn es bei mir zuhause brennt oder jemand bricht ein und räumt den Serverschrank aus. Ich gebe zu, beides ist nicht zwingend wahrscheinlich aber ausschließen kann ich dieses Szenario nicht. Also sichere ich die Daten noch auf einen externen Datenspeicher im Internet. </p>



<p class="wp-block-paragraph">Bei diesem Schritt ist darauf zu achten dass der genutzte Speicher möglichst vertrauenswürdig ist. Ich persönlich setze hier lieber auf einen der großen Player im Markt und habe mir hier einen Cloudspeicher angemietet. Natürlich verschlüssele ich meine Datensicherung vor der Übertragung in die Cloud noch &#8230; aber da sollte wohl jedem klar sein <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Die Übertragung in die Cloud führe ich über rsync aus. Weitere Details hierzu sind in dem schon existierenden Blogbeitrag zu finden: <a href="https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/">Verzeichnis von Server per rsync spiegeln</a>.</p>
<p>Der Beitrag <a href="https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/">ecoDMS Backup &#8211; automatische Datensicherung im Serverbetrieb</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/ecodms-backup-datensicherung-serverbetrieb/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Verzeichnis von Server per rsync spiegeln</title>
		<link>https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/</link>
					<comments>https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/#respond</comments>
		
		<dc:creator><![CDATA[Thomas Schiffler]]></dc:creator>
		<pubDate>Wed, 03 Jun 2020 03:25:00 +0000</pubDate>
				<category><![CDATA[IT-Know How]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[curlftpfs]]></category>
		<category><![CDATA[Datensicherung]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.schiffler.eu/?p=519</guid>

					<description><![CDATA[<p>Ich betreibe diverse Websites oder Anwendungen (meist JEE getrieben) auf eigenen Servern. Natürlich bieten so ziemlich alle Provider irgend welche &#8230; <a href="https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/" class="more-link">More <span class="screen-reader-text">Verzeichnis von Server per rsync spiegeln</span> <span class="meta-nav">&#8594;</span></a></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/">Verzeichnis von Server per rsync spiegeln</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ich betreibe diverse Websites oder Anwendungen (meist JEE getrieben) auf eigenen Servern. Natürlich bieten so ziemlich alle Provider irgend welche Lösungen zur Datensicherung, so ganz vertrauen tue ich diesen jedoch nicht zwingend. Das Thema rsync (<a rel="noreferrer noopener" href="https://wiki.ubuntuusers.de/rsync/" target="_blank">siehe ubuntuusers.de</a>) in Verbindung mit curlftpfs (<a href="https://wiki.ubuntuusers.de/Archiv/curlftpfs/" target="_blank" rel="noreferrer noopener">siehe ubuntuusers.de</a>) stellte sich für mich als eine praktikable Problemlösung heraus.</p>



<p class="wp-block-paragraph">Aus diesem Grund stellte ich mir die Frage wie ich noch etwas besser schlafen kann und wie ich mir eine eigene Datensicherung (als Fallback-Lösung) schaffen kann. Hierbei habe ich mir die folgende, für mich passende, Lösung gebaut.</p>



<h2 class="wp-block-heading">inkrementelle Serversicherung auf lokalem NAS</h2>



<p class="wp-block-paragraph">In meinem Anwendungsfall betreibe ich 3 Server / vServer irgendwo im Internet (bei unterschiedlichen Providern). Alle diese Server haben unterschiedliche Datenbestände, teils wichtiger, teils unwichtiger. Zuhause, hinter meinem Router, habe ich eine Firewall laufen hinter welcher ein Ubuntu-Server seine Arbeit verrichtet. Innerhalb dieses Netzwerks liegt auch ein Raid-System welches ich für die Datensicherung nutze:</p>



<div class="wp-block-image"><figure class="aligncenter size-medium"><a href="https://www.schiffler.eu/wp-content/uploads/2020/05/20200525_datensicherungskonzept.jpg"><img decoding="async" width="300" height="246" src="https://www.schiffler.eu/wp-content/uploads/2020/05/20200525_datensicherungskonzept-300x246.jpg" alt="Datensicherungskonzept per rsync und curlftpfs" class="wp-image-529" srcset="https://www.schiffler.eu/wp-content/uploads/2020/05/20200525_datensicherungskonzept-300x246.jpg 300w, https://www.schiffler.eu/wp-content/uploads/2020/05/20200525_datensicherungskonzept-768x630.jpg 768w, https://www.schiffler.eu/wp-content/uploads/2020/05/20200525_datensicherungskonzept.jpg 796w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure></div>



<p class="wp-block-paragraph">Auf diesem Server habe ich nun einen Cronjob eingerichtet welcher zu von mir festgelegten Zeiten läuft. Dieser Cronjob verbindet sich zu den 3 Servern im Internet und mountet ein FTP-Account per curlftpfs in das lokale Dateisystem. Weiterhin ist ein Freigabeordner des NAS-Systems gemountet. Der Cronjob selbst führt nun einen rsync zwischen den beiden Verzeichnissen durch und kopiert somit alle neuen Daten vom Server auf das NAS-System.</p>



<h2 class="wp-block-heading">Remote-FTP per curlftpfs ins Filesystem mounten</h2>



<p class="wp-block-paragraph">Das von mir verwendete curlftpfs lässt sich am einfachsten über ein Zitat von der Webseite auf ubutnuusers.de beschreiben:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><a href="http://curlftpfs.sourceforge.net/">curlftpfs</a>&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f1ec-1f1e7.png" alt="🇬🇧" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ist ein&nbsp;<a href="https://wiki.ubuntuusers.de/FUSE/">FUSE</a>-Modul, mit dem man entfernte Rechner über&nbsp;<a href="https://wiki.ubuntuusers.de/FTP/">FTP</a>&nbsp;in das eigene Dateisystem einbinden kann. Der Vorteil ist, dass man damit die Dateien und Verzeichnisse auf dem entfernten Rechner sehr komfortabel editieren, kopieren oder verschieben kann – genau wie die Dateien und Verzeichnisse auf den lokalen Festplatten. Dies erfordert auf dem Server einen FTP-Dienst. Die meisten Anbieter von Webspace ermöglichen den Zugriff über FTP.</p><cite><a href="https://wiki.ubuntuusers.de/Archiv/curlftpfs/">https://wiki.ubuntuusers.de/Archiv/curlftpfs/</a></cite></blockquote>



<p class="wp-block-paragraph">Ja ich weiß, curlftpfs wird seit Jahren nicht mehr weiter entwickelt. Allerdings funktioniert es eben einfach wunderbar, warum sollte man es ersetzen?</p>



<p class="wp-block-paragraph">Das Mounten eines FTP-Verzeichnisses in das lokale Dateisystem ist hierbei denkbar einfach:</p>



<pre class="wp-block-code"><code>mkdir /tmp/mountpoint
curlftpfs ftp://&lt;user>:&lt;passwort>@&lt;host>/&lt;zuSichernderPfad>/ /tmp/mountpoint</code></pre>



<p class="wp-block-paragraph">Wenn wir hier Username, Passwort, Hostname und den zu sicherenden Pfad mit den Daten des Remoteservers ersetzen wird das Verzeichnis entsprechend ins lokale Dateisystem eingebunden. </p>



<h2 class="wp-block-heading">Serversicherung per rsync durchführen</h2>



<p class="wp-block-paragraph">Nachdem wir nun das Remote-Verzeichnis ins lokale Dateisystem eingebunden haben können wir dieses Verzeichnis mittels rsync clonen. Rsync prüft hierbei ob eine Remote-Datei neu ist, geändert wurde oder gar gelöscht wurde und übernimmt die Änderungen je nach Parameter. </p>



<p class="wp-block-paragraph">In meinem Beispiel möchte ich alle Remote-Änderungen übernehmen und somit immer die aktuelle Dateiversion in meiner lokalen Sicherung vorliegen haben. Im folgenden Beispiel werden die Daten aus dem Verzeichnis /tmp/mountpoint in das Verzeichnis /tmp/nasmountpoint übernommen:</p>



<pre class="wp-block-code"><code>rsync -a -u --delete /tmp/mountmoint /tmp/nasmountpoint</code></pre>



<h2 class="wp-block-heading">Das fertige Script &#8211; rsync und curlftpfs in Kombination</h2>



<p class="wp-block-paragraph">Das mit das folgende Script funktioniert müssen einige Parameter angepasst werden. Diese sind jeweils in &lt;&gt; eingeschlossen. Weiterhin ist zu beachten dass im zu sichernden Verzeichnis auf dem Server eine Datei mit dem Namen &#8222;online.id&#8220; erwartet wird. Das Script prüft am Anfang ob diese Datei vorhanden ist, wenn nicht wird der curlftpfs mount hergestellt.</p>



<pre class="wp-block-code"><code>echo "starte download der remote datesicherung"
if &#91; ! -f /&lt;lokalerPfadZumMountpoint>/online.id ];
then
    echo "nicht verbunden - stelle verbindung her"
    curlftpfs ftp://&lt;user>:&lt;passwort>@&lt;host>/&lt;zuSichernderPfad>/
fi
if &#91; -f /&lt;lokalerPfadZumMountpoint>/online.id ];
then
    echo "verbindung existent - spiegle daten"
    rsync -a -u --delete /&lt;lokalerPfadZumMountpoint> /&lt;zielpfadFuerDatensicherung>
    fusermount -u /&lt;lokalerPfadZumMountpoint>
else
    echo "verbindung konnte nicht hergestellt werden - sicherung abgebrochen"
fi</code></pre>



<p class="wp-block-paragraph"></p>
<p>Der Beitrag <a href="https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/">Verzeichnis von Server per rsync spiegeln</a> erschien zuerst auf <a href="https://www.schiffler.eu">Das ist die Welt von Thomas</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.schiffler.eu/verzeichnis-von-server-per-rsync-spiegeln/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 44/55 objects using APC
Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Minified using APC
Database Caching 12/25 queries in 0.002 seconds using APC

Served from: www.schiffler.eu @ 2026-06-02 08:49:42 by W3 Total Cache
-->