Compare commits

...

58 Commits

Author SHA1 Message Date
James Manuel 8941f364eb 🔧 fix(nextcloud): use parameter expansion instead of sed (SC2001)
Replace sed pipe with bash suffix-removal expansion to satisfy
shellcheck SC2001.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
2026-06-09 16:19:46 +02:00
James Manuel f3abe7bc21 🔧 fix(nextcloud): configure EuroOffice internal URLs and preview provider
Three fixes applied when \$EUROOFFICE_HOST matches the default AIO
container naming pattern (nextcloud-*-eurooffice):

1. DocumentServerInternalUrl → http://\$EUROOFFICE_HOST:80/
   Bypasses the public domain for NC→EuroOffice converter calls.
   Trailing slash required; DocumentService.php concatenates the raw
   value with "converter" with no separator.

2. StorageUrl → http://\$APACHE_CONTAINER_HOST.nextcloud-aio:23973/
   Bypasses the public domain for EuroOffice→NC file fetch calls.
   Port 23973 is the Collabora WOPI ingress; port 11000 rejects
   requests where Host doesn't match the nextcloud.test binding.
   Trailing slash required to avoid malformed replacement URLs.

3. enabledPreviewProviders index 50 → OCA\Eurooffice\Preview
   NC's allowlist is explicit; registerPreviewProvider() alone is
   insufficient. Fixed index 50 avoids collision with AIO's seeded
   range (1–7, 23).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
