diff --git a/.devcontainer/deno.sh b/.devcontainer/deno.sh new file mode 100755 index 0000000..021b66c --- /dev/null +++ b/.devcontainer/deno.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# set error +set -e + +# Move to a tempdir +cd "$(mktemp -d)" + +# Hardcoded to deno 1.42.4 +curl -LO https://github.com/denoland/deno/releases/download/v1.42.4/deno-x86_64-unknown-linux-gnu.zip + +# Check the checksum +echo "8f769ded5ec44511ee8410c6389174e79c9d142cb4e47385d7358b552c63bdb9 deno-x86_64-unknown-linux-gnu.zip" | sha256sum -c - + +# unzip +unzip deno-x86_64-unknown-linux-gnu.zip +sudo mv deno /usr/bin/deno + +# remove everything +rm -rf -- * + +# test command +deno --version \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b3eef22 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,45 @@ +{ + "name": "Start9 App Builder", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/python:1": {}, + "ghcr.io/devcontainers-contrib/features/apt-get-packages:1": { + "packages": "build-essential,openssl,libssl-dev,libc6-dev,clang,libclang-dev,ca-certificates,curl,cargo" + } + }, + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "extensions": [ + "ms-azuretools.vscode-docker", + "ms-python.python", + "mads-hartmann.bash-ide-vscode", + "timonwong.shellcheck", + "tamasfe.even-better-toml", + "github.vscode-github-actions", + "GitHub.copilot", + "GitHub.copilot-chat", + "DavidAnson.vscode-markdownlint", + "wayou.vscode-todo-highlight" + ] + } + }, + + // Install stuff not packaged in Ubuntu + "onCreateCommand": { + "yq": "./.devcontainer/yq.sh", + "deno": "./.devcontainer/deno.sh" + }, + "postCreateCommand": { + "start9": "./.devcontainer/start9.sh" + }, + + // Add start-sdk to the PATH + "containerEnv": { + "PATH": "$HOME/.cargo/bin:$PATH" + }, + + "remoteUser": "vscode" +} diff --git a/.devcontainer/start9.sh b/.devcontainer/start9.sh new file mode 100755 index 0000000..b83fecb --- /dev/null +++ b/.devcontainer/start9.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# set error +set -e + +# move to a homedir +mkdir "$HOME/start9" && cd "$HOME/start9" && pwd + +# Start9 SDK +git clone --recursive https://github.com/Start9Labs/start-os.git --branch sdk +cd start-os/ +make sdk +start-sdk init \ No newline at end of file diff --git a/.devcontainer/yq.sh b/.devcontainer/yq.sh new file mode 100755 index 0000000..aa3b949 --- /dev/null +++ b/.devcontainer/yq.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# set error +set -e + +# Move to a tempdir +cd "$(mktemp -d)" + +# Hardcoded to yq 4.43.1 +curl -LO https://github.com/mikefarah/yq/releases/download/v4.43.1/yq_linux_amd64.tar.gz + +# Check the checksum +echo "049d1f3791cc25160a71b0bbe14a58302fb6a7e4462e07d5cbd543787a9ad815 yq_linux_amd64.tar.gz" | sha256sum -c - + +# untar +tar -xzf yq_linux_amd64.tar.gz +sudo mv yq_linux_amd64 /usr/bin/yq + +# remove everything +rm -rf -- * + +# test command +yq --version \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..9b12165 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: monthly + - package-ecosystem: "gitsubmodule" + directory: "/" + schedule: + interval: monthly + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: monthly \ No newline at end of file diff --git a/.github/workflows/buildService.yml b/.github/workflows/buildService.yml new file mode 100644 index 0000000..141163f --- /dev/null +++ b/.github/workflows/buildService.yml @@ -0,0 +1,36 @@ +name: Build Service + +on: + workflow_dispatch: + pull_request: + paths-ignore: ["*.md"] + branches: ["main", "master"] + push: + paths-ignore: ["*.md"] + branches: ["main", "master"] + +jobs: + BuildPackage: + runs-on: ubuntu-latest + steps: + - name: Prepare StartOS SDK + uses: Start9Labs/sdk@v1 + + - name: Checkout services repository + uses: actions/checkout@v4 + + - name: Build the service package + id: build + run: | + git submodule update --init --recursive + start-sdk init + make + PACKAGE_ID=$(yq -oy ".id" manifest.*) + echo "package_id=$PACKAGE_ID" >> $GITHUB_ENV + shell: bash + + - name: Upload .s9pk + uses: actions/upload-artifact@v4 + with: + name: ${{ env.package_id }}.s9pk + path: ./${{ env.package_id }}.s9pk diff --git a/.github/workflows/releaseService.yml b/.github/workflows/releaseService.yml new file mode 100644 index 0000000..125d8c2 --- /dev/null +++ b/.github/workflows/releaseService.yml @@ -0,0 +1,71 @@ +name: Release Service + +on: + push: + tags: + - 'v*.*' + +jobs: + ReleasePackage: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Prepare StartOS SDK + uses: Start9Labs/sdk@v1 + + - name: Checkout services repository + uses: actions/checkout@v4 + + - name: Build the service package + run: | + git submodule update --init --recursive + start-sdk init + make + + - name: Setting package ID and title from the manifest + id: package + run: | + echo "package_id=$(yq -oy ".id" manifest.*)" >> $GITHUB_ENV + echo "package_title=$(yq -oy ".title" manifest.*)" >> $GITHUB_ENV + shell: bash + + - name: Generate sha256 checksum + run: | + PACKAGE_ID=${{ env.package_id }} + sha256sum ${PACKAGE_ID}.s9pk > ${PACKAGE_ID}.s9pk.sha256 + shell: bash + + - name: Generate changelog + run: | + PACKAGE_ID=${{ env.package_id }} + echo "## What's Changed" > change-log.txt + yq -oy '.release-notes' manifest.* >> change-log.txt + echo "## SHA256 Hash" >> change-log.txt + echo '```' >> change-log.txt + sha256sum ${PACKAGE_ID}.s9pk >> change-log.txt + echo '```' >> change-log.txt + shell: bash + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + name: ${{ env.package_title }} ${{ github.ref_name }} + prerelease: true + body_path: change-log.txt + files: | + ./${{ env.package_id }}.s9pk + ./${{ env.package_id }}.s9pk.sha256 + + - name: Publish to Registry + env: + S9USER: ${{ secrets.S9USER }} + S9PASS: ${{ secrets.S9PASS }} + S9REGISTRY: ${{ secrets.S9REGISTRY }} + run: | + if [[ -z "$S9USER" || -z "$S9PASS" || -z "$S9REGISTRY" ]]; then + echo "Publish skipped: missing registry credentials." + else + start-sdk publish https://$S9USER:$S9PASS@$S9REGISTRY ${{ env.package_id }}.s9pk + fi \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 56fa461..e300f23 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "hello-world"] - path = hello-world - url = https://github.com/Start9Labs/hello-world +[submodule "pairdrop"] + path = pairdrop + url = https://github.com/schlagmichdoch/pairdrop diff --git a/Dockerfile b/Dockerfile index f6fe710..3644045 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,16 @@ -FROM alpine:3.17 +FROM node:lts-alpine -RUN apk update -RUN apk add --no-cache tini && \ - rm -f /var/cache/apk/* +WORKDIR /home/node/app -ARG ARCH -ADD ./hello-world/target/${ARCH}-unknown-linux-musl/release/hello-world /usr/local/bin/hello-world -RUN chmod +x /usr/local/bin/hello-world -ADD ./docker_entrypoint.sh /usr/local/bin/docker_entrypoint.sh -RUN chmod a+x /usr/local/bin/docker_entrypoint.sh +COPY ./pairdrop/package*.json ./ + +RUN npm ci + +COPY ./pairdrop . + +# environment settings +ENV NODE_ENV="production" + +EXPOSE 3000 + +ENTRYPOINT ["npm", "start"] diff --git a/LICENSE b/LICENSE index 793257b..9209783 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Start9 Labs +Copyright (c) 2024 Casa21 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index dd1dde5..b3d1020 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,6 @@ PKG_ID := $(shell yq e ".id" manifest.yaml) PKG_VERSION := $(shell yq e ".version" manifest.yaml) TS_FILES := $(shell find ./ -name \*.ts) -HELLO_WORLD_SRC := $(shell find ./hello-world/src) hello-world/Cargo.toml hello-world/Cargo.lock # delete the target of a rule if it has changed and its recipe exits with a nonzero exit status .DELETE_ON_ERROR: @@ -29,36 +28,27 @@ clean-manifest: @sed -i '' '/^[[:blank:]]*#/d' manifest.yaml @echo; echo "Comments successfully removed from manifest.yaml file."; echo -# BEGIN REBRANDING -rebranding: - @read -p "Enter new package ID name (must be a single word): " NEW_PKG_ID; \ - read -p "Enter new package title: " NEW_PKG_TITLE; \ - find . \( -name "*.md" -o -name ".gitignore" -o -name "manifest.yaml" -o -name "*Service.yml" \) -type f -not -path "./hello-world/*" -exec sed -i '' -e "s/hello-world/$$NEW_PKG_ID/g; s/Hello World/$$NEW_PKG_TITLE/g" {} +; \ - echo; echo "Rebranding complete."; echo " New package ID name is: $$NEW_PKG_ID"; \ - echo " New package title is: $$NEW_PKG_TITLE"; \ - sed -i '' -e '/^# BEGIN REBRANDING/,/^# END REBRANDING/ s/^#*/#/' Makefile - @echo; echo "Note: Rebranding code has been commented out in Makefile"; echo -# END REBRANDING - scripts/embassy.js: $(TS_FILES) deno bundle scripts/embassy.ts scripts/embassy.js arm: + # this is not a typo, when building arm, remove the x86_64 image so it doesn't get packed by start-sdk @rm -f docker-images/x86_64.tar ARCH=aarch64 $(MAKE) x86: + # this is not a typo, when building x86, remove the aarch64 image so it doesn't get packed by start-sdk @rm -f docker-images/aarch64.tar ARCH=x86_64 $(MAKE) -docker-images/aarch64.tar: Dockerfile docker_entrypoint.sh hello-world/target/aarch64-unknown-linux-musl/release/hello-world +docker-images/aarch64.tar: Dockerfile ifeq ($(ARCH),x86_64) else mkdir -p docker-images docker buildx build --tag start9/$(PKG_ID)/main:$(PKG_VERSION) --build-arg ARCH=aarch64 --platform=linux/arm64 -o type=docker,dest=docker-images/aarch64.tar . endif -docker-images/x86_64.tar: Dockerfile docker_entrypoint.sh hello-world/target/x86_64-unknown-linux-musl/release/hello-world +docker-images/x86_64.tar: Dockerfile ifeq ($(ARCH),aarch64) else mkdir -p docker-images @@ -74,9 +64,3 @@ else @echo "start-sdk: Preparing Universal Package ..." endif @start-sdk pack - -hello-world/target/aarch64-unknown-linux-musl/release/hello-world: $(HELLO_WORLD_SRC) - docker run --rm -it -v ~/.cargo/registry:/root/.cargo/registry -v "$(shell pwd)"/hello-world:/home/rust/src messense/rust-musl-cross:aarch64-musl cargo build --release - -hello-world/target/x86_64-unknown-linux-musl/release/hello-world: $(HELLO_WORLD_SRC) - docker run --rm -it -v ~/.cargo/registry:/root/.cargo/registry -v "$(shell pwd)"/hello-world:/home/rust/src messense/rust-musl-cross:x86_64-musl cargo build --release diff --git a/README.md b/README.md index 3c43e26..8345668 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ Project Logo

