├── .dockerignore ├── .gitignore ├── Changelog.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── VERSION ├── assets ├── build │ └── install.sh ├── runtime │ ├── config │ │ └── nginx │ │ │ └── ownCloud.conf │ ├── env-defaults │ └── functions └── tools │ ├── occ │ └── owncloud-backup-create ├── docker-compose.yml ├── entrypoint.sh └── kubernetes ├── nginx-service.yaml ├── nginx.yaml ├── owncloud-service.yaml ├── owncloud.yaml ├── postgresql-service.yaml └── postgresql.yaml /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | LICENSE 4 | README.md 5 | Changelog.md 6 | Makefile 7 | docker-compose.yml 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.tar.* 2 | -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | **10.0.10-0** 2 | - owncloud: upgrade to 10.0.10 3 | 4 | **10.0.9** 5 | - owncloud: upgrade to 10.0.9 6 | 7 | **9.1.6** 8 | - owncloud: upgrade to 9.1.6 9 | 10 | **9.1.5** 11 | - owncloud: upgrade to 9.1.5 12 | 13 | **9.1.4** 14 | - php: update to PHP 7.0 15 | - owncloud: upgrade to 9.1.4 16 | 17 | **9.1.0** 18 | - owncloud: upgrade to 9.1.0 19 | 20 | **9.0.4** 21 | - owncloud: upgrade to 9.0.4 22 | 23 | **9.0.3** 24 | - owncloud: upgrade to 9.0.3 25 | 26 | **9.0.2** 27 | - owncloud: upgrade to 9.0.2 28 | 29 | **9.0.1** 30 | - owncloud: upgrade to 9.0.1 31 | 32 | **9.0.0** 33 | - owncloud: upgrade to 9.0.0 34 | 35 | **8.2.3** 36 | - owncloud: upgrade to 8.2.3 37 | 38 | **8.2.2** 39 | - owncloud: upgrade to 8.2.2 40 | 41 | **8.1.5** 42 | - owncloud: upgrade to 8.1.5 43 | - use `maintenance:install` to perform full install at launch 44 | 45 | **8.0.10** 46 | - owncloud: upgrade to 8.0.10 47 | 48 | **8.0.0** 49 | - feature: backup and restore 50 | - Initial creation with ownCloud 8.0.0 51 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:bionic-20190612 AS add-apt-repositories 2 | 3 | RUN apt-get update \ 4 | && DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg \ 5 | && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C \ 6 | && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu bionic main" >> /etc/apt/sources.list 7 | 8 | FROM ubuntu:bionic-20190612 9 | 10 | LABEL maintainer="sameer@damagehead.com" 11 | 12 | ENV PHP_VERSION=7.1 \ 13 | OWNCLOUD_VERSION=10.0.10 \ 14 | OWNCLOUD_USER=www-data \ 15 | OWNCLOUD_INSTALL_DIR=/var/www/owncloud \ 16 | OWNCLOUD_DATA_DIR=/var/lib/owncloud \ 17 | OWNCLOUD_ASSETS_DIR=/etc/docker-owncloud 18 | 19 | ENV OWNCLOUD_BUILD_ASSETS_DIR=${OWNCLOUD_ASSETS_DIR}/build \ 20 | OWNCLOUD_RUNTIME_ASSETS_DIR=${OWNCLOUD_ASSETS_DIR}/runtime 21 | 22 | COPY --from=add-apt-repositories /etc/apt/trusted.gpg /etc/apt/trusted.gpg 23 | 24 | COPY --from=add-apt-repositories /etc/apt/sources.list /etc/apt/sources.list 25 | 26 | COPY assets/build/ ${OWNCLOUD_BUILD_ASSETS_DIR}/ 27 | 28 | RUN chmod +x ${OWNCLOUD_BUILD_ASSETS_DIR}/install.sh 29 | 30 | RUN ${OWNCLOUD_BUILD_ASSETS_DIR}/install.sh 31 | 32 | COPY assets/runtime/ ${OWNCLOUD_RUNTIME_ASSETS_DIR}/ 33 | 34 | COPY assets/tools/ /usr/bin/ 35 | 36 | COPY entrypoint.sh /sbin/entrypoint.sh 37 | 38 | RUN chmod 755 /sbin/entrypoint.sh 39 | 40 | WORKDIR ${OWNCLOUD_INSTALL_DIR} 41 | 42 | ENTRYPOINT ["/sbin/entrypoint.sh"] 43 | 44 | CMD ["app:owncloud"] 45 | 46 | EXPOSE 80/tcp 9000/tcp 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Sameer Naik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: build 2 | 3 | build: 4 | @docker build --tag=sameersbn/owncloud . 5 | 6 | release: build 7 | @docker build --tag=sameersbn/owncloud:$(shell cat VERSION) . 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Docker Repository on Quay.io](https://quay.io/repository/sameersbn/owncloud/status "Docker Repository on Quay.io")](https://quay.io/repository/sameersbn/owncloud) 2 | 3 | # sameersbn/owncloud:10.0.10-0 4 | 5 | - [Introduction](#introduction) 6 | - [Contributing](#contributing) 7 | - [Issues](#issues) 8 | - [Getting started](#getting-started) 9 | - [Installation](#installation) 10 | - [Quickstart](#quickstart) 11 | - [Persistence](#persistence) 12 | - [Maintenance](#maintenance) 13 | - [Creating backups](#creating-backups) 14 | - [Restoring backups](#restoring-backups) 15 | - [Upgrading](#upgrading) 16 | - [Shell Access](#shell-access) 17 | 18 | # Introduction 19 | 20 | `Dockerfile` to create a [Docker](https://www.docker.com/) container image for [ownCloud](https://owncloud.org/). 21 | 22 | ownCloud is a self-hosted open source application for file hosting and sharing. 23 | 24 | ## Contributing 25 | 26 | If you find this image useful here's how you can help: 27 | 28 | - Send a pull request with your awesome features and bug fixes 29 | - Help users resolve their [issues](../../issues?q=is%3Aopen+is%3Aissue). 30 | - Support the development of this image with a [donation](http://www.damagehead.com/donate/) 31 | 32 | ## Issues 33 | 34 | Before reporting your issue please try updating Docker to the latest version and check if it resolves the issue. Refer to the Docker [installation guide](https://docs.docker.com/installation) for instructions. 35 | 36 | SELinux users should try disabling SELinux using the command `setenforce 0` to see if it resolves the issue. 37 | 38 | If the above recommendations do not help then [report your issue](../../issues/new) along with the following information: 39 | 40 | - Output of the `docker version` and `docker info` commands 41 | - The `docker run` command or `docker-compose.yml` used to start the image. Mask out the sensitive bits. 42 | - Please state if you are using [Boot2Docker](http://www.boot2docker.io), [VirtualBox](https://www.virtualbox.org), etc. 43 | 44 | # Getting started 45 | 46 | ## Installation 47 | 48 | Automated builds of the image are available on [Dockerhub](https://hub.docker.com/r/sameersbn/owncloud) and is the recommended method of installation. 49 | 50 | > **Note**: Builds are also available on [Quay.io](https://quay.io/repository/sameersbn/owncloud) 51 | 52 | ```bash 53 | docker pull sameersbn/owncloud:10.0.10-0 54 | ``` 55 | 56 | Alternatively you can build the image yourself. 57 | 58 | ```bash 59 | docker build -t sameersbn/owncloud github.com/sameersbn/docker-owncloud 60 | ``` 61 | 62 | ## Quickstart 63 | 64 | The quickest way to start using this image is with [docker-compose](https://docs.docker.com/compose/). 65 | 66 | ```bash 67 | wget https://raw.githubusercontent.com/sameersbn/docker-owncloud/master/docker-compose.yml 68 | ``` 69 | 70 | Update the `OWNCLOUD_URL` environment variable in the `docker-compose.yml` file with the url from which ownCloud will be externally accessible. 71 | 72 | ```bash 73 | docker-compose up 74 | ``` 75 | 76 | Alternatively, you can start ownCloud manually using the Docker command line. 77 | 78 | Step 1. Launch a PostgreSQL container 79 | 80 | ```bash 81 | docker run --name owncloud-postgresql -itd --restart=always \ 82 | --env 'DB_NAME=owncloud_db' \ 83 | --env 'DB_USER=owncloud' --env 'DB_PASS=password' \ 84 | --volume /srv/docker/owncloud/postgresql:/var/lib/postgresql \ 85 | sameersbn/postgresql:9.6-4 86 | ``` 87 | 88 | Step 2. Launch the ownCloud php-fpm container 89 | 90 | ```bash 91 | docker run --name owncloud -itd --restart=always \ 92 | --env OWNCLOUD_URL=http://cloud.example.com:10080 \ 93 | --link owncloud-postgresql:postgresql \ 94 | --volume /srv/docker/owncloud/owncloud:/var/lib/owncloud \ 95 | sameersbn/owncloud:10.0.10-0 app:owncloud 96 | ``` 97 | 98 | Step 3. Launch a NGINX frontend container 99 | 100 | ```bash 101 | docker run --name owncloud-nginx -itd --restart=always \ 102 | --link owncloud:php-fpm \ 103 | --publish 10080:80 \ 104 | sameersbn/owncloud:10.0.10-0 app:nginx 105 | ``` 106 | 107 | Point your browser to `http://cloud.example.com:10080` and login using the default username and password: 108 | 109 | * username: **admin** 110 | * password: **password** 111 | 112 | > **Note** 113 | > 114 | > Use the `OWNCLOUD_ADMIN_USER` and `OWNCLOUD_ADMIN_PASSWORD` variables to create a custom admin user and password on the firstrun instead of the default credentials. 115 | 116 | ## Persistence 117 | 118 | For ownCloud to preserve its state across container shutdown and startup you should mount a volume at `/var/lib/owncloud`. 119 | 120 | > *The [Quickstart](#quickstart) command already mounts a volume for persistence.* 121 | 122 | SELinux users should update the security context of the host mountpoint so that it plays nicely with Docker: 123 | 124 | ```bash 125 | mkdir -p /srv/docker/owncloud 126 | chcon -Rt svirt_sandbox_file_t /srv/docker/owncloud 127 | ``` 128 | 129 | # Maintenance 130 | 131 | ## Creating backups 132 | 133 | The image allows users to create backups of the ownCloud installation using the `app:backup:create` command or the `owncloud-backup-create` helper script. The generated backup consists of configuration files, uploaded files and the sql database. 134 | 135 | Before generating a backup — stop and remove the running instance. 136 | 137 | ```bash 138 | docker stop owncloud && docker rm owncloud 139 | ``` 140 | 141 | Relaunch the container with the `app:backup:create` argument. 142 | 143 | ```bash 144 | docker run --name owncloud -it --rm [OPTIONS] \ 145 | sameersbn/owncloud:10.0.10-0 app:backup:create 146 | ``` 147 | 148 | The backup will be created in the `backups/` folder of the [Persistent](#persistence) volume. You can change the location using the `OWNCLOUD_BACKUPS_DIR` configuration parameter. 149 | 150 | > **NOTE** 151 | > 152 | > Backups can also be generated on a running instance using: 153 | > 154 | > ```bash 155 | > docker exec -it owncloud owncloud-backup-create 156 | > ``` 157 | 158 | By default backups are held indefinitely. Using the `OWNCLOUD_BACKUPS_EXPIRY` parameter you can configure how long (in seconds) you wish to keep the backups. For example, setting `OWNCLOUD_BACKUPS_EXPIRY=604800` will remove backups that are older than 7 days. Old backups are only removed when creating a new backup, never automatically. 159 | 160 | ## Restoring Backups 161 | 162 | Backups created using instructions from the [Creating backups](#creating-backups) section can be restored using the `app:backup:restore` argument. 163 | 164 | Before restoring a backup — stop and remove the running instance. 165 | 166 | ```bash 167 | docker stop owncloud && docker rm owncloud 168 | ``` 169 | 170 | Relaunch the container with the `app:backup:restore` argument. Ensure you launch the container in the interactive mode `-it`. 171 | 172 | ```bash 173 | docker run --name owncloud -it --rm [OPTIONS] \ 174 | sameersbn/owncloud:10.0.10-0 app:backup:restore 175 | ``` 176 | 177 | A list of existing backups will be displayed. Select a backup you wish to restore. 178 | 179 | To avoid this interaction you can specify the backup filename using the `BACKUP` argument to `app:backup:restore`, eg. 180 | 181 | ```bash 182 | docker run --name owncloud -it --rm [OPTIONS] \ 183 | sameersbn/owncloud:10.0.10-0 app:backup:restore BACKUP=1417624827_owncloud_backup.tar 184 | ``` 185 | 186 | ## Upgrading 187 | 188 | To upgrade to newer releases: 189 | 190 | 1. Download the updated Docker image: 191 | 192 | ```bash 193 | docker pull sameersbn/owncloud:10.0.10-0 194 | ``` 195 | 196 | 2. Stop the currently running image: 197 | 198 | ```bash 199 | docker stop owncloud 200 | ``` 201 | 202 | 3. Remove the stopped container 203 | 204 | ```bash 205 | docker rm -v owncloud 206 | ``` 207 | 208 | 4. Start the updated image 209 | 210 | ```bash 211 | docker run -name owncloud -itd \ 212 | [OPTIONS] \ 213 | sameersbn/owncloud:10.0.10-0 214 | ``` 215 | 216 | ## Shell Access 217 | 218 | For debugging and maintenance purposes you may want access the containers shell. If you are using Docker version `1.3.0` or higher you can access a running containers shell by starting `bash` using `docker exec`: 219 | 220 | ```bash 221 | docker exec -it owncloud bash 222 | ``` 223 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 10.0.10-0 2 | -------------------------------------------------------------------------------- /assets/build/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | download_and_extract() { 5 | src=${1} 6 | dest=${2} 7 | tarball=$(basename ${src}) 8 | 9 | if [[ ! -f ${OWNCLOUD_BUILD_ASSETS_DIR}/${tarball} ]]; then 10 | echo "Downloading ${1}..." 11 | wget ${src} -O ${OWNCLOUD_BUILD_ASSETS_DIR}/${tarball} 12 | fi 13 | 14 | echo "Extracting ${tarball}..." 15 | mkdir -p ${dest} 16 | tar xf ${OWNCLOUD_BUILD_ASSETS_DIR}/${tarball} --strip=1 -C ${dest} 17 | rm -rf ${OWNCLOUD_BUILD_ASSETS_DIR}/${tarball} 18 | } 19 | 20 | php_config_get() { 21 | local config=${1?config file not specified} 22 | local key=${2?key not specified} 23 | sed -n -e "s/^\(${key}=\)\(.*\)\(.*\)$/\2/p" ${config} 24 | } 25 | 26 | php_config_set() { 27 | local config=${1?config file not specified} 28 | local key=${2?key not specified} 29 | local value=${3?value not specified} 30 | local verbosity=${4:-verbose} 31 | 32 | if [[ ${verbosity} == verbose ]]; then 33 | echo "Setting ${config} parameter: ${key}=${value}" 34 | fi 35 | 36 | local current=$(php_config_get ${config} ${key}) 37 | if [[ "${current}" != "${value}" ]]; then 38 | if [[ $(sed -n -e "s/^[;]*[ ]*\(${key}\)=.*/\1/p" ${config}) == ${key} ]]; then 39 | value="$(echo "${value}" | sed 's|[&]|\\&|g')" 40 | sed -i "s|^[;]*[ ]*${key}=.*|${key}=${value}|" ${config} 41 | else 42 | echo "${key}=${value}" | tee -a ${config} >/dev/null 43 | fi 44 | fi 45 | } 46 | 47 | apt-get update 48 | 49 | DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ 50 | wget ca-certificates sudo nginx mysql-client postgresql-client gettext-base \ 51 | php${PHP_VERSION}-fpm php${PHP_VERSION}-cli php${PHP_VERSION}-gd \ 52 | php${PHP_VERSION}-pgsql php${PHP_VERSION}-mysql php${PHP_VERSION}-curl \ 53 | php${PHP_VERSION}-zip php${PHP_VERSION}-xml php${PHP_VERSION}-mbstring \ 54 | php${PHP_VERSION}-intl php${PHP_VERSION}-mcrypt php${PHP_VERSION}-ldap \ 55 | php${PHP_VERSION}-gmp php${PHP_VERSION}-apcu php${PHP_VERSION}-imagick 56 | 57 | # enabled required modules 58 | phpenmod -v ALL mcrypt 59 | 60 | # configure php.ini 61 | mkdir -p /run/php/ 62 | 63 | php_config_set "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf" "listen" "0.0.0.0:9000" 64 | php_config_set "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf" "env[PATH]" "/usr/local/bin:/usr/bin:/bin" 65 | php_config_set "/etc/php/${PHP_VERSION}/fpm/php.ini" "always_populate_raw_post_data" "-1" 66 | 67 | download_and_extract "https://download.owncloud.org/community/owncloud-${OWNCLOUD_VERSION}.tar.bz2" "${OWNCLOUD_INSTALL_DIR}" 68 | 69 | # set directory permissions 70 | find ${OWNCLOUD_INSTALL_DIR}/ -type f -print0 | xargs -0 chmod 0640 71 | find ${OWNCLOUD_INSTALL_DIR}/ -type d -print0 | xargs -0 chmod 0750 72 | chown -R root:${OWNCLOUD_USER} ${OWNCLOUD_INSTALL_DIR}/ 73 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_INSTALL_DIR}/apps/ 74 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_INSTALL_DIR}/config/ 75 | chown root:${OWNCLOUD_USER} ${OWNCLOUD_INSTALL_DIR}/.htaccess 76 | chmod 0644 ${OWNCLOUD_INSTALL_DIR}/.htaccess 77 | chown root:${OWNCLOUD_USER} ${OWNCLOUD_INSTALL_DIR}/.user.ini 78 | chmod 0644 ${OWNCLOUD_INSTALL_DIR}/.user.ini 79 | 80 | # remove default vhost 81 | rm -rf /etc/nginx/sites-enabled/default 82 | 83 | # clean up 84 | apt-get purge --auto-remove -y wget 85 | rm -rf /var/lib/apt/lists/* 86 | -------------------------------------------------------------------------------- /assets/runtime/config/nginx/ownCloud.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name {{OWNCLOUD_FQDN}}; 4 | 5 | # Path to the root of your installation 6 | root {{OWNCLOUD_INSTALL_DIR}}; 7 | 8 | # set max upload size 9 | client_max_body_size 0; 10 | fastcgi_buffers 64 4K; 11 | 12 | # Disable gzip to avoid the removal of the ETag header 13 | gzip off; 14 | 15 | # Uncomment if your server is build with the ngx_pagespeed module 16 | # This module is currently not supported. 17 | #pagespeed off; 18 | 19 | index index.php; 20 | error_page 403 /core/templates/403.php; 21 | error_page 404 /core/templates/404.php; 22 | 23 | rewrite ^/.well-known/carddav /remote.php/carddav/ permanent; 24 | rewrite ^/.well-known/caldav /remote.php/caldav/ permanent; 25 | 26 | # The following 2 rules are only needed for the user_webfinger app. 27 | # Uncomment it if you're planning to use this app. 28 | #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 29 | #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last; 30 | 31 | location = /robots.txt { 32 | allow all; 33 | log_not_found off; 34 | access_log off; 35 | } 36 | 37 | location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ { 38 | deny all; 39 | } 40 | 41 | location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { 42 | deny all; 43 | } 44 | 45 | location / { 46 | 47 | rewrite ^/remote/(.*) /remote.php last; 48 | 49 | rewrite ^(/core/doc/[^\/]+/)$ $1/index.html; 50 | 51 | try_files $uri $uri/ /index.php; 52 | } 53 | 54 | location ~ \.php(?:$|/) { 55 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 56 | include fastcgi_params; 57 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 58 | fastcgi_param PATH_INFO $fastcgi_path_info; 59 | fastcgi_param HTTPS {{OWNCLOUD_HTTPS}}; 60 | fastcgi_pass {{OWNCLOUD_PHP_FPM_HOST}}:{{OWNCLOUD_PHP_FPM_PORT}}; 61 | fastcgi_intercept_errors on; 62 | } 63 | 64 | # Adding the cache control header for js and css files 65 | # Make sure it is BELOW the location ~ \.php(?:$|/) { block 66 | location ~* \.(?:css|js)$ { 67 | add_header Cache-Control "public, max-age=7200"; 68 | # Optional: Don't log access to assets 69 | access_log off; 70 | } 71 | 72 | # Optional: Don't log access to other assets 73 | location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ { 74 | access_log off; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /assets/runtime/env-defaults: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## DEBUGGING 4 | DEBUG=${DEBUG:-false} 5 | 6 | ## CORE 7 | OWNCLOUD_CONFIG_DIR=${OWNCLOUD_CONFIG_DIR:-$OWNCLOUD_DATA_DIR/config} 8 | OWNCLOUD_OCDATA_DIR=${OWNCLOUD_OCDATA_DIR:-$OWNCLOUD_DATA_DIR/ocdata} 9 | OWNCLOUD_BACKUPS_DIR=${OWNCLOUD_BACKUPS_DIR:-$OWNCLOUD_DATA_DIR/backups} 10 | 11 | OWNCLOUD_ADMIN_USER=${OWNCLOUD_ADMIN_USER:-admin} 12 | OWNCLOUD_ADMIN_PASSWORD=${OWNCLOUD_ADMIN_PASSWORD:-password} 13 | 14 | OWNCLOUD_URL=${OWNCLOUD_URL:-} 15 | OWNCLOUD_URL=${OWNCLOUD_URL:-$PHP_FPM_ENV_OWNCLOUD_URL} 16 | OWNCLOUD_URL=${OWNCLOUD_URL:-http://localhost} 17 | 18 | # credits: http://stackoverflow.com/a/2506635/4799938 19 | OWNCLOUD_FQDN=$(sed -e "s/\([^/]*\)\:\/\/\([^@]*@\)\?\([^:/]*\).*/\3/" <<< ${OWNCLOUD_URL}) 20 | if [[ $(sed -e "s/\([^/]*\)\:\/\/\([^@]*@\)\?\([^:/]*\).*/\1/" <<< ${OWNCLOUD_URL}) == https ]]; then 21 | OWNCLOUD_HTTPS=${OWNCLOUD_HTTPS:-on} 22 | else 23 | OWNCLOUD_HTTPS=${OWNCLOUD_HTTPS:-off} 24 | fi 25 | 26 | OWNCLOUD_UPLOAD_MAX_FILESIZE=${OWNCLOUD_UPLOAD_MAX_FILESIZE:-4G} 27 | OWNCLOUD_MAX_FILE_UPLOADS=${OWNCLOUD_MAX_FILE_UPLOADS:-20} 28 | 29 | ## BACKUPS 30 | OWNCLOUD_BACKUPS_EXPIRY=${OWNCLOUD_BACKUPS_EXPIRY:-0} 31 | 32 | ## DATABASE 33 | DB_TYPE=${DB_TYPE:-} 34 | DB_HOST=${DB_HOST:-} 35 | DB_PORT=${DB_PORT:-} 36 | DB_NAME=${DB_NAME:-} 37 | DB_USER=${DB_USER:-} 38 | DB_PASS=${DB_PASS:-} 39 | 40 | ## PHP_FPM 41 | OWNCLOUD_PHP_FPM_HOST=${OWNCLOUD_PHP_FPM_HOST:-} 42 | OWNCLOUD_PHP_FPM_PORT=${OWNCLOUD_PHP_FPM_PORT:-} 43 | -------------------------------------------------------------------------------- /assets/runtime/functions: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | source ${OWNCLOUD_RUNTIME_ASSETS_DIR}/env-defaults 4 | 5 | OWNCLOUD_TEMPLATES_DIR=${OWNCLOUD_RUNTIME_ASSETS_DIR}/config 6 | OWNCLOUD_APP_CONFIG=${OWNCLOUD_CONFIG_DIR}/config.php 7 | OWNCLOUD_NGINX_CONFIG=/etc/nginx/sites-enabled/ownCloud.conf 8 | 9 | # Compares two version strings `a` and `b` 10 | # Returns 11 | # - negative integer, if `a` is less than `b` 12 | # - 0, if `a` and `b` are equal 13 | # - non-negative integer, if `a` is greater than `b` 14 | vercmp() { 15 | expr '(' "$1" : '\([^.]*\)' ')' '-' '(' "$2" : '\([^.]*\)' ')' '|' \ 16 | '(' "$1.0" : '[^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0" : '[^.]*[.]\([^.]*\)' ')' '|' \ 17 | '(' "$1.0.0" : '[^.]*[.][^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0.0" : '[^.]*[.][^.]*[.]\([^.]*\)' ')' '|' \ 18 | '(' "$1.0.0.0" : '[^.]*[.][^.]*[.][^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0.0.0" : '[^.]*[.][^.]*[.][^.]*[.]\([^.]*\)' ')' 19 | } 20 | 21 | # Read YAML file from Bash script 22 | # Credits: https://gist.github.com/pkuczynski/8665367 23 | parse_yaml() { 24 | local prefix=$2 25 | local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') 26 | sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ 27 | -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | 28 | awk -F$fs '{ 29 | indent = length($1)/2; 30 | vname[indent] = $2; 31 | for (i in vname) {if (i > indent) {delete vname[i]}} 32 | if (length($3) > 0) { 33 | vn=""; for (i=0; i/dev/null 62 | fi 63 | fi 64 | } 65 | 66 | ## Execute a command as OWNCLOUD_USER 67 | exec_as_owncloud() { 68 | if [[ $(whoami) == ${OWNCLOUD_USER} ]]; then 69 | $@ 70 | else 71 | sudo -HEu ${OWNCLOUD_USER} "$@" 72 | fi 73 | } 74 | 75 | occ_cli() { 76 | exec_as_owncloud php occ $@ 77 | } 78 | 79 | ## Copies configuration template in ${OWNCLOUD_TEMPLATES_DIR} to the destination as the specified USER 80 | # $1: ownership of destination file, uses `chown` 81 | # $2: source file 82 | # $3: destination location 83 | # $4: mode of destination, uses `chmod` (default: 0644) 84 | install_template() { 85 | local OWNERSHIP=${1} 86 | local SRC=${2} 87 | local DEST=${3} 88 | local MODE=${4:-0644} 89 | if [[ -f ${OWNCLOUD_TEMPLATES_DIR}/${SRC} ]]; then 90 | cp ${OWNCLOUD_TEMPLATES_DIR}/${SRC} ${DEST} 91 | fi 92 | chmod ${MODE} ${DEST} 93 | chown ${OWNERSHIP} ${DEST} 94 | } 95 | 96 | 97 | ## Replace placeholders with values 98 | # $1: file with placeholders to replace 99 | # $x: placeholders to replace 100 | update_template() { 101 | local FILE=${1?missing argument} 102 | shift 103 | 104 | [[ ! -f ${FILE} ]] && return 1 105 | 106 | local VARIABLES=($@) 107 | local USR=$(stat -c %U ${FILE}) 108 | local tmp_file=$(mktemp) 109 | cp -a "${FILE}" ${tmp_file} 110 | 111 | local variable 112 | for variable in ${VARIABLES[@]}; do 113 | # Keep the compatibilty: {{VAR}} => ${VAR} 114 | sed -ri "s/[{]{2}$variable[}]{2}/\${$variable}/g" ${tmp_file} 115 | done 116 | 117 | # Replace placeholders 118 | ( 119 | export ${VARIABLES[@]} 120 | local IFS=":"; sudo -HEu ${USR} envsubst "${VARIABLES[*]/#/$}" < ${tmp_file} > ${FILE} 121 | ) 122 | rm -f ${tmp_file} 123 | } 124 | 125 | owncloud_finalize_database_parameters() { 126 | # is a mysql or postgresql database linked? 127 | # requires that the mysql or postgresql containers have exposed 128 | # port 3306 and 5432 respectively. 129 | if [[ -n ${MYSQL_PORT_3306_TCP_ADDR} ]]; then 130 | DB_TYPE=${DB_TYPE:-mysql} 131 | DB_HOST=${DB_HOST:-mysql} 132 | DB_PORT=${DB_PORT:-$MYSQL_PORT_3306_TCP_PORT} 133 | 134 | # support for linked sameersbn/mysql image 135 | DB_USER=${DB_USER:-$MYSQL_ENV_DB_USER} 136 | DB_PASS=${DB_PASS:-$MYSQL_ENV_DB_PASS} 137 | DB_NAME=${DB_NAME:-$MYSQL_ENV_DB_NAME} 138 | 139 | # support for linked orchardup/mysql and enturylink/mysql image 140 | # also supports official mysql image 141 | DB_USER=${DB_USER:-$MYSQL_ENV_MYSQL_USER} 142 | DB_PASS=${DB_PASS:-$MYSQL_ENV_MYSQL_PASSWORD} 143 | DB_NAME=${DB_NAME:-$MYSQL_ENV_MYSQL_DATABASE} 144 | elif [[ -n ${POSTGRESQL_PORT_5432_TCP_ADDR} ]]; then 145 | DB_TYPE=${DB_TYPE:-pgsql} 146 | DB_HOST=${DB_HOST:-postgresql} 147 | DB_PORT=${DB_PORT:-$POSTGRESQL_PORT_5432_TCP_PORT} 148 | 149 | # support for linked official postgres image 150 | DB_USER=${DB_USER:-$POSTGRESQL_ENV_POSTGRES_USER} 151 | DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_POSTGRES_PASSWORD} 152 | DB_NAME=${DB_NAME:-$DB_USER} 153 | 154 | # support for linked sameersbn/postgresql image 155 | DB_USER=${DB_USER:-$POSTGRESQL_ENV_DB_USER} 156 | DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_DB_PASS} 157 | DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_DB_NAME} 158 | 159 | # support for linked orchardup/postgresql image 160 | DB_USER=${DB_USER:-$POSTGRESQL_ENV_POSTGRESQL_USER} 161 | DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_POSTGRESQL_PASS} 162 | DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_POSTGRESQL_DB} 163 | 164 | # support for linked paintedfox/postgresql image 165 | DB_USER=${DB_USER:-$POSTGRESQL_ENV_USER} 166 | DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_PASS} 167 | DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_DB} 168 | fi 169 | 170 | if [[ -z ${DB_HOST} ]]; then 171 | echo 172 | echo "ERROR: " 173 | echo " Please configure the database connection." 174 | echo " Cannot continue without a database. Aborting..." 175 | echo 176 | return 1 177 | fi 178 | 179 | # use default port number if it is still not set 180 | case ${DB_TYPE} in 181 | mysql) DB_PORT=${DB_PORT:-3306} ;; 182 | pgsql) DB_PORT=${DB_PORT:-5432} ;; 183 | *) 184 | echo 185 | echo "ERROR: " 186 | echo " Please specify the database type in use via the DB_TYPE configuration option." 187 | echo " Accepted values are \"pgsql\" or \"mysql\". Aborting..." 188 | echo 189 | return 1 190 | ;; 191 | esac 192 | 193 | # set default user and database 194 | DB_USER=${DB_USER:-root} 195 | DB_NAME=${DB_NAME:-ownclouddb} 196 | } 197 | 198 | owncloud_finalize_php_fpm_parameters() { 199 | # is a owncloud-php-fpm container linked? 200 | if [[ -n ${PHP_FPM_PORT_9000_TCP_ADDR} ]]; then 201 | OWNCLOUD_PHP_FPM_HOST=${OWNCLOUD_PHP_FPM_HOST:-$PHP_FPM_PORT_9000_TCP_ADDR} 202 | OWNCLOUD_PHP_FPM_PORT=${OWNCLOUD_PHP_FPM_PORT:-$PHP_FPM_PORT_9000_TCP_PORT} 203 | fi 204 | 205 | if [[ -z ${OWNCLOUD_PHP_FPM_HOST} ]]; then 206 | echo 207 | echo "ERROR: " 208 | echo " Please configure the php-fpm connection. Aborting..." 209 | echo 210 | return 1 211 | fi 212 | 213 | # use default php-fpm port number if it is still not set 214 | OWNCLOUD_PHP_FPM_PORT=${OWNCLOUD_PHP_FPM_PORT:-9000} 215 | } 216 | 217 | owncloud_check_database_connection() { 218 | case ${DB_TYPE} in 219 | mysql) 220 | prog="mysqladmin -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASS:+-p$DB_PASS} status" 221 | ;; 222 | pgsql) 223 | prog=$(find /usr/lib/postgresql/ -name pg_isready) 224 | prog="${prog} -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -t 1" 225 | ;; 226 | esac 227 | timeout=60 228 | while ! ${prog} >/dev/null 2>&1 229 | do 230 | timeout=$(expr $timeout - 1) 231 | if [[ $timeout -eq 0 ]]; then 232 | echo 233 | echo "Could not connect to database server. Aborting..." 234 | return 1 235 | fi 236 | echo -n "." 237 | sleep 1 238 | done 239 | echo 240 | } 241 | 242 | owncloud_configure_database() { 243 | echo -n "Configuring ownCloud::database" 244 | 245 | owncloud_finalize_database_parameters 246 | owncloud_check_database_connection 247 | 248 | if [[ -f ${OWNCLOUD_APP_CONFIG} ]]; then 249 | occ_cli config:system:set dbtype --value ${DB_TYPE} 250 | occ_cli config:system:set dbhost --value ${DB_HOST}:${DB_PORT} 251 | occ_cli config:system:set dbname --value ${DB_NAME} 252 | occ_cli config:system:set dbuser --value ${DB_USER} 253 | occ_cli config:system:set dbpassword --value ${DB_PASS} -q 254 | fi 255 | } 256 | 257 | owncloud_upgrade() { 258 | # perform installation on firstrun 259 | case ${DB_TYPE} in 260 | mysql) 261 | QUERY="SELECT count(*) FROM information_schema.tables WHERE table_schema = '${DB_NAME}';" 262 | COUNT=$(mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASS:+-p$DB_PASS} -ss -e "${QUERY}") 263 | ;; 264 | pgsql) 265 | QUERY="SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public';" 266 | COUNT=$(PGPASSWORD="${DB_PASS}" psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -Atw -c "${QUERY}") 267 | ;; 268 | esac 269 | 270 | local update_version=false 271 | if [[ -z ${COUNT} || ${COUNT} -eq 0 ]]; then 272 | echo "Setting up ownCloud for firstrun..." 273 | mkdir -p ${OWNCLOUD_INSTALL_DIR}/data 274 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_INSTALL_DIR}/data 275 | 276 | occ_cli maintenance:install \ 277 | --database=${DB_TYPE} --database-host=${DB_HOST}:${DB_PORT} \ 278 | --database-name=${DB_NAME} --database-user=${DB_USER} --database-pass=${DB_PASS} \ 279 | --admin-user=${OWNCLOUD_ADMIN_USER} --admin-pass=${OWNCLOUD_ADMIN_PASSWORD} \ 280 | --data-dir=${OWNCLOUD_OCDATA_DIR} 281 | 282 | update_version=true 283 | else 284 | CACHE_VERSION= 285 | [[ -f ${OWNCLOUD_CONFIG_DIR}/VERSION ]] && CACHE_VERSION=$(cat ${OWNCLOUD_CONFIG_DIR}/VERSION) 286 | if [[ ${OWNCLOUD_VERSION} != ${CACHE_VERSION} ]]; then 287 | ## version check, only upgrades are allowed 288 | if [[ -n ${CACHE_VERSION} && $(vercmp ${OWNCLOUD_VERSION} ${CACHE_VERSION}) -lt 0 ]]; then 289 | echo 290 | echo "ERROR: " 291 | echo " Cannot downgrade from ownCloud version ${CACHE_VERSION} to ${OWNCLOUD_VERSION}." 292 | echo " Only upgrades are allowed. Please use sameersbn/owncloud:${CACHE_VERSION} or higher." 293 | echo " Cannot continue. Aborting!" 294 | echo 295 | return 1 296 | fi 297 | 298 | echo "Upgrading ownCloud..." 299 | occ_cli maintenance:mode --on 300 | occ_cli upgrade 301 | occ_cli maintenance:mode --off 302 | 303 | update_version=true 304 | fi 305 | fi 306 | 307 | if [[ ${update_version} == true ]]; then 308 | echo -n "${OWNCLOUD_VERSION}" | exec_as_owncloud tee ${OWNCLOUD_CONFIG_DIR}/VERSION >/dev/null 309 | fi 310 | } 311 | 312 | owncloud_configure_domain() { 313 | echo "Configuring ownCloud::trusted_domain..." 314 | occ_cli config:system:set -q trusted_domains 0 --value ${OWNCLOUD_FQDN} 315 | } 316 | 317 | owncloud_configure_max_upload_size() { 318 | echo "Configuring ownCloud::max_upload_size..." 319 | php_config_set "${OWNCLOUD_INSTALL_DIR}/.user.ini" "upload_max_filesize" "${OWNCLOUD_UPLOAD_MAX_FILESIZE}" 320 | php_config_set "${OWNCLOUD_INSTALL_DIR}/.user.ini" "post_max_size" "${OWNCLOUD_UPLOAD_MAX_FILESIZE}" 321 | } 322 | 323 | owncloud_configure_max_file_uploads() { 324 | echo "Configuring ownCloud::max_file_uploads..." 325 | php_config_set "${OWNCLOUD_INSTALL_DIR}/.user.ini" "max_file_uploads" "${OWNCLOUD_MAX_FILE_UPLOADS}" 326 | } 327 | 328 | nginx_configure_virtualhost() { 329 | echo "Configuring ownCloud virtualhost..." 330 | owncloud_finalize_php_fpm_parameters 331 | update_template ${OWNCLOUD_NGINX_CONFIG} \ 332 | OWNCLOUD_FQDN \ 333 | OWNCLOUD_HTTPS \ 334 | OWNCLOUD_PHP_FPM_HOST \ 335 | OWNCLOUD_PHP_FPM_PORT 336 | } 337 | 338 | backup_dump_database() { 339 | case ${DB_TYPE} in 340 | pgsql) 341 | echo "Dumping PostgreSQL database ${DB_NAME}..." 342 | PGPASSWORD=${DB_PASS} pg_dump --clean \ 343 | --host ${DB_HOST} --port ${DB_PORT} \ 344 | --username ${DB_USER} ${DB_NAME} > ${OWNCLOUD_BACKUPS_DIR}/database.sql 345 | ;; 346 | mysql) 347 | echo "Dumping MySQL database ${DB_NAME}..." 348 | MYSQL_PWD=${DB_PASS} mysqldump --lock-tables --add-drop-table \ 349 | --host ${DB_HOST} --port ${DB_PORT} \ 350 | --user ${DB_USER} ${DB_NAME} > ${OWNCLOUD_BACKUPS_DIR}/database.sql 351 | ;; 352 | esac 353 | chown ${OWNCLOUD_USER}: ${OWNCLOUD_BACKUPS_DIR}/database.sql 354 | exec_as_owncloud gzip -f ${OWNCLOUD_BACKUPS_DIR}/database.sql 355 | } 356 | 357 | backup_dump_directory() { 358 | local directory=${1} 359 | local dirname=$(basename ${directory}) 360 | local extension=${2} 361 | 362 | echo "Dumping ${dirname}..." 363 | exec_as_owncloud tar -cf ${OWNCLOUD_BACKUPS_DIR}/${dirname}${extension} -C ${directory} . 364 | } 365 | 366 | backup_dump_information() { 367 | ( 368 | echo "info:" 369 | echo " owncloud_version: ${OWNCLOUD_VERSION}" 370 | echo " database_adapter: $(occ_cli config:system:get dbtype)" 371 | echo " created_at: $(date)" 372 | ) > ${OWNCLOUD_BACKUPS_DIR}/backup_information.yml 373 | chown ${OWNCLOUD_USER}: ${OWNCLOUD_BACKUPS_DIR}/backup_information.yml 374 | } 375 | 376 | backup_create_archive() { 377 | local tar_file="$(date +%s)_owncloud_backup.tar" 378 | 379 | echo "Creating backup archive: ${tar_file}..." 380 | exec_as_owncloud tar -cf ${OWNCLOUD_BACKUPS_DIR}/${tar_file} -C ${OWNCLOUD_BACKUPS_DIR} $@ 381 | exec_as_owncloud chmod 0755 ${OWNCLOUD_BACKUPS_DIR}/${tar_file} 382 | 383 | for f in $@ 384 | do 385 | exec_as_owncloud rm -rf ${OWNCLOUD_BACKUPS_DIR}/${f} 386 | done 387 | } 388 | 389 | backup_purge_expired() { 390 | if [[ ${OWNCLOUD_BACKUPS_EXPIRY} -gt 0 ]]; then 391 | echo -n "Deleting old backups... " 392 | local removed=0 393 | local now=$(date +%s) 394 | local cutoff=$(expr ${now} - ${OWNCLOUD_BACKUPS_EXPIRY}) 395 | for backup in $(ls ${OWNCLOUD_BACKUPS_DIR}/*_owncloud_backup.tar) 396 | do 397 | local timestamp=$(stat -c %Y ${backup}) 398 | if [[ ${timestamp} -lt ${cutoff} ]]; then 399 | rm ${backup} 400 | removed=$(expr ${removed} + 1) 401 | fi 402 | done 403 | echo "(${removed} removed)" 404 | fi 405 | } 406 | 407 | backup_restore_unpack() { 408 | local backup=${1} 409 | echo "Unpacking ${backup}..." 410 | tar xf ${OWNCLOUD_BACKUPS_DIR}/${backup} -C ${OWNCLOUD_BACKUPS_DIR} 411 | } 412 | 413 | backup_restore_validate() { 414 | eval $(parse_yaml ${OWNCLOUD_BACKUPS_DIR}/backup_information.yml backup_) 415 | 416 | ## version check 417 | if [[ $(vercmp ${OWNCLOUD_VERSION} ${backup_info_owncloud_version}) -lt 0 ]]; then 418 | echo 419 | echo "ERROR: " 420 | echo " Cannot restore backup for version ${backup_info_owncloud_version} on a ${OWNCLOUD_VERSION} instance." 421 | echo " You can only restore backups generated for versions <= ${OWNCLOUD_VERSION}." 422 | echo " Please use sameersbn/owncloud:${backup_info_owncloud_version} to restore this backup." 423 | echo " Cannot continue. Aborting!" 424 | echo 425 | return 1 426 | fi 427 | 428 | ## database adapter check 429 | if [[ ${DB_TYPE} != ${backup_info_database_adapter} ]]; then 430 | echo 431 | echo "ERROR:" 432 | echo " Your current setup uses the ${DB_TYPE} adapter, while the database" 433 | echo " backup was generated with the ${backup_info_database_adapter} adapter." 434 | echo " Cannot continue. Aborting!" 435 | echo 436 | return 1 437 | fi 438 | exec_as_owncloud rm -rf ${OWNCLOUD_BACKUPS_DIR}/backup_information.yml 439 | } 440 | 441 | backup_restore_database() { 442 | case ${DB_TYPE} in 443 | pgsql) 444 | echo "Restoring PostgreSQL database..." 445 | gzip -dc ${OWNCLOUD_BACKUPS_DIR}/database.sql.gz | \ 446 | PGPASSWORD=${DB_PASS} psql \ 447 | --host ${DB_HOST} --port ${DB_PORT} \ 448 | --username ${DB_USER} ${DB_NAME} 449 | ;; 450 | mysql) 451 | echo "Restoring MySQL database..." 452 | gzip -dc ${OWNCLOUD_BACKUPS_DIR}/database.sql.gz | \ 453 | MYSQL_PWD=${DB_PASS} mysql \ 454 | --host ${DB_HOST} --port ${DB_PORT} \ 455 | --user ${DB_USER} ${DB_NAME} 456 | ;; 457 | *) 458 | echo "Database type ${DB_TYPE} not supported." 459 | return 1 460 | ;; 461 | esac 462 | exec_as_owncloud rm -rf ${OWNCLOUD_BACKUPS_DIR}/database.sql.gz 463 | } 464 | 465 | backup_restore_directory() { 466 | local directory=${1} 467 | local dirname=$(basename ${directory}) 468 | local extension=${2} 469 | 470 | echo "Restoring ${dirname}..." 471 | files=($(shopt -s nullglob;shopt -s dotglob;echo ${directory}/*)) 472 | if [[ ${#files[@]} -gt 0 ]]; then 473 | exec_as_owncloud mv ${directory} ${directory}.$(date +%s) 474 | else 475 | exec_as_owncloud rm -rf ${directory} 476 | fi 477 | exec_as_owncloud mkdir -p ${directory} 478 | exec_as_owncloud tar -xf ${OWNCLOUD_BACKUPS_DIR}/${dirname}${extension} -C ${directory} 479 | exec_as_owncloud rm -rf ${OWNCLOUD_BACKUPS_DIR}/${dirname}${extension} 480 | } 481 | 482 | install_configuration_templates() { 483 | echo "Installing configuration templates..." 484 | if [[ -d /etc/nginx/sites-enabled && ! -f ${OWNCLOUD_NGINX_CONFIG} ]]; then 485 | install_template root: nginx/ownCloud.conf ${OWNCLOUD_NGINX_CONFIG} 0644 486 | update_template ${OWNCLOUD_NGINX_CONFIG} OWNCLOUD_INSTALL_DIR 487 | fi 488 | } 489 | 490 | initialize_datadir() { 491 | echo "Initializing datadir..." 492 | mkdir -p ${OWNCLOUD_DATA_DIR} 493 | chmod 0755 ${OWNCLOUD_DATA_DIR} 494 | chown ${OWNCLOUD_USER}: ${OWNCLOUD_DATA_DIR} 495 | 496 | # create ocdata directory 497 | mkdir -p ${OWNCLOUD_OCDATA_DIR} 498 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_OCDATA_DIR} 499 | chmod -R 0750 ${OWNCLOUD_OCDATA_DIR} 500 | 501 | # create config directory 502 | mkdir -p ${OWNCLOUD_CONFIG_DIR} 503 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_CONFIG_DIR} 504 | chmod -R 0750 ${OWNCLOUD_CONFIG_DIR} 505 | 506 | # create backups directory 507 | mkdir -p ${OWNCLOUD_BACKUPS_DIR} 508 | chmod -R 0755 ${OWNCLOUD_BACKUPS_DIR} 509 | chown -R ${OWNCLOUD_USER}: ${OWNCLOUD_BACKUPS_DIR} 510 | 511 | # symlink to config/config.php -> ${OWNCLOUD_APP_CONFIG} 512 | ln -sf ${OWNCLOUD_APP_CONFIG} ${OWNCLOUD_INSTALL_DIR}/config/config.php 513 | } 514 | 515 | initialize_system() { 516 | initialize_datadir 517 | install_configuration_templates 518 | } 519 | 520 | configure_owncloud() { 521 | echo "Configuring ownCloud..." 522 | owncloud_configure_database 523 | owncloud_upgrade 524 | owncloud_configure_domain 525 | owncloud_configure_max_upload_size 526 | owncloud_configure_max_file_uploads 527 | 528 | if [[ -f ${OWNCLOUD_APP_CONFIG} ]]; then 529 | occ_cli maintenance:mode --quiet --off 530 | fi 531 | } 532 | 533 | configure_nginx() { 534 | echo "Configuring nginx..." 535 | nginx_configure_virtualhost 536 | } 537 | 538 | backup_create() { 539 | echo -n "Checking database connection" 540 | owncloud_finalize_database_parameters 541 | owncloud_check_database_connection 542 | 543 | occ_cli maintenance:mode --on 544 | backup_dump_database 545 | backup_dump_directory ${OWNCLOUD_CONFIG_DIR} .tar.gz 546 | backup_dump_directory ${OWNCLOUD_OCDATA_DIR} .tar 547 | backup_dump_information 548 | backup_create_archive backup_information.yml database.sql.gz config.tar.gz ocdata.tar 549 | backup_purge_expired 550 | occ_cli maintenance:mode --off 551 | } 552 | 553 | backup_restore() { 554 | local tar_file= 555 | local interactive=true 556 | for arg in $@ 557 | do 558 | if [[ $arg == BACKUP=* ]]; then 559 | tar_file=${arg##BACKUP=} 560 | interactive=false 561 | break 562 | fi 563 | done 564 | 565 | # user needs to select the backup to restore 566 | if [[ $interactive == true ]]; then 567 | num_backups=$(ls ${OWNCLOUD_BACKUPS_DIR}/*_owncloud_backup.tar | wc -l) 568 | if [[ $num_backups -eq 0 ]]; then 569 | echo "No backups exist at ${OWNCLOUD_BACKUPS_DIR}. Cannot continue." 570 | return 1 571 | fi 572 | 573 | echo 574 | for b in $(ls ${OWNCLOUD_BACKUPS_DIR} | grep _owncloud_backup.tar | sort -r) 575 | do 576 | echo "‣ $b (created at $(date --date="@${b%%_owncloud_backup.tar}" +'%d %b, %G - %H:%M:%S %Z'))" 577 | done 578 | echo 579 | 580 | read -p "Select a backup to restore: " tar_file 581 | 582 | if [[ -z ${tar_file} ]]; then 583 | echo "Backup not specified. Exiting..." 584 | return 1 585 | fi 586 | fi 587 | 588 | if [[ ! -f ${OWNCLOUD_BACKUPS_DIR}/${tar_file} ]]; then 589 | echo "Specified backup does not exist. Aborting..." 590 | return 1 591 | fi 592 | 593 | echo -n "Checking database connection" 594 | owncloud_finalize_database_parameters 595 | owncloud_check_database_connection 596 | 597 | backup_restore_unpack ${tar_file} 598 | backup_restore_validate 599 | backup_restore_database 600 | backup_restore_directory ${OWNCLOUD_CONFIG_DIR} .tar.gz 601 | backup_restore_directory ${OWNCLOUD_OCDATA_DIR} .tar 602 | } 603 | -------------------------------------------------------------------------------- /assets/tools/occ: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | source ${OWNCLOUD_RUNTIME_ASSETS_DIR}/functions 4 | 5 | cd ${OWNCLOUD_INSTALL_DIR} 6 | occ_cli $@ 7 | -------------------------------------------------------------------------------- /assets/tools/owncloud-backup-create: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## Script to generate backup of a running ownCloud instance from the BASH shell 3 | 4 | set -e 5 | source ${OWNCLOUD_RUNTIME_ASSETS_DIR}/functions 6 | 7 | backup_create $@ 8 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | postgresql: 5 | restart: always 6 | image: sameersbn/postgresql:9.6-4 7 | environment: 8 | - DB_USER=owncloud 9 | - DB_PASS=password 10 | - DB_NAME=owncloud_db 11 | volumes: 12 | - /srv/docker/owncloud/postgresql:/var/lib/postgresql 13 | 14 | owncloud: 15 | restart: always 16 | image: sameersbn/owncloud:10.0.10-0 17 | command: app:owncloud 18 | environment: 19 | - DEBUG=false 20 | - TZ=Asia/Kolkata 21 | 22 | - DB_TYPE=pgsql 23 | - DB_HOST=postgresql 24 | - DB_USER=owncloud 25 | - DB_PASS=password 26 | - DB_NAME=owncloud_db 27 | 28 | - OWNCLOUD_URL=http://cloud.example.com:10080 29 | 30 | - OWNCLOUD_ADMIN_USER= 31 | - OWNCLOUD_ADMIN_PASSWORD= 32 | 33 | - OWNCLOUD_UPLOAD_MAX_FILESIZE=4G 34 | - OWNCLOUD_MAX_FILE_UPLOADS=20 35 | 36 | - OWNCLOUD_BACKUPS_EXPIRY=0 37 | depends_on: 38 | - postgresql 39 | volumes: 40 | - /srv/docker/owncloud/owncloud:/var/lib/owncloud 41 | 42 | nginx: 43 | restart: always 44 | image: sameersbn/owncloud:10.0.10-0 45 | command: app:nginx 46 | environment: 47 | - OWNCLOUD_PHP_FPM_HOST=owncloud 48 | - OWNCLOUD_PHP_FPM_PORT=9000 49 | depends_on: 50 | - owncloud 51 | ports: 52 | - "10080:80" 53 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | source ${OWNCLOUD_RUNTIME_ASSETS_DIR}/functions 4 | 5 | [[ $DEBUG == true ]] && set -x 6 | 7 | case ${1} in 8 | app:owncloud|app:nginx|app:backup:create|app:backup:restore|occ) 9 | 10 | initialize_system 11 | 12 | case ${1} in 13 | app:owncloud) 14 | configure_owncloud 15 | echo "Starting ownCloud php-fpm${PHP_VERSION}..." 16 | exec $(which php-fpm${PHP_VERSION}) -F 17 | ;; 18 | app:nginx) 19 | configure_nginx 20 | echo "Starting nginx..." 21 | exec $(which nginx) -c /etc/nginx/nginx.conf -g "daemon off;" 22 | ;; 23 | app:backup:create) 24 | shift 1 25 | backup_create 26 | ;; 27 | app:backup:restore) 28 | shift 1 29 | backup_restore $@ 30 | ;; 31 | occ) 32 | exec $@ 33 | ;; 34 | esac 35 | ;; 36 | app:help) 37 | echo "Available options:" 38 | echo " occ - Launch the ownCloud's command-line interface" 39 | echo " app:owncloud - Starts the ownCloud php5-fpm server (default)" 40 | echo " app:nginx - Starts the nginx server" 41 | echo " app:backup:create - Create a backup" 42 | echo " app:backup:restore - Restore an existing backup" 43 | echo " app:help - Displays the help" 44 | echo " [command] - Execute the specified command, eg. bash." 45 | ;; 46 | *) 47 | exec "$@" 48 | ;; 49 | esac 50 | -------------------------------------------------------------------------------- /kubernetes/nginx-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: nginx 5 | labels: 6 | name: nginx 7 | spec: 8 | type: LoadBalancer 9 | ports: 10 | - name: http 11 | port: 80 12 | targetPort: 80 13 | protocol: TCP 14 | selector: 15 | name: nginx 16 | -------------------------------------------------------------------------------- /kubernetes/nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | labels: 6 | name: nginx 7 | spec: 8 | containers: 9 | - name: nginx 10 | image: sameersbn/owncloud:10.0.10-0 11 | args: ["app:nginx"] 12 | env: 13 | - name: OWNCLOUD_URL 14 | value: http://cloud.example.com 15 | 16 | - name: OWNCLOUD_PHP_FPM_HOST 17 | value: owncloud 18 | - name: OWNCLOUD_PHP_FPM_PORT 19 | value: "9000" 20 | 21 | ports: 22 | - name: http 23 | containerPort: 80 24 | protocol: TCP 25 | livenessProbe: 26 | httpGet: 27 | path: / 28 | port: 80 29 | initialDelaySeconds: 5 30 | timeoutSeconds: 1 31 | -------------------------------------------------------------------------------- /kubernetes/owncloud-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: owncloud 5 | labels: 6 | name: owncloud 7 | spec: 8 | ports: 9 | - name: php-fpm 10 | port: 9000 11 | targetPort: 9000 12 | protocol: TCP 13 | selector: 14 | name: owncloud 15 | -------------------------------------------------------------------------------- /kubernetes/owncloud.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: owncloud 5 | labels: 6 | name: owncloud 7 | spec: 8 | containers: 9 | - name: owncloud 10 | image: sameersbn/owncloud:10.0.10-0 11 | args: ["app:owncloud"] 12 | env: 13 | - name: TZ 14 | value: Asia/Kolkata 15 | - name: DEBUG 16 | value: "false" 17 | 18 | - name: OWNCLOUD_URL 19 | value: http://cloud.example.com 20 | 21 | - name: OWNCLOUD_ADMIN_USER 22 | value: admin 23 | - name: OWNCLOUD_ADMIN_PASSWORD 24 | value: password 25 | 26 | - name: OWNCLOUD_UPLOAD_MAX_FILESIZE 27 | value: 4G 28 | - name: OWNCLOUD_MAX_FILE_UPLOADS 29 | value: "20" 30 | 31 | - name: DB_TYPE 32 | value: pgsql 33 | - name: DB_HOST 34 | value: postgresql 35 | - name: DB_PORT 36 | value: "5432" 37 | - name: DB_USER 38 | value: owncloud 39 | - name: DB_PASS 40 | value: password 41 | - name: DB_NAME 42 | value: owncloud_db 43 | 44 | ports: 45 | - name: php-fpm 46 | containerPort: 9000 47 | protocol: TCP 48 | volumeMounts: 49 | - mountPath: /var/lib/owncloud 50 | name: data 51 | livenessProbe: 52 | tcpSocket: 53 | port: 9000 54 | initialDelaySeconds: 5 55 | timeoutSeconds: 1 56 | volumes: 57 | - name: data 58 | emptyDir: {} 59 | -------------------------------------------------------------------------------- /kubernetes/postgresql-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: postgresql 5 | labels: 6 | name: postgresql 7 | spec: 8 | ports: 9 | - port: 5432 10 | targetPort: 5432 11 | protocol: TCP 12 | selector: 13 | name: postgresql 14 | -------------------------------------------------------------------------------- /kubernetes/postgresql.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: postgresql 5 | labels: 6 | name: postgresql 7 | spec: 8 | containers: 9 | - name: postgresql 10 | image: sameersbn/postgresql:9.6-4 11 | env: 12 | - name: DB_USER 13 | value: owncloud 14 | - name: DB_PASS 15 | value: password 16 | - name: DB_NAME 17 | value: owncloud_db 18 | ports: 19 | - containerPort: 5432 20 | protocol: TCP 21 | volumeMounts: 22 | - mountPath: /var/lib/postgresql 23 | name: data 24 | livenessProbe: 25 | tcpSocket: 26 | port: 5432 27 | initialDelaySeconds: 30 28 | timeoutSeconds: 5 29 | volumes: 30 | - name: data 31 | emptyDir: {} 32 | --------------------------------------------------------------------------------