2026-06-09 16:19:46 +02:00
Simon L. 4a35fda9d2 make database dump logic even more failure proof (#8286) 2026-06-09 15:17:08 +02:00
Simon L. 3a6ffcd9e9 make database dump logic even more failure proof
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-09 15:13:41 +02:00
Simon L. e659d3e047 PHP dependency updates (#8284) 2026-06-09 14:58:24 +02:00
szaimen 7c2d0128ff php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 12:54:58 +00:00
Simon L. 3de2d79cd6 aio-interface: mark Onlyoffice as deprecated (#8283) 2026-06-09 14:47:43 +02:00
Simon L. 5b17e9368e makemkv: allow it to access the necessary devices (#8276) 2026-06-09 14:45:19 +02:00
Simon L. f22ed12c4b aio-interface: add background to log overlay and use monospace font (#8271) 2026-06-09 14:42:10 +02:00
Simon L. e30f416d55 makemkv: allow it to access the necessary devices
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-09 14:33:34 +02:00
Simon L. 0ca4307bcb allow scrutiny to access all block devices (#8275) 2026-06-09 14:32:48 +02:00
Simon L. 313c39d2bc Apply suggestion from @szaimen
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-09 14:31:23 +02:00
Simon L. f7f107a3e5 aio-interface: mark Onlyoffice as deprecated
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-09 14:25:48 +02:00
Simon L. fe1ad77a45 build(deps): bump actions/checkout from 6.0.2 to 6.0.3 in /.github/workflows (#8281) 2026-06-09 14:22:31 +02:00
Simon L. 8018fc9802 build(deps): bump httpd from 2.4.67-alpine3.23 to 2.4.68-alpine3.23 in /Containers/apache (#8280) 2026-06-09 14:22:17 +02:00
Simon L. 0c80e3071e build(deps): bump guzzlehttp/guzzle from 7.11.0 to 7.11.1 in /php (#8277) 2026-06-09 14:21:54 +02:00
Simon L. bec4f533cb build(deps): bump php from 8.5.6-fpm-alpine3.23 to 8.5.7-fpm-alpine3.23 in /Containers/mastercontainer (#8270) 2026-06-09 14:21:39 +02:00
Simon L. d6c6601b29 build(deps): bump collabora/code from 26.04.1.3.1 to 26.04.1.4.1 in /Containers/collabora (#8269) 2026-06-09 14:21:23 +02:00
Simon L. 851cc26663 build(deps): bump docker from 29.5.2-cli to 29.5.3-cli in /Containers/mastercontainer (#8261) 2026-06-09 14:20:55 +02:00
Simon L. d6644fd6a3 Helm Chart updates (#8282) 2026-06-09 14:09:17 +02:00
szaimen 4c998aff73 Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-09 12:05:08 +00:00
dependabot[bot] 99b5c181b1 build(deps): bump actions/checkout in /.github/workflows
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-09 12:04:47 +00:00
Simon L. bc5ca59675 Yaml updates (#8213) 2026-06-09 14:03:31 +02:00
dependabot[bot] 5a7f543754 build(deps): bump httpd in /Containers/apache
Bumps httpd from 2.4.67-alpine3.23 to 2.4.68-alpine3.23.

---
updated-dependencies:
- dependency-name: httpd
  dependency-version: 2.4.68-alpine3.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-09 04:08:13 +00:00
szaimen e2380aa521 Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-08 13:30:58 +00:00
dependabot[bot] 39f4808376 build(deps): bump guzzlehttp/guzzle from 7.11.0 to 7.11.1 in /php
Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 7.11.0 to 7.11.1.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/7.11/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.11.0...7.11.1)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-version: 7.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 12:05:10 +00:00
Simon L. aadadf4460 allow scrutiny to access all block devices
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-08 11:49:54 +02:00
Simon L. 52f8dc9043 increase to 13.2.1
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-08 10:18:48 +02:00
Simon L. e96f5b43fa fulltextsearch: fix healthcheck (#8267) 2026-06-08 10:16:39 +02:00
copilot-swe-agent[bot] 1f91919dca fix(overlay): add background to log overlay and use monospace font
Fixes two issues from #8089:
- Add background-color to overlay-log so the container is visible
  before text starts appearing
- Use monospace font in overlay iframe content for better log readability
- Bump CSS cache version to v12
2026-06-08 08:11:59 +00:00
dependabot[bot] 9c276df668 build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.5.6-fpm-alpine3.23 to 8.5.7-fpm-alpine3.23.

---
updated-dependencies:
- dependency-name: php
  dependency-version: 8.5.7-fpm-alpine3.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 04:07:45 +00:00
dependabot[bot] 95f1691352 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 26.04.1.3.1 to 26.04.1.4.1.

---
updated-dependencies:
- dependency-name: collabora/code
  dependency-version: 26.04.1.4.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-08 04:07:28 +00:00
Simon L. 6cbf5eeefb fulltextsearch: fix healthcheck
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-06 22:24:52 +02:00
dependabot[bot] 25c7b8f7ef build(deps): bump docker in /Containers/mastercontainer
Bumps docker from 29.5.2-cli to 29.5.3-cli.

---
updated-dependencies:
- dependency-name: docker
  dependency-version: 29.5.3-cli
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-05 04:06:24 +00:00
Simon L. 5393ffbb81 doc: add missing proxy header in reverse-proxy.md (#8260) 2026-06-04 22:15:38 +02:00
Clément Pivot 3cee8b2dda Update reverse-proxy.md
fix: add missing nginx proxy header

Signed-off-by: Clément Pivot <8830707+Clement-Pivot@users.noreply.github.com>
2026-06-04 20:45:56 +02:00
Copilot 6375921282 add eurooffice (#8052) 2026-06-04 12:42:02 +02:00
Simon L. 792549c904 build(deps): bump golang from 1.26.3-alpine3.23 to 1.26.4-alpine3.23 in /Containers/watchtower (#8254) 2026-06-04 10:07:30 +02:00
Simon L. 50eea8421b build(deps): bump nats from 2.14.1-scratch to 2.14.2-scratch in /Containers/talk (#8253) 2026-06-04 10:07:05 +02:00
Simon L. 9ea710ba0e build(deps): bump caddy from 2.11.3-builder-alpine to 2.11.4-builder-alpine in /Containers/mastercontainer (#8252) 2026-06-04 10:06:29 +02:00
Simon L. 4940ece62a build(deps): bump golang from 1.26.3-alpine3.23 to 1.26.4-alpine3.23 in /Containers/imaginary (#8251) 2026-06-04 10:06:04 +02:00
Simon L. eed6c74e0c build(deps): bump haproxy from 3.3.10-alpine to 3.4.0-alpine in /Containers/docker-socket-proxy (#8250) 2026-06-04 10:05:25 +02:00
Simon L. ee7d639a0e build(deps): bump caddy from 2.11.3-alpine to 2.11.4-alpine in /Containers/apache (#8249) 2026-06-04 10:04:47 +02:00
Simon L. 7fc2a134b7 build(deps): bump collabora/code from 25.04.10.3.1 to 26.04.1.3.1 in /Containers/collabora (#8255) 2026-06-04 10:03:04 +02:00
dependabot[bot] bd1d52b220 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.10.3.1 to 26.04.1.3.1.

---
updated-dependencies:
- dependency-name: collabora/code
  dependency-version: 26.04.1.3.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-04 04:34:29 +00:00
dependabot[bot] d8e42d2fd8 build(deps): bump golang in /Containers/watchtower
Bumps golang from 1.26.3-alpine3.23 to 1.26.4-alpine3.23.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.4-alpine3.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:58:33 +00:00
dependabot[bot] 8b6ff83c19 build(deps): bump nats in /Containers/talk
Bumps nats from 2.14.1-scratch to 2.14.2-scratch.

---
updated-dependencies:
- dependency-name: nats
  dependency-version: 2.14.2-scratch
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:58:17 +00:00
dependabot[bot] 82f2e9dca1 build(deps): bump caddy in /Containers/mastercontainer
Bumps caddy from 2.11.3-builder-alpine to 2.11.4-builder-alpine.

---
updated-dependencies:
- dependency-name: caddy
  dependency-version: 2.11.4-builder-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:57:41 +00:00
dependabot[bot] 414ef03706 build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.26.3-alpine3.23 to 1.26.4-alpine3.23.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.4-alpine3.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:57:30 +00:00
dependabot[bot] f668767765 build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.3.10-alpine to 3.4.0-alpine.

---
updated-dependencies:
- dependency-name: haproxy
  dependency-version: 3.4.0-alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:57:25 +00:00
dependabot[bot] 2b8de735dc build(deps): bump caddy in /Containers/apache
Bumps caddy from 2.11.3-alpine to 2.11.4-alpine.

---
updated-dependencies:
- dependency-name: caddy
  dependency-version: 2.11.4-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-03 21:56:07 +00:00
Simon L. 21250f8ea8 talk-recording: adjust listen address back to 0.0.0.0 as talk-recording listen address does not officially support ipv6 yet (#8246) 2026-06-03 13:34:42 +02:00
Simon L. dc69f69e74 talk-recording: adjust listen address back to 0.0.0.0 as talk-recording listen address does not officially support ipv6 yet
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-03 13:32:04 +02:00
Simon L. f28b2a7c1e overlay-log: make it a bit less wide
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-03 12:59:57 +02:00
Simon L. 1b1a15edba increase to v13.2.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-03 12:42:21 +02:00
Copilot 1f94bc8af0 aio-interface: extract Nextcloud latest-major upgrade logic to dedicated script and add UI trigger button (#7988)
* Extract Nextcloud major upgrade logic to script and add UI button

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/8cd11b09-5073-4e27-8e59-9afffaf96c1f

Rename sendNotification to execCommandInContainer and reuse for upgrade method

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/88744552-9d64-4de2-9f64-5a98a5e3b200

Add $cmd array validation to execCommandInContainer

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/45d5228c-7834-404e-ba54-90b5c8c207c8

Apply suggestion from @szaimen

Signed-off-by: Simon L. <szaimen@e.mail.de>

Apply suggestion from @szaimen

Signed-off-by: Simon L. <szaimen@e.mail.de>

Apply suggestion from @szaimen

Signed-off-by: Simon L. <szaimen@e.mail.de>

Apply suggestion from @szaimen

Signed-off-by: Simon L. <szaimen@e.mail.de>

Set installLatestMajor when upgrade-to-latest-major button is clicked

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/7b977c85-9b74-4027-a536-152e49a01976

Extract getLatestMajorVersion() to avoid duplicating the version string

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/d5ec921f-8629-4f6e-949a-e8f89f1eb85f

Address PR review comments and hardcode updater channel to stable

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/c40941ff-2bf8-4a57-82be-2a0bd22b19a2

Restore sendNotification(), update cron files, extract getPlainStreamingCallback()

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/a5b6cd86-d278-4771-8a11-976c4a862966

Remove getPlainStreamingCallback, unify on getAddToStreamingResponseBody

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/15a4b815-076b-469f-95b2-c61df688a28d

Revert "Remove getPlainStreamingCallback, unify on getAddToStreamingResponseBody"

This reverts commit 6846c3a99549703121461f910cc26e6c116e0dc4.

* Refactor creating and using addToStreamingResponseBody()

This way we stick to having one implementation of the function, not three.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Read streamed output line by line, not via buffer

This way the code doesn't wait for a buffer to be filled, and we don't need to
implement logic ourselves that is provided by a present library already.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Ensure all HTTP requests are proxied, even with streaming

When requesting a streamed response, Guzzle apparently doesn't use curl, and thus we have to specify the unix socket proxy differently.

We can't specify it when creating the client, though (Guzzle complains).

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Fix syntax errors

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Remove broken code

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Fix readline line from streaming response

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Strip ANSI codes from command output before sending it to the browser

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Run PHP commands as www-data

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Properly compare version numbers

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Fix using memory limits from env

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Fix return type spec

This method always returns a closure, never null.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Use more general return type

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Avoid psalm complaint

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Fix namespace of return type

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>

* Apply suggestion from @szaimen

Signed-off-by: Simon L. <szaimen@e.mail.de>

---------

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Pablo Zmdl <pablo@nextcloud.com>
Co-authored-by: Simon L. <szaimen@e.mail.de>
2026-06-03 12:38:50 +02:00
Simon L. 335db2aac2 try to fix playwright (#8245) 2026-06-02 17:11:46 +02:00
Simon L. f5f19a488f fix playwright
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-02 17:09:45 +02:00
84 changed files with 710 additions and 209 deletions
+1 -1
View File
@@ -31,12 +31,12 @@ updates:
- "/Containers/collabora"
- "/Containers/docker-socket-proxy"
- "/Containers/domaincheck"
- "/Containers/eurooffice"
- "/Containers/fulltextsearch"
- "/Containers/imaginary"
- "/Containers/mastercontainer"
- "/Containers/nextcloud"
- "/Containers/notify-push"
- "/Containers/onlyoffice"
- "/Containers/postgresql"
- "/Containers/redis"
- "/Containers/talk"
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Check spelling
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
with:
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
name: update collabora
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run collabora-profile-update
run: |
rm -f php/cool-seccomp-profile.json
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Validate structure
run: |
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
name: Run dependency update script
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.5
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install hadolint
run: |
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Turnstyle
uses: softprops/turnstyle@e15e934b3f69ee283ba389ea05c8886baa656d93 # v2
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
name: update to latest imaginary commit on master branch
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run imaginary-update
run: |
# Imaginary
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Validate Json
run: |
sudo apt-get update
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.1
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.1
with:
persist-credentials: false
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
name: Run nextcloud-update script
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run nextcloud-update script
run: |
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
@@ -16,7 +16,7 @@ jobs:
name: PHP Deprecation Detector
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
+2 -2
View File
@@ -28,11 +28,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: lts/*
node-version: 24.15.0
- name: Install dependencies
run: cd php/tests && npm ci
@@ -13,11 +13,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: lts/*
node-version: 24.15.0
- name: Install dependencies
run: cd php/tests && npm ci
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
+1 -1
View File
@@ -32,7 +32,7 @@ jobs:
name: static-psalm-analysis
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
name: Check Shell
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run Shellcheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
with:
@@ -42,14 +42,14 @@ jobs:
require: admin
- name: Checkout workflow repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
path: source
repository: nextcloud/.github
- name: Checkout app
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
path: target
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
name: update talk
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run talk-container-update
run: |
# Recording
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
+1 -1
View File
@@ -8,4 +8,4 @@ jobs:
name: update copyright
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: update helm chart
run: |
set -x
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: update yaml files
run: |
sudo bash manual-install/update-yaml.sh
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
name: update watchtower
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run watchtower-container-update
run: |
# Watchtower
+8 -1
View File
@@ -47,7 +47,14 @@ http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI req
uri strip_prefix /onlyoffice
reverse_proxy {$ONLYOFFICE_HOST}:80 {
header_up X-Forwarded-Host {http.request.hostport}/onlyoffice
header_up X-Forwarded-Proto https
}
}
# EuroOffice
route /eurooffice/* {
uri strip_prefix /eurooffice
reverse_proxy {$EUROOFFICE_HOST}:80 {
header_up X-Forwarded-Host {http.request.hostport}/eurooffice
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
# syntax=docker/dockerfile:latest
FROM caddy:2.11.3-alpine AS caddy
FROM caddy:2.11.4-alpine AS caddy
# From https://github.com/docker-library/httpd/blob/master/2.4/alpine/Dockerfile
FROM httpd:2.4.67-alpine3.23
FROM httpd:2.4.68-alpine3.23
COPY --from=caddy /usr/bin/caddy /usr/bin/caddy
+1 -1
View File
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From a file located probably somewhere here: https://github.com/CollaboraOnline/online/blob/master/docker/from-packages/Dockerfile
FROM collabora/code:25.04.10.3.1
FROM collabora/code:26.04.1.4.1
USER root
ARG DEBIAN_FRONTEND=noninteractive
+1 -1
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM haproxy:3.3.10-alpine
FROM haproxy:3.4.0-alpine
# hadolint ignore=DL3002
USER root
+17
View File
@@ -0,0 +1,17 @@
# syntax=docker/dockerfile:latest
FROM ghcr.io/euro-office/documentserver:v9.3.1-beta.1
# USER root is probably used
COPY --chmod=775 healthcheck.sh /healthcheck.sh
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="EuroOffice for Nextcloud AIO" \
org.opencontainers.image.description="EuroOffice Document Server for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
org.opencontainers.image.vendor="Nextcloud" \
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
nc -z 127.0.0.1 80 || exit 1
+1 -1
View File
@@ -4,4 +4,4 @@ if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
curl -fs -u "elastic:$FULLTEXTSEARCH_PASSWORD" "http://127.0.0.1:9200/_cluster/health?filter_path=status" | grep -qE '"status":"(green|yellow)"' || exit 1
curl -fs -u "elastic:$ELASTIC_PASSWORD" "http://127.0.0.1:9200/_cluster/health?filter_path=status" | grep -qE '"status":"(green|yellow)"' || exit 1
+1 -1
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM golang:1.26.3-alpine3.23 AS go
FROM golang:1.26.4-alpine3.23 AS go
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
+3 -3
View File
@@ -1,17 +1,17 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
FROM docker:29.5.2-cli AS docker
FROM docker:29.5.3-cli AS docker
ARG CADDY_REMOTE_HOST_HASH=e80a9931765a8dbcbb47db415863387f0df0e1b3
# Caddy is a requirement
FROM caddy:2.11.3-builder-alpine AS caddy
FROM caddy:2.11.4-builder-alpine AS caddy
RUN set -ex; \
xcaddy build --with github.com/muety/caddy-remote-host@"$CADDY_REMOTE_HOST_HASH"; \
/usr/bin/caddy list-modules
# From https://github.com/docker-library/php/blob/master/8.5/alpine3.23/fpm/Dockerfile
FROM php:8.5.6-fpm-alpine3.23
FROM php:8.5.7-fpm-alpine3.23
EXPOSE 80
EXPOSE 8080
@@ -2,4 +2,5 @@
$CONFIG = array (
'one-click-instance' => true,
'one-click-instance.user-limit' => 100,
'update_channel' => 'stable',
);
+67 -31
View File
@@ -419,41 +419,12 @@ EOF
# AIO update to latest start # Do not remove or change this line!
if [ "$INSTALL_LATEST_MAJOR" = yes ]; then
php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater"
INSTALLED_AT="$(php /var/www/html/occ config:app:get core installedat)"
if [ -n "${INSTALLED_AT}" ]; then
# Set the installdat to 00 which will allow to skip staging and install the next major directly
# shellcheck disable=SC2001
INSTALLED_AT="$(echo "${INSTALLED_AT}" | sed "s|[0-9][0-9]$|00|")"
php /var/www/html/occ config:app:set core installedat --value="${INSTALLED_AT}"
fi
php /var/www/html/updater/updater.phar --no-interaction --no-backup
if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then
echo "Installation of Nextcloud failed!"
touch "$NEXTCLOUD_DATA_DIR/install.failed"
if ! bash /upgrade-latest-major.sh; then
echo "Upgrade to latest major version failed! Check the output above for details."
exit 1
fi
# shellcheck disable=SC2016
installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
INSTALLED_MAJOR="${installed_version%%.*}"
IMAGE_MAJOR="${image_version%%.*}"
# If a valid upgrade path, trigger the Nextcloud built-in Updater
if ! [ "$INSTALLED_MAJOR" -gt "$IMAGE_MAJOR" ]; then
php /var/www/html/updater/updater.phar --no-interaction --no-backup
if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then
echo "Installation of Nextcloud failed!"
# TODO: Add a hint here about what to do / where to look / updater.log?
touch "$NEXTCLOUD_DATA_DIR/install.failed"
exit 1
fi
# shellcheck disable=SC2016
installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
fi
php /var/www/html/occ config:system:set updatechecker --type=bool --value=true
php /var/www/html/occ app:enable nextcloud-aio --force
php /var/www/html/occ db:add-missing-columns
php /var/www/html/occ db:add-missing-primary-keys
yes | php /var/www/html/occ db:convert-filecache-bigint
fi
# AIO update to latest end # Do not remove or change this line!
@@ -896,6 +867,71 @@ else
fi
fi
# EuroOffice
if [ "$EUROOFFICE_ENABLED" = 'yes' ]; then
# Determine EuroOffice port based on host pattern
if echo "$EUROOFFICE_HOST" | grep -q "nextcloud-.*-eurooffice"; then
EUROOFFICE_PORT=80
else
EUROOFFICE_PORT=443
fi
count=0
while ! nc -z "$EUROOFFICE_HOST" "$EUROOFFICE_PORT" && [ "$count" -lt 90 ]; do
echo "Waiting for EuroOffice to become available..."
count=$((count+5))
sleep 5
done
if [ "$count" -ge 90 ]; then
bash /notify.sh "EuroOffice did not start in time!" "Skipping initialization and disabling eurooffice app."
php /var/www/html/occ app:disable eurooffice
else
# Install or enable EuroOffice app as needed
if ! [ -d "/var/www/html/custom_apps/eurooffice" ]; then
php /var/www/html/occ app:install eurooffice
elif [ "$(php /var/www/html/occ config:app:get eurooffice enabled)" != "yes" ]; then
php /var/www/html/occ app:enable eurooffice
elif [ "$SKIP_UPDATE" != 1 ]; then
php /var/www/html/occ app:update eurooffice
fi
# Set EuroOffice configuration
php /var/www/html/occ config:system:set eurooffice editors_check_interval --value="0" --type=integer
php /var/www/html/occ config:system:set eurooffice jwt_secret --value="$EUROOFFICE_SECRET"
php /var/www/html/occ config:app:set eurooffice jwt_secret --value="$EUROOFFICE_SECRET"
php /var/www/html/occ config:system:set eurooffice jwt_header --value="AuthorizationJwt"
# Adjust the EuroOffice host if using internal pattern
if echo "$EUROOFFICE_HOST" | grep -q "nextcloud-.*-eurooffice"; then
# Set internal URLs for server-to-server calls via Docker network,
# bypassing the public domain which may not resolve inside containers.
# DocumentServerInternalUrl: NC -> EuroOffice (direct container port)
# StorageUrl: EuroOffice -> NC (via port 23973 which has a matching Caddy server-block)
APACHE_CONTAINER_HOST="${EUROOFFICE_HOST%-eurooffice}-apache"
php /var/www/html/occ config:app:set eurooffice DocumentServerInternalUrl --value="http://$EUROOFFICE_HOST:80/"
php /var/www/html/occ config:app:set eurooffice StorageUrl --value="http://$APACHE_CONTAINER_HOST.nextcloud-aio:23973/"
EUROOFFICE_HOST="$NC_DOMAIN/eurooffice"
export EUROOFFICE_HOST
fi
php /var/www/html/occ config:app:set eurooffice DocumentServerUrl --value="https://$EUROOFFICE_HOST"
# Register EuroOffice preview provider in the explicit allowlist.
# Use a high fixed index (50) to avoid colliding with AIO's seeded indices (1-7, 23).
if ! php /var/www/html/occ config:system:get enabledPreviewProviders | grep -q "Eurooffice"; then
php /var/www/html/occ config:system:set enabledPreviewProviders 50 --value="OCA\Eurooffice\Preview"
fi
fi
else
# Remove EuroOffice app if disabled and removal is requested
if [ "$REMOVE_DISABLED_APPS" = yes ] && \
[ -d "/var/www/html/custom_apps/eurooffice" ] && \
[ -n "$EUROOFFICE_SECRET" ] && \
[ "$(php /var/www/html/occ config:system:get eurooffice jwt_secret)" = "$EUROOFFICE_SECRET" ]; then
php /var/www/html/occ app:remove eurooffice
fi
fi
# Talk
if [ "$TALK_ENABLED" = 'yes' ]; then
set -x
@@ -0,0 +1,43 @@
#!/bin/bash
PHP_CLI="php"
if [[ "$EUID" = 0 ]]; then
PHP_CLI="sudo -u www-data -E $PHP_CLI"
fi
# shellcheck disable=SC2016
image_version="$($PHP_CLI -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
export IMAGE_MAJOR="${image_version%%.*}"
$PHP_CLI /var/www/html/occ config:system:set updatedirectory --value="/nc-updater"
INSTALLED_AT="$($PHP_CLI /var/www/html/occ config:app:get core installedat)"
if [ -n "${INSTALLED_AT}" ]; then
# Set the installedat to 00 which will allow to skip staging and install the next major directly
# shellcheck disable=SC2001
INSTALLED_AT="$(echo "${INSTALLED_AT}" | sed "s|[0-9][0-9]$|00|")"
$PHP_CLI /var/www/html/occ config:app:set core installedat --value="${INSTALLED_AT}"
fi
$PHP_CLI /var/www/html/updater/updater.phar --no-interaction --no-backup
if ! $PHP_CLI /var/www/html/occ -V || $PHP_CLI /var/www/html/occ status | grep maintenance | grep -q 'true'; then
echo "Installation of Nextcloud failed!"
touch "$NEXTCLOUD_DATA_DIR/install.failed"
exit 1
fi
# shellcheck disable=SC2016
installed_version="$($PHP_CLI -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
export INSTALLED_MAJOR="${installed_version%%.*}"
# If a valid upgrade path, trigger the Nextcloud built-in Updater
if ! $PHP_CLI -r "version_compare(getenv('INSTALLED_MAJOR'), getenv('IMAGE_MAJOR'), '>') || exit(1);"; then
$PHP_CLI /var/www/html/updater/updater.phar --no-interaction --no-backup
if ! $PHP_CLI /var/www/html/occ -V || $PHP_CLI /var/www/html/occ status | grep maintenance | grep -q 'true'; then
echo "Installation of Nextcloud failed!"
# TODO: Add a hint here about what to do / where to look / updater.log?
touch "$NEXTCLOUD_DATA_DIR/install.failed"
exit 1
fi
fi
$PHP_CLI /var/www/html/occ config:system:set updatechecker --type=bool --value=true
$PHP_CLI /var/www/html/occ app:enable nextcloud-aio --force
$PHP_CLI /var/www/html/occ db:add-missing-columns
$PHP_CLI /var/www/html/occ db:add-missing-primary-keys
yes | $PHP_CLI /var/www/html/occ db:convert-filecache-bigint
+8 -1
View File
@@ -13,6 +13,8 @@ esac)"
export POSTGRES_LOG_MIN_MESSAGES
# Variables
GREP_STRING='Name: oc_appconfig; Type: TABLE; Schema: public; Owner:'
export GREP_STRING
DATADIR="/var/lib/postgresql/data"
export DUMP_DIR="/mnt/data"
DUMP_FILE="$DUMP_DIR/database-dump.sql"
@@ -103,7 +105,6 @@ if ( [ -f "$DATADIR/PG_VERSION" ] && [ "$PG_MAJOR" != "$(cat "$DATADIR/PG_VERSIO
done
# Check if the line we grep for later on is there
GREP_STRING='Name: oc_appconfig; Type: TABLE; Schema: public; Owner:'
if ! grep -qa "$GREP_STRING" "$DUMP_FILE"; then
echo "The needed oc_appconfig line is not there which is unexpected."
echo "Please report this to https://github.com/nextcloud/all-in-one/issues. Thanks!"
@@ -239,6 +240,12 @@ do_database_dump() {
rm -f "$DUMP_FILE"
mv "$DUMP_FILE.temp" "$DUMP_FILE"
pg_ctl stop -m fast
if ! grep -qa "$GREP_STRING" "$DUMP_FILE"; then
echo "Database dump was successful but the expected grep string does not exist."
echo "This is not expected!"
echo "Please report this to https://github.com/nextcloud/all-in-one/issues."
exit 1
fi
rm "$DUMP_DIR/export.failed"
echo 'Database dump successful!'
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
+1 -1
View File
@@ -4,4 +4,4 @@ if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
nc -z 127.0.0.1 1234 || nc -z ::1 1234 || exit 1
nc -z 127.0.0.1 1234 || exit 1
+1 -9
View File
@@ -58,21 +58,13 @@ extensionaudio = .m4a
extensionvideo = .mp4"
fi
# Detect IPv6 availability to choose the right listen address
RECORDING_LISTEN="0.0.0.0:1234"
if ! grep -q "1" /sys/module/ipv6/parameters/disable 2>/dev/null \
&& ! grep -q "1" /proc/sys/net/ipv6/conf/all/disable_ipv6 2>/dev/null \
&& ! grep -q "1" /proc/sys/net/ipv6/conf/default/disable_ipv6 2>/dev/null; then
RECORDING_LISTEN="[::]:1234"
fi
cat << RECORDING_CONF > "/conf/recording.conf"
[logs]
# 30 means Warning
level = ${TALK_RECORDING_LOG_LEVEL}
[http]
listen = ${RECORDING_LISTEN}
listen = 0.0.0.0:1234
[backend]
allowall = ${ALLOW_ALL}
+1 -1
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM nats:2.14.1-scratch AS nats
FROM nats:2.14.2-scratch AS nats
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.1.1 AS signaling
FROM alpine:3.23.4 AS janus
+1 -1
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM golang:1.26.3-alpine3.23 AS go
FROM golang:1.26.4-alpine3.23 AS go
ENV WATCHTOWER_COMMIT_HASH=9d0048403a7242943084bede951f6f966f7691ba
@@ -37,6 +37,9 @@
"writeable": false
}
],
"cap_add": [
"SYS_RAWIO"
],
"environment": [
"TZ=%TIMEZONE%",
"SECURE_CONNECTION=1",
+40 -2
View File
@@ -4,6 +4,9 @@ services:
nextcloud-aio-onlyoffice:
condition: service_started
required: false
nextcloud-aio-eurooffice:
condition: service_started
required: false
nextcloud-aio-collabora:
condition: service_started
required: false
@@ -41,6 +44,7 @@ services:
- APACHE_PORT
- AIO_LOG_LEVEL
- ONLYOFFICE_HOST=nextcloud-aio-onlyoffice
- EUROOFFICE_HOST=nextcloud-aio-eurooffice
- TZ=${TIMEZONE}
- APACHE_MAX_SIZE
- APACHE_MAX_TIME=${NEXTCLOUD_MAX_TIME}
@@ -150,15 +154,18 @@ services:
- TURN_SECRET
- SIGNALING_SECRET
- ONLYOFFICE_SECRET
- EUROOFFICE_SECRET
- AIO_LOG_LEVEL
- NEXTCLOUD_MOUNT
- CLAMAV_ENABLED
- CLAMAV_HOST=nextcloud-aio-clamav
- ONLYOFFICE_ENABLED
- EUROOFFICE_ENABLED
- COLLABORA_ENABLED
- COLLABORA_HOST=nextcloud-aio-collabora
- TALK_ENABLED
- ONLYOFFICE_HOST=nextcloud-aio-onlyoffice
- EUROOFFICE_HOST=nextcloud-aio-eurooffice
- UPDATE_NEXTCLOUD_APPS
- TZ=${TIMEZONE}
- TALK_PORT
@@ -406,6 +413,33 @@ services:
cap_drop:
- NET_RAW
nextcloud-aio-eurooffice:
image: ghcr.io/nextcloud-releases/aio-eurooffice:latest
init: true
healthcheck:
start_period: 60s
test: /healthcheck.sh
interval: 30s
timeout: 30s
start_interval: 5s
retries: 9
expose:
- "80"
environment:
- AIO_LOG_LEVEL
- LOG_LEVEL=${AIO_LOG_LEVEL}
- TZ=${TIMEZONE}
- JWT_ENABLED=true
- JWT_HEADER=AuthorizationJwt
- JWT_SECRET=${EUROOFFICE_SECRET}
volumes:
- nextcloud_aio_eurooffice:/var/lib/euro-office:rw
restart: unless-stopped
profiles:
- eurooffice
cap_drop:
- NET_RAW
nextcloud-aio-imaginary:
image: ghcr.io/nextcloud-releases/aio-imaginary:latest
user: "65534"
@@ -455,11 +489,13 @@ services:
- discovery.type=single-node
- http.port=9200
- xpack.license.self_generated.type=basic
- xpack.security.enabled=false
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- xpack.security.transport.ssl.enabled=false
- indices.fielddata.cache.size=20%
- indices.memory.index_buffer_size=20%
- thread_pool.write.queue_size=1000
- FULLTEXTSEARCH_PASSWORD
- ELASTIC_PASSWORD=${FULLTEXTSEARCH_PASSWORD}
volumes:
- nextcloud_aio_elasticsearch:/usr/share/elasticsearch/data:rw
restart: unless-stopped
@@ -511,6 +547,8 @@ volumes:
name: nextcloud_aio_database_dump
nextcloud_aio_elasticsearch:
name: nextcloud_aio_elasticsearch
nextcloud_aio_eurooffice:
name: nextcloud_aio_eurooffice
nextcloud_aio_nextcloud:
name: nextcloud_aio_nextcloud
nextcloud_aio_onlyoffice:
+2
View File
@@ -1,4 +1,5 @@
DATABASE_PASSWORD= # TODO! This needs to be a unique and good password!
EUROOFFICE_SECRET= # TODO! This needs to be a unique and good password!
FULLTEXTSEARCH_PASSWORD= # TODO! This needs to be a unique and good password!
IMAGINARY_SECRET= # TODO! This needs to be a unique and good password!
NC_DOMAIN=yourdomain.com # TODO! Needs to be changed to the domain that you want to use for Nextcloud.
@@ -14,6 +15,7 @@ WHITEBOARD_SECRET= # TODO! This needs to be a unique and good password!
CLAMAV_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
COLLABORA_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
EUROOFFICE_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
FULLTEXTSEARCH_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
IMAGINARY_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
ONLYOFFICE_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
+1 -1
View File
@@ -1,6 +1,6 @@
name: nextcloud-aio-helm-chart
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
version: 13.1.0
version: 13.2.1
apiVersion: v2
keywords:
- latest
@@ -49,6 +49,8 @@ spec:
value: "{{ .Values.APACHE_PORT }}"
- name: COLLABORA_HOST
value: nextcloud-aio-collabora
- name: EUROOFFICE_HOST
value: nextcloud-aio-eurooffice
- name: NC_DOMAIN
value: "{{ .Values.NC_DOMAIN }}"
- name: NEXTCLOUD_HOST
@@ -63,7 +65,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: ghcr.io/nextcloud-releases/aio-apache:20260527_140826
image: ghcr.io/nextcloud-releases/aio-apache:20260609_115915
readinessProbe:
exec:
command:
@@ -36,7 +36,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260527_140826
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- mkdir
- "-p"
@@ -61,7 +61,7 @@ spec:
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-clamav:20260527_140826
image: ghcr.io/nextcloud-releases/aio-clamav:20260609_115915
readinessProbe:
exec:
command:
@@ -38,9 +38,9 @@ spec:
- name: server_name
value: "{{ .Values.NC_DOMAIN }}"
{{- if contains "--o:support_key=" (join " " (.Values.ADDITIONAL_COLLABORA_OPTIONS | default list)) }}
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260527_140826
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260609_115915
{{- else }}
image: ghcr.io/nextcloud-releases/aio-collabora:20260527_140826
image: ghcr.io/nextcloud-releases/aio-collabora:20260609_115915
{{- end }}
readinessProbe:
exec:
@@ -35,7 +35,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260527_140826
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- mkdir
- "-p"
@@ -66,7 +66,7 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-postgresql:20260527_140826
image: ghcr.io/nextcloud-releases/aio-postgresql:20260609_115915
readinessProbe:
exec:
command:
@@ -0,0 +1,77 @@
{{- if eq .Values.EUROOFFICE_ENABLED "yes" }}
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-eurooffice
name: nextcloud-aio-eurooffice
namespace: "{{ .Values.NAMESPACE }}"
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: nextcloud-aio-eurooffice
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-eurooffice
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- chmod
- "777"
- /nextcloud-aio-eurooffice
volumeMounts:
- name: nextcloud-aio-eurooffice
mountPath: /nextcloud-aio-eurooffice
containers:
- env:
- name: AIO_LOG_LEVEL
value: "{{ .Values.AIO_LOG_LEVEL }}"
- name: JWT_ENABLED
value: "true"
- name: JWT_HEADER
value: AuthorizationJwt
- name: JWT_SECRET
value: "{{ .Values.EUROOFFICE_SECRET }}"
- name: LOG_LEVEL
value: "{{ .Values.AIO_LOG_LEVEL }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-eurooffice:20260609_115915
readinessProbe:
exec:
command:
- /healthcheck.sh
failureThreshold: 9
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 30
livenessProbe:
exec:
command:
- /healthcheck.sh
failureThreshold: 9
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 30
name: nextcloud-aio-eurooffice
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- mountPath: /var/lib/euro-office
name: nextcloud-aio-eurooffice
volumes:
- name: nextcloud-aio-eurooffice
persistentVolumeClaim:
claimName: nextcloud-aio-eurooffice
{{- end }}
@@ -0,0 +1,18 @@
{{- if eq .Values.EUROOFFICE_ENABLED "yes" }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
io.kompose.service: nextcloud-aio-eurooffice
name: nextcloud-aio-eurooffice
namespace: "{{ .Values.NAMESPACE }}"
spec:
{{- if .Values.STORAGE_CLASS }}
storageClassName: {{ .Values.STORAGE_CLASS }}
{{- end }}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.EUROOFFICE_STORAGE_SIZE }}
{{- end }}
@@ -0,0 +1,19 @@
{{- if eq .Values.EUROOFFICE_ENABLED "yes" }}
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-eurooffice
name: nextcloud-aio-eurooffice
namespace: "{{ .Values.NAMESPACE }}"
spec:
ipFamilyPolicy: PreferDualStack
ports:
- name: "80"
port: 80
targetPort: 80
selector:
io.kompose.service: nextcloud-aio-eurooffice
{{- end }}
@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260527_140826
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- chmod
- "777"
@@ -36,10 +36,10 @@ spec:
- env:
- name: AIO_LOG_LEVEL
value: "{{ .Values.AIO_LOG_LEVEL }}"
- name: ELASTIC_PASSWORD
value: "{{ .Values.FULLTEXTSEARCH_PASSWORD }}"
- name: ES_JAVA_OPTS
value: "{{ .Values.FULLTEXTSEARCH_JAVA_OPTIONS | default "-Xms512M -Xmx512M" }}"
- name: FULLTEXTSEARCH_PASSWORD
value: "{{ .Values.FULLTEXTSEARCH_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- name: bootstrap.memory_lock
@@ -59,8 +59,12 @@ spec:
- name: xpack.license.self_generated.type
value: basic
- name: xpack.security.enabled
value: "true"
- name: xpack.security.http.ssl.enabled
value: "false"
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260527_140826
- name: xpack.security.transport.ssl.enabled
value: "false"
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260609_115915
readinessProbe:
exec:
command:
@@ -40,7 +40,7 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-imaginary:20260527_140826
image: ghcr.io/nextcloud-releases/aio-imaginary:20260609_115915
readinessProbe:
exec:
command:
@@ -38,7 +38,7 @@ spec:
# AIO settings start # Do not remove or change this line!
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260527_140826
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- chmod
- "777"
@@ -106,6 +106,12 @@ spec:
value: "{{ .Values.COLLABORA_ENABLED }}"
- name: COLLABORA_HOST
value: nextcloud-aio-collabora
- name: EUROOFFICE_ENABLED
value: "{{ .Values.EUROOFFICE_ENABLED }}"
- name: EUROOFFICE_HOST
value: nextcloud-aio-eurooffice
- name: EUROOFFICE_SECRET
value: "{{ .Values.EUROOFFICE_SECRET }}"
- name: FULLTEXTSEARCH_ENABLED
value: "{{ .Values.FULLTEXTSEARCH_ENABLED }}"
- name: FULLTEXTSEARCH_HOST
@@ -192,7 +198,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260527_140826
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260609_115915
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
securityContext:
# The items below only work in container context
@@ -41,7 +41,7 @@ spec:
value: nextcloud-aio-nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-notify-push:20260527_140826
image: ghcr.io/nextcloud-releases/aio-notify-push:20260609_115915
readinessProbe:
exec:
command:
@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260527_140826
image: ghcr.io/nextcloud-releases/aio-alpine:20260609_115915
command:
- chmod
- "777"
@@ -46,7 +46,7 @@ spec:
value: "{{ .Values.AIO_LOG_LEVEL }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260527_140826
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260609_115915
readinessProbe:
exec:
command:
@@ -41,7 +41,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-redis:20260527_140826
image: ghcr.io/nextcloud-releases/aio-redis:20260609_115915
readinessProbe:
exec:
command:
@@ -56,7 +56,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk:20260527_140826
image: ghcr.io/nextcloud-releases/aio-talk:20260609_115915
readinessProbe:
exec:
command:
@@ -46,7 +46,7 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260527_140826
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260609_115915
readinessProbe:
exec:
command:
@@ -52,7 +52,7 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260527_140826
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260609_115915
readinessProbe:
exec:
command:
+2 -2
View File
@@ -133,7 +133,7 @@ for variable in "${DEPLOYMENTS[@]}"; do
sed -i "/^ spec:/r /tmp/initcontainers.clamav" "$variable"
elif echo "$variable" | grep -q "nextcloud-deployment.yaml"; then
sed -i "/^ spec:/r /tmp/initcontainers.nextcloud" "$variable"
elif echo "$variable" | grep -q "fulltextsearch" || echo "$variable" | grep -q "onlyoffice" || echo "$variable" | grep -q "collabora"; then
elif echo "$variable" | grep -q "fulltextsearch" || echo "$variable" | grep -q "onlyoffice" || echo "$variable" | grep -q "eurooffice" || echo "$variable" | grep -q "collabora"; then
sed -i "/^ spec:/r /tmp/initcontainers" "$variable"
fi
volumeNames="$(grep -A1 mountPath "$variable" | grep -v mountPath | sed 's|.*name: ||' | sed '/^--$/d')"
@@ -499,7 +499,7 @@ cat << EOL > /tmp/security.conf
{{- end }}
EOL
# shellcheck disable=SC1083
find ./ \( -not -name '*collabora-deployment.yaml*' -not -name '*apache-deployment.yaml*' -not -name '*onlyoffice-deployment.yaml*' -name "*deployment.yaml" \) -exec sed -i "/^ securityContext:$/r /tmp/security.conf" \{} \;
find ./ \( -not -name '*collabora-deployment.yaml*' -not -name '*apache-deployment.yaml*' -not -name '*onlyoffice-deployment.yaml*' -not -name '*eurooffice-deployment.yaml*' -name "*deployment.yaml" \) -exec sed -i "/^ securityContext:$/r /tmp/security.conf" \{} \;
# shellcheck disable=SC1083
find ./ -name '*collabora-deployment.yaml*' -exec sed -i "/ADDITIONAL_COLLABORA_OPTIONS_PLACEHOLDER/d" \{} \;
+3
View File
@@ -1,4 +1,5 @@
DATABASE_PASSWORD: # TODO! This needs to be a unique and good password!
EUROOFFICE_SECRET: # TODO! This needs to be a unique and good password!
FULLTEXTSEARCH_PASSWORD: # TODO! This needs to be a unique and good password!
IMAGINARY_SECRET: # TODO! This needs to be a unique and good password!
NC_DOMAIN: yourdomain.com # TODO! Needs to be changed to the domain that you want to use for Nextcloud.
@@ -14,6 +15,7 @@ WHITEBOARD_SECRET: # TODO! This needs to be a unique and good password
CLAMAV_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
COLLABORA_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
EUROOFFICE_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
FULLTEXTSEARCH_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
IMAGINARY_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
ONLYOFFICE_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
@@ -46,6 +48,7 @@ CLAMAV_STORAGE_SIZE: 1Gi # You can change the size of the clamav volume th
DATABASE_STORAGE_SIZE: 1Gi # You can change the size of the database volume that default to 1Gi with this value
DATABASE_DUMP_STORAGE_SIZE: 1Gi # You can change the size of the database-dump volume that default to 1Gi with this value
ELASTICSEARCH_STORAGE_SIZE: 1Gi # You can change the size of the elasticsearch volume that default to 1Gi with this value
EUROOFFICE_STORAGE_SIZE: 1Gi # You can change the size of the eurooffice volume that default to 1Gi with this value
NEXTCLOUD_STORAGE_SIZE: 5Gi # You can change the size of the nextcloud volume that default to 1Gi with this value
NEXTCLOUD_DATA_STORAGE_SIZE: 5Gi # You can change the size of the nextcloud-data volume that default to 1Gi with this value
NEXTCLOUD_TRUSTED_CACERTS_STORAGE_SIZE: 1Gi # You can change the size of the nextcloud-trusted-cacerts volume that default to 1Gi with this value
+13 -13
View File
@@ -64,16 +64,16 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.11.0",
"version": "7.11.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "c987f8ce84b8434fa430795eca0f3430663da72b"
"reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b",
"reference": "c987f8ce84b8434fa430795eca0f3430663da72b",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c",
"reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c",
"shasum": ""
},
"require": {
@@ -92,7 +92,7 @@
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
"guzzle/client-integration-tests": "3.0.2",
"guzzlehttp/test-server": "^0.4",
"guzzlehttp/test-server": "^0.5",
"php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.52 || ^9.6.34",
"psr/log": "^1.1 || ^2.0 || ^3.0"
@@ -172,7 +172,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.11.0"
"source": "https://github.com/guzzle/guzzle/tree/7.11.1"
},
"funding": [
{
@@ -188,7 +188,7 @@
"type": "tidelift"
}
],
"time": "2026-06-02T12:40:51+00:00"
"time": "2026-06-07T22:54:06+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -1624,16 +1624,16 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.38.1",
"version": "v1.38.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"
"reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
"reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
"shasum": ""
},
"require": {
@@ -1685,7 +1685,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2"
},
"funding": [
{
@@ -1705,7 +1705,7 @@
"type": "tidelift"
}
],
"time": "2026-05-26T12:51:13+00:00"
"time": "2026-05-27T06:59:30+00:00"
},
{
"name": "symfony/polyfill-php80",
+51 -1
View File
@@ -6,6 +6,7 @@
"documentation": "https://github.com/nextcloud/all-in-one/discussions/2105",
"depends_on": [
"nextcloud-aio-onlyoffice",
"nextcloud-aio-eurooffice",
"nextcloud-aio-collabora",
"nextcloud-aio-talk",
"nextcloud-aio-notify-push",
@@ -47,6 +48,7 @@
"APACHE_PORT=%APACHE_PORT%",
"AIO_LOG_LEVEL=%AIO_LOG_LEVEL%",
"ONLYOFFICE_HOST=nextcloud-aio-onlyoffice",
"EUROOFFICE_HOST=nextcloud-aio-eurooffice",
"TZ=%TIMEZONE%",
"APACHE_MAX_SIZE=%APACHE_MAX_SIZE%",
"APACHE_MAX_TIME=%NEXTCLOUD_MAX_TIME%",
@@ -223,6 +225,7 @@
"TURN_SECRET=%TURN_SECRET%",
"SIGNALING_SECRET=%SIGNALING_SECRET%",
"ONLYOFFICE_SECRET=%ONLYOFFICE_SECRET%",
"EUROOFFICE_SECRET=%EUROOFFICE_SECRET%",
"AIO_URL=%AIO_URL%",
"AIO_LOG_LEVEL=%AIO_LOG_LEVEL%",
"NC_AIO_VERSION=v%AIO_VERSION%",
@@ -230,10 +233,12 @@
"CLAMAV_ENABLED=%CLAMAV_ENABLED%",
"CLAMAV_HOST=nextcloud-aio-clamav",
"ONLYOFFICE_ENABLED=%ONLYOFFICE_ENABLED%",
"EUROOFFICE_ENABLED=%EUROOFFICE_ENABLED%",
"COLLABORA_ENABLED=%COLLABORA_ENABLED%",
"COLLABORA_HOST=nextcloud-aio-collabora",
"TALK_ENABLED=%TALK_ENABLED%",
"ONLYOFFICE_HOST=nextcloud-aio-onlyoffice",
"EUROOFFICE_HOST=nextcloud-aio-eurooffice",
"UPDATE_NEXTCLOUD_APPS=%UPDATE_NEXTCLOUD_APPS%",
"TZ=%TIMEZONE%",
"TALK_PORT=%TALK_PORT%",
@@ -357,6 +362,7 @@
"secrets": [
"REDIS_PASSWORD",
"ONLYOFFICE_SECRET",
"EUROOFFICE_SECRET",
"RECORDING_SECRET"
],
"restart": "unless-stopped",
@@ -717,7 +723,7 @@
{
"container_name": "nextcloud-aio-onlyoffice",
"image_tag": "%AIO_CHANNEL%",
"display_name": "OnlyOffice",
"display_name": "OnlyOffice (deprecated)",
"image": "ghcr.io/nextcloud-releases/aio-onlyoffice",
"init": true,
"healthcheck": {
@@ -758,6 +764,50 @@
"NET_RAW"
]
},
{
"container_name": "nextcloud-aio-eurooffice",
"image_tag": "%AIO_CHANNEL%",
"display_name": "EuroOffice",
"image": "ghcr.io/nextcloud-releases/aio-eurooffice",
"init": true,
"healthcheck": {
"start_period": "60s",
"test": "/healthcheck.sh",
"interval": "30s",
"timeout": "30s",
"start_interval": "5s",
"retries": 9
},
"expose": [
"80"
],
"internal_port": "80",
"environment": [
"AIO_LOG_LEVEL=%AIO_LOG_LEVEL%",
"LOG_LEVEL=%AIO_LOG_LEVEL%",
"TZ=%TIMEZONE%",
"JWT_ENABLED=true",
"JWT_HEADER=AuthorizationJwt",
"JWT_SECRET=%EUROOFFICE_SECRET%"
],
"volumes": [
{
"source": "nextcloud_aio_eurooffice",
"destination": "/var/lib/euro-office",
"writeable": true
}
],
"secrets": [
"EUROOFFICE_SECRET"
],
"restart": "unless-stopped",
"profiles": [
"eurooffice"
],
"cap_drop": [
"NET_RAW"
]
},
{
"container_name": "nextcloud-aio-imaginary",
"image_tag": "%AIO_CHANNEL%",
+16 -3
View File
@@ -22,9 +22,11 @@ document.addEventListener("DOMContentLoaded", function () {
// Office suite radio buttons
const collaboraRadio = document.getElementById('office-collabora');
const onlyofficeRadio = document.getElementById('office-onlyoffice');
const euroofficeRadio = document.getElementById('office-eurooffice');
const noneRadio = document.getElementById('office-none');
const collaboraHidden = document.getElementById('collabora');
const onlyofficeHidden = document.getElementById('onlyoffice');
const euroofficeHidden = document.getElementById('eurooffice');
let initialOfficeSelection = null;
optionsContainersCheckboxes.forEach(checkbox => {
@@ -36,11 +38,13 @@ document.addEventListener("DOMContentLoaded", function () {
});
// Store initial office suite selection
if (collaboraRadio && onlyofficeRadio && noneRadio) {
if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio) {
if (collaboraRadio.checked) {
initialOfficeSelection = 'collabora';
} else if (onlyofficeRadio.checked) {
initialOfficeSelection = 'onlyoffice';
} else if (euroofficeRadio.checked) {
initialOfficeSelection = 'eurooffice';
} else {
initialOfficeSelection = 'none';
}
@@ -57,20 +61,28 @@ document.addEventListener("DOMContentLoaded", function () {
});
// Check office suite changes and sync to hidden inputs
if (collaboraRadio && onlyofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden) {
if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden && euroofficeHidden) {
let currentOfficeSelection = null;
if (collaboraRadio.checked) {
currentOfficeSelection = 'collabora';
collaboraHidden.value = 'on';
onlyofficeHidden.value = '';
euroofficeHidden.value = '';
} else if (onlyofficeRadio.checked) {
currentOfficeSelection = 'onlyoffice';
collaboraHidden.value = '';
onlyofficeHidden.value = 'on';
euroofficeHidden.value = '';
} else if (euroofficeRadio.checked) {
currentOfficeSelection = 'eurooffice';
collaboraHidden.value = '';
onlyofficeHidden.value = '';
euroofficeHidden.value = 'on';
} else {
currentOfficeSelection = 'none';
collaboraHidden.value = '';
onlyofficeHidden.value = '';
euroofficeHidden.value = '';
}
if (currentOfficeSelection !== initialOfficeSelection) {
@@ -144,9 +156,10 @@ document.addEventListener("DOMContentLoaded", function () {
handleTalkVisibility(); // Ensure talk-recording is correctly initialized
// Add event listeners for office suite radio buttons
if (collaboraRadio && onlyofficeRadio && noneRadio) {
if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio) {
collaboraRadio.addEventListener('change', checkForOptionContainerChanges);
onlyofficeRadio.addEventListener('change', checkForOptionContainerChanges);
euroofficeRadio.addEventListener('change', checkForOptionContainerChanges);
noneRadio.addEventListener('change', checkForOptionContainerChanges);
}
+6
View File
@@ -27,6 +27,12 @@ document.addEventListener("DOMContentLoaded", function(event) {
const onlyoffice = document.getElementById("office-onlyoffice");
onlyoffice.disabled = true;
// EuroOffice
const eurooffice = document.getElementById("office-eurooffice");
if (eurooffice) {
eurooffice.disabled = true;
}
// Imaginary
let imaginary = document.getElementById("imaginary");
imaginary.disabled = true;
+2
View File
@@ -104,6 +104,7 @@ $app->post('/api/docker/backup-test', AIO\Controller\DockerController::class . '
$app->post('/api/docker/restore', AIO\Controller\DockerController::class . ':StartBackupContainerRestore');
$app->post('/api/docker/stop', AIO\Controller\DockerController::class . ':StopContainer');
$app->post('/api/docker/backup-reset-location', AIO\Controller\DockerController::class . ':DeleteBorgBackupConfig');
$app->post('/api/docker/nextcloud-upgrade-to-latest-major', AIO\Controller\DockerController::class . ':RunNextcloudUpgradeToLatestMajor');
$app->post('/api/docker/prune', AIO\Controller\DockerController::class . ':SystemPrune');
$app->get('/api/docker/logs', AIO\Controller\DockerController::class . ':GetLogs');
$app->post('/api/auth/login', AIO\Controller\LoginController::class . ':TryLogin');
@@ -152,6 +153,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'current_channel' => $dockerActionManager->GetCurrentChannel(),
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_eurooffice_enabled' => $configurationManager->isEuroofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
'is_talk_enabled' => $configurationManager->isTalkEnabled,
'borg_restore_password' => $configurationManager->borgRestorePassword,
+16 -4
View File
@@ -483,14 +483,16 @@ input[type="checkbox"]:disabled:not(:checked) + label {
visibility: hidden;
opacity: 0;
align-self: start;
width: min(700px, calc(100vw - 4rem));
width: min(600px, calc(100vw - 4rem));
height: min(400px, calc(100vh - 14rem));
border-radius: var(--border-radius-large);
border: solid thin rgb(192, 192, 192);
background-color: var(--color-main-background);
}
.overlay-iframe {
padding: 1rem;
font-family: monospace, system-ui, -apple-system, 'Segoe UI', Roboto, Oxygen-Sans, Cantarell, Ubuntu, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.loader {
@@ -606,13 +608,15 @@ input[type="checkbox"]:disabled:not(:checked) + label {
}
#office-collabora:checked + .office-card,
#office-onlyoffice:checked + .office-card {
#office-onlyoffice:checked + .office-card,
#office-eurooffice:checked + .office-card {
border-color: var(--color-nextcloud-blue);
background: linear-gradient(135deg, rgba(0, 130, 201, 0.08) 0%, rgba(0, 130, 201, 0.02) 100%);
}
[data-theme="dark"] #office-collabora:checked + .office-card,
[data-theme="dark"] #office-onlyoffice:checked + .office-card {
[data-theme="dark"] #office-onlyoffice:checked + .office-card,
[data-theme="dark"] #office-eurooffice:checked + .office-card {
background: linear-gradient(135deg, rgba(0, 145, 242, 0.15) 0%, rgba(0, 145, 242, 0.03) 100%);
}
@@ -631,13 +635,21 @@ input[type="checkbox"]:disabled:not(:checked) + label {
color: var(--color-main-text);
}
.office-powered-by {
margin: 4px 0 0;
font-size: 13px;
color: var(--color-main-text);
opacity: 0.7;
}
.office-checkmark {
flex-shrink: 0;
display: none;
}
#office-collabora:checked + .office-card .office-checkmark,
#office-onlyoffice:checked + .office-card .office-checkmark {
#office-onlyoffice:checked + .office-card .office-checkmark,
#office-eurooffice:checked + .office-card .office-checkmark {
display: block;
}
+8
View File
@@ -78,6 +78,10 @@ readonly class ContainerDefinitionFetcher {
if (!$this->configurationManager->isOnlyofficeEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-eurooffice') {
if (!$this->configurationManager->isEuroofficeEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-collabora') {
if (!$this->configurationManager->isCollaboraEnabled) {
continue;
@@ -194,6 +198,10 @@ readonly class ContainerDefinitionFetcher {
if (!$this->configurationManager->isOnlyofficeEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-eurooffice') {
if (!$this->configurationManager->isEuroofficeEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-collabora') {
if (!$this->configurationManager->isCollaboraEnabled) {
continue;
@@ -81,12 +81,19 @@ readonly class ConfigurationController {
if ($officeSuiteChoice === 'collabora') {
$this->configurationManager->isCollaboraEnabled = true;
$this->configurationManager->isOnlyofficeEnabled = false;
$this->configurationManager->isEuroofficeEnabled = false;
} elseif ($officeSuiteChoice === 'onlyoffice') {
$this->configurationManager->isCollaboraEnabled = false;
$this->configurationManager->isOnlyofficeEnabled = true;
$this->configurationManager->isEuroofficeEnabled = false;
} elseif ($officeSuiteChoice === 'eurooffice') {
$this->configurationManager->isCollaboraEnabled = false;
$this->configurationManager->isOnlyofficeEnabled = false;
$this->configurationManager->isEuroofficeEnabled = true;
} else {
$this->configurationManager->isCollaboraEnabled = false;
$this->configurationManager->isOnlyofficeEnabled = false;
$this->configurationManager->isEuroofficeEnabled = false;
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
$this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
+31 -9
View File
@@ -14,6 +14,7 @@ use Slim\Psr7\NonBufferedBody;
readonly class DockerController {
private const string TOP_CONTAINER = 'nextcloud-aio-apache';
private const string LATEST_MAJOR_VERSION = '34';
public function __construct(
private DockerActionManager $dockerActionManager,
@@ -221,7 +222,7 @@ readonly class DockerController {
}
if (isset($request->getParsedBody()['install_latest_major'])) {
$installLatestMajor = '34';
$installLatestMajor = self::LATEST_MAJOR_VERSION;
} else {
$installLatestMajor = '';
}
@@ -298,7 +299,7 @@ readonly class DockerController {
}
if ($addToStreamingResponseBody !== null) {
$addToStreamingResponseBody($container, "Stopping container");
$addToStreamingResponseBody("Stopping container", $container);
}
// Stop itself first and then all the dependencies
@@ -333,14 +334,30 @@ readonly class DockerController {
return $response->withStatus(201)->withHeader('Location', '.');
}
public function RunNextcloudUpgradeToLatestMajor(Request $request, Response $response, array $args) : Response {
$this->configurationManager->installLatestMajor = self::LATEST_MAJOR_VERSION;
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$this->dockerActionManager->RunNextcloudUpgradeToLatestMajor($addToStreamingResponseBody);
// We automatically reload after 10s so that the output can be read or copied if necessary
$addToStreamingResponseBody("Automatically reloading the page after 10s.");
sleep(10);
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function SystemPrune(Request $request, Response $response, array $args) : Response {
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$body = $nonbufResp->getBody();
$addToStreamingResponseBody = function (string $message) use ($body) : void {
$body->write("<div>$message</div>");
};
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$this->dockerActionManager->SystemPrune($addToStreamingResponseBody);
@@ -401,7 +418,7 @@ readonly class DockerController {
<!DOCTYPE html>
<html lang="en" class="overlay-iframe">
<head>
<link rel="stylesheet" href="../../style.css?v9" media="all" />
<link rel="stylesheet" href="../../style.css?v12" media="all" />
<script type="text/javascript" src="../../apply-theme.js?v1"></script>
<script type="text/javascript" src="../../scroll-into-view.js"></script>
</head>
@@ -426,12 +443,17 @@ readonly class DockerController {
return $nonbufResp;
}
private function getAddToStreamingResponseBody(Response $nonbufResp) : ?\Closure {
private function getAddToStreamingResponseBody(Response $nonbufResp) : \Closure {
// Create a closure to pass around to the code, which should to the logging (because it e.g. decides
// if it'll actually pull an image), but which should not need to know anything about the
// wanted markup or formatting.
$addToStreamingResponseBody = function (Container $container, string $message) use ($nonbufResp) : void {
$nonbufResp->getBody()->write("<div>{$container->displayName}: {$message}</div>");
$addToStreamingResponseBody = function (string $message, ?Container $container = null) use ($nonbufResp) : void {
// Strip ANSI codes.
$message = preg_replace('/\e[[][A-Za-z0-9];?[0-9]*m?/', '', $message);
if ($container) {
$message = "{$container->displayName}: {$message}";
}
$nonbufResp->getBody()->write("<div>" . htmlspecialchars("{$message}", ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . "</div>");
};
return $addToStreamingResponseBody;
+6
View File
@@ -99,6 +99,11 @@ class ConfigurationManager
set { $this->set('isOnlyofficeEnabled', $value); }
}
public bool $isEuroofficeEnabled {
get => $this->get('isEuroofficeEnabled', false);
set { $this->set('isEuroofficeEnabled', $value); }
}
public bool $isCollaboraEnabled {
// Type-cast because old configs could have 1/0 for this key.
get => (bool) $this->get('isCollaboraEnabled', true);
@@ -1087,6 +1092,7 @@ class ConfigurationManager
'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->isTalkRecordingEnabled ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->isOnlyofficeEnabled ? 'yes' : '',
'EUROOFFICE_ENABLED' => $this->isEuroofficeEnabled ? 'yes' : '',
'COLLABORA_ENABLED' => $this->isCollaboraEnabled ? 'yes' : '',
'TALK_ENABLED' => $this->isTalkEnabled ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->isDailyBackupRunning() && $this->areAutomaticUpdatesEnabled()) ? 'yes' : '',
+99 -56
View File
@@ -12,6 +12,7 @@ use AIO\Data\DataConst;
use AIO\Helper\NetworkHelper;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\Utils;
use http\Env\Response;
readonly class DockerActionManager {
@@ -48,7 +49,7 @@ readonly class DockerActionManager {
public function GetContainerRunningState(Container $container): ContainerState {
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
try {
$response = $this->guzzleClient->get($url);
$response = $this->sendHttpRequest('GET', $url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return ContainerState::ImageDoesNotExist;
@@ -68,7 +69,7 @@ readonly class DockerActionManager {
public function GetContainerRestartingState(Container $container): ContainerState {
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
try {
$response = $this->guzzleClient->get($url);
$response = $this->sendHttpRequest('GET', $url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return ContainerState::ImageDoesNotExist;
@@ -138,7 +139,7 @@ readonly class DockerActionManager {
public function DeleteContainer(Container $container): void {
$url = $this->BuildApiUrl(sprintf('containers/%s?v=true', urlencode($container->identifier)));
try {
$this->guzzleClient->delete($url);
$this->sendHttpRequest('DELETE', $url);
} catch (RequestException $e) {
if ($e->getCode() !== 404) {
throw $e;
@@ -155,7 +156,7 @@ readonly class DockerActionManager {
// Delete the borg cache volume
$url = $this->BuildApiUrl('volumes/nextcloud_aio_backup_cache');
try {
$this->guzzleClient->delete($url);
$this->sendHttpRequest('DELETE', $url);
error_log('nextcloud_aio_backup_cache volume deleted successfully.');
} catch (RequestException $e) {
if ($e->getCode() !== 404) {
@@ -174,7 +175,7 @@ readonly class DockerActionManager {
urlencode($id),
$since
));
$responseBody = (string)$this->guzzleClient->get($url)->getBody();
$responseBody = (string)$this->sendHttpRequest('GET', $url)->getBody();
$response = "";
$separator = "\r\n";
@@ -194,9 +195,9 @@ readonly class DockerActionManager {
$url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->identifier)));
try {
if ($addToStreamingResponseBody !== null) {
$addToStreamingResponseBody($container, "Starting container");
$addToStreamingResponseBody("Starting container", $container);
}
$this->guzzleClient->post($url);
$this->sendHttpRequest('POST', $url);
} catch (RequestException $e) {
throw new \Exception("Could not start container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
}
@@ -215,7 +216,7 @@ readonly class DockerActionManager {
$firstChar = substr($volume->name, 0, 1);
if (!in_array($firstChar, $forbiddenChars)) {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -477,6 +478,14 @@ readonly class DockerActionManager {
$regEx = '/\s+(?=--o:)/';
$requestBody['Cmd'] = preg_split($regEx, rtrim($this->configurationManager->collaboraAdditionalOptions));
}
// Special things for the scrutiny container which should not be exposed in the containers.json
} elseif ($container->identifier === 'nextcloud-aio-scrutiny') {
// Allow it to access block devices
$requestBody['HostConfig']['DeviceCgroupRules'] = ["b *:* rmw"];
// Special things for the makemkv container which should not be exposed in the containers.json
} elseif ($container->identifier === 'nextcloud-aio-makemkv') {
// Allow it to access block devices
$requestBody['HostConfig']['DeviceCgroupRules'] = ["b 11:* rmw", "c 21:* rmw"];
}
if (count($mounts) > 0) {
@@ -494,7 +503,7 @@ readonly class DockerActionManager {
$url = $this->BuildApiUrl('containers/create?name=' . $container->identifier);
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -551,10 +560,10 @@ readonly class DockerActionManager {
$imageIsThere = true;
try {
if ($addToStreamingResponseBody) {
$addToStreamingResponseBody($container, "Pulling image");
$addToStreamingResponseBody("Pulling image", $container);
}
$imageUrl = $this->BuildApiUrl(sprintf('images/%s/json', $encodedImageName));
$this->guzzleClient->get($imageUrl)->getBody()->getContents();
$this->sendHttpRequest('GET', $imageUrl)->getBody()->getContents();
} catch (\Throwable $e) {
$imageIsThere = false;
}
@@ -562,7 +571,7 @@ readonly class DockerActionManager {
$maxRetries = 3;
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
try {
$this->guzzleClient->post($url);
$this->sendHttpRequest('POST', $url);
break;
} catch (RequestException $e) {
$message = "Could not pull image " . $imageName . " (attempt $attempt/$maxRetries): " . $e->getResponse()?->getBody()->getContents();
@@ -647,11 +656,11 @@ readonly class DockerActionManager {
private function GetRepoDigestsOfContainer(string $containerName): ?array {
try {
$containerUrl = $this->BuildApiUrl(sprintf('containers/%s/json', $containerName));
$containerOutput = json_decode($this->guzzleClient->get($containerUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$containerOutput = json_decode($this->sendHttpRequest('GET', $containerUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$imageName = $containerOutput['Image'];
$imageUrl = $this->BuildApiUrl(sprintf('images/%s/json', $imageName));
$imageOutput = json_decode($this->guzzleClient->get($imageUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$imageOutput = json_decode($this->sendHttpRequest('GET', $imageUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
if (!isset($imageOutput['RepoDigests'])) {
error_log('RepoDigests is not set of container ' . $containerName);
@@ -695,7 +704,7 @@ readonly class DockerActionManager {
$containerName = 'nextcloud-aio-mastercontainer';
$url = $this->BuildApiUrl(sprintf('containers/%s/json', $containerName));
try {
$output = json_decode($this->guzzleClient->get($url)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$output = json_decode($this->sendHttpRequest('GET', $url)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$imageNameArray = explode(':', $output['Config']['Image']);
if (count($imageNameArray) === 2) {
$imageName = $imageNameArray[0];
@@ -722,7 +731,7 @@ readonly class DockerActionManager {
$containerName = 'nextcloud-aio-mastercontainer';
$url = $this->BuildApiUrl(sprintf('containers/%s/json', $containerName));
try {
$output = json_decode($this->guzzleClient->get($url)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$output = json_decode($this->sendHttpRequest('GET', $url)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$tagArray = explode(':', $output['Config']['Image']);
if (count($tagArray) === 2) {
$tag = $tagArray[1];
@@ -763,48 +772,69 @@ readonly class DockerActionManager {
}
public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh'): void {
if ($this->GetContainerStartingState($container) === ContainerState::Running) {
$this->execCommandInContainer($container, ['bash', $file, $subject, $message]);
}
$containerName = $container->identifier;
public function execCommandInContainer(Container $container, array $cmd, ?\Closure $outputCallback = null): void {
if ($cmd === []) {
throw new \InvalidArgumentException('$cmd must not be empty.');
}
foreach ($cmd as $arg) {
if (!is_string($arg) || $arg === '') {
throw new \InvalidArgumentException('Every element of $cmd must be a non-empty string.');
}
}
// schedule the exec
$url = $this->BuildApiUrl(sprintf('containers/%s/exec', urlencode($containerName)));
$response = json_decode(
$this->guzzleClient->request(
'POST',
$url,
[
'json' => [
'AttachStdout' => true,
'Tty' => true,
'Cmd' => [
'bash',
$file,
$subject,
$message
],
],
]
)->getBody()->getContents(),
true,
512,
JSON_THROW_ON_ERROR,
);
if ($this->GetContainerStartingState($container) !== ContainerState::Running) {
return;
}
$id = $response['Id'];
$containerName = $container->identifier;
// start the exec
$url = $this->BuildApiUrl(sprintf('exec/%s/start', $id));
$this->guzzleClient->request(
// Create exec instance
$url = $this->BuildApiUrl(sprintf('containers/%s/exec', urlencode($containerName)));
$response = json_decode(
$this->sendHttpRequest(
'POST',
$url,
[
'json' => [
'Detach' => false,
'AttachStdout' => true,
'AttachStderr' => true,
'Tty' => true,
'Cmd' => $cmd,
],
]
);
)->getBody()->getContents(),
true,
512,
JSON_THROW_ON_ERROR,
);
$execId = $response['Id'];
// Start exec
$url = $this->BuildApiUrl(sprintf('exec/%s/start', $execId));
$requestOptions = [
'json' => [
'Detach' => false,
'Tty' => true,
],
];
if ($outputCallback !== null) {
$requestOptions['stream'] = true;
}
$startResponse = $this->sendHttpRequest('POST', $url, $requestOptions);
if ($outputCallback !== null) {
$body = $startResponse->getBody();
while (!$body->eof()) {
$line = rtrim(Utils::readLine($body), "\r");;
if ($line !== '') {
$outputCallback($line);
}
}
}
}
@@ -815,7 +845,7 @@ readonly class DockerActionManager {
);
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -836,7 +866,7 @@ readonly class DockerActionManager {
if ($createNetwork) {
$url = $this->BuildApiUrl('networks/create');
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -865,7 +895,7 @@ readonly class DockerActionManager {
}
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -910,7 +940,7 @@ readonly class DockerActionManager {
}
$url = $this->BuildApiUrl(sprintf('containers/%s/stop?t=%s', urlencode($container->identifier), $maxShutDownTime));
try {
$this->guzzleClient->post($url);
$this->sendHttpRequest('POST', $url);
} catch (RequestException $e) {
if ($e->getCode() !== 404 && $e->getCode() !== 304) {
throw $e;
@@ -922,7 +952,7 @@ readonly class DockerActionManager {
$containerName = 'nextcloud-aio-borgbackup';
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($containerName)));
try {
$response = $this->guzzleClient->get($url);
$response = $this->sendHttpRequest('GET', $url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return -1;
@@ -944,7 +974,7 @@ readonly class DockerActionManager {
$containerName = 'nextcloud-aio-database';
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($containerName)));
try {
$response = $this->guzzleClient->get($url);
$response = $this->sendHttpRequest('GET', $url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return -1;
@@ -984,7 +1014,7 @@ readonly class DockerActionManager {
$imageName = $imageName . ':' . $this->GetCurrentChannel();
try {
$imageUrl = $this->BuildApiUrl(sprintf('images/%s/json', $imageName));
$imageOutput = json_decode($this->guzzleClient->get($imageUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
$imageOutput = json_decode($this->sendHttpRequest('GET', $imageUrl)->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
if (!isset($imageOutput['Created'])) {
error_log('Created is not set of image ' . $imageName);
@@ -1029,6 +1059,11 @@ readonly class DockerActionManager {
}
}
public function RunNextcloudUpgradeToLatestMajor(\Closure $addToStreamingResponseBody): void {
$container = $this->containerDefinitionFetcher->GetContainerById('nextcloud-aio-nextcloud');
$this->execCommandInContainer($container, ['bash', '/upgrade-latest-major.sh'], $addToStreamingResponseBody);
}
public function SystemPrune(?\Closure $addToStreamingResponseBody = null): void {
$endpoints = [
// Remove stopped containers
@@ -1057,7 +1092,7 @@ readonly class DockerActionManager {
}
try {
$response = $this->guzzleClient->post($url);
$response = $this->sendHttpRequest('POST', $url);
if ($addToStreamingResponseBody !== null) {
$data = json_decode((string)$response->getBody(), true);
$deleted = 0;
@@ -1095,4 +1130,12 @@ readonly class DockerActionManager {
sleep(10);
}
}
}
protected function sendHttpRequest(string $httpMethod, string $url, array $requestOptions = []): \Psr\Http\Message\ResponseInterface {
if (($requestOptions['stream'] ?? null) === true) {
$requestOptions['proxy'] = 'unix:///var/run/docker.sock';
}
return $this->guzzleClient->request($httpMethod, $url, $requestOptions);
}
}
+7 -2
View File
@@ -27,7 +27,7 @@
<script type="text/javascript" src="timezone.js?v1"></script>
{# js for optional containers and additional containers forms #}
<script type="text/javascript" src="containers-form-submit.js?v7"></script>
<script type="text/javascript" src="containers-form-submit.js?v8"></script>
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
{% set isAnyRunning = false %}
@@ -298,7 +298,12 @@
{% if newMajorVersionString != '' and isAnyRunning == true and isApacheStarting != true %}
<details>
<summary>Note about <strong>Nextcloud Hub {{ newMajorVersionString }}</strong></summary>
<p>If you haven't upgraded to Nextcloud Hub {{ newMajorVersionString }} yet and want to do that now, feel free to follow <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/8223">this documentation</a></strong></p>
<p>If you haven't upgraded to Nextcloud Hub {{ newMajorVersionString }} yet and want to do that now, feel free to click the button below. ⚠️ Warning: make sure to create a backup before clicking the button as the update can go wrong and will leave your instance in a broken state!</p>
<form method="POST" action="api/docker/nextcloud-upgrade-to-latest-major" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Upgrade to Nextcloud Hub {{ newMajorVersionString }}" data-confirm="Upgrade to Nextcloud Hub {{ newMajorVersionString }}? You should consider creating a backup first." />
</form>
</details>
{% endif %}
{% endif %}
+1 -1
View File
@@ -1 +1 @@
13.1.0
13.2.1
@@ -14,6 +14,42 @@
<p>Choose your preferred office suite. Only one can be enabled at a time.</p>
{% endif %}
<div class="office-suite-cards">
<input
type="radio"
id="office-eurooffice"
name="office_suite_choice"
value="eurooffice"
class="office-radio"
{% if is_eurooffice_enabled == true %}
checked="checked"
{% endif %}
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-eurooffice">
<div class="office-card-header">
<div>
<h4>Nextcloud Office</h4>
<p class="office-powered-by">powered by Euro-Office</p>
</div>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<ul class="office-features">
<li>Good Nextcloud integration</li>
<li>Open source</li>
<li>Best performance</li>
<li>Limited ODF compatibility</li>
<li>Best Microsoft compatibility</li>
<li>Good security</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://github.com/Euro-Office" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
Learn more
</a>
{% endif %}
</label>
<input type="hidden" id="eurooffice" name="eurooffice" value="" data-initial-state="{% if is_eurooffice_enabled == true %}true{% else %}false{% endif %}">
<input
type="radio"
id="office-collabora"
@@ -26,7 +62,10 @@
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-collabora">
<div class="office-card-header">
<h4>Nextcloud Office</h4>
<div>
<h4>Nextcloud Office</h4>
<p class="office-powered-by">powered by Collabora Online</p>
</div>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
@@ -36,9 +75,9 @@
<li>Best Nextcloud integration</li>
<li>Open source</li>
<li>Good performance</li>
<li>Best security: documents never leave your server</li>
<li>Best ODF compatibility</li>
<li>Best support for legacy files</li>
<li>Best security: documents never leave your server</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.collaboraoffice.com/code/" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
@@ -60,18 +99,22 @@
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-onlyoffice">
<div class="office-card-header">
<h4>OnlyOffice</h4>
<div>
<h4>ONLYOFFICE (deprecated)</h4>
<p class="office-powered-by">by Ascensio System SIA</p>
</div>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<ul class="office-features">
<li>Good Nextcloud integration</li>
<li>Open core</li>
<li>OK Nextcloud integration</li>
<li>Open Core</li>
<li>Best performance</li>
<li>Best Microsoft compatibility</li>
<li>Limited ODF compatibility</li>
<li>Best Microsoft compatibility</li>
<li>Good security</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.onlyoffice.com/" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
@@ -90,7 +133,7 @@
name="office_suite_choice"
value=""
class="office-radio"
{% if is_collabora_enabled == false and is_onlyoffice_enabled == false %}
{% if is_collabora_enabled == false and is_onlyoffice_enabled == false and is_eurooffice_enabled == false %}
checked="checked"
{% endif %}
>
@@ -224,7 +267,7 @@
</form>
<p><strong>Minimal system requirements:</strong> When any optional container is enabled, at least 2GB RAM, a dual-core CPU and 40GB system storage are required. When enabling ClamAV, Nextcloud Talk Recording-server or Fulltextsearch, at least 3GB RAM are required. For Talk Recording-server additional 2 vCPUs are required. When enabling everything, at least 5GB RAM and a quad-core CPU are required. Recommended are at least 1GB more RAM than the minimal requirement. For further advice and recommendations see <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/1335">this documentation</a></strong></p>
{% if isAnyRunning == true %}
<script type="text/javascript" src="disable-containers.js"></script>
<script type="text/javascript" src="disable-containers.js?v1"></script>
{% endif %}
{% if is_collabora_enabled == true and isAnyRunning == false and was_start_button_clicked == true %}
+1 -1
View File
@@ -2,7 +2,7 @@
<html lang="en">
<head>
<title>AIO</title>
<link rel="stylesheet" href="style.css?v10" media="all" />
<link rel="stylesheet" href="style.css?v12" media="all" />
<link rel="icon" href="img/favicon.png">
<script type="text/javascript" src="forms.js?v2"></script>
<script type="text/javascript" src="toggle-dark-mode.js?v2"></script>
+1 -1
View File
@@ -2,7 +2,7 @@
<head>
<title>AIO</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="style.css?v1">
<link rel="stylesheet" href="style.css?v12">
<link rel="stylesheet" href="logs.css?v1">
<link rel="icon" href="img/favicon.png">
<script src="apply-theme.js?v1"></script>
+1
View File
@@ -118,6 +118,7 @@ flowchart TB
subgraph OPT[" 🧩 Optional Built-in Containers (enable in AIO interface) "]
COLLA(["📄 Nextcloud Office"]):::opt
OO(["📄 OnlyOffice\nDocument Server"]):::opt
EO(["📄 EuroOffice\nDocument Server"]):::opt
TALK(["🎙️ Talk\nVideo & Voice calls"]):::opt
TALKREC(["🎬 Talk Recording"]):::opt
FTS(["🔎 Full-text Search\n(Elasticsearch)"]):::opt
+1
View File
@@ -523,6 +523,7 @@ server {
location / {
proxy_pass http://127.0.0.1:11000$request_uri; # Adjust to match APACHE_PORT and APACHE_IP_BINDING. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#adapting-the-sample-web-server-configurations-below
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Scheme $scheme;
+1 -1
View File
@@ -13,7 +13,7 @@ For the below to work, it is important that you have a domain that you point ont
- [ ] Below that you should see a section `Optional addons` which shows a checkbox list with addons that can be enabled or disabled.
- [ ] Collabora, Imaginary, Talk and Whiteboard should be enabled, the rest disabled
- [ ] Unchecking/Checking any of these should insert a button that allows to save the set config
- [ ] Checking OnlyOffice and Collabora at the same time should show a warning that this is not supported and should not saving the new config
- [ ] Only one of Collabora, OnlyOffice and EuroOffice should be selectable at the same time
- [ ] Recommended is to uncheck all options now
- [ ] Clicking on the save button should reload the page and activate the new config
- [ ] Clickig on the `Start containers` button should finally reveal a big spinning wheel that should block all elements on the side of being clicked.