Backup to Microsoft OneDrive with Synology’s Hyper Backup

With Microsoft offering 1 TB of OneDrive cloud storage in it’s Office 365 subscription, it would be nice if that storage could be used to backup data from a Synology NAS. Unfortunately, Synology’s own backup solution for DSM, Hyper Backup, does not offer to use OneDrive as a backup destination. So here is my solution to this for those who can run Docker on their Synology NAS.

Update: For OneDrive for Business (SharePoint), see Backup to Microsoft OneDrive for Business (SharePoint) with Synology’s Hyper Backup.

tl;dr Run the basic-to-passport-auth-http-proxy Docker image and configure a WebDAV backup destination in Hyper Backup.

While not offering OneDrive as backup destination, Hyper Backup does offer to configure a WebDAV server as backup destination. OneDrive on the other hand can be accessed via WebDAV. The problem is, that the OneDrive WebDAV API requires authentication with the Passport Server Side Include (SSI) Version 1.4 Protocol, while Hyper Backup’s WebDAV client only supports HTTP Basic authentication and NTLM authentication.

One solution to this is to set up a proxy server that translates all authentication related information from Basic authentication to Passport authentication (and vice versa) and forwards all other information unchanged. For this purpose I wrote the basic-to-passport-auth-http-proxy server.

Installing the proxy server

The first step is to install and configure the proxy server. As the communication between Hyper Backup and the proxy server is not encrypted, their connection should run over a trusted network, e.g. the loopback device (localhost) when installed on the same machine. It is not advisable to install the server on a public VPS or similar without additional security measures. The easiest way to run the basic-to-passport-auth-http-proxy server on a Synology NAS is to use the Docker image published on Docker Hub:

  • Make sure the Docker package is installed on the NAS. If not, you can find it in the DSM Package Center. Unfortunately, it is not available for all Synology devices. (*)
  • Open the Docker app in DSM, choose Registry, ensure you have selected Docker Hub in the Registry Settings and search for skleeschulte. Download skleeschulte/basic-to-passport-auth-http-proxy (select the highest version tag when prompted).
  • Navigate to Image and launch the image you just downloaded. In the Advanced Settings, change the following:
    Advanced Settings: Check Enable auto-restart
    Port Settings: Change Local Port to 3000
    Environment: Add a variable named PROXY_TARGET with the value https://d.docs.live.net/
    Then hit Apply and finish the Create Container dialog.
  • Navigate to Container, open the details of the newly created container and check the log. It should show something like proxy:info Proxy server listening: { address: '::', family: 'IPv6', port: 3000 } and no errors.

(*) If your NAS does not allow to run Docker images, you could install Node.js directly on your NAS and run the proxy server there, or you could install it on a different machine, e.g. a Raspberry Pi connected to your local network. Instructions for running the server directly with Node.js can be found in the README file in the GitHub repository.

Getting the OneDrive CID

To connect to OneDrive over WebDAV, in addition to the username and password, a character string called CID is needed. The CID can be obtained in one of the following ways:

  • With your web-browser, navigate to https://www.onedrive.com/ and log in to OneDrive. When the browser has finished loading the OneDrive interface, the address bar should show something like https://onedrive.live.com/?id=root&cid=ABCDEFG123456789. Here, ABCDEFG123456789 is your CID. (It is the part after cid= up to the next & sign, if there is one.)
  • Alternatively, if you have the OneDrive client installed on Windows, you can find the CID in Windows‘ Credential Manager: Under Windows Credentials, locate OneDrive Cached Credential – the username is the CID.

The CID is case-insensitive.

Configuring Hyper Backup

Now that the proxy server is up and running and you know your CID, Hyper Backup can be configured to connect to OneDrive over the proxy server:

  • In Hyper Backup, create a new Data backup task, choose WebDAV as the backup destination and hit Next.
  • Enter the following Backup Destination Settings:
    Server address: localhost:3000/ONEDRIVE_CID (replace ONEDRIVE_CID with your CID)
    Username: your OneDrive username (= email address)
    Password: your OneDrive password (if you have two-step verification enabled for your account, you need to generate an app password and use that instead)
  • When you now open the Folder drop-down, you should be presented with a list of the folders in your OneDrive.
  • The rest of the configuration is up to you.

