Merge branch 'main' into sb/storj-bump
This commit is contained in:
11
.github/workflows/build-docker-images.yml
vendored
11
.github/workflows/build-docker-images.yml
vendored
@ -34,9 +34,11 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
TAGS="--tag ${DOCKER_IMAGE}:${VERSION}"
|
TAGS="--tag ${DOCKER_IMAGE}:${VERSION}"
|
||||||
|
TAGS_NOROOT="--tag ${DOCKER_IMAGE}:${VERSION}-noroot"
|
||||||
|
|
||||||
if [ $VERSION = edge -o $VERSION = nightly ]; then
|
if [ $VERSION = edge -o $VERSION = nightly ]; then
|
||||||
TAGS="$TAGS --tag ${DOCKER_IMAGE}:latest"
|
TAGS="$TAGS --tag ${DOCKER_IMAGE}:latest"
|
||||||
|
TAGS_NOROOT="$TAGS_NOROOT --tag ${DOCKER_IMAGE}:latest-noroot"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
||||||
@ -46,6 +48,12 @@ jobs:
|
|||||||
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
|
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
|
||||||
--build-arg VCS_REF=${GITHUB_SHA::8} \
|
--build-arg VCS_REF=${GITHUB_SHA::8} \
|
||||||
${TAGS} .
|
${TAGS} .
|
||||||
|
echo ::set-output name=buildx_args_noroot::--platform ${DOCKER_PLATFORMS} \
|
||||||
|
--build-arg VERSION=${VERSION} \
|
||||||
|
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
|
||||||
|
--build-arg VCS_REF=${GITHUB_SHA::8} \
|
||||||
|
--build-arg RUNAS=noroot \
|
||||||
|
${TAGS_NOROOT} .
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1
|
||||||
@ -64,6 +72,7 @@ jobs:
|
|||||||
name: Docker Buildx (build)
|
name: Docker Buildx (build)
|
||||||
run: |
|
run: |
|
||||||
docker buildx build --no-cache --pull --output "type=image,push=false" ${{ steps.prepare.outputs.buildx_args }}
|
docker buildx build --no-cache --pull --output "type=image,push=false" ${{ steps.prepare.outputs.buildx_args }}
|
||||||
|
docker buildx build --output "type=image,push=false" ${{ steps.prepare.outputs.buildx_args_noroot }}
|
||||||
-
|
-
|
||||||
name: Docker Login
|
name: Docker Login
|
||||||
if: success() && github.event_name != 'pull_request'
|
if: success() && github.event_name != 'pull_request'
|
||||||
@ -77,11 +86,13 @@ jobs:
|
|||||||
if: success() && github.event_name != 'pull_request'
|
if: success() && github.event_name != 'pull_request'
|
||||||
run: |
|
run: |
|
||||||
docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }}
|
docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }}
|
||||||
|
docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args_noroot }}
|
||||||
-
|
-
|
||||||
name: Docker Check Manifest
|
name: Docker Check Manifest
|
||||||
if: always() && github.event_name != 'pull_request'
|
if: always() && github.event_name != 'pull_request'
|
||||||
run: |
|
run: |
|
||||||
docker run --rm mplatform/mquery ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.version }}
|
docker run --rm mplatform/mquery ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.version }}
|
||||||
|
docker run --rm mplatform/mquery ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.version }}-noroot
|
||||||
-
|
-
|
||||||
name: Clear
|
name: Clear
|
||||||
if: always() && github.event_name != 'pull_request'
|
if: always() && github.event_name != 'pull_request'
|
||||||
|
17
Dockerfile
17
Dockerfile
@ -14,12 +14,27 @@ ENV GO111MODULE=on
|
|||||||
# build & install server
|
# build & install server
|
||||||
RUN CGO_ENABLED=0 go build -tags netgo -ldflags "-X github.com/dutchcoders/transfer.sh/cmd.Version=$(git describe --tags) -a -s -w -extldflags '-static'" -o /go/bin/transfersh
|
RUN CGO_ENABLED=0 go build -tags netgo -ldflags "-X github.com/dutchcoders/transfer.sh/cmd.Version=$(git describe --tags) -a -s -w -extldflags '-static'" -o /go/bin/transfersh
|
||||||
|
|
||||||
|
ARG PUID=5000 \
|
||||||
|
PGID=5000 \
|
||||||
|
RUNAS
|
||||||
|
|
||||||
|
RUN mkdir -p /tmp/useradd && \
|
||||||
|
if [ ! -z "$RUNAS" ]; then \
|
||||||
|
echo "${RUNAS}:x:${PUID}:${PGID}::/nonexistent:/sbin/nologin" >> /tmp/useradd/passwd && \
|
||||||
|
echo "${RUNAS}:!:::::::" >> /tmp/useradd/shadow && \
|
||||||
|
echo "${RUNAS}:x:${PGID}:" >> /tmp/useradd/group && \
|
||||||
|
echo "${RUNAS}:!::" >> /tmp/useradd/groupshadow; else touch /tmp/useradd/unused; fi
|
||||||
|
|
||||||
FROM scratch AS final
|
FROM scratch AS final
|
||||||
LABEL maintainer="Andrea Spacca <andrea.spacca@gmail.com>"
|
LABEL maintainer="Andrea Spacca <andrea.spacca@gmail.com>"
|
||||||
|
ARG RUNAS
|
||||||
|
|
||||||
COPY --from=build /go/bin/transfersh /go/bin/transfersh
|
COPY --from=build /tmp/useradd/* /etc/
|
||||||
|
COPY --from=build --chown=${RUNAS} /go/bin/transfersh /go/bin/transfersh
|
||||||
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
|
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
|
||||||
|
|
||||||
|
USER ${RUNAS}
|
||||||
|
|
||||||
ENTRYPOINT ["/go/bin/transfersh", "--listener", ":8080"]
|
ENTRYPOINT ["/go/bin/transfersh", "--listener", ":8080"]
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
56
README.md
56
README.md
@ -140,12 +140,31 @@ $ go build -o transfersh main.go
|
|||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
For easy deployment, we've created a Docker container.
|
For easy deployment, we've created an official Docker container. There are two variants, differing only by which user runs the process.
|
||||||
|
|
||||||
|
The default one will run as `root`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
|
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The one tagged with the suffix `-noroot` will use `5000` as both UID and GID:
|
||||||
|
```bash
|
||||||
|
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the Container
|
||||||
|
You can also build the container yourself. This allows you to choose which UID/GID will be used, e.g. when using NFS mounts:
|
||||||
|
```bash
|
||||||
|
# Build arguments:
|
||||||
|
# * RUNAS: If empty, the container will run as root.
|
||||||
|
# Set this to anything to enable UID/GID selection.
|
||||||
|
# * PUID: UID of the process. Needs RUNAS != "". Defaults to 5000.
|
||||||
|
# * PGID: GID of the process. Needs RUNAS != "". Defaults to 5000.
|
||||||
|
|
||||||
|
docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .
|
||||||
|
```
|
||||||
|
|
||||||
## S3 Usage
|
## S3 Usage
|
||||||
|
|
||||||
For the usage with a AWS S3 Bucket, you just need to specify the following options:
|
For the usage with a AWS S3 Bucket, you just need to specify the following options:
|
||||||
@ -204,6 +223,41 @@ You need to create an OAuth Client id from console.cloud.google.com, download th
|
|||||||
|
|
||||||
```go run main.go --provider gdrive --basedir /tmp/ --gdrive-client-json-filepath /[credential_dir] --gdrive-local-config-path [directory_to_save_config] ```
|
```go run main.go --provider gdrive --basedir /tmp/ --gdrive-client-json-filepath /[credential_dir] --gdrive-local-config-path [directory_to_save_config] ```
|
||||||
|
|
||||||
|
## Shell functions
|
||||||
|
|
||||||
|
### Bash and zsh (multiple files uploaded as zip archive)
|
||||||
|
##### Add this to .bashrc or .zshrc or its equivalent
|
||||||
|
```bash
|
||||||
|
transfer(){ if [ $# -eq 0 ];then echo "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>">&2;return 1;fi;if tty -s;then file="$1";file_name=$(basename "$file");if [ ! -e "$file" ];then echo "$file: No such file or directory">&2;return 1;fi;if [ -d "$file" ];then file_name="$file_name.zip" ,;(cd "$file"&&zip -r -q - .)|curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name"|tee /dev/null,;else cat "$file"|curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name"|tee /dev/null;fi;else file_name=$1;curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name"|tee /dev/null;fi;}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Now you can use transfer function
|
||||||
|
```
|
||||||
|
$ transfer hello.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Zsh (with delete url outpu)
|
||||||
|
##### Add this to .zshrc or its equivalent
|
||||||
|
```bash
|
||||||
|
transfer()
|
||||||
|
{
|
||||||
|
local file="${1}"
|
||||||
|
local filename="${file##*/}"
|
||||||
|
# show delete link from the response header after upload. the command "sed" is necessary to clean up the output, "gsub()" in "awk" does not work.
|
||||||
|
curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/${filename}" | sed "s/#//g" | awk '/x-url-delete/ { print "Delete command: curl --request DELETE " $2 } END{ print "Download link: " $1 }'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Sample ouput
|
||||||
|
```bash
|
||||||
|
$ transfer image.img
|
||||||
|
######################################################################################################################################################################################################################################## 100.0%
|
||||||
|
Delete command: curl --request DELETE https://transfer.sh/Ge9cuW/image.img/<some_delete_token>
|
||||||
|
Download link: https://transfer.sh/Ge9cuW/image.img
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
Contributions are welcome.
|
Contributions are welcome.
|
||||||
|
Reference in New Issue
Block a user