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/Dockerfile.bash b/Dockerfile.bash new file mode 100644 index 0000000..401cde5 --- /dev/null +++ b/Dockerfile.bash @@ -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/docker-bash-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/supervisord.conf assets/infinite-seaf-cli-start.sh /home/seafuser/ +COPY assets/seafile-bash-entrypoint.sh /home/seafuser/entrypoint.sh + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/Dockerfile.cron b/Dockerfile.cron new file mode 100644 index 0000000..3cd88ab --- /dev/null +++ b/Dockerfile.cron @@ -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/docker-cron-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/infinite-seaf-cli-start.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/infinite-seaf-cli-start.sh /home/seafuser/ +COPY assets/seafile-cron-entrypoint.sh /home/seafuser/entrypoint.sh + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/Dockerfile b/Dockerfile.supervisord similarity index 73% rename from Dockerfile rename to Dockerfile.supervisord index 56d653f..81dd58e 100644 --- a/Dockerfile +++ b/Dockerfile.supervisord @@ -18,13 +18,20 @@ 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 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/docker-supervisord-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 ;\ + /bin/bash /import-seafile-apt-key.sh ;\ apt-get update ;\ apt-get install \ -o Dpkg::Options::="--force-confold" \ @@ -39,22 +46,13 @@ 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 ;\ + 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/supervisord.conf assets/infinite-seaf-cli-start.sh /home/seafuser/ +COPY assets/seafile-supervisord-entrypoint.sh /home/seafuser/entrypoint.sh ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/README.md b/README.md index 0bcd52c..7851453 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![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) [![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/Code%20source-GitLab-red.svg)](https://gitlab.com/flwgns-docker/seafile-client/) +[![@gitlab.com/flwgns-docker/seafile-client](https://img.shields.io/badge/Source%20code-GitLab-red.svg)](https://gitlab.com/flwgns-docker/seafile-client/) # Available tags diff --git a/assets/docker-bash-entrypoint.sh b/assets/docker-bash-entrypoint.sh new file mode 100644 index 0000000..c446e0f --- /dev/null +++ b/assets/docker-bash-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/infinite-seaf-cli-start.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/docker-cron-entrypoint.sh b/assets/docker-cron-entrypoint.sh new file mode 100644 index 0000000..39ea374 --- /dev/null +++ b/assets/docker-cron-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/infinite-seaf-cli-start.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/docker-entrypoint.sh b/assets/docker-supervisord-entrypoint.sh similarity index 100% rename from assets/docker-entrypoint.sh rename to assets/docker-supervisord-entrypoint.sh diff --git a/assets/infinite-seaf-cli-start.sh b/assets/infinite-seaf-cli-start.sh index dc7abb6..5aadbcf 100755 --- a/assets/infinite-seaf-cli-start.sh +++ b/assets/infinite-seaf-cli-start.sh @@ -16,11 +16,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -set -x - -sleep 10 +/bin/sleep 10 while true; do /usr/bin/seaf-cli stop /usr/bin/seaf-cli start - sleep 1200 + /bin/sleep 1200 done \ No newline at end of file diff --git a/assets/seafile-bash-entrypoint.sh b/assets/seafile-bash-entrypoint.sh new file mode 100644 index 0000000..52aa07d --- /dev/null +++ b/assets/seafile-bash-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 ~/infinite-seaf-cli-start.sh diff --git a/assets/seafile-cron-entrypoint.sh b/assets/seafile-cron-entrypoint.sh new file mode 100644 index 0000000..7716ba7 --- /dev/null +++ b/assets/seafile-cron-entrypoint.sh @@ -0,0 +1,36 @@ +#!/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 +mkdir ~/.supervisord + +# 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/seafile-entrypoint.sh b/assets/seafile-supervisord-entrypoint.sh similarity index 100% rename from assets/seafile-entrypoint.sh rename to assets/seafile-supervisord-entrypoint.sh diff --git a/utils/publish/feature--cron-or-supervisord.sh b/utils/publish/feature--cron-or-supervisord.sh new file mode 100755 index 0000000..26f8348 --- /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 Dockerfile.supervisord . +docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging-cron -f Dockerfile.cron . +docker build -t index.docker.io/$CI_REGISTRY_IMAGE:staging-bash -f Dockerfile.bash . +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