-# Hello World for StartOS +# PairDrop for StartOS -Hello World is a simple, minimal project that serves as a template for creating a service that runs on StartOS. This repository creates the `s9pk` package that is installed to run `hello-world` on [StartOS](https://github.com/Start9Labs/start-os/). Learn more about service packaging in the [Developer Docs](https://start9.com/latest/developer-docs/). +PairDrop: Local file sharing in your browser. Inspired by Apple's AirDrop. Fork of Snapdrop. +This repository creates the `s9pk` package that is installed to run `pairdrop` on [StartOS](https://github.com/Start9Labs/start-os/). ## Dependencies @@ -18,75 +19,95 @@ Install the system dependencies below to build this project by following the ins - [start-sdk](https://github.com/Start9Labs/start-os/tree/sdk/) ## Build environment + Prepare your StartOS build environment. In this example we are using Ubuntu 20.04. + 1. Install docker -``` -curl -fsSL https://get.docker.com | bash -sudo usermod -aG docker "$USER" -exec sudo su -l $USER -``` + + ```bash + curl -fsSL https://get.docker.com | bash + sudo usermod -aG docker "$USER" + exec sudo su -l $USER + ``` + 2. Set buildx as the default builder -``` -docker buildx install -docker buildx create --use -``` + + ```bash + docker buildx install + docker buildx create --use + ``` + 3. Enable cross-arch emulated builds in docker -``` -docker run --privileged --rm linuxkit/binfmt:v0.8 -``` + + ```bash + docker run --privileged --rm linuxkit/binfmt:v0.8 + ``` + 4. Install yq -``` -sudo snap install yq -``` + + ```bash + sudo snap install yq + ``` + 5. Install deno -``` -sudo snap install deno -``` + + ```bash + sudo snap install deno + ``` + 6. Install essentials build packages -``` -sudo apt-get install -y build-essential openssl libssl-dev libc6-dev clang libclang-dev ca-certificates -``` + + ```bash + sudo apt-get install -y build-essential openssl libssl-dev libc6-dev clang libclang-dev ca-certificates + ``` + 7. Install Rust -``` -curl https://sh.rustup.rs -sSf | sh -# Choose nr 1 (default install) -source $HOME/.cargo/env -``` + + ```bash + curl https://sh.rustup.rs -sSf | sh + # Choose nr 1 (default install) + source $HOME/.cargo/env + ``` + 8. Build and install start-sdk -``` -cd ~/ && git clone --recursive https://github.com/Start9Labs/start-os.git --branch sdk -cd start-os/ -make sdk -start-sdk init -``` -Now you are ready to build the `hello-world` package! + + ```bash + cd ~/ && git clone --recursive https://github.com/Start9Labs/start-os.git --branch sdk + cd start-os/ + make sdk + start-sdk init + ``` + +Now you are ready to build the `pairdrop` package! ## Cloning Clone the project locally: -``` -git clone https://github.com/Start9Labs/hello-world-startos.git -cd hello-world-startos -git submodule update --init --recursive -``` + ```bash + git clone https://github.com/CasaVinteUM/pairdrop-startos.git + cd pairdrop-startos + git submodule update --init --recursive + ``` ## Building -To build the `hello-world` package for all platforms using start-sdk, run the following command: +To build the `pairdrop` package for all platforms using start-sdk, run the following command: -``` +```bash make ``` -To build the `hello-world` package for a single platform using start-sdk, run: +To build the `pairdrop` package for a single platform using start-sdk, run: -``` +```bash # for amd64 make x86 ``` + or -``` + +```bash # for arm64 make arm ``` @@ -94,24 +115,25 @@ make arm ## Installing (on StartOS) Run the following commands to determine successful install: + > :information_source: Change server-name.local to your Start9 server address -``` +```bash start-cli auth login # Enter your StartOS password -start-cli --host https://server-name.local package install hello-world.s9pk +start-cli --host https://server-name.local package install pairdrop.s9pk ``` If you already have your `start-cli` config file setup with a default `host`, you can install simply by running: -``` +```bash make install ``` -> **Tip:** You can also install the hello-world.s9pk using **Sideload Service** under the **System > Manage** section. +> **Tip:** You can also install the `pairdrop.s9pk` using **Sideload Service** under the **System > Manage** section. ### Verify Install -Go to your StartOS Services page, select **Hello World**, configure and start the service. Then, verify its interfaces are accessible. +Go to your StartOS Services page, select **Pairdrop**, configure and start the service. Then, verify its interfaces are accessible. -**Done!** +**Done!** diff --git a/docker_entrypoint.sh b/docker_entrypoint.sh deleted file mode 100755 index aab61f3..0000000 --- a/docker_entrypoint.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exec tini hello-world diff --git a/hello-world b/hello-world deleted file mode 160000 index 48ce8a5..0000000 --- a/hello-world +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 48ce8a519b14eb6c32d770af66656e04a7866228 diff --git a/icon.png b/icon.png index 15d4ec4..38f2554 100644 Binary files a/icon.png and b/icon.png differ diff --git a/instructions.md b/instructions.md index c636962..5b68fb8 100644 --- a/instructions.md +++ b/instructions.md @@ -1,5 +1,3 @@ -# Instructions for Hello World +# Instructions for PairDrop -Instructions go here. These appear to the user in the UI on the Service page under **Instructions**. - -You are allowed to include basic [Markdown formatting](https://www.markdownguide.org/basic-syntax). +Have fun! diff --git a/manifest.yaml b/manifest.yaml index 7f35c6a..317673e 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -1,127 +1,66 @@ # Example written in yaml (toml and json are also acceptable) -# The package identifier used by the OS. This must be unique amongst all other known packages -id: hello-world - # A human readable service title -title: "Hello World" -# Service version - accepts up to four digits, where the last confirms to revisions necessary for StartOS - see documentation: https://github.com/Start9Labs/emver-rs. This value will change with each release of the service. +id: pairdrop +title: "PairDrop" version: 1.0.0.1 -# Release notes for the update - can be a string, paragraph or URL -release-notes: "Revamped for EmabssyOS 0.3.3" -# The type of license for the project. Include the LICENSE in the root of the project directory. A license is required for a Start9 package. -license: mit -# The Start9 wrapper repository URL for the package. This repo contains the manifest file (this), any scripts necessary for configuration, backups, actions, or health checks (more below). This key must exist. But could be embedded into the source repository. -wrapper-repo: "https://github.com/Start9Labs/hello-world-wrapper" -# The original project repository URL. There is no upstream repo in this example -upstream-repo: "https://github.com/Start9Labs/hello-world" -# URL to the support site / channel for the project. This key can be omitted if none exists, or it can link to the original project repository issues. -support-site: "https://docs.start9.com/" -# URL to the marketing site for the project. This key can be omitted if none exists, or it can link to the original project repository. -marketing-site: "https://start9.com/" -# The series of commands to build the project into an s9pk for arm64/v8. In this case we are using a Makefile with the simple build command "make". +release-notes: "Revamped for EmbassyOS 0.3.3" +license: MIT +wrapper-repo: "https://github.com/CasaVinteUm/pairdrop-startos" +upstream-repo: "https://github.com/schlagmichdoch/pairdrop" +support-site: "https://github.com/schlagmichdoch/pairdrop" +marketing-site: "https://pairdrop.net/" build: ["make"] -# Human readable descriptors for the service. These are used throughout the StartOS user interface, primarily in the marketplace. description: - # This is the first description visible to the user in the marketplace. - short: Example service - # This description will display with additional details in the service's individual marketplace page + short: PairDrop long: | - Hello World is a bare-bones service that launches a web interface to say "Hello World", and nothing more. -# These assets are static files necessary for packaging the service for Start9 (into an s9pk). Each value is a path to the specified asset. If an asset is missing from this list, or otherwise denoted, it will be defaulted to the values denoted below. + Local file sharing in your browser. Inspired by Apple's AirDrop. Fork of Snapdrop. assets: - # Default = LICENSE.md license: LICENSE - # Default = icon.png (.svg allowed) icon: icon.png - # Default = INSTRUCTIONS.md instructions: instructions.md - # Default = image.tar - # docker-images: image.tar -# ----- This section commented out until we support long-running containers ----- -# The main action for initializing the service. This can be script to utilize the eOS scripting apis, or docker. -# main: -# type: script -# # Defines the containers needed to run the main and mounted volumes -# containers: -# main: -# # Identifier for the main image volume, which will be used when other actions need to mount to this volume. -# image: main -# # Specifies where to mount the data volume(s), if there are any. Mounts for pointer dependency volumes are also denoted here. These are necessary if data needs to be read from / written to these volumes. -# mounts: -# # Specifies where on the service's file system its persistence directory should be mounted prior to service startup -# main: /root -# ----- END commented section ----- main: - # Docker is currently the only action implementation type: docker - # Identifier for the main image volume, which will be used when other actions need to mount to this volume. image: main - # The executable binary for starting the initialization action. For docker actions, this is typically a "docker_entrypoint.sh" file. See the Dockerfile and the docker_entrypoint.sh in this project for additional details. - entrypoint: "docker_entrypoint.sh" - # Any arguments that should be passed into the entrypoint executable - args: [] - # Specifies where to mount the data volume(s), if there are any. Mounts for pointer dependency volumes are also denoted here. These are necessary if data needs to be read from / written to these volumes. + entrypoint: npm + args: ["run", "start:prod"] mounts: - # Specifies where on the service's file system its persistence directory should be mounted prior to service startup main: /root -# This is where health checks would be defined - see a more advanced example in https://github.com/Start9Labs/start-pages-wrapper health-checks: {} config: ~ properties: ~ -# type: script -# This denotes any data, asset, or pointer volumes that should be connected when the "docker run" command is invoked volumes: - # This is the image where files from the project asset directory will go main: type: data -# This specifies how to configure the port mapping for exposing the service over TOR and LAN (if applicable). Many interfaces can be specified depending on the needs of the service. If it can be launched over a Local Area Network connection, specify a `lan-config`. Otherwise, at minimum, a `tor-config` must be specified. interfaces: - # This key is the internal name that the OS will use to configure the interface main: - # A human readable name for display in the UI name: User Interface - # A descriptive description of what the interface does - description: A simple user interface that is expected to display the text "Hello Word" + description: PairDrop User Interface tor-config: - # Port mappings are from the external port to the internal container port port-mapping: - 80: "80" - # Port mappings are from the external port to the internal container port + 80: "3000" lan-config: 443: ssl: true - internal: 80 - # Denotes if the service has a user interface to display + internal: 3000 ui: true - # Denotes the protocol specifications used by this interface protocols: - tcp - http dependencies: {} -# Specifies how backups should be run for this service. The default StartOS provided option is to use the duplicity backup library on a system image (compat) backup: create: - # Currently, only docker actions are supported. type: docker - # The docker image to use. In this case, a pre-loaded system image called compat image: compat - # Required if the action uses a system image. The default value is false. system: true - # The executable to run the command to begin the backup create process entrypoint: compat - # Arguments to pass into the entrypoint executable. In this example, the full command run will be: `compat duplicity hello-world /mnt/backup /root/data` args: - duplicity - create - /mnt/backup - # For duplicity, the backup mount point needs to be something other than `/root`, so we default to `/root/data` - /root/data mounts: - # BACKUP is the default volume that is used for backups. This is whatever backup drive is mounted to the device, or a network filesystem. - # The value here donates where the mount point will be. The backup drive is mounted to this location. BACKUP: "/mnt/backup" main: "/root/data" - # The action to execute the backup restore functionality. Details for the keys below are the same as above. restore: type: docker image: compat diff --git a/pairdrop b/pairdrop new file mode 160000 index 0000000..488762b --- /dev/null +++ b/pairdrop @@ -0,0 +1 @@ +Subproject commit 488762bbce23630a277e781f27ae4dcdf57ba88e