Compare commits

...

87 Commits

Author SHA1 Message Date
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
Simon L. bc5ca59675 Yaml updates (#8213) 2026-06-09 14:03:31 +02: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
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
Simon L. 6cbf5eeefb fulltextsearch: fix healthcheck
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-06 22:24:52 +02: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
Simon L. a78622e69a PHP dependency updates (#8242) 2026-06-02 16:02:08 +02:00
Simon L. 01e3f8247d Nextcloud dependency update (#8243) 2026-06-02 16:01:26 +02:00
szaimen 1937bf9690 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 13:48:22 +00:00
szaimen 517543babd php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-02 13:24:42 +00:00
Simon L. 751cc9e16f build(deps): bump dessant/lock-threads from 6.0.1 to 6.0.2 in /.github/workflows (#8240) 2026-06-02 13:48:20 +02:00
dependabot[bot] a9f722b453 build(deps): bump dessant/lock-threads in /.github/workflows
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/851cffe46851ddd2051ea7147ebdc995113241c3...89ae32b08ed1a541efecbab17912962a5e38981c)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-02 11:13:32 +00:00
Simon L. cbeb056e08 PHP dependency updates (#8238) 2026-06-01 16:17:22 +02:00
szaimen da5490b662 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-01 14:07:29 +00:00
Simon L. 99307a0ebe manual-upgrade.md: Move md files from CRLF to LF line endings; instruct to use :ro flag when mounting the docker socket (#8166) 2026-06-01 13:24:46 +02:00
Simon L. f73bfa6283 caddy: re-introduce lets encrypt profiles (#8237) 2026-06-01 12:39:48 +02:00
Simon L. 34aec1c790 caddy: re-introduce lets encrypt profiles
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-01 12:20:40 +02:00
Simon L. e17415591a revert: caddy: use acme shortlived profile (#8235) 2026-06-01 11:45:04 +02:00
Simon L. 28c8faf997 revert: caddy: use acme shortlived profile
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-06-01 11:40:31 +02:00
Simon L. 54b9817061 build(deps): bump nextcloud-releases/whiteboard from v1.5.8 to v1.5.9 in /Containers/whiteboard (#8233) 2026-06-01 10:42:39 +02:00
Simon L. 4f9725c5d4 build(deps): bump collabora/code from 25.04.9.4.1 to 25.04.10.3.1 in /Containers/collabora (#8232) 2026-06-01 10:42:17 +02:00
Simon L. 71b2ae78c4 aio-interface: improve overlay log appearance (#8093) 2026-06-01 10:27:33 +02:00
dependabot[bot] 66adab1ac0 build(deps): bump nextcloud-releases/whiteboard
Bumps nextcloud-releases/whiteboard from v1.5.8 to v1.5.9.

---
updated-dependencies:
- dependency-name: nextcloud-releases/whiteboard
  dependency-version: v1.5.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 07:53:03 +00:00
dependabot[bot] 3ceb97c173 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.9.4.1 to 25.04.10.3.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 07:51:19 +00:00
Simon L. 4f4420c713 PHP dependency updates (#8228) 2026-06-01 09:04:49 +02:00
szaimen dd0e4269a1 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-31 12:24:51 +00:00
Simon L. 32a0b97ce3 PHP dependency updates (#8224) 2026-05-30 15:36:36 +02:00
szaimen a0e7a80ac9 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-30 12:21:42 +00:00
Simon L. 62295caa39 update link to upgrade docs
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-29 17:44:27 +02:00
Simon L. a529bac3b4 PHP dependency updates (#8221) 2026-05-29 17:02:13 +02:00
szaimen 660f7cec08 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-29 12:59:01 +00:00
Simon L. bf4c721fe0 Update pull request template with new checkboxes (#8220) 2026-05-29 12:53:23 +02:00
Simon L. b7317a4db6 Update pull request template with new checkboxes
Added checkboxes for testing and AI usage in PR template.

Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-29 12:46:03 +02:00
Simon L. 052c0e6ff3 fix: IPv6 compatibility across containers and PHP AIO interface (#8019) 2026-05-29 10:13:33 +02:00
copilot-swe-agent[bot] 0722cf95be fix: improve IPv6 compatibility in containers and PHP AIO interface
Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/c71fba87-d463-4682-9cb3-abb659b2ca40

refactor: deduplicate resolveHostname into DataConst

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/42427bd4-05e6-4197-bdb7-db3761815113

refactor: move resolveHostname from DataConst into new NetworkHelper class

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/73cb1d89-ab85-43b6-adfe-a90c00ad60a1
2026-05-29 10:11:08 +02:00
Simon L. b6ddc024fe Nextcloud dependency update (#8218) 2026-05-29 10:08:29 +02:00
Simon L. acbfffd361 preparations for the upcoming Hub 26 Spring release (#8210) 2026-05-29 10:07:14 +02:00
szaimen b1ca6f4997 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-29 08:07:10 +00:00
Simon L. b4057096ac watchtower container update (#8094) 2026-05-29 10:04:55 +02:00
Simon L. 62396eee0d PHP dependency updates (#8195) 2026-05-29 10:03:57 +02:00
szaimen e31a493785 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-29 08:01:24 +00:00
Simon L. fb3ff3acbf Revert "update tags of playwright workflows" (#8217) 2026-05-29 10:00:18 +02:00
Simon L. 1a4093220f Revert "update tags of playwright workflows" 2026-05-29 09:59:57 +02:00
Simon L. a5cc10295d build(deps): bump elasticsearch from 9.4.1 to 9.4.2 in /Containers/fulltextsearch (#8216) 2026-05-29 09:04:52 +02:00
Simon L. e9716690de Imaginary update (#8215) 2026-05-29 09:04:38 +02:00
Simon L. 5d10dcb284 build(deps): bump dessant/lock-threads from 6.0.0 to 6.0.1 in /.github/workflows (#8214) 2026-05-29 09:04:18 +02:00
dependabot[bot] 1a7d50463a build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 9.4.1 to 9.4.2.

---
updated-dependencies:
- dependency-name: elasticsearch
  dependency-version: 9.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-29 04:24:03 +00:00
szaimen cfd8f7f47d watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-28 14:58:32 +00:00
szaimen 6cef8a1bfc imaginary-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-28 14:26:49 +00:00
dependabot[bot] 69afd5c857 build(deps): bump dessant/lock-threads in /.github/workflows
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7...851cffe46851ddd2051ea7147ebdc995113241c3)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-28 14:25:15 +00:00
Simon L. 7a499f3d0a Add "dockhand.update": "false" to all managed containers (#8184) 2026-05-28 11:56:24 +02:00
Simon L. e52f3944ee FTS: require authentication for all Elasticsearch API access (#8205) 2026-05-28 11:54:40 +02:00
Simon L. 2f7b98ddff preparations for the coming Hub 26 Spring release
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-28 11:42:03 +02:00
copilot-swe-agent[bot] a50f28424d fix: enable elasticsearch security to require authentication for all API access
- Enable xpack.security in Elasticsearch (was explicitly disabled)
- Add ELASTIC_PASSWORD env var so the built-in elastic user gets the password
- Disable HTTP SSL to keep plain HTTP while still enforcing basic auth
- Disable transport SSL (single-node setup)
- Update healthcheck to authenticate with elastic credentials
2026-05-28 11:41:59 +02:00
Ivan Mihov 26c74fd556 Add a note regardign dockhand update and a link to the documentation
Signed-off-by: Ivan Mihov <ivan@mihov.me>
2026-05-28 11:41:41 +02:00
Ivan Mihov d2d59eb207 Add dockhand.update: false to the Dockerfiles
Signed-off-by: Ivan Mihov <ivan@mihov.me>
2026-05-28 11:41:41 +02:00
Ivan Mihov 21649225d0 Add "dockhand.update": "false" to all managed containers
Signed-off-by: Ivan Mihov <ivan@mihov.me>
2026-05-28 11:41:41 +02:00
Simon L. 9cfaad674c update tags of playwright workflows (#8211) 2026-05-28 11:40:21 +02:00
Simon L. 0b0f848377 update tags of playwright workflows
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-28 11:35:29 +02:00
copilot-swe-agent[bot] f178b49cc1 fix: apply dark mode in overlay iframe via storage events and apply-theme.js
Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/bc95f559-e0c7-4682-96fb-0799956a95c6

Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
2026-05-21 11:56:51 +00:00
Gaetano Giunta 4c73a123ca move md files from CRLF to LF; instruct to use :ro flag when mounting the docker socket (manual-upgrade.md)
Signed-off-by: Gaetano Giunta <giunta.gaetano@gmail.com>
2026-05-19 17:46:47 +00:00
copilot-swe-agent[bot] b0c4f97ba2 aio-interface: improve overlay log appearance
Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/d51a2637-5128-4c8a-a18c-a86085d2cb88

aio-interface: do not cache the containers, logs and setup screen as it shows credentials

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

fix: address PR review comments - remove inline script (CSP), use default font string

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/62e290a3-94de-4988-aeb8-b577fec135a7
Co-Authored-By: szaimen <42591237+szaimen@users.noreply.github.com>
2026-05-19 16:30:33 +02:00
83 changed files with 1347 additions and 699 deletions
+1
View File
@@ -31,6 +31,7 @@ updates:
- "/Containers/collabora"
- "/Containers/docker-socket-proxy"
- "/Containers/domaincheck"
- "/Containers/eurooffice"
- "/Containers/fulltextsearch"
- "/Containers/imaginary"
- "/Containers/mastercontainer"
+5
View File
@@ -3,3 +3,8 @@
-
- Before sending a pull request that fixes a security issue please report it via our HackerOne page (https://hackerone.com/nextcloud) following our security policy (https://nextcloud.com/security/). This allows us to coordinate the fix and release without potentially exposing all Nextcloud servers and users in the meantime.
-->
<!-- Please check the below checkmarks if applicable -->
- [ ] The PR was tested and verified that it works locally
- [ ] The PR was completely or partially created with AI
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v5
- uses: dessant/lock-threads@89ae32b08ed1a541efecbab17912962a5e38981c # v5
with:
issue-inactive-days: '14'
process-only: 'issues'
+1 -1
View File
@@ -32,7 +32,7 @@ jobs:
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: lts/*
node-version: 24.15.0
- name: Install dependencies
run: cd php/tests && npm ci
@@ -17,7 +17,7 @@ jobs:
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: lts/*
node-version: 24.15.0
- name: Install dependencies
run: cd php/tests && npm ci
+9 -2
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
}
}
@@ -78,7 +85,7 @@ http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI req
# TLS options
tls {
issuer acme {
profile shortlived
profile tlsserver
# Disable HTTP challenge because that would require port 80, which we don't get (it's exposed to the mastercontainer).
# This container by default only exposes port 443 if not configured otherwise via APACHE_PORT.
disable_http_challenge
+2 -1
View File
@@ -1,5 +1,5 @@
# 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
@@ -103,6 +103,7 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Apache and Caddy for Nextcloud AIO" \
org.opencontainers.image.description="Apache HTTP server with Caddy for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -25,6 +25,7 @@ USER root
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Borgbackup for Nextcloud AIO" \
org.opencontainers.image.description="BorgBackup-based backup service for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -43,6 +43,7 @@ ENTRYPOINT ["/start.sh"]
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="ClamAV for Nextcloud AIO" \
org.opencontainers.image.description="ClamAV antivirus scanner for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -13,6 +13,7 @@ USER 1001
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="Collabora Online for Nextcloud AIO" \
org.opencontainers.image.description="Collabora Online document editor from upstream for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+2 -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.9.4.1
FROM collabora/code:26.04.1.3.1
USER root
ARG DEBIAN_FRONTEND=noninteractive
@@ -13,6 +13,7 @@ USER 1001
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="Collabora for Nextcloud AIO" \
org.opencontainers.image.description="Collabora CODE document editor for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+2 -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
@@ -20,6 +20,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Docker Socket Proxy for Nextcloud AIO" \
org.opencontainers.image.description="HAProxy-based Docker socket proxy for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -19,6 +19,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD nc -z 127.0.0.1 $APACHE_PORT || exit 1
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Domain Check for Nextcloud AIO" \
org.opencontainers.image.description="Domain validation service for Nextcloud All-in-One setup" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+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
+2 -1
View File
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Probably from here https://github.com/elastic/dockerfiles/blob/9.3/elasticsearch/Dockerfile
FROM elasticsearch:9.4.1
FROM elasticsearch:9.4.2
USER root
@@ -21,6 +21,7 @@ USER 1000:0
HEALTHCHECK --interval=10s --timeout=5s --start-period=1m --retries=5 CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Full Text Search for Nextcloud AIO" \
org.opencontainers.image.description="Elasticsearch-based full-text search for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1 -1
View File
@@ -4,4 +4,4 @@ if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
curl -fs "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
+2 -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
@@ -45,6 +45,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Imaginary for Nextcloud AIO" \
org.opencontainers.image.description="High-performance image processing service for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+2 -1
View File
@@ -5,7 +5,7 @@ FROM docker:29.5.2-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
@@ -107,6 +107,7 @@ LABEL org.opencontainers.image.title="Nextcloud All-in-One Mastercontainer" \
org.opencontainers.image.vendor="Nextcloud" \
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md" \
wud.watch="false" \
dockhand.update="false" \
com.docker.compose.project="nextcloud-aio"
# hadolint ignore=DL3002
+2 -1
View File
@@ -8,7 +8,7 @@ ENV SOURCE_LOCATION=/usr/src/nextcloud
ENV REDIS_DB_INDEX=0
# AIO settings start # Do not remove or change this line!
ENV NEXTCLOUD_VERSION=33.0.3
ENV NEXTCLOUD_VERSION=33.0.5
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!
@@ -286,6 +286,7 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Nextcloud for Nextcloud AIO" \
org.opencontainers.image.description="Nextcloud server with all required PHP extensions for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
@@ -2,4 +2,5 @@
$CONFIG = array (
'one-click-instance' => true,
'one-click-instance.user-limit' => 100,
'update_channel' => 'stable',
);
+54 -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,58 @@ 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
EUROOFFICE_HOST="$NC_DOMAIN/eurooffice"
export EUROOFFICE_HOST
fi
php /var/www/html/occ config:app:set eurooffice DocumentServerUrl --value="https://$EUROOFFICE_HOST"
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
+1
View File
@@ -23,6 +23,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Notify Push for Nextcloud AIO" \
org.opencontainers.image.description="Nextcloud notify_push high-performance backend for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -9,6 +9,7 @@ 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="OnlyOffice for Nextcloud AIO" \
org.opencontainers.image.description="OnlyOffice Document Server for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -49,6 +49,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="PostgreSQL for Nextcloud AIO" \
org.opencontainers.image.description="PostgreSQL database for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -23,6 +23,7 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Redis for Nextcloud AIO" \
org.opencontainers.image.description="Redis cache server for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1
View File
@@ -67,6 +67,7 @@ CMD ["python", "-m", "nextcloud.talk.recording", "--config", "/conf/recording.co
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Talk Recording for Nextcloud AIO" \
org.opencontainers.image.description="Nextcloud Talk recording service for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+2 -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
@@ -112,6 +112,7 @@ CMD ["supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Talk for Nextcloud AIO" \
org.opencontainers.image.description="Nextcloud Talk with NATS, Janus, eturnal, and signaling server for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+5 -3
View File
@@ -4,11 +4,13 @@ if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
nc -z 127.0.0.1 8081 || exit 1
nc -z 127.0.0.1 8081 || nc -z ::1 8081 || exit 1
nc -z 127.0.0.1 8188 || exit 1
nc -z 127.0.0.1 4222 || exit 1
nc -z 127.0.0.1 "$TALK_PORT" || exit 1
nc -z 127.0.0.1 "$TALK_PORT" || nc -z ::1 "$TALK_PORT" || exit 1
eturnalctl status || exit 1
# Verify that the signaling server is actually serving requests, not just
# listening on the TCP port (which nc -z above only tests for open port).
wget -q -O /dev/null http://127.0.0.1:8081/api/v1/stats || exit 1
# SC2102: [::1] is an IPv6 address literal in a URL, not a character-range glob.
# shellcheck disable=SC2102
wget -q -O /dev/null http://127.0.0.1:8081/api/v1/stats || wget -q -O /dev/null http://[::1]:8081/api/v1/stats || exit 1
+8 -1
View File
@@ -75,6 +75,13 @@ if grep -q "1" /sys/module/ipv6/parameters/disable \
|| grep -q "1" /proc/sys/net/ipv6/conf/default/disable_ipv6; then
IP_BINDING="0.0.0.0"
fi
# Build a listen address suitable for the signaling server's "ip:port" format.
# IPv6 needs bracket notation: [::]:8081; IPv4 keeps the plain form: 0.0.0.0:8081
if [ "$IP_BINDING" = "::" ]; then
SIGNALING_LISTEN="[::]:8081"
else
SIGNALING_LISTEN="$IP_BINDING:8081"
fi
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
set +x
fi
@@ -118,7 +125,7 @@ fi
# Signaling
cat << SIGNALING_CONF > "/conf/signaling.conf"
[http]
listen = 0.0.0.0:8081
listen = ${SIGNALING_LISTEN}
readtimeout = 15
writetimeout = 30
+4 -3
View File
@@ -1,13 +1,13 @@
# 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=652c89577076f6bc6f2af4465217589641216ee3
ENV WATCHTOWER_COMMIT_HASH=9d0048403a7242943084bede951f6f966f7691ba
RUN set -ex; \
apk upgrade --no-cache -a; \
apk add --no-cache \
build-base; \
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.16.1
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.17.2
FROM alpine:3.23.4
@@ -27,6 +27,7 @@ ENV AIO_LOG_LEVEL="warn"
ENTRYPOINT ["/start.sh"]
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Watchtower for Nextcloud AIO" \
org.opencontainers.image.description="Watchtower auto-update service for Nextcloud All-in-One containers" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+2 -1
View File
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Probably from this file: https://github.com/nextcloud/whiteboard/blob/main/Dockerfile
FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.8
FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.9
USER root
RUN set -ex; \
@@ -24,6 +24,7 @@ ENTRYPOINT ["/start.sh"]
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
dockhand.update="false" \
org.opencontainers.image.title="Whiteboard for Nextcloud AIO" \
org.opencontainers.image.description="Collaborative whiteboard service for Nextcloud All-in-One" \
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
+1 -1
View File
@@ -13,7 +13,7 @@
<category>monitoring</category>
<bugs>https://github.com/nextcloud/all-in-one/issues</bugs>
<dependencies>
<nextcloud min-version="32" max-version="33"/>
<nextcloud min-version="33" max-version="34"/>
</dependencies>
<settings>
+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.
+2 -2
View File
@@ -27,7 +27,7 @@ The only way to fix this on your side is upgrading regularly (e.g. by enabling d
```bash
sudo docker pull assaflavie/runlike
echo '#!/bin/bash' > /tmp/nextcloud-aio-nextcloud
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike -p nextcloud-aio-nextcloud >> /tmp/nextcloud-aio-nextcloud
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro assaflavie/runlike -p nextcloud-aio-nextcloud >> /tmp/nextcloud-aio-nextcloud
sudo chown root:root /tmp/nextcloud-aio-nextcloud
```
5. Now open `/tmp/nextcloud-aio-nextcloud` with a text editor, and edit the container tag:
@@ -66,7 +66,7 @@ Prerequisite: have all containers from AIO interface running.
##### 1. Install portainer if not installed:
```bash
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock:ro -v portainer_data:/data portainer/portainer-ce:latest
```
- If you have a reverse proxy
- you can setup and navigate using a domain name.
+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
+181 -92
View File
@@ -64,25 +64,26 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.10.3",
"version": "7.11.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "47ba23c7a55247e2e1b7407aca90e9bbed0d9d86"
"reference": "c987f8ce84b8434fa430795eca0f3430663da72b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/47ba23c7a55247e2e1b7407aca90e9bbed0d9d86",
"reference": "47ba23c7a55247e2e1b7407aca90e9bbed0d9d86",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b",
"reference": "c987f8ce84b8434fa430795eca0f3430663da72b",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^2.3",
"guzzlehttp/psr7": "^2.8",
"guzzlehttp/promises": "^2.5",
"guzzlehttp/psr7": "^2.11",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
"symfony/deprecation-contracts": "^2.5 || ^3.0",
"symfony/polyfill-php80": "^1.24"
},
"provide": {
"psr/http-client-implementation": "1.0"
@@ -91,7 +92,7 @@
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
"guzzle/client-integration-tests": "3.0.2",
"guzzlehttp/test-server": "^0.3.2",
"guzzlehttp/test-server": "^0.4",
"php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.52 || ^9.6.34",
"psr/log": "^1.1 || ^2.0 || ^3.0"
@@ -171,7 +172,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.10.3"
"source": "https://github.com/guzzle/guzzle/tree/7.11.0"
},
"funding": [
{
@@ -187,24 +188,25 @@
"type": "tidelift"
}
],
"time": "2026-05-20T22:59:19+00:00"
"time": "2026-06-02T12:40:51+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "2.4.1",
"version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2"
"reference": "4360e982f87f5f258bf872d094647791db2f4c8e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/09e8a212562fb1fb6a512c4156ed71525969d6c2",
"reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2",
"url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e",
"reference": "4360e982f87f5f258bf872d094647791db2f4c8e",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0"
"php": "^7.2.5 || ^8.0",
"symfony/deprecation-contracts": "^2.5 || ^3.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
@@ -254,7 +256,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.4.1"
"source": "https://github.com/guzzle/promises/tree/2.5.0"
},
"funding": [
{
@@ -270,27 +272,29 @@
"type": "tidelift"
}
],
"time": "2026-05-20T22:57:30+00:00"
"time": "2026-06-02T12:23:43+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "2.10.1",
"version": "2.11.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "73ab136360b5dfd858006eae9795e8fe43c80361"
"reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/73ab136360b5dfd858006eae9795e8fe43c80361",
"reference": "73ab136360b5dfd858006eae9795e8fe43c80361",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f",
"reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
"ralouphie/getallheaders": "^3.0",
"symfony/deprecation-contracts": "^2.5 || ^3.0",
"symfony/polyfill-php80": "^1.24"
},
"provide": {
"psr/http-factory-implementation": "1.0",
@@ -371,7 +375,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.10.1"
"source": "https://github.com/guzzle/psr7/tree/2.11.0"
},
"funding": [
{
@@ -387,7 +391,7 @@
"type": "tidelift"
}
],
"time": "2026-05-20T09:27:36+00:00"
"time": "2026-06-02T12:30:48+00:00"
},
{
"name": "http-interop/http-factory-guzzle",
@@ -1285,16 +1289,16 @@
},
{
"name": "slim/slim",
"version": "4.15.1",
"version": "4.15.2",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
"reference": "887893516557506f254d950425ce7f5387a26970"
"reference": "e12cb05ca2a14e8f459d019e87a31dc915b80470"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/887893516557506f254d950425ce7f5387a26970",
"reference": "887893516557506f254d950425ce7f5387a26970",
"url": "https://api.github.com/repos/slimphp/Slim/zipball/e12cb05ca2a14e8f459d019e87a31dc915b80470",
"reference": "e12cb05ca2a14e8f459d019e87a31dc915b80470",
"shasum": ""
},
"require": {
@@ -1397,7 +1401,7 @@
"type": "tidelift"
}
],
"time": "2025-11-21T12:23:44+00:00"
"time": "2026-05-22T08:00:12+00:00"
},
{
"name": "slim/twig-view",
@@ -1620,16 +1624,16 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",
"shasum": ""
},
"require": {
@@ -1681,7 +1685,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"
},
"funding": [
{
@@ -1701,20 +1705,104 @@
"type": "tidelift"
}
],
"time": "2026-04-10T17:25:58+00:00"
"time": "2026-05-26T12:51:13+00:00"
},
{
"name": "symfony/polyfill-php81",
"name": "symfony/polyfill-php80",
"version": "v1.37.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
"reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php80\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ion Bazan",
"email": "ion.bazan@gmail.com"
},
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2026-04-10T16:19:22+00:00"
},
{
"name": "symfony/polyfill-php81",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
"reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
"shasum": ""
},
"require": {
@@ -1761,7 +1849,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1"
},
"funding": [
{
@@ -1781,20 +1869,20 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2026-05-26T12:45:58+00:00"
},
{
"name": "twig/twig",
"version": "v3.26.0",
"version": "v3.27.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "1fcae487b180d78e6351f4e0afa91f9eab96a2bc"
"reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/1fcae487b180d78e6351f4e0afa91f9eab96a2bc",
"reference": "1fcae487b180d78e6351f4e0afa91f9eab96a2bc",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/ae2071bffb38f04847fc0864d730c94b9cb8ab74",
"reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74",
"shasum": ""
},
"require": {
@@ -1849,7 +1937,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.26.0"
"source": "https://github.com/twigphp/Twig/tree/v3.27.1"
},
"funding": [
{
@@ -1861,7 +1949,7 @@
"type": "tidelift"
}
],
"time": "2026-05-20T07:31:59+00:00"
"time": "2026-05-30T17:09:26+00:00"
}
],
"packages-dev": [
@@ -2390,16 +2478,16 @@
},
{
"name": "amphp/process",
"version": "v2.0.3",
"version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/amphp/process.git",
"reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d"
"reference": "583959df17d00304ad7b0b32285373f985935643"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d",
"reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d",
"url": "https://api.github.com/repos/amphp/process/zipball/583959df17d00304ad7b0b32285373f985935643",
"reference": "583959df17d00304ad7b0b32285373f985935643",
"shasum": ""
},
"require": {
@@ -2413,7 +2501,7 @@
"amphp/php-cs-fixer-config": "^2",
"amphp/phpunit-util": "^3",
"phpunit/phpunit": "^9",
"psalm/phar": "^5.4"
"psalm/phar": "6.16.1"
},
"type": "library",
"autoload": {
@@ -2446,7 +2534,7 @@
"homepage": "https://amphp.org/process",
"support": {
"issues": "https://github.com/amphp/process/issues",
"source": "https://github.com/amphp/process/tree/v2.0.3"
"source": "https://github.com/amphp/process/tree/v2.1.0"
},
"funding": [
{
@@ -2454,7 +2542,7 @@
"type": "github"
}
],
"time": "2024-04-19T03:13:44+00:00"
"time": "2026-05-31T15:11:55+00:00"
},
{
"name": "amphp/serialization",
@@ -4053,16 +4141,16 @@
},
{
"name": "symfony/console",
"version": "v6.4.39",
"version": "v6.4.41",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "c132f1215fe4aa45b70173cc00ce9a755dd31ec5"
"reference": "d21b17ed158e79180fac3895ff751707970eeb57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/c132f1215fe4aa45b70173cc00ce9a755dd31ec5",
"reference": "c132f1215fe4aa45b70173cc00ce9a755dd31ec5",
"url": "https://api.github.com/repos/symfony/console/zipball/d21b17ed158e79180fac3895ff751707970eeb57",
"reference": "d21b17ed158e79180fac3895ff751707970eeb57",
"shasum": ""
},
"require": {
@@ -4127,7 +4215,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.4.39"
"source": "https://github.com/symfony/console/tree/v6.4.41"
},
"funding": [
{
@@ -4147,24 +4235,25 @@
"type": "tidelift"
}
],
"time": "2026-05-12T06:50:03+00:00"
"time": "2026-05-24T08:48:41+00:00"
},
{
"name": "symfony/filesystem",
"version": "v8.0.11",
"version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7"
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/224db910898ce1317b892a9a1338f1f8f17eb7c7",
"reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2",
"reference": "99aec13b82b4967ec5088222c4a3ecca955949c2",
"shasum": ""
},
"require": {
"php": ">=8.4",
"php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
},
@@ -4197,7 +4286,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v8.0.11"
"source": "https://github.com/symfony/filesystem/tree/v8.1.0"
},
"funding": [
{
@@ -4217,7 +4306,7 @@
"type": "tidelift"
}
],
"time": "2026-05-11T16:39:47+00:00"
"time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/finder",
@@ -4289,16 +4378,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "4864388bfbd3001ce88e234fab652acd91fdc57e"
"reference": "e9247d281d694a5120554d9afaf54e070e88a603"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e",
"reference": "4864388bfbd3001ce88e234fab652acd91fdc57e",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
"reference": "e9247d281d694a5120554d9afaf54e070e88a603",
"shasum": ""
},
"require": {
@@ -4347,7 +4436,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
},
"funding": [
{
@@ -4367,20 +4456,20 @@
"type": "tidelift"
}
],
"time": "2026-04-26T13:13:48+00:00"
"time": "2026-05-26T05:58:03+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.37.0",
"version": "v1.38.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
"shasum": ""
},
"require": {
@@ -4432,7 +4521,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
},
"funding": [
{
@@ -4452,20 +4541,20 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2026-05-25T13:48:31+00:00"
},
{
"name": "symfony/polyfill-php84",
"version": "v1.37.0",
"version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php84.git",
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06"
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06",
"reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06",
"url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
"reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
"shasum": ""
},
"require": {
@@ -4512,7 +4601,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0"
"source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"
},
"funding": [
{
@@ -4532,7 +4621,7 @@
"type": "tidelift"
}
],
"time": "2026-04-10T18:47:49+00:00"
"time": "2026-05-26T12:51:13+00:00"
},
{
"name": "symfony/service-contracts",
@@ -4623,16 +4712,16 @@
},
{
"name": "symfony/string",
"version": "v7.4.11",
"version": "v7.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "965f7306a43383d02c6aca1e3f3bd2f0ea5dee15"
"reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/965f7306a43383d02c6aca1e3f3bd2f0ea5dee15",
"reference": "965f7306a43383d02c6aca1e3f3bd2f0ea5dee15",
"url": "https://api.github.com/repos/symfony/string/zipball/961683010db3b27ec6ebcd7308e6e1ee8fa7ffde",
"reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde",
"shasum": ""
},
"require": {
@@ -4690,7 +4779,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.4.11"
"source": "https://github.com/symfony/string/tree/v7.4.13"
},
"funding": [
{
@@ -4710,7 +4799,7 @@
"type": "tidelift"
}
],
"time": "2026-05-13T12:04:42+00:00"
"time": "2026-05-23T15:23:29+00:00"
},
{
"name": "vimeo/psalm",
+54 -2
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",
@@ -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%",
@@ -828,11 +878,13 @@
"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=%FULLTEXTSEARCH_PASSWORD%"
"ELASTIC_PASSWORD=%FULLTEXTSEARCH_PASSWORD%"
],
"volumes": [
{
+14
View File
@@ -0,0 +1,14 @@
"use strict";
// Apply the saved theme immediately to avoid a flash of the wrong theme.
try { document.documentElement.setAttribute('data-theme', localStorage.getItem('theme') ?? ''); } catch (e) {}
// React when the user toggles the theme on the parent page while this page is
// open in an iframe. localStorage.setItem() fires a 'storage' event on every
// other window / frame that shares the same origin, so we can keep in sync
// without the parent having to know about us.
window.addEventListener('storage', (e) => {
if (e.key === 'theme') {
document.documentElement.setAttribute('data-theme', e.newValue ?? '');
}
});
+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,
+3 -1
View File
@@ -10,6 +10,7 @@ pre {
margin: 0;
padding: 1rem;
box-sizing: border-box;
font-family: 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';
}
#floating-box {
position: fixed;
@@ -26,7 +27,8 @@ pre {
gap: 0.5rem;
font-size: large;
border: solid thin gray;
background-color: #f9f9f9;
background-color: var(--color-main-background);
color: var(--color-main-text);
width: 10rem;
padding: 0.5rem 1rem;
margin: 0 0 0 1rem;
+15 -5
View File
@@ -483,8 +483,8 @@ input[type="checkbox"]:disabled:not(:checked) + label {
visibility: hidden;
opacity: 0;
align-self: start;
width: 300px;
height: 200px;
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);
}
@@ -606,13 +606,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 +633,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;
}
+3 -1
View File
@@ -11,7 +11,7 @@ function toggleTheme() {
function setThemeToDOM(value) {
// Set the theme to the root document and all possible iframe documents (so they can adapt their styling, too).
const documents = [document, Array.from(document.querySelectorAll('iframe')).map((iframe) => iframe.contentDocument)].flat()
const documents = [document, ...Array.from(document.querySelectorAll('iframe')).map((iframe) => iframe.contentDocument).filter(Boolean)]
documents.forEach((doc) => doc.documentElement.setAttribute('data-theme', value));
}
@@ -35,4 +35,6 @@ setThemeToDOM(getSavedTheme());
document.addEventListener('DOMContentLoaded', () => {
setThemeIcon(getSavedTheme())
document.querySelector('button#theme-toggle')?.addEventListener('click', () => toggleTheme());
// Re-apply theme when the overlay-log iframe navigates (e.g. after a form submission).
document.querySelector('iframe#overlay-log')?.addEventListener('load', () => setThemeToDOM(getSavedTheme()));
});
+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']);
+32 -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 = '33';
$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,8 @@ readonly class DockerController {
<!DOCTYPE html>
<html lang="en" class="overlay-iframe">
<head>
<link rel="stylesheet" href="../../style.css?v8" media="all" />
<link rel="stylesheet" href="../../style.css?v11" media="all" />
<script type="text/javascript" src="../../apply-theme.js?v1"></script>
<script type="text/javascript" src="../../scroll-into-view.js"></script>
</head>
<body>
@@ -425,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;
+9 -2
View File
@@ -5,6 +5,7 @@ namespace AIO\Data;
use AIO\Auth\PasswordGenerator;
use AIO\Controller\DockerController;
use AIO\Helper\NetworkHelper;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\TransferException;
@@ -98,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);
@@ -1086,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' : '',
@@ -1111,9 +1118,9 @@ class ConfigurationManager
'INSTALL_LATEST_MAJOR' => $this->installLatestMajor ? 'yes' : '',
'REMOVE_DISABLED_APPS' => $this->nextcloudKeepDisabledApps ? '' : 'yes',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
'AIO_DATABASE_HOST' => NetworkHelper::resolveHostname('nextcloud-aio-database'),
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
'CADDY_IP_ADDRESS' => in_array('caddy', $this->aioCommunityContainers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
'CADDY_IP_ADDRESS' => in_array('caddy', $this->aioCommunityContainers, true) ? NetworkHelper::resolveHostname('nextcloud-aio-caddy') : '',
'WHITEBOARD_ENABLED' => $this->isWhiteboardEnabled ? 'yes' : '',
'AIO_VERSION' => $this->getAioVersion(),
default => $this->getRegisteredSecret($placeholder),
+1
View File
@@ -71,4 +71,5 @@ class DataConst {
public static function GetAioVersionFile() : string {
return (string)realpath(__DIR__ . '/../../templates/includes/aio-version.twig');
}
}
+94 -57
View File
@@ -9,8 +9,10 @@ use AIO\Container\VersionState;
use AIO\ContainerDefinitionFetcher;
use AIO\Data\ConfigurationManager;
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 {
@@ -47,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;
@@ -67,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;
@@ -137,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;
@@ -154,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) {
@@ -173,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";
@@ -193,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());
}
@@ -214,7 +216,7 @@ readonly class DockerActionManager {
$firstChar = substr($volume->name, 0, 1);
if (!in_array($firstChar, $forbiddenChars)) {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -449,7 +451,7 @@ readonly class DockerActionManager {
// Special things for the jellyfin community container
} elseif ($container->identifier === 'nextcloud-aio-jellyfin') {
$lldapIp = gethostbyname('nextcloud-aio-lldap');
$lldapIp = NetworkHelper::resolveHostname('nextcloud-aio-lldap');
if ($lldapIp !== 'nextcloud-aio-lldap') {
$requestBody['HostConfig']['ExtraHosts'] = ['nextcloud-aio-lldap:' . $lldapIp];
}
@@ -484,15 +486,16 @@ readonly class DockerActionManager {
// All AIO-managed containers should not be updated externally via watchtower but gracefully by AIO's backup and update feature.
// Also DIUN should not send update notifications. See https://crazymax.dev/diun/providers/docker/#docker-labels
// Also Dockhand should not be auto updating the containers. See https://dockhand.pro/manual/#container-labels-behavior
// Additionally set a default org.label-schema.vendor and com.docker.compose.project
$requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "wud.watch" => "false", "diun.enable" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
$requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "wud.watch" => "false", "diun.enable" => "false", "dockhand.update" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
// Containers should have a fixed host name. See https://github.com/nextcloud/all-in-one/discussions/6589
$requestBody['Hostname'] = $container->identifier;
$url = $this->BuildApiUrl('containers/create?name=' . $container->identifier);
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -549,10 +552,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;
}
@@ -560,7 +563,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();
@@ -645,11 +648,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);
@@ -693,7 +696,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];
@@ -720,7 +723,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];
@@ -761,48 +764,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);
}
}
}
}
@@ -813,7 +837,7 @@ readonly class DockerActionManager {
);
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -834,7 +858,7 @@ readonly class DockerActionManager {
if ($createNetwork) {
$url = $this->BuildApiUrl('networks/create');
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -863,7 +887,7 @@ readonly class DockerActionManager {
}
try {
$this->guzzleClient->request(
$this->sendHttpRequest(
'POST',
$url,
[
@@ -908,7 +932,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;
@@ -920,7 +944,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;
@@ -942,7 +966,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;
@@ -982,7 +1006,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);
@@ -1027,6 +1051,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
@@ -1055,7 +1084,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;
@@ -1093,4 +1122,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);
}
}
+23
View File
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace AIO\Helper;
class NetworkHelper {
/**
* Resolve a hostname to its IP address, trying IPv4 first and falling back
* to IPv6 (AAAA record) when no A record is found. Returns the hostname
* unchanged when neither record resolves successfully.
*/
public static function resolveHostname(string $hostname): string {
$ipv4 = gethostbyname($hostname);
if ($ipv4 !== $hostname) {
return $ipv4;
}
$records = dns_get_record($hostname, DNS_AAAA);
if (is_array($records) && isset($records[0]['ipv6']) && $records[0]['ipv6'] !== '') {
return $records[0]['ipv6'];
}
return $hostname;
}
}
+8 -3
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 %}
@@ -37,7 +37,7 @@
{% set isBackupOrRestoreRunning = false %}
{% set isApacheStarting = false %}
{# Setting newMajorVersion to '' will hide corresponding options/elements, can be set to an integer like 26 in order to show corresponding elements. If set, also increase installLatestMajor in https://github.com/nextcloud/all-in-one/blob/main/php/src/Controller/DockerController.php #}
{% set newMajorVersionString = '' %}
{% set newMajorVersionString = '26 Spring' %}
{% set oldMajorVersionString = '25 Autumn' %}
{% if is_backup_container_running == true %}
@@ -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/7523">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</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 %}
+2 -2
View File
@@ -2,10 +2,10 @@
<html lang="en">
<head>
<title>AIO</title>
<link rel="stylesheet" href="style.css?v9" media="all" />
<link rel="stylesheet" href="style.css?v11" 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?v1"></script>
<script type="text/javascript" src="toggle-dark-mode.js?v2"></script>
<script type="text/javascript" src="click-handlers.js?v2"></script>
</head>
+3 -2
View File
@@ -2,9 +2,10 @@
<head>
<title>AIO</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="logs.css">
<link rel="stylesheet" href="style.css?v11">
<link rel="stylesheet" href="logs.css?v1">
<link rel="icon" href="img/favicon.png">
<script src="apply-theme.js?v1"></script>
<script src="log-load.js?v1"></script>
</head>
<body data-container-id="{{ id }}">
+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.