Backing up family photos has always been an important task for me, especially the ones taken from my phone (which is often). I do periodic backups to an external hard drive, however, I never really found a cloud backup solution I liked and where I had control over. For a while I was backing up photos to OneDrive, but I found the cost of upgrading to an Office365 account a bit overkill. Recently over the past year I have been experimenting with Digital Ocean Spaces, which is an object storage service with S3 compatibility.
Since it is compatible with S3 and I regularly use Termux (a linux command-line emulator app), I wonder if I could schedule nightly backup jobs using the s3cmd tool.
Here are the steps I took.
Installing s3cmd and Termux API
I referenced the scripts provided in this Github repo to install the necessary dependencies for s3cmd to run properly. Here are the commands I ran on Termux.
pkg install python pkg install termux-api pip install s3cmd
After installing the above packages run the following command to configure s3cmd for your DO Spaces account. I referenced this document when running the command.
s3cmd --configure
Creating the sync script
***Please use caution when testing your scripts so that you do not burn through your cellular data***
I wanted any videos or photos taken on my phone each day to be synced to my DO Spaces bucket. To avoid using cell data I needed a way to ensure that my phone was connected to the wifi network. I utilized the Termux API , which offers commands that can have access to or provide hardware information of your Android device. The specific command would be termux-wifi-connectioninfo. The command prints information about your current wifi statuses.
Here is an example:
$termux-wifi-connectioninfo { "bssid": "xx:xx:xx:xx:xx:xx", "frequency_mhz": 2412, "ip": "xxx.xxx.x.xxx", "link_speed_mbps": 78, "mac_address": "xx:xx:xx:xx:xx:xx", "network_id": 1, "rssi": -42, "ssid": "xxxxxxxxxxx", "ssid_hidden": false, "supplicant_state": "COMPLETED" }
What we are looking for is the “supplicant_state” field to have a value of “COMPLETED”.
Using the results printed I wrote the below script that would check the “supplicant_state” field before running the s3cmd command. It will only run if the field value contains the word “COMPLETED”. If so, it will sync all photos and videos in the Camera folder for the current date.
#!/bin/bash WIFISTATUS=$(termux-wifi-connectioninfo | grep supplicant) CURRDATE=$(date +%Y%m%d) echo $WIFISTATUS if [[ "$WIFISTATUS" =~ "COMPLETED" ]] then s3cmd put /sdcard/DCIM/Camera/$CURRDATE* s3://Path/To/My/Bucket else echo NOWIFI fi
Scheduling the cron job
In order to have the script run in a nightly basis I added the following entry to the crontab by running crontab -e.
0 23 * * * /data/data/com.termux/files/home/scripts/dailyphotobacknew.sh >> ~/camerasync.log
The only caveat with the above approach would be that you need to have termux running in the background in order for the script to run. Besides that, this setup has worked out well for me and all my photos and videos have been backed up to cloud storage without much of a hiccup. Once in a while if I power off my phone I have remember to open termux, but that rarely occurs.
I hope this helps any DigitalOcean and Android users out there. If you do not have a DO account and you are thinking about signing up for one, use this link to get some free credits (I will receive some credits for the referral as well).