diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d9f9960..6b64095 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,40 +1,65 @@
image: docker:latest
services:
-- docker:dind
+ - docker:dind
stages:
-- build_publish
+ - build
+ - test
+ - publish
before_script:
-- apk add bash
+ - apk add bash git
+ - /bin/bash .utilities/check.sh
-cron_or_supervisord:
- stage: build_publish
- script:
- - /bin/bash utils/publish/feature--cron-or-supervisord.sh
+build.tags:
+ stage: build
+ script: /bin/bash -e .utilities/build.tags.sh
only:
- - feature--cron-or-supervisord
+ - tags
+ artifacts:
+ paths:
+ - $CI_PROJECT_NAME.tar
-staging:
- stage: build_publish
- script:
- - /bin/bash utils/publish/staging.sh
+build.schedules:
+ stage: build
+ script: /bin/bash -e .utilities/build.schedules.sh
only:
- - staging
+ - schedules
+ artifacts:
+ paths:
+ - $CI_PROJECT_NAME.tar
-production:
- stage: build_publish
- script:
- - /bin/bash utils/publish/production.sh
+test:
+ stage: test
+ script: /bin/bash -e .utilities/test.sh
only:
- - tags
- except:
- - branches
+ - tags
+ - schedules
+ artifacts:
+ paths:
+ - $CI_PROJECT_NAME.tar
+
+publish.tags:
+ stage: publish
+ script: /bin/bash -e .utilities/publish.tags.sh
+ only:
+ - tags
+ artifacts:
+ paths:
+ - $CI_PROJECT_NAME.tar
+
+publish.schedules:
+ stage: publish
+ script: /bin/bash -e .utilities/publish.schedules.sh
+ only:
+ - schedules
+ artifacts:
+ paths:
+ - $CI_PROJECT_NAME.tar
update_docker_hub_full_description:
- stage: build_publish
- script:
- - /bin/bash utils/publish/update-docker-hub-full-description.sh
+ stage: publish
+ script: /bin/bash -e .utilities/update-docker-hub-full-description.sh
only:
- - master
\ No newline at end of file
+ - master
diff --git a/assets/cron/seafile-entrypoint.sh b/.utilities/build.schedules.sh
similarity index 54%
rename from assets/cron/seafile-entrypoint.sh
rename to .utilities/build.schedules.sh
index 2a2baec..ef75070 100644
--- a/assets/cron/seafile-entrypoint.sh
+++ b/.utilities/build.schedules.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,20 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Define variable shortcuts for readability purposes.
-seafile_ini=~/.ccnet/seafile.ini
-seafile_sock=~/.seafile/seafile-data/seafile.sock
+# Hard reset to the latest tag.
+latest_version=$(git describe --abbrev=0)
+git reset --hard $latest_version
-# Prepare the directories.
-mkdir ~/.seafile
+cp -R tests seafile-client/
+cd seafile-client/
-# Safely initialise the Seafile client.
-/usr/bin/seaf-cli init -d ~/.seafile
-while [ ! -f $seafile_ini ]; do sleep 1; done
+docker build \
+ --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
+ --build-arg VCS_REF=$(git rev-parse --short HEAD) \
+ --build-arg VERSION=$latest_version \
+ --tag $CI_PROJECT_NAME:build .
-# Safely start the Seafile daemon.
-/usr/bin/seaf-cli start
-while [ ! -S $seafile_sock ]; do sleep 1; done
-
-# Start the synchronisation.
-/usr/bin/seaf-cli sync -u $SEAF_USERNAME -p $SEAF_PASSWORD -s $SEAF_SERVER_URL -l $SEAF_LIBRARY_UUID -d /volume
\ No newline at end of file
+docker save --output ../$CI_PROJECT_NAME.tar $CI_PROJECT_NAME:build
diff --git a/assets/supervisord/supervisord.conf b/.utilities/build.tags.sh
similarity index 64%
rename from assets/supervisord/supervisord.conf
rename to .utilities/build.tags.sh
index 2139015..2812b0b 100644
--- a/assets/supervisord/supervisord.conf
+++ b/.utilities/build.tags.sh
@@ -1,5 +1,7 @@
+#!/bin/bash
+
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,17 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Run in the foreground to keep the container running.
-[supervisord]
-nodaemon=true
+cp -R tests seafile-client/
+cd seafile-client/
-# Manage the Seafile daemon.
-[unix_http_socket]
-file=~/.seafile/seafile-data/seafile.sock
+docker build \
+ --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
+ --build-arg VCS_REF=$(git rev-parse --short HEAD) \
+ --build-arg VERSION=$latest_version \
+ --tag $CI_PROJECT_NAME:build .
-# Manage the infinite `seaf-cli start`.
-[program:seaf-cli-start-loop]
-command=/bin/bash /home/seafuser/seafile-healthcheck.sh
-process_name=%(program_name)s
-numprocs=1
-autostart=true
+docker save --output ../$CI_PROJECT_NAME.tar $CI_PROJECT_NAME:build
diff --git a/.utilities/check.sh b/.utilities/check.sh
new file mode 100644
index 0000000..9160cb0
--- /dev/null
+++ b/.utilities/check.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+# Check the CI pipeline sources.
+if ! [[ "$CI_PIPELINE_SOURCE" == "push" || "$CI_PIPELINE_SOURCE" == "schedule" ]]; then
+ echo "CI pipelines are only allowed from the push and schedule sources"
+ exit 1
+fi
+
+# Check the schedule target for the scheduled CI pipelines.
+if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]]; then
+ if [[ -z "$SCHEDULE_TARGET" ]]; then
+ echo "\$SCHELUDE_TARGET was not provided."
+ exit 1
+ fi
+
+ if ! [[ "$SCHEDULE_TARGET" == "weekly" ]]; then
+ echo "\$SCHEDULE_TARGET $SCHEDULE_TARGET is not known."
+ exit 1
+ fi
+fi
+
+# Check the tag is properly defined on job other than update_docker_hub_full_description job,
+# on pushed CI pipelines.
+if [[ "$CI_PIPELINE_SOURCE" == "push" ]]; then
+ if ! [[ "$CI_JOB_NAME" == "update_docker_hub_full_description" ]]; then
+ if [[ -z "$CI_COMMIT_TAG" && "$CI_COMMIT_TAG" =~ ^[0-9]+[.][0-9]+[.][0-9]+$ ]]
+ echo "The \$CI_COMMIT_TAG $CI_COMMIT_TAG does not match the MAJOR.Minor.revision layout."
+ exit 1
+ fi
+ fi
+fi
diff --git a/.utilities/publish.schedules.sh b/.utilities/publish.schedules.sh
new file mode 100644
index 0000000..af9f7e0
--- /dev/null
+++ b/.utilities/publish.schedules.sh
@@ -0,0 +1,34 @@
+# !/bin/bash
+
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+SCRIPT_DIRECTORY=$(dirname ${BASH_SOURCE[0]})
+source $SCRIPT_DIRECTORY/utilities.sh
+load_images_artifacts
+
+tags=("latest")
+for version_component in "$(git describe --abbrev=0 | tr '.' '\n')"; do
+ tag+="$version_component"
+ tags+=("$tag")
+ tag+="."
+done
+
+echo $CI_REGISTRY_BOT_PASSWORD | docker login --password-stdin --username $CI_REGISTRY_BOT_USERNAME
+for tag in "${tags[@]}"; do
+ docker tag $CI_PROJECT_NAME:$tag $CI_REGISTRY_IMAGE:build
+ docker push $CI_REGISTRY_IMAGE:$tag
+done
diff --git a/.utilities/publish.tags.sh b/.utilities/publish.tags.sh
new file mode 100644
index 0000000..2287429
--- /dev/null
+++ b/.utilities/publish.tags.sh
@@ -0,0 +1,34 @@
+# !/bin/bash
+
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+SCRIPT_DIRECTORY=$(dirname ${BASH_SOURCE[0]})
+source $SCRIPT_DIRECTORY/utilities.sh
+load_images_artifacts
+
+tags=("latest")
+for version_component in "$CI_COMMIT_TAG"; do
+ tag+="$version_component"
+ tags+=("$tag")
+ tag+="."
+done
+
+echo $CI_REGISTRY_BOT_PASSWORD | docker login --password-stdin --username $CI_REGISTRY_BOT_USERNAME
+for tag in "${tags[@]}"; do
+ docker tag $CI_PROJECT_NAME:$tag $CI_REGISTRY_IMAGE:build
+ docker push $CI_REGISTRY_IMAGE:$tag
+done
diff --git a/.utilities/test.sh b/.utilities/test.sh
new file mode 100644
index 0000000..a110ab5
--- /dev/null
+++ b/.utilities/test.sh
@@ -0,0 +1,26 @@
+# !/bin/bash
+
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+SCRIPT_DIRECTORY=$(dirname ${BASH_SOURCE[0]})
+source $SCRIPT_DIRECTORY/utilities.sh
+load_images_artifacts
+
+docker run \
+ --interactive \
+ --attach stderr \
+ $CI_PROJECT_NAME:build /tests/test_binaries.sh
diff --git a/utils/publish/update-docker-hub-full-description.sh b/.utilities/update-docker-hub-full-description.sh
similarity index 97%
rename from utils/publish/update-docker-hub-full-description.sh
rename to .utilities/update-docker-hub-full-description.sh
index 670eb53..ac772b2 100644
--- a/utils/publish/update-docker-hub-full-description.sh
+++ b/.utilities/update-docker-hub-full-description.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/.utilities/utilities.sh b/.utilities/utilities.sh
new file mode 100644
index 0000000..b115d67
--- /dev/null
+++ b/.utilities/utilities.sh
@@ -0,0 +1,21 @@
+# !/bin/bash
+
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+load_images_artifacts() {
+ docker load --input $CI_PROJECT_NAME.tar
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d4a41e..3e4c7eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,40 +1,50 @@
-### [1.2.1] - 2019/05/02
+# __[2.0.0](https://gitlab.com/flwgns-docker/seafile-client/-/tags/2.0.0)__ | _2020/01/06_
+- Support 2FA authentication through `oathtool` using the secret key
+- Support for upload/download limits
+- Support for Seafile library password
+- Allow skipping SSL certificates verifications
+- Drop Bash/supervisord/cron implementations in favor of showing seafile's log
+- Implement basic integration tests that check expected binairies
+- Improve continuous integration though splitted jobs
+- Revise README
+- Change the volume path from /volume to /library for consistency
+
+### __[1.2.1](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.2.1)__ | _2019/12/29_
- Fix #4:
- Switch base image from Debian oldoldstable Jessie to Debian stable Buster to fix unmet dependencies of `seafile-cli` to `python-future` and `python-searpc`
- Replace `;` with `&&` as commands separators in the Dockerfile's `RUN` to properly report failed commands at CI
-
-## [1.2.0] - 2019/05/02
+## __[1.2.0](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.2.0)__ | _2019/05/02_
- Replace _supervisord_ with _cron_ for running the front job that keeps the container up. It uses less resources.
- Improve the __infinite-seaf-cli-start.sh__ into __seafile-healthcheck.sh__. The Seafile daemon will not be restarted if it's state are either _downloading_ or _committing_, which otherwise is problematic.
-### [1.1.2] - 2019/04/18
+### __[1.1.2](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.1.2)__ | _2019/04/18_
- Slim down the Docker image, from 102MB to 67MB, gaining 35MB, reducing size by 34%.
-### [1.1.1] - 2019/04/18
+### __[1.1.1](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.1.1)__ | _2019/04/18_
- Because of the infinite-seaf-cli-start loop, within the container was running many seaf-daemons. Now, the infinite loop stop the current seaf-daemon before starting it again. (see #3)
-## [1.1.0] - 2019/04/09
+## __[1.1.0](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.1.0)__ | _2019/04/09_
- The container now actually use the UID/GID provided to it:
The container entrypoint is run with root, then another entrypoint is run by the container's user, seafuser, to run the Seafile client.
-### [1.0.6] - 2019/03/25
+### __[1.0.6](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.6)__ | _2019/03/25_
- More minor fixes from v1.0.4
-### [1.0.5] - 2019/03/25
+### __[1.0.5](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.5)__ | _2019/03/25_
- Minor fixes from v1.0.4
-### [1.0.4] - 2019/03/25
+### __[1.0.4](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.4)__ | _2019/03/25_
- Fix the build target detection (@a52559ddb38a64d7fceaa8bf9b8afd7356ccc439)
- Login to the Docker Hub from within the script, not the gitlab-ci.yml, using (@72bab017c1167b8ab35cef3cc709ff83686eaca4, @f69483354a4cf8afdbea89ef2bb1d9a9b7b2ac10)
- Require Bash on all Gitlab CI stages (@72bab017c1167b8ab35cef3cc709ff83686eaca4)
- Add a script to push the README.md into the Docker Hub repository's full_description (@8cb49cbc8253368701d718c2e38017790c78ceca, @ca6128fb96602da71f3b7a560e834d1b7587abac)
-### [1.0.3] - 2019/03/19
+### __[1.0.3](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.3)__ | _2019/03/19_
- Restrict staging pipelines to pushed pipelines
- Restrict production pipelines to pushed and triggered pipelines
- Require a build target on triggered production pipelines
-### [1.0.2] - 2019/03/18
+### __[1.0.2](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.2)__ | _2019/03/18_
- Fix a minor issue when testing for requested production build.
-### [1.0.1] - 2019/03/18
+### __[1.0.1](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.1)__ | _2019/03/18_
- Add failsafe when importing Seafile's APT-key
- Restrict production build to latest, majors, minors and revisions version, on-demand.
-# [1.0.0] - 2019/03/15
+# __[1.0.0](https://gitlab.com/flwgns-docker/seafile-client/-/tags/1.0.0)__ | _2019/03/15_
- Release to Docker Hub
-# [0.9.2] - 2019/03/15
+### __[0.9.2](https://gitlab.com/flwgns-docker/seafile-client/-/tags/0.9.2)__ | _2019/03/15_
- Test release on GitLab, before Docker Hub
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index ff1b902..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,66 +0,0 @@
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-FROM debian:buster-slim
-
-# Prevent the packages installation to halt.
-ENV DEBIAN_FRONTEND noninteractive
-# Create the seafile client user.
-ENV UNAME=seafuser
-ENV UID=1000
-ENV GID=1000
-
-# Copy over the Docker related files.
-COPY utils/build/import-seafile-apt-key.sh /
-COPY assets/cron/docker-entrypoint.sh /entrypoint.sh
-
-# Safely import Seafile APT key, then install both seafile-cli and supervisord.
-RUN mkdir -p /etc/apt/sources.list.d/ && \
- apt-get update && \
- apt-get install -y gnupg && \
- echo "deb http://deb.seadrive.org buster main" \
- > /etc/apt/sources.list.d/seafile.list && \
- bash /import-seafile-apt-key.sh && \
- apt-get remove -y gnupg && \
- apt-get autoremove -y && \
- apt-get update && \
- apt-get install \
- -o Dpkg::Options::="--force-confold" \
- -y \
- seafile-cli \
- cron && \
- apt-get clean && \
- apt-get autoclean \
- -o APT::Clean-Installed=true && \
- rm \
- -rf \
- /var/log/fsck/*.log \
- /var/log/apt/*.log \
- /var/cache/debconf/*.dat-old \
- /var/lib/apt/lists/* \
- /import-seafile-apt-key.sh && \
- mkdir /volume/ && \
- echo "seafuser" > /etc/cron.allow && \
- echo "*/20 * * * * /bin/bash /home/seafuser/seafile-healthcheck.sh" \
- > /var/spool/cron/crontabs/seafuser && \
- groupadd -g $GID -o $UNAME && \
- useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
-
-# Copy over the required files for Seafile/SupervisorD.
-COPY assets/cron/seafile-healthcheck.sh /home/seafuser/seafile-healthcheck.sh
-COPY assets/cron/seafile-entrypoint.sh /home/seafuser/entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
diff --git a/Dockerfile b/Dockerfile
new file mode 120000
index 0000000..842615a
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1 @@
+assets/cron/Dockerfile
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
index 648524f..23dc218 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
- Copyright (C) 2019 flow.gunso@gmail.com
+ Copyright (C) 2019-2020 flow.gunso@gmail.com
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
diff --git a/README.md b/README.md
index 936f259..1c90d04 100644
--- a/README.md
+++ b/README.md
@@ -1,98 +1,97 @@
-[](https://gitlab.com/flwgns-docker/seafile-client/commits/1.2.1)
+[](https://gitlab.com/flwgns-docker/seafile-client/commits/2.0.0)
[](https://hub.docker.com/r/flowgunso/seafile-client)
[](https://www.gnu.org/licenses/gpl-3.0)
[](https://gitlab.com/flwgns-docker/seafile-client/)
-# Available tags
+**Share a Seafile library as a volume to other containers.**
-Weekly stable release are built every Monday at 6AM UTC+2.
-Permanent stable releases will not be built again.
+# Supported tags
+[`2`, `2.0`, `2.0.0`, `latest`](seafile-client/Dockerfile)
-## Weekly stable releases.
-[`1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.1),
-[`1.2`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.1),
-[`1.2.1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.1),
-[`latest`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.1)
-
-## Developmental releases.
-[`staging`](https://gitlab.com/flwgns-docker/seafile-client/tree/staging):
-The purpose of this release is to test feature and make them available to anyone.
-
-# Purpose
-Docker Seafile Client allow you to sync a Seafile library within a container.
-
-**Essentially, you can share a Seafile library as a volume to other containers**.
-
-## Seafile?
-[Seafile is a cloud storage software](https://www.seafile.com/).
+# Informations
+* Synchronize a single Seafile library, available at the path `/library/'.
+* Password protected librairies are supported.
+* Two factor authentication is supported.
+* Upload and download speeds are configurable.
+* SSL certificates are skippable.
+
+* Supported tags are rebuilt weekly.
+
+* Ask questions on [Seafile forum](https://forum.seafile.com/t/docker-client-to-sync-files-with-containers/8573).
+* Contribute and report issues on [Gitlab](https://gitlab.com/flwgns-docker/seafile-client/).
# Usage
-The *Seafile* daemon is running as the user `seafuser` from it's directories `~/.seafile/` and `~/.ccnet`.
+## Required configuration
+__SEAF_SERVER_URL__, __SEAF_USERNAME__, __SEAF_PASSWORD__, __SEAF_LIBRARY_UUID__
+Provide your Seafile _server URL_, _username_, _password_ and _library UUID_ to synchronise your library at `/library`, then share it as a volume.
-The library is synced at `/volume/`.
+The `seaf-cli` is ran within the container as the user `seafuser`.
-The *Seafile* daemon is managed with *supervisord* since it can't run as a foreground process.
-The *supervisord* is running from `~/.supervisord/`, the `supervisord.conf`, `supervisord.log` and `supervisord.pid` can be found there.
-*supervisord* also manage a shell script, `~/infinite-seaf-cli-start.sh` which stop then start the Seafile daemon every 20 minutes: the synchronisation might not work properly if the Seafile daemon is not restarted from times to times, for an unresolved reason.
-## Examples
-You would have to share the path `/volume/` to other containers, with the following approaches:
-### Docker CLI
+## Optional configurations
+__SEAF_2FA_SECRET__
+_Two factor authentication is supported but your secret key must be provided._ That key can be found on your Seafile web interface, only at the 2FA setup, when the QR code is shown. The secret key is embedded in the QR or available as a cookie.
+
+__SEAF_LIBRARY_PASSWORD__
+Password protected librairies can be sync provided with the _password_.
+
+__SEAF_UPLOAD_LIMIT__, __SEAF_DOWNLOAD_LIMIT__
+Upload and download speeds are configurable as _absolute bytes_.
+
+__SEAF_SKIP_SSL_CERT__
+Skip SSL certificates verifications. _Any string is considered true, omit the variable to set to false_. Enable this if you have synchronization failures regarding SSL certificates.
+
+__UID__, __GID__
+Override the _UID_ and _GID_ for volume read/write permissions.
+
+# Examples
+## As a Docker command
```
docker run \
- -e SEAF_SERVER_URL= \ # The URL to your Seafile server.
- -e SEAF_USERNAME= \ # Your Seafile username.
- -e SEAF_PASSWORD= \ # Your Seafile password
- -e SEAF_LIBRARY_UUID= \ # The Seafile library UUID you want to sync with.
- -e UID= \ # Default is 1000.
- -e GID= \ # Default is 1000.
- -v your/shared/volume:/volume \
+ -e SEAF_SERVER_URL=https://seafile.example/
+ -e SEAF_USERNAME=a_seafile_user
+ -e SEAF_PASSWORD=SoMePaSSWoRD
+ -e SEAF_LIBRARY_UUID=an-hexadecimal-library-uuid
+ -v path/to/shared/volume:/library \
flowgunso/seafile-client:latest
```
-### docker-compose
+## As a Docker Compose
```yaml
-version: "3.4"
-
services:
+
seafile-client:
image: flowgunso/seafile-client:latest
- restart: on-failure
volumes:
- - your_shared_volume:/volume
+ - shared_volume:/library
environment:
- - SEAF_SERVER_URL= # The URL to your Seafile server.
- - SEAF_USERNAME= # Your Seafile username.
- - SEAF_PASSWORD= # Your Seafile password.
- - SEAF_LIBRARY_UUID= # The Seafile library UUID you want to sync with.
- - UID= # Default is 1000.
- - GID= # Default is 1000.
+ SEAF_SERVER_URL: "https://seafile.example/"
+ SEAF_USERNAME: "a_seafile_user"
+ SEAF_PASSWORD: "SoMePaSSWoRD"
+ SEAF_LIBRARY_UUID: "an-hexadecimal-library-uuid"
volumes:
- your_shared_volume:
+ shared_volume:
```
+## With all optional configurations
+```yaml
+services:
+ seafile-client:
+ image: flowgunso/seafile-client:latest
+ volumes:
+ - shared_volume:/library
+ environment:
+ SEAF_SERVER_URL: "https://seafile.example/"
+ SEAF_USERNAME: "a_seafile_user"
+ SEAF_PASSWORD: "SoMePaSSWoRD"
+ SEAF_LIBRARY_UUID: "an-hexadecimal-library-uuid"
+ SEAF_2FA_SECRET: "JBSWY3DPEHPK3PXPIXDAUMXEDOXIUCDXWC32CS"
+ SEAF_LIBRARY_PASSWORD: "LiBRaRyPaSSWoRD"
+ SEAF_UPLOAD_LIMIT: "1000000"
+ SEAF_DOWNLOAD_LIMIT: "1000000"
+ SEAF_SKIP_SSL_CERT: "true"
-# Environment variables
-The following environment variable are available.
-
-## Seafile
-This Docker **must be configured with the following**, **otherwise** it **will not run**:
-### SEAF_SERVER_URL
-The URL to your Seafile server.
-### SEAF_USERNAME
-Your Seafile account's username.
-### SEAF_PASSWORD
-Your Seafile account's password.
-### SEAF_LIBRARY_UUID
-The Seafile library UUID you want to use.
-
-## User permissions
-This Docker is **not running as `root` but as `seafuser`**. You can override the user/group ID used with:
-### UID
-The user ID defaults to `1000`. You may want to override this variable to prevent permission issues.
-### GID
-The group ID defaults to `1000`. Similarly, you may want to override this variable to prevent permission issues.
-
-# Source code
-This Docker image is licensed under GPLv3.
-The source code is available in [gitlab.com/flwgns-docker/seafile-client](https://gitlab.com/flwgns-docker/seafile-client/).
\ No newline at end of file
+volumes:
+ shared_volume:
+```
+Or use the [docker-compose.yml](documentations/docker-compose.yml) template.
\ No newline at end of file
diff --git a/assets/bash/Dockerfile b/assets/bash/Dockerfile
deleted file mode 100644
index 81d93a6..0000000
--- a/assets/bash/Dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-FROM debian:jessie-slim
-
-# Prevent the packages installation to halt.
-ENV DEBIAN_FRONTEND noninteractive
-# Specify the user running Seafile.
-ENV UNAME=seafuser
-ENV UID=1000
-ENV GID=1000
-
-# Copy over the Docker related files.
-COPY utils/build/import-seafile-apt-key.sh /
-COPY assets/bash/docker-entrypoint.sh /entrypoint.sh
-
-# Safely import Seafile APT key, then install both seafile-cli and supervisord.
-RUN mkdir -p /etc/apt/sources.list.d/ ;\
- echo "deb http://deb.seadrive.org jessie main" \
- > /etc/apt/sources.list.d/seafile.list ;\
- /bin/bash /import-seafile-apt-key.sh ;\
- apt-get update ;\
- apt-get install \
- -o Dpkg::Options::="--force-confold" \
- -y seafile-cli ;\
- apt-get clean ;\
- apt-get autoclean \
- -o APT::Clean-Installed=true ;\
- rm \
- -f \
- /var/log/fsck/*.log \
- /var/log/apt/*.log \
- /var/cache/debconf/*.dat-old \
- /import-seafile-apt-key.sh ;\
- mkdir /volume ;\
- groupadd -g $GID -o $UNAME ;\
- useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
-
-# Copy over the required files for Seafile/SupervisorD.
-COPY assets/bash/seafile-healthcheck.sh /home/seafuser/
-COPY assets/bash/seafile-entrypoint.sh /home/seafuser/entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
diff --git a/assets/bash/docker-entrypoint.sh b/assets/bash/docker-entrypoint.sh
deleted file mode 100644
index c2cf920..0000000
--- a/assets/bash/docker-entrypoint.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# Check mandatory Seafile configuration have been properly set.
-if [ -z $SEAF_SERVER_URL ]; then echo "The \$SEAF_SERVER_URL was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_USERNAME ]; then echo "The \$SEAF_USERNAME was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_PASSWORD ]; then echo "The \$SEAF_PASSWORD was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_LIBRARY_UUID ]; then echo "The \$SEAF_LIBRARY_UUID was not defined. Stopping container..."; exit 1; fi
-
-# Update the user ID, if the $UID changed.
-if [ "$UID" != "1000" ]; then
- usermod -u $UID $UNAME
- # What if the $UID already exists ?
-fi
-
-# Change the group, if the $GID changed.
-if [ "$GID" != "1000" ]; then
- getent group | grep ":$GID:" >/dev/null
- if [ $? -eq 0 ]; then
- usermod -g $GID -G 1000 $UNAME
- else
- groupmod -g $GID $UNAME
- fi
-fi
-
-# Set the files ownership.
-chown $UID.$GID -R /home/seafuser/seafile-healthcheck.sh
-chown $UID.$GID -R /home/seafuser/entrypoint.sh
-chown $UID.$GID -R /volume
-
-# Run the Seafile client as the container user.
-su - $UNAME << EO
- export SEAF_SERVER_URL=$SEAF_SERVER_URL
- export SEAF_USERNAME=$SEAF_USERNAME
- export SEAF_PASSWORD=$SEAF_PASSWORD
- export SEAF_LIBRARY_UUID=$SEAF_LIBRARY_UUID
- export UNAME=$UNAME
- /bin/bash /home/seafuser/entrypoint.sh
-EO
\ No newline at end of file
diff --git a/assets/bash/seafile-healthcheck.sh b/assets/bash/seafile-healthcheck.sh
deleted file mode 100755
index 9b05e63..0000000
--- a/assets/bash/seafile-healthcheck.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# `seaf-cli status` output csv-like information with tabulates as separators and columns named in comment lines.
-# The Seafile client should not be restarted while some statuses are occuring, such as "downloading" or "committing".
-#
-# This script grabs the output while ignoring the comments to iterate over the informations set to their columns,
-# then it compares the statuses, when not empty, to the ones that do not require a restart. Finally either restart or don't.
-
-seaf=/usr/bin/seaf-cli
-dont_restart_on=("downloading" "committing")
-restart=true
-
-sleep 10s
-while true; do
- while IFS=$'\t' read -r name status progress; do
- if [ $status ]; then
- for dont_restart_on_status in "${dont_restart_on[@]}"; do
- if [ "$status" == "$dont_restart_on_status" ]; then
- restart=false; break; break
- fi
- done
- fi
- done < <($seaf status | grep -v "^#")
-
- if $restart; then
- $seaf stop
- $seaf start
- fi
-
- sleep 10m
-done
\ No newline at end of file
diff --git a/assets/cron/Dockerfile b/assets/cron/Dockerfile
deleted file mode 100644
index 3272c7f..0000000
--- a/assets/cron/Dockerfile
+++ /dev/null
@@ -1,61 +0,0 @@
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-FROM debian:jessie-slim
-
-# Prevent the packages installation to halt.
-ENV DEBIAN_FRONTEND noninteractive
-# Create the seafile client user.
-ENV UNAME=seafuser
-ENV UID=1000
-ENV GID=1000
-
-# Copy over the Docker related files.
-COPY utils/build/import-seafile-apt-key.sh /
-COPY assets/cron/docker-entrypoint.sh /entrypoint.sh
-
-# Safely import Seafile APT key, then install both seafile-cli and supervisord.
-RUN mkdir -p /etc/apt/sources.list.d/ ;\
- echo "deb http://deb.seadrive.org jessie main" \
- > /etc/apt/sources.list.d/seafile.list ;\
- bash /import-seafile-apt-key.sh ;\
- apt-get update ;\
- apt-get install \
- -o Dpkg::Options::="--force-confold" \
- -y \
- seafile-cli \
- cron ;\
- apt-get clean ;\
- apt-get autoclean \
- -o APT::Clean-Installed=true ;\
- rm \
- -f \
- /var/log/fsck/*.log \
- /var/log/apt/*.log \
- /var/cache/debconf/*.dat-old \
- /import-seafile-apt-key.sh ;\
- mkdir /volume/ ;\
- echo "seafuser" > /etc/cron.allow ;\
- echo "*/20 * * * * /bin/bash /home/seafuser/seafile-healthcheck.sh" \
- > /var/spool/cron/crontabs/seafuser ;\
- groupadd -g $GID -o $UNAME ;\
- useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
-
-# Copy over the required files for Seafile/SupervisorD.
-COPY assets/cron/seafile-healthcheck.sh /home/seafuser/seafile-healthcheck.sh
-COPY assets/cron/seafile-entrypoint.sh /home/seafuser/entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
diff --git a/assets/seafile.list b/assets/seafile.list
deleted file mode 100644
index 11f6d09..0000000
--- a/assets/seafile.list
+++ /dev/null
@@ -1 +0,0 @@
-deb http://deb.seadrive.org jessie main
\ No newline at end of file
diff --git a/assets/supervisord/Dockerfile b/assets/supervisord/Dockerfile
deleted file mode 100644
index bf66fc7..0000000
--- a/assets/supervisord/Dockerfile
+++ /dev/null
@@ -1,58 +0,0 @@
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-FROM debian:jessie-slim
-
-# Prevent the packages installation to halt.
-ENV DEBIAN_FRONTEND noninteractive
-# Specify the user running Seafile.
-ENV UNAME=seafuser
-ENV UID=1000
-ENV GID=1000
-
-# Copy over the Docker related files.
-COPY utils/build/import-seafile-apt-key.sh /
-COPY assets/supervisord/dockerentrypoint.sh /entrypoint.sh
-
-# Safely import Seafile APT key, then install both seafile-cli and supervisord.
-RUN mkdir -p /etc/apt/sources.list.d/ ;\
- echo "deb http://deb.seadrive.org jessie main" \
- > /etc/apt/sources.list.d/seafile.list ;\
- /bin/bash /import-seafile-apt-key.sh ;\
- apt-get update ;\
- apt-get install \
- -o Dpkg::Options::="--force-confold" \
- -y \
- seafile-cli \
- supervisor ;\
- apt-get clean ;\
- apt-get autoclean \
- -o APT::Clean-Installed=true ;\
- rm \
- -f \
- /var/log/fsck/*.log \
- /var/log/apt/*.log \
- /var/cache/debconf/*.dat-old \
- /import-seafile-apt-key.sh ;\
- mkdir /volume ;\
- groupadd -g $GID -o $UNAME ;\
- useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
-
-# Copy over the required files for Seafile/SupervisorD.
-COPY assets/supervisord/supervisord.conf assets/supervisord/seafile-healthcheck.sh /home/seafuser/
-COPY assets/supervisord/seafile-entrypoint.sh /home/seafuser/entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
diff --git a/assets/supervisord/docker-entrypoint.sh b/assets/supervisord/docker-entrypoint.sh
deleted file mode 100644
index 0fef05e..0000000
--- a/assets/supervisord/docker-entrypoint.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# Check mandatory Seafile configuration have been properly set.
-if [ -z $SEAF_SERVER_URL ]; then echo "The \$SEAF_SERVER_URL was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_USERNAME ]; then echo "The \$SEAF_USERNAME was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_PASSWORD ]; then echo "The \$SEAF_PASSWORD was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_LIBRARY_UUID ]; then echo "The \$SEAF_LIBRARY_UUID was not defined. Stopping container..."; exit 1; fi
-
-# Update the user ID, if the $UID changed.
-if [ "$UID" != "1000" ]; then
- usermod -u $UID $UNAME
- # TODO: What if the $UID already exists ?
-fi
-
-# Change the group, if the $GID changed.
-if [ "$GID" != "1000" ]; then
- getent group | grep ":$GID:" >/dev/null
- if [ $? -eq 0 ]; then
- usermod -g $GID -G 1000 $UNAME
- else
- groupmod -g $GID $UNAME
- fi
-fi
-
-# Set the files ownership.
-chown $UID.$GID -R /home/seafuser/supervisord.conf
-chown $UID.$GID -R /home/seafuser/seafile-healthcheck.sh
-chown $UID.$GID -R /home/seafuser/entrypoint.sh
-chown $UID.$GID -R /volume
-
-# Run the Seafile client as the container user.
-su - $UNAME << EO
- export SEAF_SERVER_URL=$SEAF_SERVER_URL
- export SEAF_USERNAME=$SEAF_USERNAME
- export SEAF_PASSWORD=$SEAF_PASSWORD
- export SEAF_LIBRARY_UUID=$SEAF_LIBRARY_UUID
- export UNAME=$UNAME
- /bin/bash /home/seafuser/entrypoint.sh
-EO
\ No newline at end of file
diff --git a/assets/supervisord/seafile-healthcheck.sh b/assets/supervisord/seafile-healthcheck.sh
deleted file mode 100755
index 9b05e63..0000000
--- a/assets/supervisord/seafile-healthcheck.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# `seaf-cli status` output csv-like information with tabulates as separators and columns named in comment lines.
-# The Seafile client should not be restarted while some statuses are occuring, such as "downloading" or "committing".
-#
-# This script grabs the output while ignoring the comments to iterate over the informations set to their columns,
-# then it compares the statuses, when not empty, to the ones that do not require a restart. Finally either restart or don't.
-
-seaf=/usr/bin/seaf-cli
-dont_restart_on=("downloading" "committing")
-restart=true
-
-sleep 10s
-while true; do
- while IFS=$'\t' read -r name status progress; do
- if [ $status ]; then
- for dont_restart_on_status in "${dont_restart_on[@]}"; do
- if [ "$status" == "$dont_restart_on_status" ]; then
- restart=false; break; break
- fi
- done
- fi
- done < <($seaf status | grep -v "^#")
-
- if $restart; then
- $seaf stop
- $seaf start
- fi
-
- sleep 10m
-done
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index 1d2b8df..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-version: "3.4"
-
-services:
- seafile-client:
- image: flowgunso/seafile-client:latest
- restart: on-failure
- volumes:
- - your_shared_volume:/volume
- environment:
- - SEAF_SERVER_URL= # The URL to your Seafile server.
- - SEAF_USERNAME= # Your Seafile username.
- - SEAF_PASSWORD= # Your Seafile password.
- - SEAF_LIBRARY_UUID= # The Seafile library UUID you want to sync with.
- - UID= # Default is 1000.
- - GID= # Default is 1000.
-
-volumes:
- your_shared_volume:
\ No newline at end of file
diff --git a/documentations/docker-compose.yml b/documentations/docker-compose.yml
new file mode 100644
index 0000000..b362826
--- /dev/null
+++ b/documentations/docker-compose.yml
@@ -0,0 +1,20 @@
+version: "3.4"
+
+services:
+ seafile-client:
+ image: flowgunso/seafile-client:latest
+ volumes:
+ - shared_volume:/library
+ environment:
+ SEAF_SERVER_URL: "" # The URL to your Seafile server.
+ SEAF_USERNAME: "" # Your Seafile username.
+ SEAF_PASSWORD: "" # Your Seafile password.
+ SEAF_LIBRARY_UUID: "" # The Seafile library UUID you want to sync with.
+# SEAF_LIBRARY_PASSWORD: "" # The Seafile library password, if required.
+# SEAF_SKIP_SSL_CERT: "true" # Any string is true, omit to set to false.
+# SEAF_2FA_SECRET: "" # The 2FA secret key available at Seafile 2FA setup.
+# UID: "" # Default is 1000.
+# GID: "" # Default is 1000.
+
+volumes:
+ shared_volume:
\ No newline at end of file
diff --git a/seafile-client/Dockerfile b/seafile-client/Dockerfile
new file mode 100644
index 0000000..c5c5970
--- /dev/null
+++ b/seafile-client/Dockerfile
@@ -0,0 +1,69 @@
+# Docker Seafile client, help you mount a Seafile library as a volume.
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+FROM debian:buster-slim
+
+ARG BUILD_DATE
+ARG VCS_REF
+ARG VERSION
+LABEL maintainer="flow.gunso@gmail.com" \
+ org.label-schema.build-date=$BUILD_DATE \
+ org.label-schema.name="Seafile Docker client" \
+ org.label-schema.description="Sync Seafile librairies within Docker containers." \
+ org.label-schema.url=$CI_PROJECT_URL \
+ org.label-schema.vcs-ref=$VCS_REF \
+ org.label-schema.vcs-url=$CI_PROJECT_URL \
+ org.label-schema.vendor="flow.gunso@gmail.com" \
+ org.label-schema.version=$VERSION \
+ org.label-schema.schema-version="1.0"
+
+# Install seaf-cli and oathtool, prepare the user.
+ENV DEBIAN_FRONTEND=noninteractive
+ENV UNAME=seafuser UID=1000 GID=1000
+COPY import-seafile-apt-key.sh /
+RUN apt-get update && apt-get install -y gnupg && \
+ mkdir -p /etc/apt/sources.list.d/ && \
+ echo "deb http://deb.seadrive.org buster main" > /etc/apt/sources.list.d/seafile.list && \
+ bash /import-seafile-apt-key.sh && \
+ apt-get purge --yes gnupg && apt-get autoremove --yes && \
+ apt-get update && apt-get install \
+ --no-install-recommends \
+ --yes \
+ seafile-cli \
+ oathtool && \
+ apt-get clean && apt-get autoclean && \
+ rm -rf \
+ /var/log/fsck/*.log \
+ /var/log/apt/*.log \
+ /var/cache/debconf/*.dat-old \
+ /var/lib/apt/lists/* \
+ /import-seafile-apt-key.sh && \
+ mkdir /library/ && \
+ groupadd -g $GID -o $UNAME && \
+ useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME && \
+ mkdir /home/$UNAME/.seafile && \
+ chown $UNAME:$GID /home/$UNAME/.seafile
+
+# Copy over the assets.
+COPY docker-entrypoint.sh /entrypoint.sh
+COPY docker-healthcheck.sh /healthcheck.sh
+COPY seafile-entrypoint.sh /home/seafuser/entrypoint.sh
+#COPY seafile-healthcheck.sh /home/seafuser/healthcheck.sh
+COPY tests /tests
+
+ENTRYPOINT ["/bin/bash", "--"]
+CMD ["/entrypoint.sh"]
+HEALTHCHECK --start-period=20s --retries=1 CMD ["su", "-", "${UNAME}", "-c", "/healthcheck.sh"]
\ No newline at end of file
diff --git a/assets/cron/docker-entrypoint.sh b/seafile-client/docker-entrypoint.sh
similarity index 50%
rename from assets/cron/docker-entrypoint.sh
rename to seafile-client/docker-entrypoint.sh
index 901e7d4..3494004 100644
--- a/assets/cron/docker-entrypoint.sh
+++ b/seafile-client/docker-entrypoint.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,17 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+function fail_with_message {
+ echo "$1"
+ echo "Exiting container."
+ exit 1
+}
+
# Check mandatory Seafile configuration have been properly set.
-if [ -z $SEAF_SERVER_URL ]; then echo "The \$SEAF_SERVER_URL was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_USERNAME ]; then echo "The \$SEAF_USERNAME was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_PASSWORD ]; then echo "The \$SEAF_PASSWORD was not defined. Stopping container..."; exit 1; fi
-if [ -z $SEAF_LIBRARY_UUID ]; then echo "The \$SEAF_LIBRARY_UUID was not defined. Stopping container..."; exit 1; fi
+[[ -z "$SEAF_SERVER_URL" ]] && fail_with_message "The \$SEAF_SERVER_URL is not defined."
+[[ -z "$SEAF_USERNAME" ]] && fail_with_message "The \$SEAF_USERNAME is not defined."
+[[ -z "$SEAF_PASSWORD" ]] && fail_with_message "The \$SEAF_PASSWORD is not defined."
+[[ -z "$SEAF_LIBRARY_UUID" ]] && fail_with_message "The \$SEAF_LIBRARY_UUID is not defined."
+[[ -n "$SEAF_UPLOAD_LIMIT" && $SEAF_UPLOAD_LIMIT =~ ^[0-9]+$ && "$SEAF_UPLOAD_LIMIT" -gt 0 ]] && \
+ fail_with_message "The \$SEAF_UPLOAD_LIMIT is not an integer greater than 0."
+[[ -n "$SEAF_DOWNLOAD_LIMIT" && $SEAF_DOWNLOAD_LIMIT =~ ^[0-9]+$ && "$SEAF_DOWNLOAD_LIMIT" -gt 0 ]] && \
+ fail_with_message "The \$SEAF_DOWNLOAD_LIMIT is not an integer greater than 0."
# Update the user ID, if the $UID changed.
-if [ "$UID" != "1000" ]; then
- usermod -u $UID $UNAME
- # What if the $UID already exists ?
-fi
+# TODO: What if the $UID already exists ?
+[[ "$UID" != "1000" ]] && usermod -u $UID $UNAME
# Change the group, if the $GID changed.
if [ "$GID" != "1000" ]; then
@@ -39,7 +47,7 @@ if [ "$GID" != "1000" ]; then
fi
# Set the files ownership.
-chown $UID.$GID /home/seafuser/seafile-healthcheck.sh
+chown $UID.$GID /home/seafuser/healthcheck.sh
chown $UID.$GID /home/seafuser/entrypoint.sh
chown $UID.$GID -R /volume
@@ -49,8 +57,10 @@ su - $UNAME << EO
export SEAF_USERNAME=$SEAF_USERNAME
export SEAF_PASSWORD=$SEAF_PASSWORD
export SEAF_LIBRARY_UUID=$SEAF_LIBRARY_UUID
- export UNAME=$UNAME
+ [[ "$SEAF_SKIP_SSL_CERT" ]] && export SEAF_SKIP_SSL_CERT=$SEAF_SKIP_SSL_CERT
+ [[ "$SEAF_UPLOAD_LIMIT" ]] && export SEAF_UPLOAD_LIMIT=$SEAF_UPLOAD_LIMIT
+ [[ "$SEAF_DOWNLOAD_LIMIT" ]] && export SEAF_DOWNLOAD_LIMIT=$SEAF_DOWNLOAD_LIMIT
+ [[ "$SEAF_2FA_SECRET" ]] && export SEAF_2FA_SECRET=$SEAF_2FA_SECRET
+ [[ "$SEAF_LIBRARY_PASSWORD" ]] && export SEAF_LIBRARY_PASSWORD=$SEAF_LIBRARY_PASSWORD
/bin/bash /home/seafuser/entrypoint.sh
EO
-
-cron -f
\ No newline at end of file
diff --git a/assets/bash/seafile-entrypoint.sh b/seafile-client/docker-healthcheck.sh
old mode 100644
new mode 100755
similarity index 52%
rename from assets/bash/seafile-entrypoint.sh
rename to seafile-client/docker-healthcheck.sh
index a029c5b..298f5e9
--- a/assets/bash/seafile-entrypoint.sh
+++ b/seafile-client/docker-healthcheck.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,23 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Define variable shortcuts for readability purposes.
-seafile_ini=~/.ccnet/seafile.ini
-seafile_sock=~/.seafile/seafile-data/seafile.sock
+# Grab the status of the active repos then return as healthy/unhealthy
+# depending the healthy statuses.
-# Prepare the directories.
-mkdir ~/.seafile
-
-# Safely initialise the Seafile client.
-/usr/bin/seaf-cli init -d ~/.seafile
-while [ ! -f $seafile_ini ]; do sleep 1; done
-
-# Safely start the Seafile daemon.
-/usr/bin/seaf-cli start
-while [ ! -S $seafile_sock ]; do sleep 1; done
-
-# Start the synchronisation.
-/usr/bin/seaf-cli sync -u $SEAF_USERNAME -p $SEAF_PASSWORD -s $SEAF_SERVER_URL -l $SEAF_LIBRARY_UUID -d /volume
-
-# Run the infinite Seafile restart.
-source ~/seafile-healthcheck.sh
+healthy_statuses=("downloading" "waiting for sync", "uploading", "downloading files", "downloading file list")
+while IFS=$'\t' read -r name status; do
+ for healthy_status in "${healthy_statuses[@]}"; do
+ if [[ "$status" == "$healthy" ]]; then exit 0; fi
+ done
+ exit 1
+done < <(seaf-cli status | grep -v "^#")
diff --git a/utils/build/import-seafile-apt-key.sh b/seafile-client/import-seafile-apt-key.sh
similarity index 95%
rename from utils/build/import-seafile-apt-key.sh
rename to seafile-client/import-seafile-apt-key.sh
index 4818945..3a4db2c 100644
--- a/utils/build/import-seafile-apt-key.sh
+++ b/seafile-client/import-seafile-apt-key.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/assets/supervisord/seafile-entrypoint.sh b/seafile-client/seafile-entrypoint.sh
similarity index 54%
rename from assets/supervisord/seafile-entrypoint.sh
rename to seafile-client/seafile-entrypoint.sh
index e603906..e9a8b3d 100644
--- a/assets/supervisord/seafile-entrypoint.sh
+++ b/seafile-client/seafile-entrypoint.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,27 +16,30 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Define variable shortcuts for readability purposes.
-seafile_ini=~/.ccnet/seafile.ini
-seafile_sock=~/.seafile/seafile-data/seafile.sock
-supervisord_conf=~/supervisord.conf
-supervisord_pid=~/.supervisord/supervisord.pid
-supervisord_log=~/.supervisord/supervisord.log
-
-# Prepare the directories.
-mkdir ~/.seafile
-mkdir ~/.supervisord
-
# Safely initialise the Seafile client.
+seafile_ini=~/.ccnet/seafile.ini
/usr/bin/seaf-cli init -d ~/.seafile
while [ ! -f $seafile_ini ]; do sleep 1; done
# Safely start the Seafile daemon.
+seafile_sock=~/.seafile/seafile-data/seafile.sock
/usr/bin/seaf-cli start
while [ ! -S $seafile_sock ]; do sleep 1; done
-# Start the synchronisation.
-/usr/bin/seaf-cli sync -u $SEAF_USERNAME -p $SEAF_PASSWORD -s $SEAF_SERVER_URL -l $SEAF_LIBRARY_UUID -d /volume
+# Set the disable_verify_certificate key to true only if the environment variable exists.
+[[ "$SEAF_SKIP_SSL_CERT" ]] && seaf-cli config -k disable_verify_certificate -v true
-# Start the supervisord.
-/usr/bin/supervisord -u $UNAME -c $supervisord_conf -j $supervisord_pid -l $supervisord_log
\ No newline at end of file
+# Set the upload/download limits
+[[ "$SEAF_UPLOAD_LIMIT" ]] && seaf-cli config -k upload_limit -v $SEAF_UPLOAD_LIMIT
+[[ "$SEAF_DOWNLOAD_LIMIT" ]] && seaf-cli config -k download_limit -v $SEAF_DOWNLOAD_LIMIT
+
+# Build the seaf-cli sync command.
+cmd="seaf-cli sync -u $SEAF_USERNAME -p $SEAF_PASSWORD -s $SEAF_SERVER_URL -l $SEAF_LIBRARY_UUID -d /library"
+[[ "$SEAF_2FA_SECRET" ]] && cmd+=" -a $(oathtool --base32 --totp $SEAF_2FA_SECRET)"
+[[ "$SEAF_LIBRARY_PASSWORD" ]] && cmd+=" -e $SEAF_LIBRARY_PASSWORD"
+
+# Run it.
+if ! eval $cmd; then echo "Failed to synchronize."; exit 1; fi
+
+# Continously print the log.
+tail -f ~/.ccnet/logs/seafile.log
diff --git a/assets/cron/seafile-healthcheck.sh b/seafile-client/seafile-healthcheck.sh
similarity index 97%
rename from assets/cron/seafile-healthcheck.sh
rename to seafile-client/seafile-healthcheck.sh
index 663e03b..1bd54e3 100755
--- a/assets/cron/seafile-healthcheck.sh
+++ b/seafile-client/seafile-healthcheck.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/utils/publish/staging.sh b/tests/test_binaries.sh
old mode 100755
new mode 100644
similarity index 62%
rename from utils/publish/staging.sh
rename to tests/test_binaries.sh
index ba28fcf..09c79f6
--- a/utils/publish/staging.sh
+++ b/tests/test_binaries.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
+# Copyright (C) 2019-2020, flow.gunso@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,15 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Restrict to pipeline triggered by pushes.
-if [ $CI_PIPELINE_SOURCE != "push" ]; then
- echo "This must be only ran from pushes."
+failures=()
+binaries=(seaf-cli oathtool)
+
+for binary in "${binaries[@]}"; do
+ if ! [ -x "$(command -v $binary)" ]; then
+ echo "$binary was not found"
+ failures+=($binary)
+ else
+ echo "$binary was found"
+ fi
+done
+
+if [ ${#failures[@]} -ne 0 ]; then
exit 1
fi
-
-# Login with Docker Registry.
-echo $CI_REGISTRY_BOT_PASSWORD | docker login -u $CI_REGISTRY_BOT_USERNAME docker.io --password-stdin
-
-# Build and push as staging.
-docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging .
-docker push index.docker.io/$CI_REGISTRY_IMAGE:staging
\ No newline at end of file
diff --git a/utils/publish/feature--cron-or-supervisord.sh b/utils/publish/feature--cron-or-supervisord.sh
deleted file mode 100755
index 59446dc..0000000
--- a/utils/publish/feature--cron-or-supervisord.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# Restrict to pipeline triggered by pushes.
-if [ $CI_PIPELINE_SOURCE != "push" ]; then
- echo "This must be only ran from pushes."
- exit 1
-fi
-
-# Login with Docker Registry.
-echo $CI_REGISTRY_BOT_PASSWORD | docker login -u $CI_REGISTRY_BOT_USERNAME docker.io --password-stdin
-
-# Build and push as staging.
-docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging-supervisord -f assets/supervisord/Dockerfile .
-docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging-cron -f assets/cron/Dockerfile .
-docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging-bash -f assets/bash/Dockerfile .
-docker push index.docker.io/$CI_REGISTRY_IMAGE:staging-supervisord
-docker push index.docker.io/$CI_REGISTRY_IMAGE:staging-cron
-docker push index.docker.io/$CI_REGISTRY_IMAGE:staging-bash
diff --git a/utils/publish/production.sh b/utils/publish/production.sh
deleted file mode 100755
index 8c8d48e..0000000
--- a/utils/publish/production.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/bash
-
-# Docker Seafile client, help you mount a Seafile library as a volume.
-# Copyright (C) 2019, flow.gunso@gmail.com
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# Restrict production build to tag matching MAJOR.MINOR.REVISION.
-if ! [[ "$CI_COMMIT_TAG" =~ ^[0-9]+[.][0-9]+[.][0-9]+$ ]]; then
- echo "Version number must match major.minor.revision!"
- exit 1
-fi
-
-# When this stage is ran from 'push', the build target is BUILD_LATEST.
-# When this stage is ran from 'trigger', the build target must be provided.
-# Otherwise, stop the stage.
-if [ $CI_PIPELINE_SOURCE == "push" ]; then
- BUILD_LATEST=true
-elif [ $CI_PIPELINE_SOURCE == "trigger" ]; then
- if [ -z $BUILD_LATEST ] && \
- [ -z $BUILD_MAJOR ] && \
- [ -z $BUILD_MINOR ] && \
- [ -z $BUILD_REVISION ]; then
- echo "You must provide build targets to this stage when ran from Pipeline Triggers."
- exit 1
- fi
-else
- echo "This stage is restricted to 'push' or 'trigger' Pipeline sources."
- exit 1
-fi
-
-# Cascade the builds by inheritance.
-if [ $BUILD_LATEST ]; then BUILD_MAJOR=true; BUILD_MINOR=true; BUILD_REVISION=true; fi
-if [ $BUILD_MAJOR ]; then BUILD_MINOR=true; BUILD_REVISION=true; fi
-if [ $BUILD_MINOR ]; then BUILD_REVISION=true; fi
-
-# Define MAJOR, MINOR and REVISION version numbers.
-MAJOR_NUMBER=$(echo "$CI_COMMIT_TAG" | awk -F \. {'print $1'})
-MINOR_NUMBER=$(echo "$CI_COMMIT_TAG" | awk -F \. {'print $2'})
-REVISION_NUMBER=$(echo "$CI_COMMIT_TAG" | awk -F \. {'print $3'})
-MAJOR=$MAJOR_NUMBER
-MINOR=$MAJOR.$MINOR_NUMBER
-REVISION=$MINOR.$REVISION_NUMBER
-
-# Always build with all tags, there's a single build anyway.
-docker build \
- -t index.docker.io/$CI_REGISTRY_IMAGE:latest \
- -t index.docker.io/$CI_REGISTRY_IMAGE:$MAJOR \
- -t index.docker.io/$CI_REGISTRY_IMAGE:$MINOR \
- -t index.docker.io/$CI_REGISTRY_IMAGE:$REVISION .
-
-# Login with Docker Registry.
-echo $CI_REGISTRY_BOT_PASSWORD | docker login -u $CI_REGISTRY_BOT_USERNAME docker.io --password-stdin
-
-# Only push requested builds.
-if [ $BUILD_LATEST ]; then docker push index.docker.io/$CI_REGISTRY_IMAGE:latest; fi
-if [ $BUILD_MAJOR ]; then docker push index.docker.io/$CI_REGISTRY_IMAGE:$MAJOR; fi
-if [ $BUILD_MINOR ]; then docker push index.docker.io/$CI_REGISTRY_IMAGE:$MINOR; fi
-if [ $BUILD_REVISION ]; then docker push index.docker.io/$CI_REGISTRY_IMAGE:$REVISION; fi
\ No newline at end of file