Data recovery

If one day you need to recover data from your backup without the proxy server, you can do so by accessing the backup files directly with Synology’s Hyper Backup Explorer, e.g. with the Windows OneDrive client or after downloading them from the OneDrive webinterface.

Resource consumption

My NAS model is a DS218+ with an Intel Celeron J3355 (2x 2 GHz) and 2 GB RAM. The Docker container idles around 0.1% CPU usage and 60 MB of RAM. The image takes up 90 MB of storage space.

While a backup is running, CPU Usage of the container stays unchanged while RAM usage goes up to 80 to 130 MB.

Disclaimer

Although successfully completing a number of tests, the basic-to-passport-auth-http-proxy server is not extensively field-tested yet. Use it at your own risk. If you observe any problems, please create a new issue at the GitHub project page. If you run your own tests, please share the results (e.g. comment here or create an issue on GitHub).

Happy backuping!

30 Gedanken zu „Backup to Microsoft OneDrive with Synology’s Hyper Backup

  1. This doesn’t seem to work with some Office 365 subscriptions that have a different onedrive implementation: After signing in on the Web, it takes me to my.sharepoint.com/personal/… and there I have my onedrive space, no CID in the URL. I could get the username from the credential store, but it’s much longer than the CID and when trying to connect with HyperBackup it gives me an Authentication failure.

  2. I get an error:
    proxy:error PROXY_TARGET environment variable is not set.

    export -p output:

    export PROXY_TARGET=“https://d.docs.live.net/“

    What can I do?

  3. Hallo und danke für diesen Beitrag. Bisher habe ich die Datensicherung via Hyper Backup lokal erstellt und dann via Cloud Sync auf OneDrive übertragen. Ich bin aber schon seit längerem auf der Suche nach einem „besseren“ Lösungsansatz, welcher nicht lokal nochmal zusätzlich Speicher belegt. Deine Idee via Proxy finde ich super.
    Danke und viele Grüße
    Esche

  4. Hallo,
    vielen Dank für das super Script.
    Ich habe das Backup über HyperBackup auf OneDrive über Node.js zum laufen bekommen, so wie hier beschreiben.
    Ich bringe das ganze über folgendes Script über ssh als root zum laufen:

    #!/bin/bash
    cd /usr/basic-to-passport-auth-http-proxy-master/
    npm ci –only=production
    export PROXY_TARGET=https://d.docs.live.net/
    node lib/server.js

    Ich erhalte das folgende als Ausgabe:
    added 17 packages, and audited 18 packages in 7s
    2 high severity vulnerabilities
    To address all issues (including breaking changes), run:
    npm audit fix –force
    Run `npm audit` for details.
    proxy:info Proxy server listening: { address: ‚::‘, family: ‚IPv6‘, port: 3000 } +0ms

    Und schon funktioniert das ganze Backup.

    Sobald ich putty aber beende, wird das obige Script beendet und schon bricht die Verbindung vom OneDrive-Server ab.

    Nun habe ich also als root, das obige Script in den Odner „/usr/local/etc/rc.d/“ gepackt, damit es bei jedem Neustart meiner NAS automatisch ausgeführt wird und die Verbindung zum OneDrive-Server hergestellt wird.

    Das funktioniert auch soweit, ABER irgendwann kommt folgender Fehler:
    Code:
    proxy:error [19268897/5817] Sending error response: 500 read ECONNRESET +2h <<<— Zeit immer unterschiedlich
    _http_outgoing.js:526
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

    Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at sendResponse (/usr/basic-to-passport-auth-http-proxy-master/lib/server.js:48:17)
    at ProxyServer. (/usr/basic-to-passport-auth-http-proxy-master/lib/server .js:264:5)
    at ProxyServer.emit (/usr/basic-to-passport-auth-http-proxy-master/node_modules/even temitter3/index.js:210:27)
    at ClientRequest.proxyError (/usr/basic-to-passport-auth-http-proxy-master/node_modu les/http-proxy/lib/http-proxy/passes/web-incoming.js:163:18)
    at ClientRequest.emit (events.js:310:20)
    at TLSSocket.socketErrorListener (_http_client.js:426:9)
    at TLSSocket.emit (events.js:310:20)
    at errorOrDestroy (internal/streams/destroy.js:108:12)
    at onwriteError (_stream_writable.js:418:5) {
    code: ‚ERR_HTTP_HEADERS_SENT‘
    }
    … und das Script wird beendet und schon besteht keine Verbindung mehr zum OneDrive-Server.

    Wo liegt der Fehler und wie sorge ich dafür, dass das Script wieder automatisch startet, sobald die Verbindung mal abgebrochen ist?

    Schon mal vielen Dank im Voraus.

    • Benjamin – ich muss vorausschicken, ich bin kein Programmierer und habe mir das, was jetzt folgt, zusammengegoggelt… Also lieber nochmal überprüfen. Ich bin über SSH auf meine DS412 gegangen.

      1. Ich habe im Verzeichnis /etc mit dem VI Editor eine Datei rc.local erstellt. Die wird wohl beim Start des NAS aufgerufen und sorgt dafür, dass dort enthaltene Skript-Befehle ausgeführt werden – diese Datei muss mit chmod +x ausführbar gemacht werden.

      2. mit dem VI Editor habe ich folgendes Skript dort hineingeschrieben – wobei XXXXX einer meiner gemeinsamen Ordner ist, dort liegt das Unterverzeichnis „proxy“ – in das habe ich die entzippten ProxyMaster-Dateien geladen und von dort auch die Installation per SSH angestossen (kann man sicher auch woanders hinlegen, aber da war ich überfragt, wie)

      #!/bin/sh
      cd volume1/XXXXXXXX/proxy
      export PROXY_TARGET=https://d.docs.live.net/
      node lib/server.js

      Ich glaube nämlich, dass der Befehl „npm ci –only=production“ nur einmal zum installieren benötigt wird.

      3. Wenn die Synology neu startet, dann lädt das Skript im Hintergrund die Konfiguration und startet den Server – so erkläre ich mir jedenfalls, dass es funktioniert. Wie gesagt, bin kein Programmierer, deshalb: VORSICHT, und vielleicht kann das hier ja auch jemand erfahrenes noch kommentieren….

  5. Was ist der Unterschied/Nachteil zu mounten von onedrive via Rclone und dann den mount als Ziel für Backup benutzen?
    Vorteil Rclone, man kann es so als „Share“ benutzen…

  6. Wird das mit dem neuen Synology Update auf DSM 7 weiterhin laufen? Nachdem bei DSM 7 so viel geändert wird, wollte ich vor dem Update lieber mal fragen…

    • Es läuft bei mir auch unter DSM 7…
      Leider habe ich ein anders Problem (es sollte aber DSM Version unabhängig sein). Am Anfang läuft alles super, allerdings nach einer gewissen Zeit werden die Backups als Korrupt markiert. Je größer das Backup desto schneller passiert es, meistens so nach 10-15 Backups (incrementel)… Hat jemand das gleiche Problem und weiß die Lösung?
      Zur Zeit muss ich immer den Job neu anlegen in Hyper Backup und es von „vorne“ sichern, was ziemlich unhandlich ist.

      • Ich kann das genauso bestätigen. Die Backupjobs lassen sich durch löschen und neu einrichten wieder mit den vorhandenen Daten verknüpfen, aber ein paar Läufe später sind sie wieder defekt.
        Ich hab echt viel probiert, bin aber am kapitulieren.
        Hand aufs Herz, hat das irgendjemand dauerhaft lauffähig bekommen?
        Bei mir läuft DSM7

      • Hi,

        I have similar issues
        I have a large backup (800Go)
        I tried and retried many times, even with a lower selection 100Go)
        With a large backup (the first with 800Go), it stuck at 96%, and suspended. Impossible to finish it
        For a finished job (less than 100Go) if I start an integrity verification, it fail : the datas can be only restored

        So, it seems to be complicated to backup on Onedrive. That’s probably the reason why Synology doesn’t support this one ?

        I tried with another storage, like Kdrive (infomaniak Switzerland), with the same issue
        Problably, some Webdav servers are not compatible with this kind of backup ?

        For the moment, the only working webdav provider in my case, is HiDrive (ionos)

        Any other suggestion to backup with OneDrive correctly ?

  7. Hey Ray 😉

    Ich hänge an der Stelle an der ich das HyperBackup einrichte und die Ordner in meinem Office angezeigt werden sollten. Da kommt dann aber die Fehlermeldung, dass es keine Zugriff gibt. Hab es sowohl mit als auch ohne App Passwort aus Microsfot versucht.

    Wo kann da der Fehler sein? Bin kein Programmierer, aber auch nicht ganz blöd.

  8. Pingback: Synology Backup To Onedrive - SecuredGuide

  9. Hallo Zusammen

    Was spricht dagegen nur die zu sichernden Verzeichnisse via CloudSync zu synchronisieren? Diese sind ja dann bei OneDrive wieder versioniert.

    Unsere alte DS213+ unterstütz Docker leider nicht und es kommt mir keine elegantere Lösung in den Sinn.

    Gruss Oli

  10. Das Backup lief lange Zeit problemlos, jetzt plötzlich meldet Hyper Backup immer „Ziel: offline“, was aber definitiv nicht stimmt. Was könnte das Problem sein?

    Gruss Harald

  11. Thanks for the docker –
    I get error in Create Backup Destination Settings of „unable to perform this operation, possibly because the network connection is unstable or the system is busy. – have tried manyt times
    Have taken latest from registry (0.1.4), on DSM 7.1.1-42962 Update 1 – latest Docker package.
    Config is docker-entrypoint.sh forever –minUptime 1000 –spinSleepTime 1000 /ib/server.js; PROXY_TARGET: https://d.docs.livenet/ ; PROXY_PORT: 3000
    Execute using high privilige (same result Ticked or not)
    Enable web portal via Web Station – un ticked
    Port Settings – Local Port=Auto, Container Port = 3000, TCP
    Log shows – 2022-10-30T10:18:36.176Z proxy:info Proxy server listening: { address: ‚::‘, family: ‚IPv6‘, port: 3000 }

    ANy suggestions

    • Issue Fixed – no idea how
      Deleted docker image
      recreatedall seemed OK
      Suspect issue was around Settings
      General Settings – Set- Execute Contain using High priv & Auto-restart
      Advanced Settings – add PROXY_TARGET
      Next page – Port Settings change Local port from „Auto“ to 3000

      So thanks

  12. Thanks for providing these amazing instructions Ray! I set this up on my Synology and it seemed to work perfectly for a while. However, the integrity check always finds a lot of corrupted files after a few weeks and then Hyper Backup stops doing more backups. Then I have to delete the backup task and re-link it and it continues to work.
    Does anyone have this issue as well? Any ideas how to fix it?
    Thanks a lot in advance!

  13. Everything works OK.
    But upload speed is ~10 MB/s.
    CPU is nearly idle, enough memory on Synology NAS, 500 Mb/s upload internet connection speed for other applications.

    What can be limiting the hyper backup uploaв speed?

  14. I have similar problems to Jonas ad Chris.

    1. „The integrity check finds a lot of corrupted files after a few weeks and then Hyper Backup stops doing more backups. Then I have to delete the backup task and re-link it and it continues to work.“
    2. I see the following errors in the log which may not have anything to do with the corrupted files.
    2023/07/24 07:04:39 stdout 2023-07-23T23:04:39.394Z proxy:error [502070970/5838] Sending error response: 500 Request failed with status code 503
    2023/07/24 07:04:39 stdout 2023-07-23T23:04:39.394Z proxy:error Request failed with status code 503

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.