Compare commits
	
		
			39 Commits
		
	
	
		
			update-ngi
			...
			feature/im
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0fcd87246b | |||
| 39747d190d | |||
| 8421962c1e | |||
| 8c5d843ba4 | |||
| 7074744ba8 | |||
| cb0a103e04 | |||
| ff6873a52c | |||
| 9408a6ab81 | |||
| c4bb6d0932 | |||
| 7a6256f78d | |||
| 8be413fe71 | |||
| af36d22633 | |||
| 85e5070b8d | |||
| 36615bc097 | |||
| a3cd6741eb | |||
| cb453e884d | |||
| 267f3cbb78 | |||
| b0c4f06af1 | |||
| 750477a409 | |||
| 7a7da21544 | |||
| d72a8fdcdb | |||
| 7aa4e15034 | |||
| 0c5b05957c | |||
| d8cb3719e2 | |||
| bbc834a62d | |||
| da8f7fb447 | |||
| ee2c5a2b42 | |||
| 182a42ff1f | |||
| 5a397ce63e | |||
| ccb54f34d4 | |||
| 3143e99572 | |||
| 9859907d4b | |||
| 6c0fa9c12d | |||
| a3c99a72bf | |||
| c94ffed09d | |||
| 7a863573c9 | |||
| c930bbcf56 | |||
| a13e7a509c | |||
| 0f9aba3e9e | 
| @ -22,6 +22,8 @@ steps: | |||||||
|       NGINX_CONF_VERSION: v1 |       NGINX_CONF_VERSION: v1 | ||||||
|       MY_CNF_VERSION: v1 |       MY_CNF_VERSION: v1 | ||||||
|       ENTRYPOINT_VERSION: v1 |       ENTRYPOINT_VERSION: v1 | ||||||
|  |       CRONTAB_VERSION: v1 | ||||||
|  |       PG_BACKUP_VERSION: v2 | ||||||
|       SECRET_DB_PASSWORD_VERSION: v1 |       SECRET_DB_PASSWORD_VERSION: v1 | ||||||
|       SECRET_DB_ROOT_PASSWORD_VERSION: v1 |       SECRET_DB_ROOT_PASSWORD_VERSION: v1 | ||||||
|       SECRET_ADMIN_PASSWORD_VERSION: v1 |       SECRET_ADMIN_PASSWORD_VERSION: v1 | ||||||
| @ -43,7 +45,7 @@ steps: | |||||||
|         from_secret: drone_abra-bot_token |         from_secret: drone_abra-bot_token | ||||||
|       fork: true |       fork: true | ||||||
|       repositories: |       repositories: | ||||||
|         - coop-cloud/auto-recipes-catalogue-json |         - toolshed/auto-recipes-catalogue-json | ||||||
|  |  | ||||||
| trigger: | trigger: | ||||||
|   event: tag |   event: tag | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								.env.sample
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								.env.sample
									
									
									
									
									
								
							| @ -1,6 +1,7 @@ | |||||||
