Sign inSign up

jjoswig/raspberrypi-timemachine

By jjoswig

•Updated over 6 years ago

docker image to run a TimeMachine compatible container on basis of Samba for drive for MacOS

Image
0

949

jjoswig/raspberrypi-timemachine repository overview

⁠jjoswig/raspberrypi-timemachine

docker image to run a TimeMachine compatible container on basis of Samba to provide a TimeMachine drive for MacOS

⁠Prerequisites

To run this docker image you will need the following:

  • A Raspberry PI - I propose to use at least a Raspberry PI 4, because it has enough resources and interfaces (USB 3.0, GBIT ethernet) that will provide an appropriate backup speed
  • Raspbian Buster - You should ideally use Raspbian as operating system on the Raspberry PI (https://www.raspbian.org/⁠)
  • Docker - Please install docker using: sudo apt update && sudo apt install docker.io

⁠Tags

  • latest SMB image based off of alpine:latest

To pull this image: docker pull jjoswig/raspberrypi-timemachine:latest

⁠Example usage for SMB

Example usage with --net=host to allow Avahi discovery; all available environment variables set to their default values:

docker run -d --restart=always \
  --name timemachine \
  --net=host \
  -e CUSTOM_SMB_CONF="false" \
  -e CUSTOM_USER="false" \
  -e DEBUG_LEVEL="1" \
  -e MIMIC_MODEL="TimeCapsule8,119" \
  -e EXTERNAL_CONF="" \
  -e HIDE_SHARES="no" \
  -e TM_USERNAME="timemachine" \
  -e TM_GROUPNAME="timemachine" \
  -e TM_UID="1000" \
  -e TM_GID="1000" \
  -e PASSWORD="timemachine" \
  -e SET_PERMISSIONS="false" \
  -e SHARE_NAME="TimeMachine" \
  -e SMB_PORT="445" \
  -e VOLUME_SIZE_LIMIT="0" \
  -e WORKGROUP="WORKGROUP" \
  -v /path/on/host/to/backup/to/for/timemachine:/opt/timemachine \
  -v timemachine-var-lib-samba:/var/lib/samba \
  -v timemachine-var-cache-samba:/var/cache/samba \
  -v timemachine-run-samba:/run/samba \
  mbentley/timemachine:smb

Example usage with exposing ports without Avahi discovery; all available environment variables set to their default values:

docker run -d --restart=always \
  --name timemachine \
  --hostname timemachine \
  -p 137:137/udp \
  -p 138:138/udp \
  -p 139:139 \
  -p 445:445 \
  -e CUSTOM_SMB_CONF="false" \
  -e CUSTOM_USER="false" \
  -e DEBUG_LEVEL="1" \
  -e HIDE_SHARES="no" \
  -e EXTERNAL_CONF="" \
  -e MIMIC_MODEL="TimeCapsule8,119" \
  -e TM_USERNAME="timemachine" \
  -e TM_GROUPNAME="timemachine" \
  -e TM_UID="1000" \
  -e TM_GID="1000" \
  -e PASSWORD="timemachine" \
  -e SET_PERMISSIONS="false" \
  -e SHARE_NAME="TimeMachine" \
  -e SMB_PORT="445" \
  -e VOLUME_SIZE_LIMIT="0" \
  -e WORKGROUP="WORKGROUP" \
  -v /path/on/host/to/backup/to/for/timemachine:/opt/timemachine \
  -v timemachine-var-lib-samba:/var/lib/samba \
  -v timemachine-var-cache-samba:/var/cache/samba \
  -v timemachine-run-samba:/run/samba \
  mbentley/timemachine:smb
⁠Tips for Automatic Discovery w/Avahi

This works best with --net=host so that discovery can be broadcast. Otherwise, you will need to expose the above ports and then you must manually map the share in Finder for it to show up (open Finder, click Shared, and connect as smb://hostname-or-ip/TimeMachine with your TimeMachine credentials). Using --net=host only works if you do not already run Samba or Avahi on the host! Alternatively, you can use the SMB_PORT option to change the port that Samba uses. See below for another workaround if you do not wish to change the Samba port.

⁠Conflicts with Samba and/or Avahi on the Host

Note: If you are already running Samba on your Docker host (or you're wanting to run this on your NAS), you should be aware that using --net=host will cause a conflict with the Samba install. As an alternative, you can use the macvlan driver in Docker⁠ which will allow you to map a static IP address to your container. If you have issues setting up Time Machine with the configuration, feel free to open an issue and I can assist - this is how I persoanlly run time machine.

  1. Create a macvlan Docker network (assuming your local subnet is 192.168.0.0/24, the default gateway is 192.168.0.1, and eth0 for the host's network interface):

    $ docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macvlan1
    

    On devices such as Synology DSM, the primary network interface may be ovs_eth0 due to the usage of Open vSwitch. If you are unsure of your primary network interface, this command may help:

    $ route | grep ^default | awk '{print $NF}'
    eth0
    

    The macvlan driver can use another network interface as the documentation states above but in cases where multiple network interfaces may exist and they might not all be connected, choosing the primary network interface is generally safe.

  2. Add --network macvlan1 and --ip 192.168.0.x to your docker run command where 192.168.0.x is a static IP to assign to Time Machine

⁠Volume & File system Permissions

If you're using an external volume like in the example above, you will need to set the filesystem permissions on disk. By default, the timemachine user is 1000:1000.

Also note that if you change the TM_USERNAME value that it will change the data path from /opt/timemachine to /opt/<value-of-TM_USERNAME>.

Default credentials:

  • Username: timemachine
  • Password: timemachine
⁠Optional variables for SMB
VariableDefaultDescription
CUSTOM_SMB_CONFfalseindicates that you are going to bind mount a custom config to /etc/samba/smb.conf if set to true
CUSTOM_USERfalseindicates that you are going to bind mount /etc/password, /etc/group, and /etc/shadow; and create data directories if set to true
DEBUG_LEVEL1sets the debug level for nmbd and smbd
EXTERNAL_CONFnot setspecifies a directory in which individual variable files, ending in .conf, for multiple users; see Adding Multiple Users & Shares⁠ for more info
HIDE_SHARESnoset to yes if you would like only the share(s) a user can access to appear
MIMIC_MODELTimeCapsule8,119sets the value of time machine to mimic
TM_USERNAMEtimemachinesets the username time machine runs as
TM_GROUPNAMEtimemachinesets the group name time machine runs as
TM_UID1000sets the UID of the TM_USERNAME user
TM_GID1000sets the GID of the TM_GROUPNAME group
PASSWORDtimemachinesets the password for the timemachine user
SET_PERMISSIONSfalseset to true to have the entrypoint set ownership and permission on /opt/timemachine
SHARE_NAMETimeMachinesets the name of the timemachine share to TimeMachine by default
SMB_PORT445sets the port that Samba will be available on
VOLUME_SIZE_LIMIT0sets the maximum size of the time machine backup; a unit can also be passed (e.g. - 1 T). See the Samba docs⁠ under the fruit:time machine max size section for more details
WORKGROUPWORKGROUPset the Samba workgroup name
⁠Adding Multiple Users & Shares

In order to add multiple users who have their own shares, you will need to create a file for each user and put them in a directory. The file name must end in .conf or it will not be parsed and the contents must be environment variable formatted proper and include all of the values below in the example. Only VOLUME_SIZE_LIMIT can be empty if you do not want to set a quota.

⁠Example EXTERNAL_CONF File

This is an example to create a user named foo. The EXTERNAL_CONF variable should point to the directory that contains the user definition files. Create multiple files with different attributes to create multiple users and shares.

foo.conf

TM_USERNAME=foo
TM_GROUPNAME=foogroup
PASSWORD=foopass
SHARE_NAME=foo
VOLUME_SIZE_LIMIT="1 T"
TM_UID=1000
TM_GID=1000
⁠Example run command for EXTERNAL_CONF

This run command has the necessary path to where the external user files will be mounted (set in EXTERNAL_CONF) and the volume mount that matches the path specified in EXTERNAL_CONF.

docker run -d --restart=always \
  --name timemachine \
  --net=host \
  -e CUSTOM_SMB_CONF="false" \
  -e CUSTOM_USER="false" \
  -e DEBUG_LEVEL="1" \
  -e MIMIC_MODEL="TimeCapsule8,119" \
  -e EXTERNAL_CONF="/users" \
  -e HIDE_SHARES="no" \
  -e TM_USERNAME="timemachine" \
  -e TM_GROUPNAME="timemachine" \
  -e TM_UID="1000" \
  -e TM_GID="1000" \
  -e PASSWORD="timemachine" \
  -e SET_PERMISSIONS="false" \
  -e SHARE_NAME="TimeMachine" \
  -e SMB_PORT="445" \
  -e VOLUME_SIZE_LIMIT="0" \
  -e WORKGROUP="WORKGROUP" \
  -v /path/on/host/to/backup/to/for/timemachine:/opt/timemachine \
  -v timemachine-var-lib-samba:/var/lib/samba \
  -v timemachine-var-cache-samba:/var/cache/samba \
  -v timemachine-run-samba:/run/samba \
  -v /path/on/host/to/user/file/directory:/users \
  mbentley/timemachine:smb
⁠Using a password file

This is an example to using Docker secrets to pass the password via a file

password.txt

my_secret_password
⁠Example docker-compose file

Please see the example docker-compose.yml file in the repository. Another example can be found below.

version: "3.3" # or greater
services:
  timemachine:
    restart: unless-stopped
    image: jjoswig/timemachine
    network_mode: host
    environment:
      - CUSTOM_SMB_CONF=false
      - CUSTOM_USER=false
      - MIMIC_MODEL=TimeCapsule8,119
      - EXTERNAL_CONF=
      - HIDE_SHARES=no
      - TM_USERNAME=timemachine
      - TM_GROUPNAME=timemachine
      - TM_UID=1000
      - TM_GID=1000
      - PASSWORD=timemachine
      - SET_PERMISSIONS=false
      - SHARE_NAME=TimeMachine
      - SMB_PORT=445
      - VOLUME_SIZE_LIMIT=0
      - WORKGROUP=WORKGROUP"
    ports:
      - "137:137/udp"
      - "138:138/udp"
      - "139:139"
    volumes:
      - /mnt/backups/timemachine:/opt/timemachine 
      - ./timemachine-var-lib-samba:/var/lib/samba
      - ./timemachine-var-cache-samba:/var/cache/samba
      - ./timemachine-run-samba:/run/samba      

Note: Adjust the paths in the volumes according to your needs. E.g., if you have an external HDD connected via USB to the Raspberry PI and mounted to "/mnt", than use the path above.

Thanks for mbentley⁠ for his example to start from.

Tag summary

Content type

Image

Digest

Size

13.3 MB

Last updated

over 6 years ago

docker pull jjoswig/raspberrypi-timemachine