diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 09d9c34..d9f9960 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,13 @@ stages: before_script: - apk add bash +cron_or_supervisord: + stage: build_publish + script: + - /bin/bash utils/publish/feature--cron-or-supervisord.sh + only: + - feature--cron-or-supervisord + staging: stage: build_publish script: diff --git a/CHANGELOG.md b/CHANGELOG.md index bb8b25b..49efa52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [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 - Slim down the Docker image, from 102MB to 67MB, gaining 35MB, reducing size by 34%. ### [1.1.1] - 2019/04/18 diff --git a/Dockerfile b/Dockerfile index 56d653f..3272c7f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,19 +18,26 @@ 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 seafile repository. -COPY assets/seafile.list /etc/apt/sources.list.d/ +# 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. -COPY utils/build/import-seafile-apt-key.sh / -RUN /bin/bash /import-seafile-apt-key.sh ;\ +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 \ - supervisor ;\ + cron ;\ apt-get clean ;\ apt-get autoclean \ -o APT::Clean-Installed=true ;\ @@ -39,22 +46,16 @@ RUN /bin/bash /import-seafile-apt-key.sh ;\ /var/log/fsck/*.log \ /var/log/apt/*.log \ /var/cache/debconf/*.dat-old \ - /import-seafile-apt-key.sh - -# Create the seafile client user. -ENV UNAME=seafuser -ENV UID=1000 -ENV GID=1000 -RUN groupadd -g $GID -o $UNAME ;\ + /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 Docker entrypoint. -COPY assets/docker-entrypoint.sh /entrypoint.sh - # Copy over the required files for Seafile/SupervisorD. -COPY assets/supervisord.conf /home/seafuser/ -COPY assets/infinite-seaf-cli-start.sh /home/seafuser/ -COPY assets/seafile-entrypoint.sh /home/seafuser/entrypoint.sh -RUN mkdir /volume +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/README.md b/README.md index ed8ac59..57e975d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![1.1.2 build status](https://gitlab.com/flwgns-docker/seafile-client/badges/1.1.2/pipeline.svg)](https://gitlab.com/flwgns-docker/seafile-client/commits/1.1.2) +[![1.2.0 build status](https://gitlab.com/flwgns-docker/seafile-client/badges/1.2.0/pipeline.svg)](https://gitlab.com/flwgns-docker/seafile-client/commits/1.2.0) [![Docker pulls](https://img.shields.io/docker/pulls/flowgunso/seafile-client.svg)](https://hub.docker.com/r/flowgunso/seafile-client) [![Licensed under GPLv3](https://img.shields.io/badge/License-GPLv3-red.svg)](https://www.gnu.org/licenses/gpl-3.0) [![@gitlab.com/flwgns-docker/seafile-client](https://img.shields.io/badge/Source%20code-GitLab-red.svg)](https://gitlab.com/flwgns-docker/seafile-client/) @@ -8,32 +8,16 @@ Weekly stable release are built every Monday at 6AM UTC+2. Permanent stable releases will not be built again. -You can rely on the weekly stable releases. They are stable. - ## Weekly stable releases. -[`1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.2), -[`1.1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.2), -[`1.1.2`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.2), -[`latest`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.2) - -## Permanent stable releases. -[`1.1.1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.1): -Release previous to the slim down. Image is larger than 100MB. +[`1`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.0), +[`1.2`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.0), +[`1.2.0`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.0), +[`latest`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.2.0) ## 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. -## Obsolete releases. -[`1.1.0`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.1.0) -see [issue #3](https://gitlab.com/flwgns-docker/seafile-client/issues/3). - -[`1.0`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.0.6) and it's revision -[`1.0.6`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.0.6), -[`1.0.3`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.0.3), -[`1.0.2`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.0.2), -[`1.0.0`](https://gitlab.com/flwgns-docker/seafile-client/tags/1.0.0) are now obsolete. - # Purpose Docker Seafile Client allow you to sync a Seafile library within a container. diff --git a/assets/bash/Dockerfile b/assets/bash/Dockerfile new file mode 100644 index 0000000..81d93a6 --- /dev/null +++ b/assets/bash/Dockerfile @@ -0,0 +1,56 @@ +# 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 new file mode 100644 index 0000000..c2cf920 --- /dev/null +++ b/assets/bash/docker-entrypoint.sh @@ -0,0 +1,54 @@ +#!/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-entrypoint.sh b/assets/bash/seafile-entrypoint.sh new file mode 100644 index 0000000..a029c5b --- /dev/null +++ b/assets/bash/seafile-entrypoint.sh @@ -0,0 +1,38 @@ +#!/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 . + +# Define variable shortcuts for readability purposes. +seafile_ini=~/.ccnet/seafile.ini +seafile_sock=~/.seafile/seafile-data/seafile.sock + +# 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 diff --git a/assets/bash/seafile-healthcheck.sh b/assets/bash/seafile-healthcheck.sh new file mode 100755 index 0000000..9b05e63 --- /dev/null +++ b/assets/bash/seafile-healthcheck.sh @@ -0,0 +1,47 @@ +#!/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 new file mode 100644 index 0000000..3272c7f --- /dev/null +++ b/assets/cron/Dockerfile @@ -0,0 +1,61 @@ +# 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/cron/docker-entrypoint.sh b/assets/cron/docker-entrypoint.sh new file mode 100644 index 0000000..901e7d4 --- /dev/null +++ b/assets/cron/docker-entrypoint.sh @@ -0,0 +1,56 @@ +#!/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 /home/seafuser/seafile-healthcheck.sh +chown $UID.$GID /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 + +cron -f \ No newline at end of file diff --git a/assets/infinite-seaf-cli-start.sh b/assets/cron/seafile-entrypoint.sh old mode 100755 new mode 100644 similarity index 58% rename from assets/infinite-seaf-cli-start.sh rename to assets/cron/seafile-entrypoint.sh index dc7abb6..2a2baec --- a/assets/infinite-seaf-cli-start.sh +++ b/assets/cron/seafile-entrypoint.sh @@ -16,11 +16,20 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -set -x +# Define variable shortcuts for readability purposes. +seafile_ini=~/.ccnet/seafile.ini +seafile_sock=~/.seafile/seafile-data/seafile.sock -sleep 10 -while true; do - /usr/bin/seaf-cli stop - /usr/bin/seaf-cli start - sleep 1200 -done \ No newline at end of file +# 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 \ No newline at end of file diff --git a/assets/cron/seafile-healthcheck.sh b/assets/cron/seafile-healthcheck.sh new file mode 100755 index 0000000..663e03b --- /dev/null +++ b/assets/cron/seafile-healthcheck.sh @@ -0,0 +1,42 @@ +#!/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 + +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 diff --git a/assets/supervisord/Dockerfile b/assets/supervisord/Dockerfile new file mode 100644 index 0000000..bf66fc7 --- /dev/null +++ b/assets/supervisord/Dockerfile @@ -0,0 +1,58 @@ +# 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/docker-entrypoint.sh b/assets/supervisord/docker-entrypoint.sh similarity index 97% rename from assets/docker-entrypoint.sh rename to assets/supervisord/docker-entrypoint.sh index d7460f5..0fef05e 100644 --- a/assets/docker-entrypoint.sh +++ b/assets/supervisord/docker-entrypoint.sh @@ -40,7 +40,7 @@ fi # Set the files ownership. chown $UID.$GID -R /home/seafuser/supervisord.conf -chown $UID.$GID -R /home/seafuser/infinite-seaf-cli-start.sh +chown $UID.$GID -R /home/seafuser/seafile-healthcheck.sh chown $UID.$GID -R /home/seafuser/entrypoint.sh chown $UID.$GID -R /volume diff --git a/assets/seafile-entrypoint.sh b/assets/supervisord/seafile-entrypoint.sh similarity index 100% rename from assets/seafile-entrypoint.sh rename to assets/supervisord/seafile-entrypoint.sh diff --git a/assets/supervisord/seafile-healthcheck.sh b/assets/supervisord/seafile-healthcheck.sh new file mode 100755 index 0000000..9b05e63 --- /dev/null +++ b/assets/supervisord/seafile-healthcheck.sh @@ -0,0 +1,47 @@ +#!/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/supervisord.conf b/assets/supervisord/supervisord.conf similarity index 94% rename from assets/supervisord.conf rename to assets/supervisord/supervisord.conf index 560c374..2139015 100644 --- a/assets/supervisord.conf +++ b/assets/supervisord/supervisord.conf @@ -24,7 +24,7 @@ file=~/.seafile/seafile-data/seafile.sock # Manage the infinite `seaf-cli start`. [program:seaf-cli-start-loop] -command=/bin/bash /home/seafuser/infinite-seaf-cli-start.sh +command=/bin/bash /home/seafuser/seafile-healthcheck.sh process_name=%(program_name)s numprocs=1 autostart=true diff --git a/utils/publish/feature--cron-or-supervisord.sh b/utils/publish/feature--cron-or-supervisord.sh new file mode 100755 index 0000000..59446dc --- /dev/null +++ b/utils/publish/feature--cron-or-supervisord.sh @@ -0,0 +1,34 @@ +#!/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