| TYPE=nextcloud | TYPE=nextcloud | ||||||
| TIMEOUT=900 | TIMEOUT=900 | ||||||
| ENABLE_AUTO_UPDATE=true | ENABLE_AUTO_UPDATE=true | ||||||
|  | ENABLE_BACKUPS=true | ||||||
|  |  | ||||||
| DOMAIN=nextcloud.example.com | DOMAIN=nextcloud.example.com | ||||||
| ## Domain aliases | ## Domain aliases | ||||||
| @ -44,9 +45,22 @@ DEFAULT_QUOTA="10 GB" | |||||||
| # MAIL_DOMAIN= | # MAIL_DOMAIN= | ||||||
| # SECRET_SMTP_PASSWORD_VERSION=v1 | # SECRET_SMTP_PASSWORD_VERSION=v1 | ||||||
|  |  | ||||||
|  | ## Customization | ||||||
|  | # THEMING_COLOR= | ||||||
|  | # THEMING_SLOGAN= | ||||||
|  | # COPY_ASSETS="flow_background.jpg|app:/var/www/html/themes/" | ||||||
|  | # COPY_ASSETS="$COPY_ASSETS icon_left_brand.svg|app:/var/www/html/themes/" | ||||||
|  | # COPY_ASSETS="$COPY_ASSETS icon.png|app:/var/www/html/themes/" | ||||||
|  |  | ||||||
| # APPS="calendar" | # APPS="calendar" | ||||||
|  |  | ||||||
| # COLLABORA_URL=https://collabora.example.com | # COLLABORA_URL=https://collabora.example.com | ||||||
|  | ## IMPORTANT FOR SECURITY REASONS WHEN RUNNING COLLABORA | ||||||
|  | ## list of IP addresses that are allowed to make WOPI requests. Use the default | ||||||
|  | ## when running the collabora server on the same machine as nextcloud. | ||||||
|  | ## Otherwise set this to the IP address range of your collabora server(s) i.e. 1.2.3.4/32 | ||||||
|  | ## https://docs.nextcloud.com/server/latest/admin_manual/office/configuration.html#wopi-settings | ||||||
|  | # COLLABORA_ALLOWLIST="172.16.0.0/12" | ||||||
|  |  | ||||||
| # COMPOSE_FILE="$COMPOSE_FILE:compose.onlyoffice.yml" | # COMPOSE_FILE="$COMPOSE_FILE:compose.onlyoffice.yml" | ||||||
| # ONLYOFFICE_URL=https://onlyoffice.example.com | # ONLYOFFICE_URL=https://onlyoffice.example.com | ||||||
| @ -57,6 +71,10 @@ DEFAULT_QUOTA="10 GB" | |||||||
| # BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash! | # BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash! | ||||||
| # SECRET_BBB_SECRET_VERSION=v1 | # SECRET_BBB_SECRET_VERSION=v1 | ||||||
|  |  | ||||||
|  | # COMPOSE_FILE="$COMPOSE_FILE:compose.whiteboard.yml" | ||||||
|  | # APPS="$APPS whiteboard" | ||||||
|  | # SECRET_WHITEBOARD_JWT_VERSION=v1 | ||||||
|  |  | ||||||
| # COMPOSE_FILE="$COMPOSE_FILE:compose.authentik.yml" | # COMPOSE_FILE="$COMPOSE_FILE:compose.authentik.yml" | ||||||
| # APPS="$APPS sociallogin" | # APPS="$APPS sociallogin" | ||||||
| # AUTHENTIK_USER_PREFIX=authentik | # AUTHENTIK_USER_PREFIX=authentik | ||||||
| @ -69,3 +87,12 @@ DEFAULT_QUOTA="10 GB" | |||||||
|  |  | ||||||
| #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.imaginary-preview.yml" | ||||||
|  |  | ||||||
|  | # HSTS Options | ||||||
|  | # Uncomment this line to enable HSTS: https://docs.nextcloud.com/server/30/admin_manual/installation/harden_server.html | ||||||
|  | #HSTS_ENABLED=1 | ||||||
|  | # Uncomment this line to add the `preload` part | ||||||
|  | #HSTS_PRELOAD=1 | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								README.md
									
									
									
									
									
								
							| @ -87,7 +87,12 @@ OCC_CMDS="app:disable dashboard" | |||||||
