Compare commits

..

12 Commits

Author SHA1 Message Date
f27ea1a2cc chore: publish 12.1.0+31.0.6-fpm release
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2025-12-23 14:30:22 +01:00
c952020194 Implement NC Talk High Performance Backend (#56)
Some checks failed
continuous-integration/drone/push Build is failing
This implements the high performance backend for Nextcloud Talk, which is nessecary if it needs to handle more people (video) calling.
More Details about it: https://nextcloud-talk.readthedocs.io/en/latest/quick-install/

The current implementation is sadly limited to be used once per host, so this might need some additional love in the future, if someone needs it more flexible.

The related traefik pr: coop-cloud/traefik#66

Reviewed-on: #56
Co-authored-by: Apfelwurm <Alexander@volzit.de>
Co-committed-by: Apfelwurm <Alexander@volzit.de>
2025-12-23 13:28:18 +00:00
aa3ab83a38 Merge pull request 'remove post_install_occ' (#55) from improve_readme into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #55
2025-10-30 17:38:15 +00:00
dbdf6227e1 remove post_install_occ
Some checks failed
continuous-integration/drone/pr Build is failing
2025-10-17 19:05:03 -07:00
e83ae638eb Merge pull request 'make maximum upload size configurable' (#53) from uploadLimit into main
Reviewed-on: #53
Reviewed-by: 3wordchant <3wordchant@noreply.git.coopcloud.tech>
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2025-09-09 20:43:13 +00:00
96e9a224f3 Merge branch 'main' into uploadLimit 2025-09-09 20:42:54 +00:00
afee08ae4d Merge pull request 'Make INNODB_BUFFER_POOL_SIZE configurable' (#51) from feature/innodb-buffer-tune into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #51
Reviewed-by: ammaratef45 <ammaratef45@proton.me>
2025-09-09 20:17:59 +00:00
5f05ab8f42 make maximum upload size configurable
Some checks failed
continuous-integration/drone/pr Build is failing
2025-09-09 12:53:37 -07:00
65d5af91bc Merge branch 'main' into feature/innodb-buffer-tune
Some checks failed
continuous-integration/drone/pr Build is failing
2025-09-09 19:46:26 +00:00
93037e1a35 Merge pull request 'fix supporting multiple domains' (#52) from sslhost into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #52
Reviewed-by: 3wordchant <3wordchant@noreply.git.coopcloud.tech>
2025-09-08 13:38:09 +00:00
9986e87db5 fix supporting multiple domains
Some checks failed
continuous-integration/drone/pr Build is failing
2025-09-07 14:41:53 -07:00
3wc
42c90cce21 Add configurable INNODB_BUFFER_POOL_SIZE
Some checks failed
continuous-integration/drone/pr Build is failing
2025-09-01 00:15:52 -04:00
9 changed files with 175 additions and 56 deletions

View File

@ -15,6 +15,7 @@ COMPOSE_FILE="$COMPOSE_FILE:compose.mariadb.yml"
#MAX_DB_CONNECTIONS=500 #MAX_DB_CONNECTIONS=500
ADMIN_USER=admin ADMIN_USER=admin
TZ=Etc/UTC
SECRET_DB_ROOT_PASSWORD_VERSION=v1 SECRET_DB_ROOT_PASSWORD_VERSION=v1
SECRET_DB_PASSWORD_VERSION=v1 SECRET_DB_PASSWORD_VERSION=v1
@ -23,6 +24,7 @@ SECRET_ADMIN_PASSWORD_VERSION=v1
EXTRA_VOLUME=/dev/null:/tmp/.dummy EXTRA_VOLUME=/dev/null:/tmp/.dummy
PHP_MEMORY_LIMIT=1G PHP_MEMORY_LIMIT=1G
PHP_UPLOAD_LIMIT=512M
# fpm-tune, see: https://spot13.com/pmcalculator/ # fpm-tune, see: https://spot13.com/pmcalculator/
FPM_MAX_CHILDREN=16 FPM_MAX_CHILDREN=16
FPM_START_SERVERS=4 FPM_START_SERVERS=4
@ -81,15 +83,16 @@ DEFAULT_QUOTA="10 GB"
# AUTHENTIK_DOMAIN=authentik.example.com # AUTHENTIK_DOMAIN=authentik.example.com
# SECRET_AUTHENTIK_SECRET_VERSION=v1 # SECRET_AUTHENTIK_SECRET_VERSION=v1
# SECRET_AUTHENTIK_ID_VERSION=v1 # SECRET_AUTHENTIK_ID_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"
#COMPOSE_FILE="$COMPOSE_FILE:compose.fulltextsearch.yml" #COMPOSE_FILE="$COMPOSE_FILE:compose.fulltextsearch.yml"
#SECRET_ELASTICSEARCH_PASSWORD_VERSION=v1 #SECRET_ELASTICSEARCH_PASSWORD_VERSION=v1
# Image / PDF previews with Imaginary (see README) #COMPOSE_FILE="$COMPOSE_FILE:compose.talk.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.imaginary-preview.yml" #TALK_DOMAIN=talk.example.com
#SECRET_TALK_INTERNAL_SECRET_VERSION=v1 # length=64 charset=default
#SECRET_TALK_TURN_SECRET_VERSION=v1 # length=64 charset=default
#SECRET_TALK_SIGNALING_SECRET_VERSION=v1 # length=64 charset=default
# HSTS Options # HSTS Options
# Uncomment this line to enable HSTS: https://docs.nextcloud.com/server/30/admin_manual/installation/harden_server.html # Uncomment this line to enable HSTS: https://docs.nextcloud.com/server/30/admin_manual/installation/harden_server.html

View File

@ -26,6 +26,7 @@ Fully automated luxury Nextcloud via docker-swarm.
### Onlyoffice Integration ### Onlyoffice Integration
`abra app config <app-name>` `abra app config <app-name>`
Configure the following envs: Configure the following envs:
``` ```
COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml" COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml"
@ -33,12 +34,13 @@ ONLYOFFICE_URL=https://onlyoffice.example.com
SECRET_ONLYOFFICE_JWT_VERSION=v1 SECRET_ONLYOFFICE_JWT_VERSION=v1
``` ```
`abra app secret insert <app-name> onlyoffice_jwt v1 <jwt_secret>` * `abra app secret insert <app-name> onlyoffice_jwt v1 <jwt_secret>`
`abra app cmd <app-name> app install_onlyoffice` * `abra app cmd <app-name> app install_onlyoffice`
### BBB Integration ### BBB Integration
`abra app config <app-name>` `abra app config <app-name>`
Configure the following envs: Configure the following envs:
``` ```
COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml" COMPOSE_FILE="$COMPOSE_FILE:compose.apps.yml"
@ -46,8 +48,44 @@ BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash!
SECRET_BBB_SECRET_VERSION=v1 SECRET_BBB_SECRET_VERSION=v1
``` ```
`abra app secret insert <app-name> bbb_secret v1 <bbb_secret>` * `abra app secret insert <app-name> bbb_secret v1 <bbb_secret>`
`abra app cmd <app-name> app install_bbb` * `abra app cmd <app-name> app install_bbb`
### Nextcloud Talk High performance Backend
Note: at the moment you are limited to run one Nextcloud high performance backend per docker host with this setup.
`abra app config <app-name>`
Configure the following envs:
```
#COMPOSE_FILE="$COMPOSE_FILE:compose.talk.yml"
#TALK_DOMAIN=talk.example.com
#SECRET_TALK_INTERNAL_SECRET_VERSION=v1 # length=64 charset=default
#SECRET_TALK_TURN_SECRET_VERSION=v1 # length=64 charset=default
#SECRET_TALK_SIGNALING_SECRET_VERSION=v1 # length=64 charset=default
```
* `abra app secret insert <app-name> talk_internal_secret v1 <talk_internal_secret>`
* `abra app secret insert <app-name> talk_turn_secret v1 <talk_turn_secret>`
* `abra app secret insert <app-name> talk_signaling_secret v1 <talk_signaling_secret>`
* `abra app cmd <app-name> app install_talk`
Don't forget to enable the additional env's in your hosts traefik instance:
```
COMPOSE_FILE="$COMPOSE_FILE:compose.nextcloud-talk-hpb.yml"
NEXTCLOUD_TALK_HPB_ENABLED=1
```
Due to a bug in compose that deletes duplacted ports without checking for the protocol, traefik need to get the additional udp binding added after the deployment via ssh (this might take longer than expected!):
```
docker service update --publish-add published=3478,target=3478,protocol=udp traefik_XXX_XXX_app
```
To check if tcp and udp was binded, you can use:
```
docker service inspect traefik_XXX_XXX_app | grep 3478 -a2
```
### Authentik Integration ### Authentik Integration
@ -64,21 +102,18 @@ AUTHENTIK_ID_NAME=authentik_example_com_nextcloud_id_v1 # the same as in authen
`abra app cmd <app-name> app set_authentik` `abra app cmd <app-name> app set_authentik`
### Disable Dashboard
Disable dashboard app since it is so corporate:
`abra app config <app-name>`
Configure the following envs:
```
OCC_CMDS="app:disable dashboard"
```
`abra app cmd <app-name> app post_install_occ`
## Running `occ` ## Running `occ`
`abra app cmd <app-name> app run_occ '"user:list --help"'` `abra app cmd <app-name> app run_occ '"user:list --help"'`
Read more about [occ command here](https://docs.nextcloud.com/server/stable/admin_manual/occ_command.html).
### Disable Dashboard
To disable dashboard app (since it is so corporate):
`abra app cmd <app-name> app run_occ '"app:disable dashboard"'`
## Default user files ## Default user files
- 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 - 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
@ -249,20 +284,6 @@ docker exec -u www-data $(docker ps -f name=foo_com_app -q) ./occ preview:pre-ge
This app will improve performance of image browsing at the cost of storage space. This app will improve performance of image browsing at the cost of storage space.
## Better image previews with `imaginary`
1. Run `abra app config <domain>` and uncomment the line `#COMPOSE_FILE="$COMPOSE_FILE:compose.imaginary-preview.yml"`.
2. Re-deploy the app (`abra app deploy <domain> --force`)
3. Edit `/var/www/config/config.php` and add:
```
'enabledPreviewProviders' =>
array (
0 => 'OC\\Preview\\Imaginary',
),
'preview_imaginary_url' => 'http://imaginary:9000',
```
## Fulltextsearch using elasticsearch ## Fulltextsearch using elasticsearch
1. Uncomment the following lines in your env file: 1. Uncomment the following lines in your env file:

19
abra.sh
View File

@ -2,9 +2,10 @@
export FPM_TUNE_VERSION=v5 export FPM_TUNE_VERSION=v5
export NGINX_CONF_VERSION=v8 export NGINX_CONF_VERSION=v8
export MY_CNF_VERSION=v5 export MY_CNF_VERSION=v6
export ENTRYPOINT_VERSION=v3 export ENTRYPOINT_VERSION=v3
export ENTRYPOINT_WHITEBOARD_VERSION=v1 export ENTRYPOINT_WHITEBOARD_VERSION=v1
export ENTRYPOINT_TALK_VERSION=v1
export CRONTAB_VERSION=v1 export CRONTAB_VERSION=v1
export PG_BACKUP_VERSION=v2 export PG_BACKUP_VERSION=v2
@ -12,13 +13,6 @@ run_occ() {
su -p www-data -s /bin/sh -c "/var/www/html/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() {
install_apps="$@" install_apps="$@"
if [ -z "$install_apps" ]; then if [ -z "$install_apps" ]; then
@ -104,6 +98,15 @@ install_whiteboard() {
} }
install_talk() {
install_apps spreed
run_occ "talk:signaling:add --verify 'wss://${TALK_DOMAIN}' '$(cat /run/secrets/talk_signaling_secret)'"
run_occ "talk:stun:add '${TALK_DOMAIN}:3478'"
run_occ "talk:stun:add '${TALK_DOMAIN}:443'"
run_occ "talk:turn:add --secret='$(cat /run/secrets/talk_turn_secret)' turn '${TALK_DOMAIN}:3478' udp,tcp"
}
install_fulltextsearch() { install_fulltextsearch() {
install_apps fulltextsearch install_apps fulltextsearch
install_apps fulltextsearch_elasticsearch install_apps fulltextsearch_elasticsearch

View File

@ -1,10 +0,0 @@
---
version: '3.8'
services:
imaginary:
image: nextcloud/aio-imaginary:20250822_112758
environment:
- PORT=9000
command: -concurrency 50 -enable-url-source -log-level debug
networks:
- internal

View File

@ -16,6 +16,7 @@ services:
- MYSQL_PASSWORD_FILE=/run/secrets/db_password - MYSQL_PASSWORD_FILE=/run/secrets/db_password
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
- MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-100} - MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-100}
- INNODB_BUFFER_POOL_SIZE=${INNODB_BUFFER_POOL_SIZE:-1G}"
configs: configs:
- source: my_tune - source: my_tune
target: /etc/mysql/conf.d/my-tune.cnf target: /etc/mysql/conf.d/my-tune.cnf

70
compose.talk.yml Normal file
View File

@ -0,0 +1,70 @@
version: "3.8"
services:
talk:
image: "nextcloud/aio-talk:20251128_084214"
environment:
- NC_DOMAIN=${DOMAIN}
- TALK_HOST=${TALK_DOMAIN}
- TZ
- TALK_PORT=3478
- INTERNAL_SECRET_FILE=/run/secrets/talk_internal_secret
- TURN_SECRET_FILE=/run/secrets/talk_turn_secret
- SIGNALING_SECRET_FILE=/run/secrets/talk_signaling_secret
deploy:
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.services.${STACK_NAME}_talk.loadbalancer.server.port=8081
- traefik.http.routers.${STACK_NAME}_talk.rule=Host(`${TALK_DOMAIN}`)
- traefik.http.routers.${STACK_NAME}_talk.entrypoints=web-secure
- traefik.http.routers.${STACK_NAME}_talk.tls.certresolver=${LETS_ENCRYPT_ENV}
- traefik.tcp.routers.${STACK_NAME}_nextcloud-talk-hpb.rule=HostSNI(`*`)
- traefik.tcp.routers.${STACK_NAME}_nextcloud-talk-hpb.entrypoints=nextcloud-talk-hpb
- traefik.tcp.routers.${STACK_NAME}_nextcloud-talk-hpb.service=${STACK_NAME}_nextcloud-talk-hpb-svc
- traefik.tcp.services.${STACK_NAME}_nextcloud-talk-hpb-svc.loadbalancer.server.port=3478
- traefik.udp.routers.${STACK_NAME}_nextcloud-talk-hpb-udp.entrypoints=nextcloud-talk-hpb-udp
- traefik.udp.routers.${STACK_NAME}_nextcloud-talk-hpb-udp.service=${STACK_NAME}_nextcloud-talk-hpb-udp-svc
- traefik.udp.services.${STACK_NAME}_nextcloud-talk-hpb-udp-svc.loadbalancer.server.port=3478
networks:
- proxy
configs:
- source: entrypoint_talk
target: /custom-entrypoint.sh
mode: 775
entrypoint: /custom-entrypoint.sh
secrets:
- source: talk_internal_secret
uid: "1000"
gid: "122"
mode: 0600
- source: talk_turn_secret
uid: "1000"
gid: "122"
mode: 0600
- source: talk_signaling_secret
uid: "1000"
gid: "122"
mode: 0600
app:
secrets:
- talk_turn_secret
- talk_signaling_secret
secrets:
talk_internal_secret:
external: true
name: ${STACK_NAME}_talk_internal_secret_${SECRET_TALK_INTERNAL_SECRET_VERSION}
talk_turn_secret:
external: true
name: ${STACK_NAME}_talk_turn_secret_${SECRET_TALK_TURN_SECRET_VERSION}
talk_signaling_secret:
external: true
name: ${STACK_NAME}_talk_signaling_secret_${SECRET_TALK_SIGNALING_SECRET_VERSION}
configs:
entrypoint_talk:
name: ${STACK_NAME}_entrypoint_talk_${ENTRYPOINT_TALK_VERSION}
file: entrypoint.talk.sh.tmpl
template_driver: golang

View File

@ -35,8 +35,8 @@ services:
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}" - "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure" - "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "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.redirectscheme.scheme=https"
- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}" - "traefik.http.middlewares.${STACK_NAME}-redirect.redirectscheme.permanent=true"
- "caddy=${DOMAIN}" - "caddy=${DOMAIN}"
- "caddy.reverse_proxy={{upstreams 80}}" - "caddy.reverse_proxy={{upstreams 80}}"
- "caddy.tls.on_demand=" - "caddy.tls.on_demand="
@ -76,6 +76,7 @@ services:
- OVERWRITEPROTOCOL=https - OVERWRITEPROTOCOL=https
- OVERWRITECLIURL=https://${DOMAIN} - OVERWRITECLIURL=https://${DOMAIN}
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-1G} - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-1G}
- PHP_UPLOAD_LIMIT=${PHP_UPLOAD_LIMIT:-512M}
- FPM_MAX_CHILDREN=${FPM_MAX_CHILDREN:-131} - FPM_MAX_CHILDREN=${FPM_MAX_CHILDREN:-131}
- FPM_START_SERVERS=${FPM_START_SERVERS:-32} - FPM_START_SERVERS=${FPM_START_SERVERS:-32}
- FPM_MIN_SPARE_SERVERS=${FPM_MIN_SPARE_SERVERS:-32} - FPM_MIN_SPARE_SERVERS=${FPM_MIN_SPARE_SERVERS:-32}
@ -94,7 +95,7 @@ services:
failure_action: rollback failure_action: rollback
order: start-first order: start-first
labels: labels:
- "coop-cloud.${STACK_NAME}.version=12.0.1+31.0.6-fpm" - "coop-cloud.${STACK_NAME}.version=12.1.0+31.0.6-fpm"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}" - "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "backupbot.backup=${ENABLE_BACKUPS:-true}" - "backupbot.backup=${ENABLE_BACKUPS:-true}"
- "backupbot.backup.volumes.redis=false" - "backupbot.backup.volumes.redis=false"

30
entrypoint.talk.sh.tmpl Normal file
View File

@ -0,0 +1,30 @@
#!/bin/bash
set -eu
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
file_env "INTERNAL_SECRET"
file_env "TURN_SECRET"
file_env "SIGNALING_SECRET"
/start.sh supervisord -c /supervisord.conf

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 = 1G innodb_buffer_pool_size = {{ env "INNODB_BUFFER_POOL_SIZE" }}
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