├── .github └── workflows │ ├── release.yml │ └── sync_readme.yml ├── .gitignore ├── Dockerfile ├── README.md ├── _config.yml ├── docker-compose.yml ├── preview └── dog.JPG ├── release.sh └── root └── etc ├── cont-init.d ├── 00-envsubst.sh └── 00-smb.sh ├── samba └── smb.conf └── services.d ├── avahi └── run ├── dbus └── run ├── nmbd └── run └── sambd └── run /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - tim-apple 7 | schedule: 8 | - cron: "0 0 * * *" # daily 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | 18 | - name: Build 19 | uses: docker/build-push-action@v1 20 | with: 21 | username: ${{ secrets.DOCKER_USERNAME }} 22 | password: ${{ secrets.DOCKER_PASSWORD }} 23 | repository: ${{ secrets.DOCKER_USERNAME }}/time-machine 24 | tags: latest 25 | -------------------------------------------------------------------------------- /.github/workflows/sync_readme.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Sync Readme 3 | 4 | on: 5 | push: 6 | branches: 7 | - tim-apple 8 | schedule: 9 | - cron: "0 0 * * *" # daily 10 | 11 | 12 | jobs: 13 | sync: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2 19 | 20 | - name: Sync 21 | uses: ms-jpq/sync-dockerhub-readme@v1 22 | with: 23 | username: ${{ secrets.DOCKER_USERNAME }} 24 | password: ${{ secrets.DOCKER_PASSWORD }} 25 | repository: ${{ secrets.DOCKER_USERNAME }}/time-machine 26 | readme: "./README.md" 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:focal 2 | 3 | 4 | ARG S6_VER="2.0.0.1" 5 | 6 | 7 | ## S6 Overlay 8 | RUN mkdir /_install 9 | ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_VER}/s6-overlay-amd64.tar.gz /_install 10 | RUN tar xzf /_install/s6-overlay-amd64.tar.gz -C / --exclude="./bin" && \ 11 | tar xzf /_install/s6-overlay-amd64.tar.gz -C /usr ./bin 12 | ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2 13 | ENTRYPOINT ["/init"] 14 | 15 | 16 | ## Dependencies 17 | ENV DEBIAN_FRONTEND=noninteractive 18 | RUN apt update && \ 19 | apt upgrade -y && \ 20 | apt install -y \ 21 | gettext-base samba avahi-daemon 22 | 23 | 24 | ## Scripts 25 | COPY root / 26 | ENV S6_CMD_WAIT_FOR_SERVICES=1 \ 27 | PGID=0 \ 28 | PUID=0 \ 29 | SMB_NAME='Time Machine' \ 30 | SMB_USER=dog \ 31 | SMB_PASSWORD=dog 32 | VOLUME ["/share"] 33 | 34 | 35 | ## Cleanup 36 | RUN apt autoremove -y && \ 37 | apt clean && \ 38 | rm -r /_install 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Docker Tim🍎 Machine](https://ms-jpq.github.io/docker-time-machine) 2 | 3 | Zero Configuration. Time machine for MacOS 4 | 5 | Thank you Tim🍏, very cool. 6 | 7 | ## Show me 8 | 9 | [![Docker Pulls](https://img.shields.io/docker/pulls/msjpq/time-machine.svg)](https://hub.docker.com/r/msjpq/time-machine/) 10 | 11 | ```sh 12 | docker run --net=host -v /my_folder/:/share msjpq/time-machine 13 | ``` 14 | 15 | - User: `dog` 16 | - Password : `dog` 17 | 18 | Why? Because I like dogs. 19 | 20 | ## Fancy 21 | 22 | | Environmental Variables | Description | 23 | | ------------------------- | -------------------- | 24 | | `SMB_NAME='Time Machine'` | what you see from 💻 | 25 | | `SMB_USER=dog` | your login | 26 | | `SMB_PASSWORD=dog` | your password | 27 | | `PGID=0` | user gid (advanced) | 28 | | `PUID=0` | user uid (advanced) | 29 | 30 | ## Docker Compose 31 | 32 | ```yaml 33 | --- 34 | version: "3.7" 35 | 36 | services: 37 | time_machine: 38 | image: msjpq/time-machine 39 | container_name: time-machine 40 | restart: unless-stopped 41 | network_mode: host 42 | volumes: 43 | - ./:/share 44 | ``` 45 | 46 | ## Very important 47 | 48 | Say hi to my dog! 49 | 50 | ![my dog](https://raw.githubusercontent.com/ms-jpq/docker-time-machine/tim-apple/preview/dog.JPG) 51 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | title: Docker Tim🍎 Machine 3 | 4 | showcase: True 5 | 6 | images: [] 7 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: "3.7" 3 | 4 | services: 5 | time_machine: 6 | image: msjpq/time-machine 7 | container_name: time-machine 8 | restart: unless-stopped 9 | network_mode: host 10 | volumes: 11 | - ./:/share 12 | -------------------------------------------------------------------------------- /preview/dog.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ms-jpq/docker-time-machine/c45e47f46f60f10176c1b50f9eac78d4989311aa/preview/dog.JPG -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | cd "$(dirname "$0")" || exit 1 8 | 9 | IMAGE='msjpq/time-machine' 10 | docker build -f 'Dockerfile' -t "$IMAGE" . 11 | 12 | 13 | if [[ $# -gt 1 ]] 14 | then 15 | docker push "$IMAGE" 16 | fi 17 | -------------------------------------------------------------------------------- /root/etc/cont-init.d/00-envsubst.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | sub() { 8 | local envs="$1" 9 | local path="$2" 10 | local temp="$(envsubst "$envs" < "$path")" 11 | printf '%s' "$temp" > "$path" 12 | } 13 | 14 | export HOST_NAME="$(hostname)" 15 | 16 | sub '${SMB_USER},${SMB_NAME}' /etc/samba/smb.conf 17 | -------------------------------------------------------------------------------- /root/etc/cont-init.d/00-smb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | GROUP_NAME='time-machine-users' 8 | 9 | if ! getent group "$GROUP_NAME" > /dev/null 2>&1; then 10 | groupadd --non-unique --gid "$PGID" "$GROUP_NAME" 11 | fi 12 | 13 | if ! id -u "$SMB_USER" > /dev/null 2>&1; then 14 | useradd --system --non-unique --gid "$GROUP_NAME" --uid "$PUID" "$SMB_USER" 15 | fi 16 | 17 | 18 | printf '%s\n%s\n' "$SMB_PASSWORD" "$SMB_PASSWORD" | smbpasswd -s -a "$SMB_USER" 19 | 20 | 21 | chown "$SMB_USER":"$GROUP_NAME" '/share' 22 | -------------------------------------------------------------------------------- /root/etc/samba/smb.conf: -------------------------------------------------------------------------------- 1 | [global] 2 | # Basic Samba configuration 3 | server role = standalone server 4 | passdb backend = tdbsam 5 | obey pam restrictions = yes 6 | security = user 7 | printcap name = /dev/null 8 | load printers = no 9 | socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=524288 SO_SNDBUF=524288 10 | server string = Samba Server %v 11 | map to guest = bad user 12 | dns proxy = no 13 | wide links = yes 14 | follow symlinks = yes 15 | unix extensions = no 16 | acl allow execute always = yes 17 | log file = /var/log/samba/%m.log 18 | max log size = 1000 19 | 20 | # Special configuration for Apple's Time Machine 21 | fruit:model = TimeCapsule8,119 22 | fruit:advertise_fullsync = true 23 | fruit:aapl = yes 24 | fruit:time machine = yes 25 | 26 | # Sharing configs 27 | browsable = yes 28 | read only = no 29 | writable = yes 30 | durable handles = yes 31 | kernel oplocks = no 32 | kernel share modes = no 33 | posix locking = no 34 | vfs objects = catia fruit streams_xattr 35 | ea support = yes 36 | inherit acls = yes 37 | 38 | 39 | veto files = /._*/.apdisk/.AppleDouble/.DS_Store/.TemporaryItems/.Trashes/desktop.ini/ehthumbs.db/Network Trash Folder/Temporary Items/Thumbs.db/ 40 | delete veto files = yes 41 | 42 | valid users = ${SMB_USER} 43 | 44 | admin users = ${SMB_USER} 45 | 46 | 47 | [${SMB_NAME}] 48 | path = /share 49 | -------------------------------------------------------------------------------- /root/etc/services.d/avahi/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | s6-svwait /var/run/s6/services/dbus 8 | 9 | 10 | exec /usr/sbin/avahi-daemon --no-chroot 11 | -------------------------------------------------------------------------------- /root/etc/services.d/dbus/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | mkdir -p /run/dbus/ 8 | 9 | exec /usr/bin/dbus-daemon --system --nofork --nopidfile 10 | -------------------------------------------------------------------------------- /root/etc/services.d/nmbd/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | exec /usr/sbin/nmbd --foreground --no-process-group --debug-stdout 8 | -------------------------------------------------------------------------------- /root/etc/services.d/sambd/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | 7 | exec /usr/sbin/smbd --foreground --no-process-group --debug-stdout 8 | --------------------------------------------------------------------------------