|  |  | ||||||
| - Configure a `defaultapp` in your `config.php` or use [apporder](https://apps.nextcloud.com/apps/apporder) | - Configure a `defaultapp` in your `config.php` or use [apporder](https://apps.nextcloud.com/apps/apporder) | ||||||
|  |  | ||||||
| ## Upgrading Nextcloud apps | ## Upgrading Nextcloud | ||||||
|  | Upgrading Nextcloud can be a hair raising experiance. They [don't support downgrading](https://docs.nextcloud.com/server/latest/admin_manual/maintenance/upgrade.html) even for minor versions. | ||||||
|  |  | ||||||
|  | Many of us  have found that jumping major versions when upgrading is also a bad idea. We have however found that it's ok to skip minor version upgrades and go to the last minor version before a major version (e.g. 24.0.0 to 24.9.9 before going to 25.0.0). To extra cautious just upgrade one release at a time. Read the release notes and check your logs. | ||||||
|  |  | ||||||
|  | ## Upgrading Nextcloud apps (plug-ins) | ||||||
|  |  | ||||||
| `abra app cmd <app-name> app run_occ '"app:update --all"'` | `abra app cmd <app-name> app run_occ '"app:update --all"'` | ||||||
|  |  | ||||||
| @ -244,6 +249,20 @@ 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: | ||||||
| @ -281,3 +300,11 @@ And you can populate the index manually and check if any errors occur: | |||||||
| ``` | ``` | ||||||
| abra app cmd <domain> app run_occ '"fulltextsearch:index"' | abra app cmd <domain> app run_occ '"fulltextsearch:index"' | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | ### Troubleshooting fulltextsearch | ||||||
|  |  | ||||||
|  | The fulltextsearch plugin might be stuck with this error: "Index is already running". In that case the following command can get things runing again: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | abra app run <domain> db /bin/sh -- -c 'echo "delete from oc_fulltextsearch_ticks;" | mariadb -u root -p$(cat /run/secrets/db_root_password) nextcloud' | ||||||
|  | ``` | ||||||
|  | |||||||
							
								
								
									
										56
									
								
								abra.sh
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								abra.sh
									
									
									
									
									
								
							| @ -1,10 +1,12 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| export FPM_TUNE_VERSION=v5 | export FPM_TUNE_VERSION=v5 | ||||||
| export NGINX_CONF_VERSION=v7 | export NGINX_CONF_VERSION=v8 | ||||||
| export MY_CNF_VERSION=v5 | export MY_CNF_VERSION=v5 | ||||||
| export ENTRYPOINT_VERSION=v3 | export ENTRYPOINT_VERSION=v3 | ||||||
|  | export ENTRYPOINT_WHITEBOARD_VERSION=v1 | ||||||
| export CRONTAB_VERSION=v1 | export CRONTAB_VERSION=v1 | ||||||
|  | export PG_BACKUP_VERSION=v2 | ||||||
|  |  | ||||||
| run_occ() { | 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 $@" | ||||||
| @ -52,6 +54,27 @@ set_logfile_stdout() { | |||||||
|     set_system_config logfile '/dev/stdout' |     set_system_config logfile '/dev/stdout' | ||||||
| } | } | ||||||
|  |  | ||||||
|  | customize() { | ||||||
|  |     if [ -z "$1" ] | ||||||
|  |     then | ||||||
|  |             echo "Usage: ... customize <assets_path>" | ||||||
|  |             exit 1 | ||||||
|  |     fi | ||||||
|  |     asset_dir=$1 | ||||||
|  |     for asset in $COPY_ASSETS; do | ||||||
|  |         source=$(echo $asset | cut -d "|" -f1) | ||||||
|  |         target=$(echo $asset | cut -d "|" -f2) | ||||||
|  |         echo copy $source to $target | ||||||
|  |         abra app cp $APP_NAME $asset_dir/$source $target | ||||||
|  |     done | ||||||
|  |  | ||||||
|  |     abra app cmd -T $APP_NAME app set_app_config theming color \"$THEMING_COLOR\" | ||||||
|  |     abra app cmd -T $APP_NAME app set_app_config theming slogan \"$THEMING_SLOGAN\" | ||||||
|  |     abra app cmd -T $APP_NAME app run_occ '"theming:config background \"/var/www/html/themes/flow_background.jpg\""' | ||||||
|  |     abra app cmd -T $APP_NAME app run_occ '"theming:config logo \"/var/www/html/themes/icon_left_brand.svg\""' | ||||||
|  |     abra app cmd -T $APP_NAME app run_occ '"theming:config logoheader \"/var/www/html/themes/icon.png\""' | ||||||
|  | } | ||||||
|  |  | ||||||
| install_bbb() { | install_bbb() { | ||||||
|     install_apps bbb |     install_apps bbb | ||||||
|     set_app_config bbb app.navigation true |     set_app_config bbb app.navigation true | ||||||
| @ -69,8 +92,18 @@ install_onlyoffice() { | |||||||
| install_collabora() { | install_collabora() { | ||||||
|     install_apps richdocuments |     install_apps richdocuments | ||||||
|     set_app_config richdocuments wopi_url "$COLLABORA_URL" |     set_app_config richdocuments wopi_url "$COLLABORA_URL" | ||||||
|  |     # important for security reaosns | ||||||
|  |     # https://docs.nextcloud.com/server/latest/admin_manual/office/configuration.html#wopi-settings | ||||||
|  |     set_app_config richdocuments wopi_allowlist "$COLLABORA_ALLOWLIST" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | install_whiteboard() { | ||||||
|  |     install_apps whiteboard | ||||||
|  |     set_app_config whiteboard collabBackendUrl "https://${DOMAIN}/whiteboard" | ||||||
|  |     set_app_config whiteboard jwt_secret_key "$(cat /run/secrets/whiteboard_jwt)" | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| install_fulltextsearch() { | install_fulltextsearch() { | ||||||
|     install_apps fulltextsearch |     install_apps fulltextsearch | ||||||
|     install_apps fulltextsearch_elasticsearch |     install_apps fulltextsearch_elasticsearch | ||||||
| @ -89,6 +122,7 @@ set_authentik() { | |||||||
|     install_apps sociallogin |     install_apps sociallogin | ||||||
|     AUTHENTIK_SECRET=$(cat /run/secrets/authentik_secret) |     AUTHENTIK_SECRET=$(cat /run/secrets/authentik_secret) | ||||||
|     AUTHENTIK_ID=$(cat /run/secrets/authentik_id) |     AUTHENTIK_ID=$(cat /run/secrets/authentik_id) | ||||||
|  |     set_system_config logo_url https://$AUTHENTIK_DOMAIN | ||||||
|     set_app_config sociallogin custom_providers " |     set_app_config sociallogin custom_providers " | ||||||
| { | { | ||||||
|     \"custom_oidc\":[ |     \"custom_oidc\":[ | ||||||
| @ -99,7 +133,7 @@ set_authentik() { | |||||||
|         \"tokenUrl\": \"https://$AUTHENTIK_DOMAIN/application/o/token/\", |         \"tokenUrl\": \"https://$AUTHENTIK_DOMAIN/application/o/token/\", | ||||||
|         \"displayNameClaim\":\"preferred_username\", |         \"displayNameClaim\":\"preferred_username\", | ||||||
|         \"userInfoUrl\": \"https://$AUTHENTIK_DOMAIN/application/o/userinfo/\", |         \"userInfoUrl\": \"https://$AUTHENTIK_DOMAIN/application/o/userinfo/\", | ||||||
|         \"logoutUrl\": \"https://$AUTHENTIK_DOMAIN/if/session-end/nextcloud/\", |         \"logoutUrl\": \"https://$AUTHENTIK_DOMAIN/application/o/nextcloud/end-session/\", | ||||||
|         \"clientId\":\"$AUTHENTIK_ID\", |         \"clientId\":\"$AUTHENTIK_ID\", | ||||||
|         \"clientSecret\":\"$AUTHENTIK_SECRET\", |         \"clientSecret\":\"$AUTHENTIK_SECRET\", | ||||||
|         \"scope\":\"openid profile email nextcloud\", |         \"scope\":\"openid profile email nextcloud\", | ||||||
| @ -121,3 +155,21 @@ set_authentik() { | |||||||
|     run_occ 'config:system:set allow_user_to_change_display_name --value=false' |     run_occ 'config:system:set allow_user_to_change_display_name --value=false' | ||||||
|     run_occ 'config:system:set lost_password_link --value=disabled' |     run_occ 'config:system:set lost_password_link --value=disabled' | ||||||
| } | } | ||||||
|  |  | ||||||
|  | disable_skeletondirectory() { | ||||||
|  |     run_occ "config:system:set skeletondirectory --value ''" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | set_windowsfriendly_filenames() { | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 0 --value=?' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 1 --value=\<' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 2 --value=\>' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 3 --value=:' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 4 --value=*' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 5 --value=\|' | ||||||
|  |     run_occ 'config:system:set forbidden_filename_characters 6 --value=\"' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | upgrade_mariadb() { | ||||||
|  |     mariadb-upgrade -p`cat /run/secrets/db_root_password` | ||||||
|  | } | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ authentik: | |||||||
|         - AUTHENTIK_DOMAIN |         - AUTHENTIK_DOMAIN | ||||||
|         - SECRET_AUTHENTIK_SECRET_VERSION |         - SECRET_AUTHENTIK_SECRET_VERSION | ||||||
|         - SECRET_AUTHENTIK_ID_VERSION |         - SECRET_AUTHENTIK_ID_VERSION | ||||||
|     execute: |     initial-hooks: | ||||||
|         - app set_authentik |         - app set_authentik | ||||||
|     shared_secrets: |     shared_secrets: | ||||||
|         nextcloud_secret: authentik_secret |         nextcloud_secret: authentik_secret | ||||||
| @ -15,10 +15,10 @@ onlyoffice: | |||||||
|         - compose.onlyoffice.yml |         - compose.onlyoffice.yml | ||||||
|         - ONLYOFFICE_URL |         - ONLYOFFICE_URL | ||||||
|         - SECRET_ONLYOFFICE_JWT_VERSION |         - SECRET_ONLYOFFICE_JWT_VERSION | ||||||
|     execute: |     initial-hooks: | ||||||
|         - app install_onlyoffice |         - app install_onlyoffice | ||||||
| collabora: | collabora: | ||||||
|     uncomment: |     uncomment: | ||||||
|         - COLLABORA_URL |         - COLLABORA_URL | ||||||
|     execute: |     initial-hooks: | ||||||
|         - app install_collabora |         - app install_collabora | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ version: "3.8" | |||||||
|  |  | ||||||
| services: | services: | ||||||
|   elasticsearch: |   elasticsearch: | ||||||
|     image: "docker.elastic.co/elasticsearch/elasticsearch:8.11.4" |     image: "docker.elastic.co/elasticsearch/elasticsearch:8.17.2" | ||||||
|     environment: |     environment: | ||||||
|       - cluster.name=docker-cluster |       - cluster.name=docker-cluster | ||||||
|       - bootstrap.memory_lock=true |       - bootstrap.memory_lock=true | ||||||
| @ -29,7 +29,7 @@ services: | |||||||
|         mode: 0600 |         mode: 0600 | ||||||
|  |  | ||||||
|   searchindexer: |   searchindexer: | ||||||
|     image: nextcloud:29.0.1-fpm |     image: nextcloud:31.0.6-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 | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								compose.imaginary-preview.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								compose.imaginary-preview.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | --- | ||||||
|  | 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 | ||||||
| @ -9,7 +9,7 @@ services: | |||||||
|       - MYSQL_PASSWORD_FILE=/run/secrets/db_password |       - MYSQL_PASSWORD_FILE=/run/secrets/db_password | ||||||
|  |  | ||||||
|   db: |   db: | ||||||
|     image: "mariadb:10.5" |     image: "mariadb:11.4" | ||||||
|     environment: |     environment: | ||||||
|       - MYSQL_DATABASE=nextcloud |       - MYSQL_DATABASE=nextcloud | ||||||
|       - MYSQL_USER=nextcloud |       - MYSQL_USER=nextcloud | ||||||
| @ -28,12 +28,11 @@ services: | |||||||
|       - internal |       - internal | ||||||
|     deploy: |     deploy: | ||||||
|       labels: |       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.pre-hook: 'mysqldump --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.backup.post-hook: "rm -rf /var/lib/mysql/backup.sql" |         backupbot.restore.post-hook: 'mariadb -u root -p"$$(cat /run/secrets/db_root_password)" nextcloud < /var/lib/mysql/backup.sql' | ||||||
|           backupbot.backup.path: "/var/lib/mysql/backup.sql" |  | ||||||
|     healthcheck: |     healthcheck: | ||||||
|       test: ["CMD-SHELL", 'mysqladmin -p"$$(cat /run/secrets/db_root_password)"  ping'] |       test: ["CMD-SHELL", 'mariadb-admin -p"$$(cat /run/secrets/db_root_password)"  ping'] | ||||||
|       interval: 30s |       interval: 30s | ||||||
|       timeout: 10s |       timeout: 10s | ||||||
|       retries: 10 |       retries: 10 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ services: | |||||||
|       - NEXTCLOUD_UPDATE=1 |       - NEXTCLOUD_UPDATE=1 | ||||||
|  |  | ||||||
|   db: |   db: | ||||||
|     image: "postgres:12" |     image: "postgres:13" | ||||||
|     command: -c "max_connections=${MAX_DB_CONNECTIONS:-100}" |     command: -c "max_connections=${MAX_DB_CONNECTIONS:-100}" | ||||||
|     volumes: |     volumes: | ||||||
|       - "postgres:/var/lib/postgresql/data" |       - "postgres:/var/lib/postgresql/data" | ||||||
| @ -29,10 +29,18 @@ services: | |||||||
|       retries: 5 |       retries: 5 | ||||||
|     deploy: |     deploy: | ||||||
|       labels: |       labels: | ||||||
|             backupbot.backup: "true" |         backupbot.backup.pre-hook: "/pg_backup.sh backup" | ||||||
|             backupbot.backup.pre-hook: "PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /var/lib/postgresql/data/backup.sql" |         backupbot.backup.volumes.postgres.path: "backup.sql" | ||||||
|             backupbot.backup.post-hook: "rm -rf /var/lib/postgresql/data/backup.sql" |         backupbot.restore.post-hook: '/pg_backup.sh restore' | ||||||
|             backupbot.backup.path: "/var/lib/postgresql/data/" |     configs: | ||||||
|  |         - source: pg_backup | ||||||
|  |           target: /pg_backup.sh | ||||||
|  |           mode: 0555 | ||||||
|  |  | ||||||
| volumes: | volumes: | ||||||
|   postgres: |   postgres: | ||||||
|  |  | ||||||
|  | configs: | ||||||
|  |   pg_backup: | ||||||
|  |     name: ${STACK_NAME}_pg_backup_${PG_BACKUP_VERSION} | ||||||
|  |     file: pg_backup.sh | ||||||
|  | |||||||
							
								
								
									
										44
									
								
								compose.whiteboard.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								compose.whiteboard.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | version: "3.8" | ||||||
|  |  | ||||||
|  | services: | ||||||
|  |   app: | ||||||
|  |     secrets: | ||||||
|  |       - whiteboard_jwt | ||||||
|  |  | ||||||
|  |   whiteboard: | ||||||
|  |     image: ghcr.io/nextcloud-releases/whiteboard:v1.1.2 | ||||||
|  |     deploy: | ||||||
|  |       labels: | ||||||
|  |         - traefik.enable=true | ||||||
|  |         - traefik.docker.network=proxy | ||||||
|  |         - traefik.http.services.${STACK_NAME}_whiteboard.loadbalancer.server.port=3002 | ||||||
|  |         - traefik.http.routers.${STACK_NAME}_whiteboard.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS}) && PathPrefix(`/whiteboard`) | ||||||
|  |         - traefik.http.routers.${STACK_NAME}_whiteboard.entrypoints=web-secure | ||||||
|  |         - traefik.http.routers.${STACK_NAME}_whiteboard.tls.certresolver=${LETS_ENCRYPT_ENV} | ||||||
|  |         - traefik.http.middlewares.${STACK_NAME}_whiteboard-stripprefix.stripprefix.prefixes=/whiteboard | ||||||
|  |         - traefik.http.routers.${STACK_NAME}_whiteboard.middlewares=${STACK_NAME}_whiteboard-stripprefix | ||||||
|  |     configs: | ||||||
|  |       - source: entrypoint_whiteboard | ||||||
|  |         target: /custom-entrypoint.sh | ||||||
|  |     entrypoint: ["sh", "/custom-entrypoint.sh"] | ||||||
|  |     user: root | ||||||
|  |     networks: | ||||||
|  |      - proxy | ||||||
|  |     ports: | ||||||
|  |       - 3002:3002 | ||||||
|  |     secrets: | ||||||
|  |       - whiteboard_jwt | ||||||
|  |     environment: | ||||||
|  |       - NEXTCLOUD_URL=https://$DOMAIN | ||||||
|  |       - JWT_SECRET_KEY_FILE=/run/secrets/whiteboard_jwt | ||||||
|  |  | ||||||
|  | secrets: | ||||||
|  |   whiteboard_jwt: | ||||||
|  |     external: true | ||||||
|  |     name: ${STACK_NAME}_whiteboard_jwt_${SECRET_WHITEBOARD_JWT_VERSION} | ||||||
|  |  | ||||||
|  | configs: | ||||||
|  |   entrypoint_whiteboard: | ||||||
|  |     name: ${STACK_NAME}_entrypoint_whiteboard_${ENTRYPOINT_WHITEBOARD_VERSION} | ||||||
|  |     file: entrypoint.whiteboard.sh.tmpl | ||||||
|  |     template_driver: golang | ||||||
							
								
								
									
										19
									
								
								compose.yml
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								compose.yml
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | |||||||
| version: "3.8" | version: "3.8" | ||||||
| services: | services: | ||||||
|   web: |   web: | ||||||
|     image: nginx:1.26.1 |     image: nginx:1.29.0 | ||||||
|     depends_on: |     depends_on: | ||||||
|       - app |       - app | ||||||
|     configs: |     configs: | ||||||
| @ -12,6 +12,8 @@ services: | |||||||
|       - X_FRAME_OPTIONS_ENABLED |       - X_FRAME_OPTIONS_ENABLED | ||||||
|       - DOMAIN |       - DOMAIN | ||||||
|       - STACK_NAME |       - STACK_NAME | ||||||
|  |       - HSTS_ENABLED | ||||||
|  |       - HSTS_PRELOAD | ||||||
|     volumes: |     volumes: | ||||||
|       - nextcloud:/var/www/html/ |       - nextcloud:/var/www/html/ | ||||||
|       - nextapps:/var/www/html/custom_apps:cached |       - nextapps:/var/www/html/custom_apps:cached | ||||||
| @ -46,7 +48,7 @@ services: | |||||||
|       start_period: 5m |       start_period: 5m | ||||||
|  |  | ||||||
|   app: |   app: | ||||||
|     image: nextcloud:29.0.1-fpm |     image: nextcloud:31.0.6-fpm | ||||||
|     depends_on: |     depends_on: | ||||||
|       - db |       - db | ||||||
|     configs: |     configs: | ||||||
| @ -72,6 +74,7 @@ services: | |||||||
|       - TRUSTED_PROXIES=10.0.0.0/8 |       - TRUSTED_PROXIES=10.0.0.0/8 | ||||||
|       - REDIS_HOST=cache |       - REDIS_HOST=cache | ||||||
|       - OVERWRITEPROTOCOL=https |       - OVERWRITEPROTOCOL=https | ||||||
|  |       - OVERWRITECLIURL=https://${DOMAIN} | ||||||
|       - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-1G} |       - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-1G} | ||||||
|       - 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} | ||||||
| @ -91,10 +94,12 @@ services: | |||||||
|         failure_action: rollback |         failure_action: rollback | ||||||
|         order: start-first |         order: start-first | ||||||
|       labels: |       labels: | ||||||
|         - "coop-cloud.${STACK_NAME}.version=8.0.0+29.0.1-fpm" |         - "coop-cloud.${STACK_NAME}.version=12.0.1+31.0.6-fpm" | ||||||
|         - "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}" |         - "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}" | ||||||
|         - "backupbot.backup=true" |         - "backupbot.backup=${ENABLE_BACKUPS:-true}" | ||||||
|         - "backupbot.backup.path=/var/www/html/config/,/var/www/html/data/,/var/www/html/custom_apps/" |         - "backupbot.backup.volumes.redis=false" | ||||||
|  |        #- "backupbot.backup.volumes.nextcloud=false" | ||||||
|  |  | ||||||
|     healthcheck: |     healthcheck: | ||||||
|       test: ["CMD-SHELL", 'SCRIPT_NAME=status SCRIPT_FILENAME=/var/www/html/status.php REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000 | grep "installed\":true"'] |       test: ["CMD-SHELL", 'SCRIPT_NAME=status SCRIPT_FILENAME=/var/www/html/status.php REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000 | grep "installed\":true"'] | ||||||
|       interval: 30s |       interval: 30s | ||||||
| @ -103,7 +108,7 @@ services: | |||||||
|       start_period: 15m |       start_period: 15m | ||||||
|  |  | ||||||
|   cron: |   cron: | ||||||
|     image: nextcloud:29.0.1-fpm |     image: nextcloud:31.0.6-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 | ||||||
| @ -119,7 +124,7 @@ services: | |||||||
|  |  | ||||||
|  |  | ||||||
|   cache: |   cache: | ||||||
|     image: redis:7.2.5-alpine |     image: redis:8.0.2-alpine | ||||||
|     networks: |     networks: | ||||||
|       - internal |       - internal | ||||||
|     volumes: |     volumes: | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								entrypoint.whiteboard.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								entrypoint.whiteboard.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | export JWT_SECRET_KEY=$(cat /run/secrets/whiteboard_jwt) | ||||||
|  |  | ||||||
|  | exec npm run server:start | ||||||
| @ -10,7 +10,11 @@ events { | |||||||
|  |  | ||||||
|  |  | ||||||
| http { | http { | ||||||
|     include mime.types; |     include       /etc/nginx/mime.types; | ||||||
|  |     # See https://github.com/nextcloud/forms/issues/1838#issuecomment-1860497200 | ||||||
|  |     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" ' | ||||||
| @ -22,17 +26,8 @@ http { | |||||||
|     sendfile        on; |     sendfile        on; | ||||||
|     #tcp_nopush     on; |     #tcp_nopush     on; | ||||||
|  |  | ||||||
|     # Prevent nginx HTTP Server Detection |  | ||||||
|     server_tokens   off; |  | ||||||
|  |  | ||||||
|     keepalive_timeout  65; |     keepalive_timeout  65; | ||||||
|  |  | ||||||
|     # Set the `immutable` cache control options only for assets with a cache busting `v` argument |  | ||||||
|     map $arg_v $asset_immutable { |  | ||||||
|         "" ""; |  | ||||||
|     default "immutable"; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #gzip  on; |     #gzip  on; | ||||||
|  |  | ||||||
|     upstream php-handler { |     upstream php-handler { | ||||||
| @ -50,15 +45,17 @@ http { | |||||||
|         # could take several months. |         # could take several months. | ||||||
|         #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; |         #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | ||||||
|  |  | ||||||
|         # set max upload size and increase upload timeout: |         {{ if eq (env "HSTS_ENABLED") "1" }} | ||||||
|         client_max_body_size 512M; |         {{ if eq (env "HSTS_PRELOAD") "1" }} | ||||||
|         client_body_timeout 300s; |         add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | ||||||
|         fastcgi_buffers 64 4K; |         {{ else }} | ||||||
|  |         add_header Strict-Transport-Security "max-age=15768000; includeSubDomains;" always; | ||||||
|  |         {{ end }} | ||||||
|  |         {{ end }} | ||||||
|  |  | ||||||
|         # The settings allows you to optimize the HTTP2 bandwidth. |         # set max upload size | ||||||
|         # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/ |         client_max_body_size 512M; | ||||||
|         # for tuning hints |         fastcgi_buffers 64 4K; | ||||||
|         client_body_buffer_size 512k; |  | ||||||
|  |  | ||||||
|         # Enable gzip but do not remove ETag headers |         # Enable gzip but do not remove ETag headers | ||||||
|         gzip on; |         gzip on; | ||||||
| @ -66,7 +63,7 @@ http { | |||||||
|         gzip_comp_level 4; |         gzip_comp_level 4; | ||||||
|         gzip_min_length 256; |         gzip_min_length 256; | ||||||
|         gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; |         gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; | ||||||
|         gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; |         gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; | ||||||
|  |  | ||||||
|         # Pagespeed is not supported by Nextcloud, so if your server is built |         # Pagespeed is not supported by Nextcloud, so if your server is built | ||||||
|         # with the `ngx_pagespeed` module, uncomment this line to disable it. |         # with the `ngx_pagespeed` module, uncomment this line to disable it. | ||||||
| @ -75,6 +72,7 @@ http { | |||||||
|         # HTTP response headers borrowed from Nextcloud `.htaccess` |         # HTTP response headers borrowed from Nextcloud `.htaccess` | ||||||
|         add_header Referrer-Policy                      "no-referrer"       always; |         add_header Referrer-Policy                      "no-referrer"       always; | ||||||
|         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-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                         "noindex, nofollow" always; | ||||||
|         add_header X-XSS-Protection                     "1; mode=block"     always; |         add_header X-XSS-Protection                     "1; mode=block"     always; | ||||||
| @ -164,32 +162,12 @@ http { | |||||||
|  |  | ||||||
|             fastcgi_intercept_errors on; |             fastcgi_intercept_errors on; | ||||||
|             fastcgi_request_buffering off; |             fastcgi_request_buffering off; | ||||||
|  |  | ||||||
|             fastcgi_max_temp_file_size 0; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         # Javascript mimetype fixes for nginx |         location ~ \.(?:css|js|svg|gif)$ { | ||||||
|         # Note: The block below should be removed, and the js|mjs section should be |  | ||||||
|         # added to the block below this one. This is a temporary fix until Nginx  |  | ||||||
|         # upstream fixes the js mime-type |  | ||||||
|         location ~* \.(?:js|mjs)$ { |  | ||||||
|             types {  |  | ||||||
|                 text/javascript js mjs; |  | ||||||
|             }  |  | ||||||
|             try_files $uri /index.php$request_uri; |             try_files $uri /index.php$request_uri; | ||||||
|             add_header Cache-Control "public, max-age=15778463, $asset_immutable"; |             expires 6M;         # Cache-Control policy borrowed from `.htaccess` | ||||||
|             access_log off; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         # Serve static files |  | ||||||
|         location ~ \.(?:css|svg|gif|png|jpg|ico|wasm|tflite|map|ogg|flac)$ { |  | ||||||
|             try_files $uri /index.php$request_uri; |  | ||||||
|             add_header Cache-Control "public, max-age=15778463, $asset_immutable"; |  | ||||||
|             access_log off;     # Optional: Don't log access to assets |             access_log off;     # Optional: Don't log access to assets | ||||||
|  |  | ||||||
|             location ~ \.wasm$ { |  | ||||||
|                 default_type application/wasm; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         location ~ \.woff2?$ { |         location ~ \.woff2?$ { | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								pg_backup.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								pg_backup.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | BACKUP_FILE='/var/lib/postgresql/data/backup.sql' | ||||||
|  |  | ||||||
|  | function backup { | ||||||
|  |   export PGPASSWORD=$(cat /run/secrets/db_password) | ||||||
|  |   pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > $BACKUP_FILE | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function restore { | ||||||
|  |     cd /var/lib/postgresql/data/ | ||||||
|  |     restore_config(){ | ||||||
|  |         # Restore allowed connections | ||||||
|  |         cat pg_hba.conf.bak > pg_hba.conf | ||||||
|  |         su postgres -c 'pg_ctl reload' | ||||||
|  |     } | ||||||
|  |     # Don't allow any other connections than local | ||||||
|  |     cp pg_hba.conf pg_hba.conf.bak | ||||||
|  |     echo "local all all trust" > pg_hba.conf | ||||||
|  |     su postgres -c 'pg_ctl reload' | ||||||
|  |     trap restore_config EXIT INT TERM | ||||||
|  |  | ||||||
|  |     # Recreate Database | ||||||
|  |     psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);"  | ||||||
|  |     createdb -U ${POSTGRES_USER} ${POSTGRES_DB} | ||||||
|  |     psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f $BACKUP_FILE | ||||||
|  |  | ||||||
|  |     trap - EXIT INT TERM | ||||||
|  |     restore_config | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $@ | ||||||
							
								
								
									
										1
									
								
								release/10.0.0+30.0.4-fpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								release/10.0.0+30.0.4-fpm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | https://docs.nextcloud.com/server/latest/admin_manual/release_notes/upgrade_to_30.html | ||||||
							
								
								
									
										4
									
								
								release/11.0.0+30.0.4-fpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								release/11.0.0+30.0.4-fpm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | Upgrades mariadb from 10.5 to 11.4 | ||||||
|  | NOTE: If your Nextcloud instance is using mariadb, after running this update you MUST run the database upgrade command: | ||||||
|  | `abra app command nextcloud.yourserver.org db upgrade_mariadb` | ||||||
|  | More info: https://mariadb.com/kb/en/upgrading-from-mariadb-10-11-to-mariadb-11-4/ | ||||||
							
								
								
									
										1
									
								
								release/9.1.0+29.0.5-fpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								release/9.1.0+29.0.5-fpm
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | Added automated customization options. Config needs to be updated to be able to use it. | ||||||
		Reference in New Issue
	
	Block a user
	