🐳 zerobyte

Backup automation for self-hosters. Built on top of restic

Docker Ready 8 Services 6,791 stars
1. Pull Image docker pull rustfs/rustfs
2. 1-Click Launch Command docker run -d --name zerobyte rustfs/rustfs:latest
3. Compose Deployment docker compose up -d
app/test/integration/infra/compose.yaml
Download .yml
services:
  rustfs:
    image: rustfs/rustfs:latest
    command: ["/data"]
    environment:
      RUSTFS_ADDRESS: ":9000"
      RUSTFS_ACCESS_KEY: "rustfsadmin"
      RUSTFS_SECRET_KEY: "rustfsadmin"
      RUSTFS_CONSOLE_ENABLE: "false"
    volumes:
      - rustfs-data:/data

  rustfs-setup:
    image: minio/mc:latest
    depends_on:
      - rustfs
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        until mc alias set rustfs http://rustfs:9000 rustfsadmin rustfsadmin --api S3v4 --path on; do
          echo "Waiting for RustFS..."
          sleep 1
        done
        mc mb --ignore-existing --region us-east-1 rustfs/zerobyte-integration

  sftp:
    build:
      context: ./sftp
    environment:
      SFTP_USER: "zerobyte-sftp"
      SFTP_PASSWORD: "zerobyte-sftp-password"
      SFTP_PUBLIC_KEY_PATH: "/run/zerobyte/sftp/id_ed25519.pub"
    volumes:
      - ../artifacts/sftp/id_ed25519.pub:/run/zerobyte/sftp/id_ed25519.pub:ro
      - sftp-data:/srv/zerobyte-integration
    healthcheck:
      test: ["CMD", "ssh-keyscan", "-T", "2", "localhost"]
      interval: 1s
      timeout: 5s
      retries: 30

  sftp-legacy-rsa:
    build:
      context: ./sftp
    environment:
      SFTP_USER: "zerobyte-sftp"
      SFTP_PASSWORD: "zerobyte-sftp-password"
      SFTP_PUBLIC_KEY_PATH: "/run/zerobyte/sftp/id_ed25519.pub"
      SFTP_LEGACY_RSA_HOSTKEY: "true"
    volumes:
      - ../artifacts/sftp/id_ed25519.pub:/run/zerobyte/sftp/id_ed25519.pub:ro
      - sftp-legacy-rsa-data:/srv/zerobyte-integration
    healthcheck:
      test: ["CMD", "ssh-keyscan", "-T", "2", "-t", "rsa", "localhost"]
      interval: 1s
      timeout: 5s
      retries: 30

  webdav:
    build:
      context: ./webdav
    environment:
      WEBDAV_USER: "zerobyte-webdav"
      WEBDAV_PASSWORD: "zerobyte-webdav-password"
    healthcheck:
      test:
        [
          "CMD",
          "curl",
          "-fsS",
          "-u",
          "zerobyte-webdav:zerobyte-webdav-password",
          "http://localhost/zerobyte-integration/case-a/hello.txt",
        ]
      interval: 1s
      timeout: 5s
      retries: 30

  smb:
    build:
      context: ./smb
    environment:
      SMB_USER: "zerobyte-smb"
      SMB_PASSWORD: "zerobyte-smb-password"
      SMB_SHARE: "zerobyte-integration"
    healthcheck:
      test:
        [
          "CMD",
          "smbclient",
          "//localhost/zerobyte-integration",
          "-U",
          "zerobyte-smb%zerobyte-smb-password",
          "-c",
          "get case-a/hello.txt /tmp/zerobyte-smb-healthcheck.txt",
        ]
      interval: 1s
      timeout: 5s
      retries: 30

  nfs:
    build:
      context: ./nfs
    privileged: true
    volumes:
      - nfs-data:/srv/zerobyte-integration
    healthcheck:
      test: ["CMD", "sh", "-c", "exportfs -v | grep -q /srv/zerobyte-integration/fixtures"]
      interval: 1s
      timeout: 5s
      retries: 30

  integration:
    build:
      context: ../../../..
      dockerfile: app/test/integration/infra/Dockerfile
      args:
        BASE_IMAGE: zerobyte-integration-runtime-base:latest
    depends_on:
      rustfs-setup:
        condition: service_completed_successfully
      sftp:
        condition: service_healthy
      sftp-legacy-rsa:
        condition: service_healthy
      webdav:
        condition: service_healthy
      smb:
        condition: service_healthy
      nfs:
        condition: service_healthy
    cap_add:
      - SYS_ADMIN
    devices:
      - /dev/fuse:/dev/fuse
    volumes:
      - ../artifacts:/app/app/test/integration/artifacts
      - ../artifacts/sftp/id_ed25519:/run/zerobyte/sftp/id_ed25519:ro
    environment:
      LOG_LEVEL: "error"
      SFTP_PRIVATE_KEY_PATH: "/run/zerobyte/sftp/id_ed25519"
      SKIP_VOLUME_MOUNT_INTEGRATION_TESTS: "${SKIP_VOLUME_MOUNT_INTEGRATION_TESTS:-false}"

volumes:
  rustfs-data:
  sftp-data:
  sftp-legacy-rsa-data:
  nfs-data: