Compare commits

..

22 Commits

Author SHA1 Message Date
738f71e6de chore: publish 3.1.0+25.0.1-fpm release 2023-01-20 11:16:56 +01:00
5c80e759e5 update release file for next release 2023-01-20 11:14:10 +01:00
3wc
782593c07c Update abra syntax in examples (finally) [mass update] 2023-01-19 16:02:28 -08:00
19c260b8da healthchecks (#32)
Adding healthchecks for nginx, mariadb, redis and php-fpm

Co-authored-by: Moritz <moritz.m@local-it.org>
Reviewed-on: coop-cloud/nextcloud#32
2023-01-12 21:16:31 +00:00
3156757fee feat: run occ commands from env variables as post deploy command 2023-01-10 18:09:11 +01:00
012e9c2310 feat: set default quota via abra app cmd 2022-12-14 12:12:41 +01:00
805b29d918 feat: template fpm settings
this closes #25
2022-12-13 15:31:38 +01:00
9148747de6 chore: clean up .env.sample 2022-12-07 16:18:37 +01:00
c646f95706 refactor: move nc-app secrets to seperate overwrite yml 2022-12-07 16:15:26 +01:00
f0bbb28626 feat: make smtp settings configurable in .env 2022-12-07 15:51:57 +01:00
0e8c5ecd17 fix CI deployment: set bbb and onlyoffice secret version 2022-12-06 15:11:01 +01:00
f87f9fc4da use docker secrets for bbb 2022-12-06 14:47:29 +01:00
1b76b6211f add install_onlyoffice command 2022-12-06 13:27:45 +01:00
17bedc79e5 chore: publish 3.0.1+25.0.1-fpm release 2022-12-02 11:26:02 +01:00
3wc
26bd2225d4 Fix typo in db_password versioning 2022-11-22 18:43:52 -08:00
832655e360 chore: publish 3.0.0+25.0.1-fpm release 2022-11-18 17:33:04 +01:00
3wc
b86b044e5e Return to <recipe>.example.com templating 2022-11-18 07:25:03 -08:00
8a3e9f1317 Add install_bbb app command 2022-11-16 15:48:21 +01:00
0278daa5b6 refactor: clean abra.sh file from old unused functions 2022-11-15 11:04:35 +01:00
3wc
0f6b38557c Set config versions for CI deployment 2022-11-12 19:38:10 -08:00
3wc
d3d1aee6a3 Auto-create proxy network during CI test 2022-11-12 19:29:06 -08:00
63ce9a6fb9 Merge pull request 'Automatically install apps specified via env variable.' (#29) from auto_app_install into main
Reviewed-on: coop-cloud/nextcloud#29
2022-11-09 09:48:22 +00:00
18 changed files with 511 additions and 247 deletions

33
.drone.yml Normal file
View File

@ -0,0 +1,33 @@
---
kind: pipeline
name: deploy to swarm-test.autonomic.zone
steps:
- name: deployment
image: decentral1se/stack-ssh-deploy:latest
settings:
host: swarm-test.autonomic.zone
stack: nextcloud
generate_secrets: true
purge: true
deploy_key:
from_secret: drone_ssh_swarm_test
networks:
- proxy
environment:
DOMAIN: nextcloud.swarm-test.autonomic.zone
STACK_NAME: nextcloud
LETS_ENCRYPT_ENV: production
ADMIN_USER: foobar
FPM_TUNE_VERSION: v1
NGINX_CONF_VERSION: v1
MY_CNF_VERSION: v1
ENTRYPOINT_VERSION: v1
SECRET_DB_PASSWORD_VERSION: v1
SECRET_DB_ROOT_PASSWORD_VERSION: v1
SECRET_ADMIN_PASSWORD_VERSION: v1
SECRET_ONLYOFFICE_JWT_VERSION: v1
SECRET_BBB_SECRET_VERSION: v1
EXTRA_VOLUME: "/dev/null:/tmp/.dummy"
trigger:
branch:
- main

53
.env.sample Normal file
View File

@ -0,0 +1,53 @@
TYPE=nextcloud
DOMAIN=nextcloud.example.com
## Domain aliases
#EXTRA_DOMAINS=', `www.nextcloud.example.com`'
LETS_ENCRYPT_ENV=production
COMPOSE_FILE="compose.yml"
COMPOSE_FILE="$COMPOSE_FILE:compose.mariadb.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.postgres.yml"
ADMIN_USER=admin
SECRET_DB_ROOT_PASSWORD_VERSION=v1
SECRET_DB_PASSWORD_VERSION=v1
SECRET_ADMIN_PASSWORD_VERSION=v1
EXTRA_VOLUME=/dev/null:/tmp/.dummy
# fpm-tune, see: https://spot13.com/pmcalculator/
FPM_MAX_CHILDREN=131
FPM_START_SERVERS=32
FPM_MIN_SPARE_SERVERS=32
FPM_MAX_SPARE_SERVERS=98
DEFAULT_QUOTA="10 GB"
# X_FRAME_OPTIONS_ENABLED=1
# X_FRAME_OPTIONS_ALLOW_FROM=embedding-site.example.org
# COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
# See https://github.com/nextcloud/docker#auto-configuration-via-environment-variables for default values
# SMTP_AUTHTYPE=
# SMTP_HOST=
# SMTP_SECURE=
# SMTP_NAME=
# SMTP_PORT=
# MAIL_FROM_ADDRESS=
# MAIL_DOMAIN=
# SECRET_SMTP_PASSWORD_VERSION=v1
# COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml"
# APPS="calendar sociallogin onlyoffice"
#
# ONLYOFFICE_URL=https://onlyoffice.example.com
# SECRET_ONLYOFFICE_JWT_VERSION=v1
#
# BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash!
# SECRET_BBB_SECRET_VERSION=v1
#
# OCC_CMDS="app:disable dashboard"
# OCC_CMDS="$OCC_CMDS|config:app:set sociallogin auto_create_groups --value 1"
# OCC_CMDS="$OCC_CMDS|config:app:set sociallogin hide_default_login --value 1"

2
.gitignore vendored
View File

@ -1 +1 @@
.env /.envrc

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"shellcheck.customArgs": [
"--shell=bash"
]
}

269
README.md
View File

@ -1,135 +1,192 @@
# Nextcloud # Nextcloud
Wiki Cafe's configuration for a Nextcloud deployment. Originally slimmed down from an `abra` [recipe](https://git.coopcloud.tech/coop-cloud/nextcloud) by [Co-op Cloud](https://coopcloud.tech/). [![Build Status](https://drone.autonomic.zone/api/badges/coop-cloud/nextcloud/status.svg)](https://drone.autonomic.zone/coop-cloud/nextcloud)
Fully automated luxury Nextcloud via docker-swarm.
This setup works in conjunction with [Caddy reverse proxy](https://git.coopcloud.tech/coop-cloud/caddy), handling TLS certificates via Let's Encrypt. This setup also includes labels for optional integration with [backupbot](https://git.coopcloud.tech/coop-cloud/backup-bot-two) for automated backups. <!-- metadata -->
* **Category**: Apps
* **Status**: 2, beta
* **Image**: [`nextcloud`](https://hub.docker.com/_/nextcloud), 4, upstream
* **Healthcheck**: Yes
* **Backups**: No
* **Email**: 3
* **Tests**: 2
* **SSO**: 1 (OAuth)
<!-- endmetadata -->
## Basic usage
## Deploying the app with Docker Swarm 1. Set up Docker Swarm and [`abra`]
2. Deploy [`coop-cloud/traefik`]
3. `abra app new nextcloud --secrets` (optionally with `--pass` if you'd like
to save secrets in `pass`)
4. `abra app config YOURAPPDOMAIN` - be sure to change `$DOMAIN` to something that resolves to
your Docker swarm box
5. `abra app deploy YOURAPPDOMAIN`
Create a new file `.env` in this directory with the following contents, adjusting as necessary: ## How do I customise the default home page when logging in?
- Delete the dashboard app since it is so corporate
- Follow [these docs](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/default_files_configuration.html) to set the default files list for each user in the Files app
- Configure a `defaultapp` in your `config.php` or use [apporder](https://apps.nextcloud.com/apps/apporder)
## Running `occ`
`abra app run --user www-data YOURAPPDOMAIN app occ user:list --help`
## Upgrading Nextcloud apps
`abra app run --user www-data YOURAPPDOMAIN app occ app:update --all`
## How do I fix a Nextcloud version snafu?
`Exception: Updates between multiple major versions and downgrades are unsupported.`
Solution:
- Look at log files to determine the old Nextcloud version
- Change your local `~/.abra/recipes/nextcloud/compose.yml` to the highest minor
version in the old version -- e.g. choose `22.2.5` for `22`, if you're
upgrading to `23`.
- Then, do one of (both bad):
1. `abra app deploy --chaos ...`, then `app run` to go in and manually lower the version number in PHP (shell in, `apt install vim-core && vi version.php`), then try `php ./occ upgrade`
2. `abra app undeploy ...`, `abra volume rm`, CAREFULLY only choose the volume
ENDING `_nextcloud`, then `abra app deploy --chaos ...`, then edit the
`compose.yml` to add `entrypoint: ['tail', '-f', '/dev/null']` to `app`,
then `app deploy --chaos` again, then `app run --user=www-data ... app bash` to get in and run `./occ maintenance:repair`, and `./occ upgrade`.
- Change `compose.yml` to the new version number; `git checkout compose.yml`
- `abra app deploy --force`
- This wasn't even multiplle major versions was it 😾
## How do I integrate with Keycloak SSO?
Use [this plugin](https://github.com/pulsejet/nextcloud-oidc-login). Unlike the plugin it's forked from, there is no configuration UI, so you'll need to edit `/var/www/html/config/config.php`:
``` ```
STACK_NAME=nextcloud 'oidc_login_client_id' => 'nextcloud',
DOMAIN=nextcloud.example.com 'oidc_login_client_secret' => 'mysecret',
## Domain aliases 'oidc_login_provider_url' => 'https://example.com/auth/realms/myrealm',
#EXTRA_DOMAINS=', `www.nextcloud.example.com`' 'oidc_login_disable_registration' => false,
LETS_ENCRYPT_ENV=production 'oidc_login_hide_password_form' => true,
'oidc_login_button_text' => 'Log in with your myssodomain',
ADMIN_USER=admin 'oidc_login_default_group' => 'mygroup',
'oidc_login_attributes' =>
EXTRA_VOLUME=/dev/null:/tmp/.dummy array (
'id' => 'sub',
PHP_MEMORY_LIMIT=1G 'name' => 'name',
# fpm-tune, see: https://spot13.com/pmcalculator/ 'mail' => 'email',
FPM_MAX_CHILDREN=128 ),
FPM_START_SERVERS=32 'oidc_create_groups' => true,
FPM_MIN_SPARE_SERVERS=32
FPM_MAX_SPARE_SERVERS=64
DEFAULT_QUOTA="500 MB"
# X_FRAME_OPTIONS_ENABLED=1
# X_FRAME_OPTIONS_ALLOW_FROM=embedding-site.example.org
# SMTP Config
# See https://github.com/nextcloud/docker#auto-configuration-via-environment-variables for default values
SMTP_AUTHTYPE=LOGIN
SMTP_HOST=mail.example.com
SMTP_SECURE=tls
SMTP_NAME=mail@example.com
SMTP_PORT=587
MAIL_FROM_ADDRESS=cloud
MAIL_DOMAIN=example.com
# Database tuning variables
INNODB_BUFFER_POOL_SIZE=1G
MAX_DB_CONNECTIONS=256
``` ```
Set the environment variables from the .env file during the shell session: You can use [this trick](https://janikvonrotz.ch/2020/10/20/openid-connect-with-nextcloud-and-keycloak/) (see "Cryptic Usernames" work-around) to get proper usernames.
If you ever need to change the realm, you'll need to reset the cache with:
``` ```
set -a && source .env && set +a docker exec -u www-data <container-id> php occ config:app:delete oidc_login last_updated_well_known
docker exec -u www-data <container-id> php occ config:app:delete oidc_login last_updated_jwks
``` ```
### Creating Secrets ## How do I enable multiple SSO login buttons?
Set the secrets. The usual way to create a secret is: We've been able to get this setup by using the [social login](https://apps.nextcloud.com/apps/sociallogin) plugin.
``` If using Keycloak, you'll want to do [this trick](https://janikvonrotz.ch/2020/10/20/openid-connect-with-nextcloud-and-keycloak/) also.
printf "SECRET_HERE" | docker secret create SECRET_NAME -
## How can I customise the CSS?
There is some basic stuff in the admin settings.
To go a little deeper, you can use [this handy app](https://apps.nextcloud.com/apps/theming_customcss).
Here is an example CSS config which hides the local login and makes space for a central image:
```css
#body-login .wrapper main form[name="login"],
#body-login .wrapper main form[name="login"] ~ a {
display: none;
}
#body-login .logo {
visibility: hidden;
}
#body-login #alternative-logins a.button[href*="oidc"] {
background: #233b4a;
color: #fff;
transition: all 0.2s ease-in-out;
}
#body-login #alternative-logins a.button[href*="oidc"]:hover {
background: linear-gradient(-35deg, #233b4a 40%, #486c83 100%);
}
#body-login #alternative-logins a.button[href*="/sociallogin/oauth/google"] {
border: 0;
color: #db4437 !important;
background-color: #fff;
}
#body-login
#alternative-logins
a.button[href*="/sociallogin/oauth/google"]::before {
width: 25px;
background-color: #db4437;
border-radius: 100%;
background-size: 60%;
background-position: center;
height: 25px;
vertical-align: middle;
margin-right: 4px;
}
#body-login main {
padding: 50vh 0 0 0;
}
#body-login a[href*="#body-login"] {
visibility: hidden;
}
#body-login footer a,
#body-login footer p {
color: #233b4a;
}
#body-login footer a:hover {
color: #fff;
}
#body-login footer p.info {
text-shadow: none;
}
``` ```
The required secrets are: [nextcloud-docker]: https://hub.docker.com/_/nextcloud/
[`abra`]: https://git.autonomic.zone/autonomic-cooperative/abra
[`coop-cloud/traefik`]: https://git.autonomic.zone/coop-cloud/traefik
- `db_password`: The MariaDB database password for the `nextcloud` user. ## Using [`previewgenerator`](https://github.com/nextcloud/previewgenerator) app
- `admin_password`: The Nextcloud admin user's password.
- `smtp_password`: The SMTP password for sending emails.
- `elasticsearch_password`: The Elasticsearch password.
- `db_root_password`: The MariaDB root user password.
We can generate these secrets using `openssl rand -base64 32` or similar. > Beware, this appp has been known to not work...
After you install, enable etc. then you need to run the generation (**warning**: it can take a long time!):
``` ```
openssl rand -base64 32 | docker secret create db_password - abra app run <domain> app bash -u www-data
openssl rand -base64 32 | docker secret create admin_password - ./occ preview:generate-all
openssl rand -base64 32 | docker secret create smtp_password -
openssl rand -base64 32 | docker secret create elasticsearch_password -
openssl rand -base64 32 | docker secret create db_root_password -
``` ```
### Deploying the App To set up the cron to run again, there is [no clear solution in the context of
containers](https://github.com/nextcloud/previewgenerator/issues/1). So, a
Deploy using the `-c` flag to specify one or multiple compose files. pretty dodgy hack is to run it from the system directly:
``` ```
docker stack deploy nextcloud --detach=true -c compose.yaml -c compose.mariadb.yaml -c compose.smtp.yaml -c compose.fulltextsearch.yaml root@foo.com /etc/cron.hourly $ cat foo-com-preview-generate
#!/bin/bash
docker exec -u www-data $(docker ps -f name=foo_com_app -q) ./occ preview:pre-generate
``` ```
### Enabling Full Text Search This app will improve performance of image browsing at the cost of storage space.
To enable full text search, we first set up some environment variables for running commands inside the app and database containers:
```
export NC_APP="docker exec -u www-data -it $(docker ps --filter name=${STACK_NAME}_app --format '{{.ID}}' | head -n 1)"
export NC_DB="docker exec -it $(docker ps --filter name=${STACK_NAME}_db --format '{{.ID}}' | head -n 1)"
```
Next, run the following commands to install and configure the necessary Nextcloud apps for full text search with Elasticsearch:
```
$NC_APP php /var/www/html/occ app:install fulltextsearch
$NC_APP php /var/www/html/occ app:install fulltextsearch_elasticsearch
$NC_APP php /var/www/html/occ app:install files_fulltextsearch
$NC_APP php /var/www/html/occ config:app:set fulltextsearch search_platform --value="OCA\\FullTextSearch_Elasticsearch\\Platform\\ElasticSearchPlatform"
$NC_APP php /var/www/html/occ config:app:set fulltextsearch_elasticsearch elastic_host --value="http://elastic:$(cat /run/secrets/elasticsearch_password)@elasticsearch:9200/"
$NC_APP php /var/www/html/occ config:app:set fulltextsearch_elasticsearch elastic_index --value="nextcloud"
$NC_APP php /var/www/html/occ config:app:set files_fulltextsearch files_local --value="1"
```
Verify the setup by running:
```
$NC_APP php /var/www/html/occ config:list files_fulltextsearch
```
Then, check for connectivity with Elasticsearch:
```
$NC_APP php /var/www/html/occ fulltextsearch:test
```
Manually build the search index:
```
$NC_APP php /var/www/html/occ fulltextsearch:index
```
If you get “Index is already running”, clear the ticker table in the database:
```
$NC_DB sh -c 'echo "delete from oc_fulltextsearch_ticks;" | mariadb -u root -p$(cat /run/secrets/db_root_password) nextcloud'
```

54
abra.sh Normal file
View File

@ -0,0 +1,54 @@
#!/bin/bash
export FPM_TUNE_VERSION=v5
export NGINX_CONF_VERSION=v4
export MY_CNF_VERSION=v4
export ENTRYPOINT_VERSION=v3
run_occ(){
su -p www-data -s /bin/sh -c "/var/www/html/occ $@"
}
post_install_occ(){
IFS='|' read -ra CMD <<< "$OCC_CMDS"
for cmd in "${CMD[@]}"; do
run_occ "$cmd"
done
}
install_apps(){
install_apps="$@"
if [ -z "$install_apps" ]
then
install_apps=$APPS
fi
for app in $install_apps
do
run_occ "app:install $app"
done
}
set_app_config(){
APP=$1
KEY=$2
VALUE=$3
run_occ "config:app:set $APP $KEY --value $VALUE"
}
install_bbb(){
install_apps bbb
set_app_config bbb app.navigation true
set_app_config bbb api.url "$BBB_URL"
set_app_config bbb api.secret "$(cat /run/secrets/bbb_secret)"
}
install_onlyoffice(){
install_apps onlyoffice
set_app_config onlyoffice DocumentServerUrl "$ONLYOFFICE_URL"
set_app_config onlyoffice jwt_secret "$(cat /run/secrets/onlyoffice_jwt)"
set_app_config onlyoffice customizationForcesave true
}
set_default_quota(){
set_app_config files default_quota '"$DEFAULT_QUOTA"'
}

18
compose.apps.yml Normal file
View File

@ -0,0 +1,18 @@
version: "3.8"
services:
app:
secrets:
- onlyoffice_jwt
- bbb_secret
environment:
- APPS
- ONLYOFFICE_URL
- BBB_URL
secrets:
onlyoffice_jwt:
external: true
name: ${STACK_NAME}_onlyoffice_jwt_${SECRET_ONLYOFFICE_JWT_VERSION}
bbb_secret:
external: true
name: ${STACK_NAME}_bbb_secret_${SECRET_BBB_SECRET_VERSION}

View File

@ -1,51 +0,0 @@
services:
elasticsearch:
image: "docker.elastic.co/elasticsearch/elasticsearch:9.2.1"
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
# Disable authentication and ssl completely
# - xpack.security.enabled=false
# Use this to enable Basic Authentication:
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- ELASTIC_PASSWORD_FILE=/var/run/secrets/elasticsearch_password
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch:/usr/share/elasticsearch/data
networks:
- internal
secrets:
- source: elasticsearch_password
uid: "1000"
gid: "1000"
mode: 0600
searchindexer:
image: nextcloud:32.0.1-fpm
volumes:
- nextcloud:/var/www/html/
- nextapps:/var/www/html/custom_apps:cached
- nextdata:/var/www/html/data:cached
- nextconfig:/var/www/html/config:cached
- ${EXTRA_VOLUME}
networks:
- internal
entrypoint: su -p www-data -s /bin/sh -c '/var/www/html/occ fulltextsearch:live'
app:
secrets:
- elasticsearch_password
secrets:
elasticsearch_password:
external: true
name: ${STACK_NAME}_elasticsearch_password
volumes:
elasticsearch:

View File

@ -1,55 +0,0 @@
services:
app:
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
db:
image: "mariadb:12.0"
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
- MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-100}
- INNODB_BUFFER_POOL_SIZE=${INNODB_BUFFER_POOL_SIZE:-1G}"
configs:
- source: my_tune
target: /etc/mysql/conf.d/my-tune.cnf
secrets:
- db_root_password
- db_password
volumes:
- "mariadb:/var/lib/mysql"
networks:
- internal
deploy:
labels:
backupbot.backup: "true"
backupbot.backup.pre-hook: 'mariadb-dump --single-transaction -u root -p"$$(cat /run/secrets/db_root_password)" nextcloud > /var/lib/mysql/backup.sql'
backupbot.backup.volumes.mariadb.path: "backup.sql"
backupbot.restore.post-hook: 'mariadb -u root -p"$$(cat /run/secrets/db_root_password)" nextcloud < /var/lib/mysql/backup.sql'
healthcheck:
test: ["CMD-SHELL", 'mariadb-admin -p"$$(cat /run/secrets/db_root_password)" ping']
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
configs:
my_tune:
name: ${STACK_NAME}_my_cnf
file: my-tune.cnf
template_driver: golang
secrets:
db_root_password:
external: true
name: ${STACK_NAME}_db_root_password
db_password:
external: true
name: ${STACK_NAME}_db_password
volumes:
mariadb:

46
compose.mariadb.yml Normal file
View File

@ -0,0 +1,46 @@
version: "3.8"
services:
app:
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
db:
image: "mariadb:10.5"
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
configs:
- source: my_tune
target: /etc/mysql/conf.d/my-tune.cnf
secrets:
- db_root_password
- db_password
volumes:
- "mariadb:/var/lib/mysql"
networks:
- internal
deploy:
labels:
backupbot.backup: "true"
backupbot.backup.pre-hook: 'mkdir -p /tmp/backup/ && mysqldump --single-transaction -u root -p"$$(cat /run/secrets/db_root_password)" nextcloud > /tmp/backup/backup.sql'
backupbot.backup.post-hook: "rm -rf /tmp/backup"
backupbot.backup.path: "/tmp/backup/"
healthcheck:
test: ["CMD-SHELL", 'mysqladmin -p"$$(cat /run/secrets/db_root_password)" ping']
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
configs:
my_tune:
name: ${STACK_NAME}_my_cnf_${MY_CNF_VERSION}
file: my-tune.cnf
volumes:
mariadb:

37
compose.postgres.yml Normal file
View File

@ -0,0 +1,37 @@
version: '3.8'
services:
app:
environment:
- POSTGRES_HOST=db
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- NEXTCLOUD_UPDATE=1
db:
image: "postgres:12"
volumes:
- "postgres:/var/lib/postgresql/data"
networks:
- internal
environment:
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
POSTGRES_DB: nextcloud
secrets:
- db_password
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
deploy:
labels:
backupbot.backup: "true"
backupbot.backup.pre-hook: "mkdir -p /tmp/backup/ && PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /tmp/backup/backup.sql"
backupbot.backup.post-hook: "rm -rf /tmp/backup"
backupbot.backup.path: "/tmp/backup/"
volumes:
postgres:

View File

@ -1,3 +1,4 @@
version: "3.8"
services: services:
app: app:
secrets: secrets:
@ -15,4 +16,4 @@ services:
secrets: secrets:
smtp_password: smtp_password:
external: true external: true
name: ${STACK_NAME}_smtp_password name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION}

View File

@ -1,6 +1,7 @@
version: "3.8"
services: services:
web: web:
image: nginx:1.29.3 image: nginx:1.23.2
configs: configs:
- source: nginx_conf - source: nginx_conf
target: /etc/nginx/nginx.conf target: /etc/nginx/nginx.conf
@ -32,23 +33,20 @@ services:
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect" - "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true" - "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}" - "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}"
- "caddy=${DOMAIN}"
- "caddy.reverse_proxy={{upstreams 80}}"
- "caddy.tls.on_demand="
healthcheck: healthcheck:
test: ["CMD-SHELL", 'curl -s -N curl -Ns localhost/status.php | grep "installed\":true"'] test: ["CMD-SHELL", 'curl -s -N curl -Ns localhost/status.php | grep "installed\":true"']
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 10 retries: 10
start_period: 5m start_period: 1m
app: app:
image: nextcloud:32.0.1-fpm image: nextcloud:25.0.1-fpm
depends_on: depends_on:
- db - db
configs: configs:
- source: fpm_tune - source: fpm_tune
target: /usr/local/etc/php-fpm.d/zzz-fpm-tune.conf target: /usr/local/etc/php-fpm.d/fpm-tune.conf
- source: entrypoint - source: entrypoint
target: /custom-entrypoint.sh target: /custom-entrypoint.sh
mode: 555 mode: 555
@ -58,6 +56,7 @@ services:
- admin_password - admin_password
environment: environment:
- APPS - APPS
- OCC_CMDS
- X_FRAME_OPTIONS_ALLOW_FROM - X_FRAME_OPTIONS_ALLOW_FROM
- X_FRAME_OPTIONS_ENABLED - X_FRAME_OPTIONS_ENABLED
- DOMAIN - DOMAIN
@ -65,14 +64,14 @@ services:
- NEXTCLOUD_ADMIN_USER=${ADMIN_USER} - NEXTCLOUD_ADMIN_USER=${ADMIN_USER}
- NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/admin_password - NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/admin_password
- NEXTCLOUD_TRUSTED_DOMAINS=${DOMAIN} - NEXTCLOUD_TRUSTED_DOMAINS=${DOMAIN}
- TRUSTED_PROXIES=10.0.0.0/8 - TRUSTED_PROXIES=traefik
- REDIS_HOST=cache - REDIS_HOST=cache
- OVERWRITEPROTOCOL=https - OVERWRITEPROTOCOL=https
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-1G} - PHP_MEMORY_LIMIT=1G
- FPM_MAX_CHILDREN=${FPM_MAX_CHILDREN:-131} - FPM_MAX_CHILDREN=131
- FPM_START_SERVERS=${FPM_START_SERVERS:-32} - FPM_START_SERVERS=32
- FPM_MIN_SPARE_SERVERS=${FPM_MIN_SPARE_SERVERS:-32} - FPM_MIN_SPARE_SERVERS=32
- FPM_MAX_SPARE_SERVERS=${FPM_MAX_SPARE_SERVERS:-98} - FPM_MAX_SPARE_SERVERS=98
- DEFAULT_QUOTA - DEFAULT_QUOTA
volumes: volumes:
- nextcloud:/var/www/html/ - nextcloud:/var/www/html/
@ -87,6 +86,7 @@ services:
failure_action: rollback failure_action: rollback
order: start-first order: start-first
labels: labels:
- "coop-cloud.${STACK_NAME}.version=3.1.0+25.0.1-fpm"
- "backupbot.backup=true" - "backupbot.backup=true"
- "backupbot.backup.path=/var/www/html/config/,/var/www/html/data/,/var/www/html/custom_apps/" - "backupbot.backup.path=/var/www/html/config/,/var/www/html/data/,/var/www/html/custom_apps/"
healthcheck: healthcheck:
@ -94,10 +94,10 @@ services:
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 10 retries: 10
start_period: 5m start_period: 1m
cron: cron:
image: nextcloud:32.0.1-fpm image: nextcloud:25.0.1-fpm
volumes: volumes:
- nextcloud:/var/www/html/ - nextcloud:/var/www/html/
- nextapps:/var/www/html/custom_apps:cached - nextapps:/var/www/html/custom_apps:cached
@ -109,7 +109,7 @@ services:
entrypoint: /cron.sh entrypoint: /cron.sh
cache: cache:
image: redis:8.2.2-alpine image: redis:7.0.5-alpine
networks: networks:
- internal - internal
volumes: volumes:
@ -121,12 +121,15 @@ services:
retries: 20 retries: 20
secrets: secrets:
db_root_password:
external: true
name: ${STACK_NAME}_db_root_password_${SECRET_DB_ROOT_PASSWORD_VERSION}
db_password: db_password:
external: true external: true
name: ${STACK_NAME}_db_password name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
admin_password: admin_password:
external: true external: true
name: ${STACK_NAME}_admin_password name: ${STACK_NAME}_admin_password_${SECRET_ADMIN_PASSWORD_VERSION}
volumes: volumes:
nextcloud: nextcloud:
@ -138,15 +141,15 @@ volumes:
configs: configs:
nginx_conf: nginx_conf:
name: ${STACK_NAME}_nginx name: ${STACK_NAME}_nginx_${NGINX_CONF_VERSION}
file: nginx.conf.tmpl file: nginx.conf.tmpl
template_driver: golang template_driver: golang
fpm_tune: fpm_tune:
name: ${STACK_NAME}_fpm_tune name: ${STACK_NAME}_fpm_tune_${FPM_TUNE_VERSION}
file: fpm-tune.ini file: fpm-tune.ini
template_driver: golang template_driver: golang
entrypoint: entrypoint:
name: ${STACK_NAME}_entrypoint name: ${STACK_NAME}_entrypoint_${ENTRYPOINT_VERSION}
file: entrypoint.sh.tmpl file: entrypoint.sh.tmpl
template_driver: golang template_driver: golang

View File

@ -4,7 +4,7 @@
# https://mariadb.com/kb/en/library/performance-schema-overview/ # https://mariadb.com/kb/en/library/performance-schema-overview/
[server] [server]
innodb_buffer_pool_size = {{ env "INNODB_BUFFER_POOL_SIZE" }} innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 2 innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90 innodb_max_dirty_pages_pct = 90
@ -13,7 +13,7 @@ key_buffer_size = 16M
innodb_log_file_size = 256M innodb_log_file_size = 256M
long_query_time = 1 long_query_time = 1
max_allowed_packet = 256M max_allowed_packet = 256M
max_connections = {{ env "MAX_DB_CONNECTIONS" }} max_connections = 100
max_heap_table_size = 64M max_heap_table_size = 64M
max_user_connections = 0 max_user_connections = 0
myisam_recover_options = BACKUP myisam_recover_options = BACKUP

View File

@ -11,9 +11,6 @@ events {
http { http {
include /etc/nginx/mime.types; include /etc/nginx/mime.types;
types {
application/javascript js mjs;
}
default_type application/octet-stream; default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' log_format main '$remote_addr - $remote_user [$time_local] "$request" '
@ -66,7 +63,7 @@ http {
add_header X-Content-Type-Options "nosniff" always; add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always; add_header X-Download-Options "noopen" always;
add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always; add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always; add_header X-XSS-Protection "1; mode=block" always;
{{ if eq (env "X_FRAME_OPTIONS_ENABLED") "1" }} {{ if eq (env "X_FRAME_OPTIONS_ENABLED") "1" }}

View File

@ -0,0 +1,6 @@
2.0.0 introduces a minor nextcloud update to 23.0.4 and moves the database service to a seperate override.yml file to support different database types (mariadb / postgres). This might break your installation. Please add the following snippet to your config .env to ensure the right db is used:
```
COMPOSE_FILE="compose.yml"
COMPOSE_FILE="$COMPOSE_FILE:compose.mariadb.yml"
```

57
releases/3.1.0+25.0.1-fpm Normal file
View File

@ -0,0 +1,57 @@
## FPM Tune
The fpm-tune.ini settings are now configurable by `.env`. Please add this to your servers configs:
```
# fpm-tune, see: https://spot13.com/pmcalculator/
FPM_MAX_CHILDREN=131
FPM_START_SERVERS=32
FPM_MIN_SPARE_SERVERS=32
FPM_MAX_SPARE_SERVERS=98
```
## SMTP
Add SMTP Config to your .env file:
```
# COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
# See https://github.com/nextcloud/docker#auto-configuration-via-environment-variables for default values
# SMTP_AUTHTYPE=
# SMTP_HOST=
# SMTP_SECURE=
# SMTP_NAME=
# SMTP_PORT=
# MAIL_FROM_ADDRESS=
# MAIL_DOMAIN=
# SECRET_SMTP_PASSWORD_VERSION=v1
abra app secret insert example.com smtp_password v1 example_password
```
## Post Deploy Commands
Some Apps can also be managed with abra app cmd!
```
# COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml"
# APPS="calendar sociallogin onlyoffice"
abra app cmd example.com app install_apps
# ONLYOFFICE_URL=https://onlyoffice.example.com
# SECRET_ONLYOFFICE_JWT_VERSION=v1
abra app secret insert example.com onlyoffice_jwt v1 example_password
abra app cmd example.com app install_onlyoffice
# BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash!
# SECRET_BBB_SECRET_VERSION=v1
abra app secret insert example.com bbb_secret v1 example_password
abra app cmd example.com app install_bbb
```
## Set Quota
```
# DEFAULT_QUOTA="10 GB"
abra app cmd example.com app set_default_quota
```

View File

@ -1,6 +1,9 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"ignoreDeps": [
"mariadb:10.6"
],
"extends": [ "extends": [
"config:recommended" "config:base"
] ]
} }