Compare commits

...

153 Commits

Author SHA1 Message Date
Simon L.
d5b334177c Merge pull request #7703 from nextcloud/aio-helm-update
Helm Chart updates
2026-03-06 09:18:17 +01:00
szaimen
ea52b11c7b Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-06 08:15:38 +00:00
Simon L.
825787e228 Merge pull request #7633 from nextcloud/aio-yaml-update
Yaml updates
2026-03-06 09:14:27 +01:00
Simon L.
7224f659b3 Merge pull request #7695 from nextcloud/dependabot/github_actions/dot-github/workflows/actions/upload-artifact-7.0.0
build(deps): bump actions/upload-artifact from 6.0.0 to 7.0.0 in /.github/workflows
2026-03-05 13:15:12 +01:00
dependabot[bot]
d4e753ef84 build(deps): bump actions/upload-artifact in /.github/workflows
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6.0.0 to 7.0.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](b7c566a772...bbbca2ddaa)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 12:07:57 +00:00
szaimen
31c30cce9d Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-03 12:07:24 +00:00
Simon L.
45bebab55d Merge pull request #7683 from turtleinarock/patch-1
readme: fix typo
2026-03-03 11:01:39 +01:00
turtleinarock
00896009cd Update readme.md
Erroneous backtick (`) at the end of the Unraid script command.

Signed-off-by: turtleinarock <s.senn14@gmail.com>
2026-03-02 13:50:12 -06:00
Simon L.
c1faa785b3 Merge pull request #7667 from nextcloud/Anvil5465-patch-4
Document Seerr Permissions Change
2026-02-27 11:32:59 +01:00
Anvil5465
004674fada Update community-containers/jellyseerr/readme.md
Co-authored-by: Simon L. <szaimen@e.mail.de>
Signed-off-by: Anvil5465 <119350594+Anvil5465@users.noreply.github.com>
2026-02-27 05:31:49 -05:00
Anvil5465
ad6b5d4087 Document Seerr permissions change
Signed-off-by: Anvil5465 <119350594+Anvil5465@users.noreply.github.com>
2026-02-26 15:33:02 -05:00
Simon L.
2fce6352c8 fix starting process not shown if containers are already up-to-date
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-26 11:49:48 +01:00
Simon L.
0a97eba954 Merge pull request #7662 from nextcloud/revert-7613-dependabot/docker/Containers/collabora/collabora/code-25.04.9.1.1
Revert "build(deps): bump collabora/code from 25.04.8.3.1 to 25.04.9.1.1 in /Containers/collabora"
2026-02-26 11:37:07 +01:00
Simon L.
360b7c2614 Revert "build(deps): bump collabora/code from 25.04.8.3.1 to 25.04.9.1.1 in /Containers/collabora" 2026-02-26 11:35:41 +01:00
Simon L.
2c61ecddd4 fix js detail with harp
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-26 11:12:06 +01:00
Pablo Zmdl
a863d9255d Merge pull request #7656 from nextcloud/auto-load-only-new-log-data 2026-02-25 16:59:09 +01:00
Pablo Zmdl
680a2fefcb Auto-load only new log data
This is way more complicated that just reloading the log file, but also
way nicer.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-25 16:45:41 +01:00
Simon L.
b07c24f813 Merge pull request #7660 from nextcloud/aio-dependency-update
PHP dependency updates
2026-02-25 13:28:35 +01:00
szaimen
d7775ef6f5 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-25 12:10:24 +00:00
Simon L.
40b4839693 Merge pull request #7651 from nextcloud/enh/noid/allow-configure-checksum-validation
s3.config.php: allow to configure `request_checksum_calculation` and `response_checksum_validation`
2026-02-25 10:39:40 +01:00
Simon L.
87a9396ebe Merge pull request #7658 from nextcloud/dependabot/docker/Containers/onlyoffice/onlyoffice/documentserver-9.3.0.1
build(deps): bump onlyoffice/documentserver from 9.2.1.1 to 9.3.0.1 in /Containers/onlyoffice
2026-02-25 08:08:20 +01:00
dependabot[bot]
c9d413638c build(deps): bump onlyoffice/documentserver in /Containers/onlyoffice
Bumps onlyoffice/documentserver from 9.2.1.1 to 9.3.0.1.

---
updated-dependencies:
- dependency-name: onlyoffice/documentserver
  dependency-version: 9.3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-25 04:08:52 +00:00
Simon L.
fe60e7b5d3 Merge pull request #7655 from nextcloud/enh/7654/hide-harp
aio-interface: hide harp temporarily
2026-02-24 20:58:17 +01:00
Simon L.
042eded639 aio-interface: hide harp temporarily
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-24 16:34:08 +01:00
Simon L.
f12b47b301 s3.config.php: allow to configure request_checksum_calculation and response_checksum_validation
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-24 14:17:07 +01:00
Simon L.
0633f665d5 Merge pull request #7646 from nextcloud/dependabot/docker/Containers/redis/redis-8.6.1-alpine
build(deps): bump redis from 8.2.3-alpine to 8.6.1-alpine in /Containers/redis
2026-02-24 08:03:51 +01:00
Simon L.
d028bf9534 Merge pull request #7645 from nextcloud/dependabot/docker/Containers/mastercontainer/caddy-2.11.1-alpine
build(deps): bump caddy from 2.10.2-alpine to 2.11.1-alpine in /Containers/mastercontainer
2026-02-24 08:03:20 +01:00
Simon L.
696afdc7e9 Merge pull request #7644 from nextcloud/dependabot/docker/Containers/apache/caddy-2.11.1-alpine
build(deps): bump caddy from 2.10.2-alpine to 2.11.1-alpine in /Containers/apache
2026-02-24 08:02:58 +01:00
dependabot[bot]
c359f78f6c build(deps): bump redis in /Containers/redis
Bumps redis from 8.2.3-alpine to 8.6.1-alpine.

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 8.6.1-alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 04:08:32 +00:00
dependabot[bot]
aedeee48cc build(deps): bump caddy in /Containers/mastercontainer
Bumps caddy from 2.10.2-alpine to 2.11.1-alpine.

---
updated-dependencies:
- dependency-name: caddy
  dependency-version: 2.11.1-alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 04:08:06 +00:00
dependabot[bot]
00d7dc6c43 build(deps): bump caddy in /Containers/apache
Bumps caddy from 2.10.2-alpine to 2.11.1-alpine.

---
updated-dependencies:
- dependency-name: caddy
  dependency-version: 2.11.1-alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 04:07:33 +00:00
Simon L.
5113045e87 Merge pull request #7634 from nextcloud/auto-reload-logs
Auto-reload the log view, and scroll to bottom.
2026-02-23 14:02:22 +01:00
Pablo Zmdl
280898be6f Reload every 5s, but only if visible
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-23 13:36:28 +01:00
Simon L.
517d68b106 Merge pull request #7641 from nextcloud/aio-dependency-update
PHP dependency updates
2026-02-23 13:33:19 +01:00
szaimen
4f8c828202 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-23 12:15:49 +00:00
Simon L.
4f687be298 Merge pull request #7640 from nextcloud/enh/noid/fix-redis-config
redis.config.php: fix some now optional values
2026-02-23 10:27:27 +01:00
Simon L.
f46358b50e redis.config.php: fix some now optional values
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-23 10:25:12 +01:00
Simon L.
9184fe7cb4 Merge pull request #7638 from nextcloud/enh/noid/fix-helm-types
helm: fix type of yes and no values
2026-02-23 09:28:33 +01:00
Simon L.
c3322c65c0 helm: fix type of yes and no values
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-23 09:27:48 +01:00
Pablo Zmdl
862a17ab4e Auto-reload the log view, and scroll to bottom.
Includes a button to disable the automatic reloading (useful when inspecting some lines in the middle).

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-20 14:22:57 +01:00
Simon L.
1ddaa30b0f Merge pull request #7632 from nextcloud/enh/noid/fix-redis-typo
redis.config.php: fix typo
2026-02-20 12:59:52 +01:00
Simon L.
ceafca8a3a Merge pull request #7631 from nextcloud/add-404-error-handler
aio-interface: 404 error handler for less app output pollution
2026-02-20 12:57:53 +01:00
Simon L.
8344d8ade6 redis.config.php: fix typo
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-20 12:52:59 +01:00
Pablo Zmdl
22d0da73ac 404 error handler for less app output pollution
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-20 12:48:24 +01:00
Simon L.
faea2c0525 Merge pull request #7630 from nextcloud/dependabot/docker/Containers/docker-socket-proxy/haproxy-3.3.4-alpine
build(deps): bump haproxy from 3.3.3-alpine to 3.3.4-alpine in /Containers/docker-socket-proxy
2026-02-20 08:39:43 +01:00
dependabot[bot]
fdcf41558f build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.3.3-alpine to 3.3.4-alpine.

---
updated-dependencies:
- dependency-name: haproxy
  dependency-version: 3.3.4-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-20 04:07:27 +00:00
Simon L.
ff09f47f39 Merge pull request #7625 from nextcloud/aio-dependency-update
PHP dependency updates
2026-02-19 15:23:04 +01:00
Simon L.
96e73317f9 notify-push: remove jq as it is not needed anymore
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-19 14:22:21 +01:00
Simon L.
3737c182f0 Merge pull request #7627 from nextcloud/aio-helm-update
Helm Chart updates
2026-02-19 13:33:12 +01:00
szaimen
07eca6ca9c Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-19 13:31:22 +01:00
szaimen
a888648c1b php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-19 12:09:22 +00:00
Simon L.
d1b27efedf Merge pull request #7623 from nextcloud/enh/noid/update-to-php-8.5
update mastercontainer to php 8.5
2026-02-19 11:22:08 +01:00
Simon L.
d7c7443ff5 Clarify instructions for local DNS resolution
Rephrase instructions for editing /etc/hosts file on Linux.

Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-18 20:24:02 +01:00
Simon L.
bad972bac3 fix detail
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-18 18:44:05 +01:00
Simon L.
b192f496dc increase to 12.8.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-18 18:35:15 +01:00
Simon L.
1c0222774b Merge pull request #7402 from nextcloud/enh/noid/allow-configure-redis-cluster
allow to configure redis cluster
2026-02-18 18:34:25 +01:00
Simon L.
148a60e51c update mastercontainer to php 8.5
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-18 17:48:44 +01:00
Simon L.
a7d137b92a Merge pull request #7593 from nextcloud/aio-dependency-update
PHP dependency updates
2026-02-18 16:44:33 +01:00
Simon L.
c5b088ef33 Merge pull request #7608 from nextcloud/enh/7600/custom-uid-gid
readme: describe how to configure custom UID/GID
2026-02-18 15:06:14 +01:00
Simon L.
eed6181731 Merge pull request #7620 from nextcloud/watchtower-container-update
watchtower container update
2026-02-18 13:54:46 +01:00
Simon L.
91b8593a6c Merge pull request #7619 from nextcloud/enh/7612/prevent-image-hash
fix getting name of mastercontainer if a hash was found
2026-02-18 13:53:46 +01:00
Simon L.
d43046e28a Merge pull request #7613 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-25.04.9.1.1
build(deps): bump collabora/code from 25.04.8.3.1 to 25.04.9.1.1 in /Containers/collabora
2026-02-18 13:53:22 +01:00
Simon L.
09b310a777 Merge pull request #7611 from nextcloud/enh/noid/improve-config.json-detection
backupscript: improve detection of invalid configuration.json files
2026-02-18 13:53:07 +01:00
Simon L.
b2c8afb661 Merge pull request #7603 from nextcloud/enh/noid/allow-configure-db-persistent
nextcloud-entrypoint.sh: allow to configure dbpersistent setting
2026-02-18 13:52:24 +01:00
Simon L.
5f3716b2da Merge pull request #7602 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.4.18-fpm-alpine3.23
build(deps): bump php from 8.4.17-fpm-alpine3.23 to 8.4.18-fpm-alpine3.23 in /Containers/mastercontainer
2026-02-18 13:51:56 +01:00
Anvil5465
e9a5039211 Jellyseerr to Seerr Migration (#7596)
Signed-off-by: Anvil5465 <119350594+Anvil5465@users.noreply.github.com>
2026-02-18 13:50:55 +01:00
Simon L.
f8f34c0558 Merge pull request #7591 from nextcloud/enh/noid/rename-components
rename the display-name of some containers
2026-02-18 13:46:05 +01:00
Oleksandr Piskun
987191ac14 feat(app-api): add HaRP container (#7493)
Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
Signed-off-by: bigcat88 <bigcat88@icloud.com>
Signed-off-by: Oleksandr Piskun <oleksandr2088@icloud.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-authored-by: Simon L. <szaimen@e.mail.de>
2026-02-18 13:45:44 +01:00
Simon L.
92372abfe7 Merge pull request #7458 from nextcloud/enh/6877/show-sub-steps
aio-interface: show sub-steps for starting containers
2026-02-18 13:45:04 +01:00
Simon L.
5c242195a8 Merge pull request #7621 from nextcloud/aio-helm-update
Helm Chart updates
2026-02-18 13:43:43 +01:00
szaimen
3f0abf2b31 Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-18 12:43:05 +00:00
szaimen
1660656b52 watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-18 12:18:47 +00:00
szaimen
77136b5c34 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-18 12:08:51 +00:00
Simon L.
6b20209886 Merge pull request #7606 from nextcloud/enh/7567/install-docs-unraid
readme: add install docs for unraid
2026-02-17 16:52:42 +01:00
Pablo Zmdl
56f34703fa Increase cache busters for changed JS and CSS files
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-17 16:35:01 +01:00
Pablo Zmdl
0a5590bfa7 Fix JS error expecting an absent form
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-17 16:35:01 +01:00
Pablo Zmdl
01e64bf259 Remove console logging
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-17 16:35:01 +01:00
Pablo Zmdl
fee94d10bc Refactor setting theme and icon initially
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-17 16:35:01 +01:00
Pablo Zmdl
bf2d9ff394 Load container status into iframe as streamed response
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-02-17 16:35:01 +01:00
Simon L.
410dc0e489 Merge pull request #7607 from nextcloud/enh/7601/add-extra-hosts-guide
readme: add guide how to add extra hosts to the containers
2026-02-17 15:19:37 +01:00
Simon L.
cf507d6159 Merge pull request #7616 from th0rgall/patch-1
Docs: clarify filtering of archives during borg backup pruning
2026-02-17 15:06:29 +01:00
Thor Galle
91152877c9 Apply suggestion from @szaimen
Co-authored-by: Simon L. <szaimen@e.mail.de>
Signed-off-by: Thor Galle <thorgalle@gmail.com>
2026-02-17 15:03:17 +01:00
Simon L.
1d85bfe302 fix getting name of mastercontainer if a hash was found
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-17 14:49:55 +01:00
Simon L.
4da3a06458 address review
Co-authored-by: Pablo Zmdl <57864086+pabzm@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-17 13:20:53 +01:00
Simon L.
e0d82965a2 rename the display-name of some containers
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-17 12:13:10 +01:00
Thor Galle
b70b5f6486 Fix typo
Signed-off-by: Thor Galle <thorgalle@gmail.com>
2026-02-17 10:28:26 +01:00
Thor Galle
e4f34da3bb Docs: clarify filtering of archives during borg backup pruning
Clarify the retention policy adjustment instructions by mentioning to not include the '-a' or '--glob-archives' option.

I recently included in the retention policy env variable, and it lead to a pruning error due to the duplicate `-a` ... `--glob-archives` options. I added it because I didn't know that AIO already filtered archives in the borg repo during pruning, and I was worried that it would prune out other non-Nextcloud-AIO backups in the repo. I added a very similar glob myself, so just omitting what I added was the solution for my problem.

As an alternative to this edit, I was thinking that Nextcloud AIO's default filtering behavior could be clarified elsewhere is a positive way.

Two ideas:

1. Modify the start of the retention policy FAQ, like:
   
   After a backup, AIO prunes your borg archives with the `--glob-archives '*_*-nextcloud-aio'` option, so that it does not affect archives unrelated to AIO. The built-in retention policy is `--keep-within=7d --keep-weekly=4 --keep-monthly=6`. [...]
   
2. Or perhaps, there can be another FAQ question about backups, like "Will Nextcloud AIO touch other backups in my borg repository?" or "Can I use my borg repository for backups unrelated to Nextcloud AIO?", with the answer:

   No/Yes, AIO internally uses the borg `--glob-archives '*_*-nextcloud-aio'` option to only prune AIO archives, so Nextcloud AIO will not affect archives/backups unrelated to AIO. Be careful that other systems don't prune your AIO archives, however.

Signed-off-by: Thor Galle <thorgalle@gmail.com>
2026-02-17 10:21:40 +01:00
dependabot[bot]
fd4263a31c build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.8.3.1 to 25.04.9.1.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-17 04:07:58 +00:00
Simon L.
a5876486dd backupscript: improve detection of invalid configuration.json files
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 18:34:09 +01:00
Simon L.
8fef1b084e Merge pull request #7610 from nextcloud/dependabot/github_actions/dot-github/workflows/astral-sh/setup-uv-7.3.0
build(deps): bump astral-sh/setup-uv from 7.2.1 to 7.3.0 in /.github/workflows
2026-02-16 16:18:36 +01:00
dependabot[bot]
636554ee50 build(deps): bump astral-sh/setup-uv in /.github/workflows
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.1 to 7.3.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](803947b9bd...eac588ad8d)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 13:07:55 +00:00
Simon L.
c44a3533a5 Merge pull request #7604 from nextcloud/enh/noid/point-out-more-features
readme: point out some more default features
2026-02-16 13:07:52 +01:00
Simon L.
d4bbeae02d readme: describe how to configure custom UID/GID
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 12:36:58 +01:00
Simon L.
c1a435b077 readme: add install docs for unraid
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 12:18:35 +01:00
Simon L.
ec762a8a66 readme: add guide how to add extra hosts to the containers
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 12:01:07 +01:00
Simon L.
c1bf30980c readme: point out some more default features
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 10:53:13 +01:00
Simon L.
0c0e92c956 nextcloud-entrypoint.sh: allow to configure dbpersistent setting
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-16 10:36:50 +01:00
dependabot[bot]
2af9f1df5a build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.4.17-fpm-alpine3.23 to 8.4.18-fpm-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 04:10:54 +00:00
Simon L.
58e5d8534b add githubstatus check also to deploying to beta instructions
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-13 11:48:21 +01:00
Simon L.
4d7ab6c453 increase to 12.7.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-13 10:57:39 +01:00
Simon L.
bdda7c2178 Merge pull request #7541 from nextcloud/enh/noid/use-strict-types-in-php
add `declare(strict_types=1);` to all php files
2026-02-13 10:54:23 +01:00
Simon L.
6e0569678d Merge pull request #7556 from nextcloud/enh/noid/del-openssl
redis and apache: delete openssl after using it
2026-02-13 10:54:08 +01:00
Simon L.
590694c638 Merge pull request #7564 from nextcloud/enh/noid/change-order-of-items
office-selector: change order of points for OO
2026-02-13 10:53:48 +01:00
Simon L.
fe4f568d02 Merge pull request #7578 from nextcloud/enh/noid/fix-bug-with-fts
fix bug with FTS not being able to enable it anymore
2026-02-13 10:53:34 +01:00
Simon L.
4cf066cfce Merge pull request #7584 from nextcloud/enh/noid/offer-checkbox-new-hub-release
aio-interface: offer checkbox to install the new hub release
2026-02-13 10:53:26 +01:00
Simon L.
225918320a Merge pull request #7587 from nextcloud/enh/7572/show-version-state
aio-interface: show which containers have an update available
2026-02-13 10:52:57 +01:00
Simon L.
7e5d8a20d2 aio-interface: show which containers have an update available
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-13 10:09:13 +01:00
Simon L.
974f443455 Merge pull request #7585 from nextcloud/revert-7485-enh/noid/more-strict-check
Revert "mastercontainer: make check for correct volume name more strict"
2026-02-13 09:59:52 +01:00
Simon L.
e3e1ddf983 Revert "mastercontainer: make check for correct volume name more strict"
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-13 09:51:54 +01:00
Simon L.
94bb848352 Merge pull request #7579 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2026-02-13 09:34:38 +01:00
Simon L.
70aa75ef06 Merge pull request #7583 from nextcloud/dependabot/docker/Containers/postgresql/postgres-17.8-alpine
build(deps): bump postgres from 17.7-alpine to 17.8-alpine in /Containers/postgresql
2026-02-13 09:34:14 +01:00
Simon L.
e70af15e81 Merge pull request #7582 from nextcloud/dependabot/docker/Containers/docker-socket-proxy/haproxy-3.3.3-alpine
build(deps): bump haproxy from 3.3.2-alpine to 3.3.3-alpine in /Containers/docker-socket-proxy
2026-02-13 09:34:01 +01:00
Simon L.
9652e39be2 aio-interface: offer checkbox to install the new hub release
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-13 09:33:03 +01:00
dependabot[bot]
053cf7cbbe build(deps): bump postgres in /Containers/postgresql
Bumps postgres from 17.7-alpine to 17.8-alpine.

---
updated-dependencies:
- dependency-name: postgres
  dependency-version: 17.8-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-13 04:08:48 +00:00
dependabot[bot]
d25b2e85ef build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.3.2-alpine to 3.3.3-alpine.

---
updated-dependencies:
- dependency-name: haproxy
  dependency-version: 3.3.3-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-13 04:07:57 +00:00
szaimen
bfcddbab73 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-12 12:24:27 +00:00
Simon L.
da0775863d fix bug with FTS not being able to enable it anymore
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-12 10:22:02 +01:00
Simon L.
dd989ee87f Merge pull request #7576 from nextcloud/automated/noid/psalm-baseline-update
[Automated] Update psalm-baseline.xml
2026-02-12 10:02:12 +01:00
nextcloud-command
ffd71ba47e Update psalm baseline
Signed-off-by: GitHub <noreply@github.com>
2026-02-12 04:47:28 +00:00
Simon L.
ebe971d18d Merge pull request #7570 from nextcloud/dependabot/docker/Containers/watchtower/golang-1.26.0-alpine3.23
build(deps): bump golang from 1.25.6-alpine3.23 to 1.26.0-alpine3.23 in /Containers/watchtower
2026-02-11 16:03:21 +01:00
Simon L.
8d717221b3 Merge pull request #7566 from nextcloud/dependabot/docker/Containers/whiteboard/nextcloud-releases/whiteboard-v1.5.6
build(deps): bump nextcloud-releases/whiteboard from v1.5.4 to v1.5.6 in /Containers/whiteboard
2026-02-11 16:03:08 +01:00
Simon L.
3111f2b748 Merge pull request #7568 from nextcloud/dependabot/docker/Containers/imaginary/golang-1.26.0-alpine3.23
build(deps): bump golang from 1.25.6-alpine3.23 to 1.26.0-alpine3.23 in /Containers/imaginary
2026-02-11 16:02:35 +01:00
Simon L.
66dc3051e6 Merge pull request #7560 from nextcloud/dependabot/docker/Containers/talk-recording/python-3.14.3-alpine3.23
build(deps): bump python from 3.14.2-alpine3.23 to 3.14.3-alpine3.23 in /Containers/talk-recording
2026-02-11 16:02:21 +01:00
Simon L.
c66fa6e2a9 Merge pull request #7558 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-25.04.8.3.1
build(deps): bump collabora/code from 25.04.8.2.1 to 25.04.8.3.1 in /Containers/collabora
2026-02-11 16:02:07 +01:00
Simon L.
7b0b0139dd Merge pull request #7546 from nextcloud/watchtower-container-update
watchtower container update
2026-02-11 16:01:49 +01:00
Simon L.
73268f1bd2 Merge pull request #7545 from nextcloud/dependabot/docker/Containers/talk/strukturag/nextcloud-spreed-signaling-2.1.0
build(deps): bump strukturag/nextcloud-spreed-signaling from 2.0.4 to 2.1.0 in /Containers/talk
2026-02-11 16:01:27 +01:00
Simon L.
970c1212c0 Merge pull request #7544 from nextcloud/dependabot/docker/Containers/mastercontainer/docker-29.2.1-cli
build(deps): bump docker from 29.2.0-cli to 29.2.1-cli in /Containers/mastercontainer
2026-02-11 16:01:13 +01:00
Simon L.
2e04fdaa8c Merge pull request #7543 from nextcloud/dependabot/docker/Containers/fulltextsearch/elasticsearch-8.19.11
build(deps): bump elasticsearch from 8.19.10 to 8.19.11 in /Containers/fulltextsearch
2026-02-11 16:01:00 +01:00
Simon L.
bf7f818410 Merge pull request #7540 from nextcloud/talk-container-update
talk container update
2026-02-11 16:00:46 +01:00
Simon L.
8b2e9b4a5a Merge pull request #7527 from nextcloud/aio-dependency-update
PHP dependency updates
2026-02-11 16:00:21 +01:00
Simon L.
e9ab05c5b7 Merge pull request #7571 from nextcloud/aio-helm-update
Helm Chart updates
2026-02-11 15:28:17 +01:00
szaimen
67814f32d8 Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-11 14:26:18 +00:00
Simon L.
270ad0ecea fix the update-helm workflow
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-11 15:25:31 +01:00
dependabot[bot]
0e4ffe65f0 build(deps): bump golang in /Containers/watchtower
Bumps golang from 1.25.6-alpine3.23 to 1.26.0-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 04:08:53 +00:00
dependabot[bot]
0348be71d4 build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.25.6-alpine3.23 to 1.26.0-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 04:07:53 +00:00
dependabot[bot]
5cc47f8c88 build(deps): bump nextcloud-releases/whiteboard
Bumps nextcloud-releases/whiteboard from v1.5.4 to v1.5.6.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 04:08:52 +00:00
Simon L.
fd01a9a70b office-selector: change order of points for OO
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-09 10:48:11 +01:00
dependabot[bot]
39b6c92d86 build(deps): bump python in /Containers/talk-recording
Bumps python from 3.14.2-alpine3.23 to 3.14.3-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 04:13:39 +00:00
dependabot[bot]
f0f6e24825 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.8.2.1 to 25.04.8.3.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-09 04:12:32 +00:00
szaimen
426eca6aab php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-08 12:03:46 +00:00
szaimen
1ddda8eb6e watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-07 12:12:30 +00:00
szaimen
09a7141955 talk-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-07 12:05:25 +00:00
Simon L.
14d6579893 redis and apache: delete openssl after using it
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-06 17:23:02 +01:00
Simon L.
a803d1c098 Merge pull request #7554 from nextcloud/dependabot/github_actions/dot-github/workflows/astral-sh/setup-uv-7.2.1
build(deps): bump astral-sh/setup-uv from 7.2.0 to 7.2.1 in /.github/workflows
2026-02-06 13:24:29 +01:00
dependabot[bot]
2df9b8af50 build(deps): bump astral-sh/setup-uv in /.github/workflows
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.0 to 7.2.1.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](61cb8a9741...803947b9bd)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-06 12:07:10 +00:00
Simon L.
a16c7e28c2 Clean up pull request template
Removed unnecessary lines from the pull request template.

Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-04 23:11:04 +01:00
dependabot[bot]
afb355d9e1 build(deps): bump strukturag/nextcloud-spreed-signaling
Bumps strukturag/nextcloud-spreed-signaling from 2.0.4 to 2.1.0.

---
updated-dependencies:
- dependency-name: strukturag/nextcloud-spreed-signaling
  dependency-version: 2.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-04 04:08:40 +00:00
dependabot[bot]
70711b8b05 build(deps): bump docker in /Containers/mastercontainer
Bumps docker from 29.2.0-cli to 29.2.1-cli.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-04 04:07:52 +00:00
dependabot[bot]
c2a88d5698 build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 8.19.10 to 8.19.11.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-04 04:07:43 +00:00
Simon L.
270302d74f domain-validator: adjust querying the domain parameter
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-03 16:51:54 +01:00
Simon L.
eba86c3ad1 add declare(strict_types=1); to all php files
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-02-03 13:25:53 +01:00
Simon L.
63bb5845de notify-push: refactor to use Nextcloud's config.php directly
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-01-26 11:04:09 +01:00
Simon L.
1ed7196de6 redis.config.php: allow to configure redis.cluster
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-01-21 12:07:21 +01:00
102 changed files with 979 additions and 321 deletions

View File

@@ -3,6 +3,3 @@
-
- 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.
-->
* Resolves: # <!-- related github issue -->
* [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits

View File

@@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
php-version: 8.5
extensions: apcu
- name: Run dependency update script
run: |

View File

@@ -30,7 +30,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: [ "8.4" ]
php-versions: [ "8.5" ]
name: php-lint

View File

@@ -36,7 +36,7 @@ jobs:
line-length: warning
- name: Install the latest version of uv
uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0
uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
- name: Check GitHub actions
run: uvx zizmor --min-severity medium .github/workflows/*.yml

View File

@@ -20,7 +20,7 @@ jobs:
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
php-version: 8.5
extensions: apcu
coverage: none

View File

@@ -36,11 +36,11 @@ jobs:
- name: Install Playwright Browsers
run: cd php/tests && npx playwright install --with-deps chromium
- name: Set up php 8.4
- name: Set up php 8.5
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2.36.0
with:
extensions: apcu
php-version: 8.4
php-version: 8.5
coverage: none
ini-file: development
env:
@@ -114,7 +114,7 @@ jobs:
exit 1
fi
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: ${{ !cancelled() }}
with:
name: playwright-report

View File

@@ -82,7 +82,7 @@ jobs:
exit 1
fi
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: ${{ !cancelled() }}
with:
name: playwright-report

View File

@@ -15,7 +15,7 @@ jobs:
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
php-version: 8.5
extensions: apcu
coverage: none

View File

@@ -39,7 +39,7 @@ jobs:
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2.36.0
with:
php-version: 8.4
php-version: 8.5
extensions: apcu
coverage: none
ini-file: development

View File

@@ -29,7 +29,7 @@ jobs:
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
php-version: 8.5
extensions: apcu
coverage: none

View File

@@ -58,6 +58,11 @@ http://{$APACHE_HOST}:23973, # For Collabora callback and WOPI requests, see con
reverse_proxy {$WHITEBOARD_HOST}:3002
}
# HaRP (ExApps)
route /exapps/* {
reverse_proxy {$HARP_HOST}:8780
}
# Nextcloud
route {
header Strict-Transport-Security max-age=31536000;

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM caddy:2.10.2-alpine AS caddy
FROM caddy:2.11.1-alpine AS caddy
# From https://github.com/docker-library/httpd/blob/master/2.4/alpine/Dockerfile
FROM httpd:2.4.66-alpine3.23
@@ -79,7 +79,8 @@ RUN set -ex; \
chmod 777 -R /usr/local/apache2/logs; \
rm -rf /usr/local/apache2/cgi-bin/; \
\
echo "root:$(openssl rand -base64 12)" | chpasswd
echo "root:$(openssl rand -base64 12)" | chpasswd; \
apk --no-cache del openssl
USER 33

View File

@@ -77,6 +77,10 @@ if [ "$BORG_MODE" = backup ]; then
if ! [ -f "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json" ]; then
echo "configuration.json not present. Cannot perform the backup!"
exit 1
elif ! grep -q '"domain"' "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json" \
|| ! grep -q '"wasStartButtonClicked"' "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json"; then
echo "It seems like the configuration.json setup was not done correctly. Something is wrong! (Most likely the provided configuration.json is invalid)"
exit 1
elif ! [ -f "/nextcloud_aio_volumes/nextcloud_aio_nextcloud/config/config.php" ]; then
echo "config.php is missing. Cannot perform backup!"
exit 1
@@ -514,6 +518,10 @@ if [ "$BORG_MODE" = restore ]; then
if [ "$RESTORE_FAILED" = 1 ]; then
exit 1
elif ! grep -q '"domain"' "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json" \
|| ! grep -q '"wasStartButtonClicked"' "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json"; then
echo "It seems like the restore of the configuration.json was not done correctly. Something is wrong! (Most likely is the restore archive already incorrect)!"
exit 1
fi
# Inform user

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.8.2.1
FROM collabora/code:25.04.8.3.1
USER root
ARG DEBIAN_FRONTEND=noninteractive

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM haproxy:3.3.2-alpine
FROM haproxy:3.3.4-alpine
# hadolint ignore=DL3002
USER root

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Probably from here https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/Dockerfile
FROM elasticsearch:8.19.10
FROM elasticsearch:8.19.11
USER root

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM golang:1.25.6-alpine3.23 AS go
FROM golang:1.26.0-alpine3.23 AS go
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee

View File

@@ -1,12 +1,12 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
FROM docker:29.2.0-cli AS docker
FROM docker:29.2.1-cli AS docker
# Caddy is a requirement
FROM caddy:2.10.2-alpine AS caddy
FROM caddy:2.11.1-alpine AS caddy
# From https://github.com/docker-library/php/blob/master/8.4/alpine3.23/fpm/Dockerfile
FROM php:8.4.17-fpm-alpine3.23
# From https://github.com/docker-library/php/blob/master/8.5/alpine3.23/fpm/Dockerfile
FROM php:8.5.3-fpm-alpine3.23
EXPOSE 80
EXPOSE 8080

View File

@@ -21,6 +21,11 @@ Listen 8080 https
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
# Disable output buffering to enable streaming responses.
<Proxy "fcgi://127.0.0.1:9000/" flushpackets=on>
</Proxy>
# Master dir
DocumentRoot /var/www/docker-aio/php/public/
<Directory /var/www/docker-aio/php/public/>

View File

@@ -162,11 +162,14 @@ if ! sudo -E -u www-data docker ps --format "{{.Names}}" | grep -q "^nextcloud-a
Using a different name is not supported since mastercontainer updates will not work in that case!
If you are on docker swarm and try to run AIO, see https://github.com/nextcloud/all-in-one#can-i-run-this-with-docker-swarm"
exit 1
elif sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer --format "{{.Config.Image}}" | grep -q '@'; then
print_red "It seems like you used a hash for the mastercontainer image tag. This is not supported!"
exit 1
elif ! sudo -E -u www-data docker volume ls --format "{{.Name}}" | grep -q "^nextcloud_aio_mastercontainer$"; then
print_red "It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.)
Using a different name is not supported since the built-in backup solution will not work in that case!"
exit 1
elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer --format '{{.Mounts}}' | grep -q " nextcloud_aio_mastercontainer "; then
elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer | grep -q "nextcloud_aio_mastercontainer"; then
print_red "It seems like you did not attach the 'nextcloud_aio_mastercontainer' volume to the mastercontainer?
This is not supported since the built-in backup solution will not work in that case!"
exit 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=32.0.5
ENV NEXTCLOUD_VERSION=32.0.6
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!

View File

@@ -1,14 +1,18 @@
<?php
if (getenv('REDIS_HOST')) {
if (getenv('REDIS_MODE') !== 'rediscluster') {
$CONFIG = array(
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => getenv('REDIS_HOST'),
'password' => (string) getenv('REDIS_HOST_PASSWORD'),
),
);
if (getenv('REDIS_HOST')) {
$CONFIG['redis']['host'] = (string) getenv('REDIS_HOST');
}
if (getenv('REDIS_HOST_PASSWORD')) {
$CONFIG['redis']['password'] = (string) getenv('REDIS_HOST_PASSWORD');
}
if (getenv('REDIS_PORT')) {
$CONFIG['redis']['port'] = (int) getenv('REDIS_PORT');
}
@@ -17,7 +21,36 @@ if (getenv('REDIS_HOST')) {
$CONFIG['redis']['dbindex'] = (int) getenv('REDIS_DB_INDEX');
}
if (getenv('REDIS_USER_AUTH') !== false) {
if (getenv('REDIS_USER_AUTH')) {
$CONFIG['redis']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
}
} else {
$CONFIG = array(
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis.cluster' => array(
'timeout' => 0.0,
'read_timeout' => 0.0,
'failover_mode' => \RedisCluster::FAILOVER_ERROR,
'seeds' => array_values(array_filter(array(
(getenv('REDIS_HOST') && getenv('REDIS_PORT')) ? (getenv('REDIS_HOST') . ':' . (string)getenv('REDIS_PORT')) : null,
(getenv('REDIS_HOST_2') && getenv('REDIS_PORT_2')) ? (getenv('REDIS_HOST_2') . ':' . (string)getenv('REDIS_PORT_2')) : null,
(getenv('REDIS_HOST_3') && getenv('REDIS_PORT_3')) ? (getenv('REDIS_HOST_3') . ':' . (string)getenv('REDIS_PORT_3')) : null,
(getenv('REDIS_HOST_4') && getenv('REDIS_PORT_4')) ? (getenv('REDIS_HOST_4') . ':' . (string)getenv('REDIS_PORT_4')) : null,
(getenv('REDIS_HOST_5') && getenv('REDIS_PORT_5')) ? (getenv('REDIS_HOST_5') . ':' . (string)getenv('REDIS_PORT_5')) : null,
(getenv('REDIS_HOST_6') && getenv('REDIS_PORT_6')) ? (getenv('REDIS_HOST_6') . ':' . (string)getenv('REDIS_PORT_6')) : null,
(getenv('REDIS_HOST_7') && getenv('REDIS_PORT_7')) ? (getenv('REDIS_HOST_7') . ':' . (string)getenv('REDIS_PORT_7')) : null,
(getenv('REDIS_HOST_8') && getenv('REDIS_PORT_8')) ? (getenv('REDIS_HOST_8') . ':' . (string)getenv('REDIS_PORT_8')) : null,
(getenv('REDIS_HOST_9') && getenv('REDIS_PORT_9')) ? (getenv('REDIS_HOST_9') . ':' . (string)getenv('REDIS_PORT_9')) : null,
))),
),
);
if (getenv('REDIS_HOST_PASSWORD')) {
$CONFIG['redis.cluster']['password'] = (string) getenv('REDIS_HOST_PASSWORD');
}
if (getenv('REDIS_USER_AUTH')) {
$CONFIG['redis.cluster']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
}
}

View File

@@ -34,4 +34,14 @@ if (getenv('OBJECTSTORE_S3_BUCKET')) {
if ($sse_c_key) {
$CONFIG['objectstore']['arguments']['sse_c_key'] = $sse_c_key;
}
$requestChecksumValidation = getenv('OBJECTSTORE_S3_REQUEST_CHECKSUM_VALIDATION');
if ($requestChecksumValidation) {
$CONFIG['objectstore']['arguments']['request_checksum_calculation'] = $requestChecksumValidation;
}
$responseChecksumValidation = getenv('OBJECTSTORE_S3_RESPONSE_CHECKSUM_VALIDATION');
if ($responseChecksumValidation) {
$CONFIG['objectstore']['arguments']['response_checksum_validation'] = $responseChecksumValidation;
}
}

View File

@@ -669,8 +669,12 @@ php /var/www/html/occ config:system:set documentation_url.server_logs --value="h
php /var/www/html/occ config:system:set htaccess.RewriteBase --value="/"
php /var/www/html/occ maintenance:update:htaccess
# Revert dbpersistent setting to check if it fixes too many db connections
php /var/www/html/occ config:system:set dbpersistent --value=false --type=bool
# Handle db persistent settings
if [ "$NEXTCLOUD_PERSIST_DATABASE_CONNECTIONS" = "yes" ]; then
php /var/www/html/occ config:system:set dbpersistent --value=true --type=bool
else
php /var/www/html/occ config:system:set dbpersistent --value=false --type=bool
fi
if [ "$DISABLE_BRUTEFORCE_PROTECTION" = yes ]; then
php /var/www/html/occ config:system:set auth.bruteforce.protection.enabled --type=bool --value=false
@@ -1025,13 +1029,13 @@ else
fi
fi
# Docker socket proxy
# Docker socket proxy / HaRP
# app_api is a shipped app
if [ -d "/var/www/html/custom_apps/app_api" ]; then
php /var/www/html/occ app:disable app_api
rm -r "/var/www/html/custom_apps/app_api"
fi
if [ "$DOCKER_SOCKET_PROXY_ENABLED" = 'yes' ]; then
if [ "$DOCKER_SOCKET_PROXY_ENABLED" = 'yes' ] || [ "$HARP_ENABLED" = 'yes' ]; then
if [ "$(php /var/www/html/occ config:app:get app_api enabled)" != "yes" ]; then
php /var/www/html/occ app:enable app_api
fi

View File

@@ -11,7 +11,6 @@ RUN set -ex; \
netcat-openbsd \
tzdata \
bash \
jq \
openssl; \
# Give root a random password
echo "root:$(openssl rand -base64 12)" | chpasswd; \

View File

@@ -3,12 +3,6 @@
if [ -z "$NEXTCLOUD_HOST" ]; then
echo "NEXTCLOUD_HOST needs to be provided. Exiting!"
exit 1
elif [ -z "$POSTGRES_HOST" ]; then
echo "POSTGRES_HOST needs to be provided. Exiting!"
exit 1
elif [ -z "$REDIS_HOST" ]; then
echo "REDIS_HOST needs to be provided. Exiting!"
exit 1
fi
# Only start container if nextcloud is accessible
@@ -28,7 +22,7 @@ elif [ "$CPU_ARCH" != "x86_64" ]; then
fi
# Add warning
if ! [ -f /nextcloud/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push ]; then
if ! [ -f /var/www/html/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push ]; then
echo "The notify_push binary was not found."
echo "Most likely is DNS resolution not working correctly."
echo "You can try to fix this by configuring a DNS server globally in dockers daemon.json."
@@ -44,52 +38,9 @@ fi
echo "notify-push was started"
# Set a default value for POSTGRES_PORT
if [ -z "$POSTGRES_PORT" ]; then
POSTGRES_PORT=5432
fi
# Set a default for redis db index
if [ -z "$REDIS_DB_INDEX" ]; then
REDIS_DB_INDEX=0
fi
# Set a default value for REDIS_PORT
if [ -z "$REDIS_PORT" ]; then
REDIS_PORT=6379
fi
# Set a default for db type
if [ -z "$DATABASE_TYPE" ]; then
DATABASE_TYPE=postgres
elif [ "$DATABASE_TYPE" != postgres ] && [ "$DATABASE_TYPE" != mysql ]; then
echo "DB type must be either postgres or mysql"
exit 1
fi
# Use the correct Postgres username
if [ "$POSTGRES_USER" = nextcloud ]; then
POSTGRES_USER="oc_$POSTGRES_USER"
export POSTGRES_USER
fi
# URL-encode passwords
POSTGRES_PASSWORD="$(jq -rn --arg v "$POSTGRES_PASSWORD" '$v|@uri')"
REDIS_HOST_PASSWORD="$(jq -rn --arg v "$REDIS_HOST_PASSWORD" '$v|@uri')"
# Postgres root cert
if [ -f "/nextcloud/data/certificates/POSTGRES" ]; then
CERT_OPTIONS="?sslmode=verify-ca&sslrootcert=/nextcloud/data/certificates/ca-bundle.crt"
# Mysql root cert
elif [ -f "/nextcloud/data/certificates/MYSQL" ]; then
CERT_OPTIONS="?sslmode=verify-ca&ssl-ca=/nextcloud/data/certificates/ca-bundle.crt"
fi
# Set sensitive values as env
export DATABASE_URL="$DATABASE_TYPE://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB$CERT_OPTIONS"
export REDIS_URL="redis://$REDIS_USER:$REDIS_HOST_PASSWORD@$REDIS_HOST:$REDIS_PORT/$REDIS_DB_INDEX"
# Run it
/nextcloud/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push \
--database-prefix="oc_" \
--nextcloud-url "https://$NC_DOMAIN" \
--port 7867
/var/www/html/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push \
--port 7867 \
/var/www/html/config/config.php
exec "$@"

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From https://github.com/ONLYOFFICE/Docker-DocumentServer/blob/master/Dockerfile
FROM onlyoffice/documentserver:9.2.1.1
FROM onlyoffice/documentserver:9.3.0.1
# USER root is probably used

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From https://github.com/docker-library/postgres/blob/master/17/alpine3.23/Dockerfile
FROM postgres:17.7-alpine
FROM postgres:17.8-alpine
COPY --chmod=775 start.sh /start.sh
COPY --chmod=775 healthcheck.sh /healthcheck.sh

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From https://github.com/redis/docker-library-redis/blob/release/8.2/alpine/Dockerfile
FROM redis:8.2.3-alpine
FROM redis:8.6.1-alpine
COPY --chmod=775 start.sh /start.sh
@@ -10,6 +10,7 @@ RUN set -ex; \
\
# Give root a random password
echo "root:$(openssl rand -base64 12)" | chpasswd; \
apk --no-cache del openssl; \
\
# Get rid of unused binaries
rm -f /usr/local/bin/gosu;

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM python:3.14.2-alpine3.23
FROM python:3.14.3-alpine3.23
COPY --chmod=775 start.sh /start.sh
COPY --chmod=775 healthcheck.sh /healthcheck.sh

View File

@@ -1,10 +1,10 @@
# syntax=docker/dockerfile:latest
FROM nats:2.12.4-scratch AS nats
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.4 AS signaling
FROM strukturag/nextcloud-spreed-signaling:2.1.0 AS signaling
FROM alpine:3.23.3 AS janus
ARG JANUS_VERSION=v1.3.3
ARG JANUS_VERSION=v1.4.0
WORKDIR /src
RUN set -ex; \
apk upgrade --no-cache -a; \

View File

@@ -25,7 +25,9 @@ certificate = /etc/nginx/ssl/server.crt
key = /etc/nginx/ssl/server.key
[app]
# Set to "true" to install pprof debug handlers.
# Set to "true" to install pprof debug handlers. Access will only be possible
# from IPs allowed through the "allowed_ips" option below.
#
# See "https://golang.org/pkg/net/http/pprof/" for further information.
debug = false
@@ -270,8 +272,9 @@ connectionsperhost = 8
#SA = NA
[stats]
# Comma-separated list of IP addresses that are allowed to access the stats
# endpoint. Leave empty (or commented) to only allow access from "127.0.0.1".
# Comma-separated list of IP addresses that are allowed to access the debug,
# stats and metrics endpoints.
# Leave empty (or commented) to only allow access from localhost.
#allowed_ips =
[etcd]

View File

@@ -1,13 +1,13 @@
# syntax=docker/dockerfile:latest
FROM golang:1.25.6-alpine3.23 AS go
FROM golang:1.26.0-alpine3.23 AS go
ENV WATCHTOWER_COMMIT_HASH=f522ce27e1fbe4618da54833025a95be62aa838a
ENV WATCHTOWER_COMMIT_HASH=943098a670cb78a620af6499fb94b3ee2c940cf0
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.14.0
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.14.2
FROM alpine:3.23.3

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.4
FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.6
USER root
RUN set -ex; \

View File

@@ -1,5 +1,5 @@
## Caddy with geoblocking
This container bundles caddy and auto-configures it for you. It also covers [vaultwarden](https://github.com/nextcloud/all-in-one/tree/main/community-containers/vaultwarden) by listening on `bw.$NC_DOMAIN`, if installed. It also covers [stalwart](https://github.com/nextcloud/all-in-one/tree/main/community-containers/stalwart) by listening on `mail.$NC_DOMAIN`, if installed. It also covers [jellyfin](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyfin) by listening on `media.$NC_DOMAIN`, if installed. It also covers [lldap](https://github.com/nextcloud/all-in-one/tree/main/community-containers/lldap) by listening on `ldap.$NC_DOMAIN`, if installed. It also covers [nocodb](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb) by listening on `tables.$NC_DOMAIN`, if installed. It also covers [jellyseerr](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyseerr) by listening on `requests.$NC_DOMAIN`, if installed. It also covers [nextcloud-exporter](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter) by listening on `metrics.$NC_DOMAIN`, if installed. It also covers [LocalAI](https://github.com/nextcloud/all-in-one/tree/main/community-containers/local-ai) by listening on `ai.$NC_DOMAIN`, if installed.
This container bundles caddy and auto-configures it for you. It also covers [vaultwarden](https://github.com/nextcloud/all-in-one/tree/main/community-containers/vaultwarden) by listening on `bw.$NC_DOMAIN`, if installed. It also covers [stalwart](https://github.com/nextcloud/all-in-one/tree/main/community-containers/stalwart) by listening on `mail.$NC_DOMAIN`, if installed. It also covers [jellyfin](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyfin) by listening on `media.$NC_DOMAIN`, if installed. It also covers [lldap](https://github.com/nextcloud/all-in-one/tree/main/community-containers/lldap) by listening on `ldap.$NC_DOMAIN`, if installed. It also covers [nocodb](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb) by listening on `tables.$NC_DOMAIN`, if installed. It also covers [seerr](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyseerr) by listening on `requests.$NC_DOMAIN`, if installed. It also covers [nextcloud-exporter](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter) by listening on `metrics.$NC_DOMAIN`, if installed. It also covers [LocalAI](https://github.com/nextcloud/all-in-one/tree/main/community-containers/local-ai) by listening on `ai.$NC_DOMAIN`, if installed.
### Notes
- This container is incompatible with the [npmplus](https://github.com/nextcloud/all-in-one/tree/main/community-containers/npmplus) community container. So make sure that you do not enable both at the same time!
@@ -12,7 +12,7 @@ This container bundles caddy and auto-configures it for you. It also covers [vau
- If you want to use this with [jellyfin](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyfin), make sure that you point `media.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for jellyfin.
- If you want to use this with [lldap](https://github.com/nextcloud/all-in-one/tree/main/community-containers/lldap), make sure that you point `ldap.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for lldap.
- If you want to use this with [nocodb](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb), make sure that you point `tables.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for nocodb.
- If you want to use this with [jellyseerr](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyseerr), make sure that you point `requests.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for jellyseerr.
- If you want to use this with [seerr](https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyseerr), make sure that you point `requests.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for seerr.
- If you want to use this with [nextcloud-exporter](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter), make sure that you point `metrics.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for nextcloud-exporter.
- If you want to use this with [local AI](https://github.com/nextcloud/all-in-one/tree/main/community-containers/local-ai), make sure that you point `ai.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for local AI.
- After the container was started the first time, you should see a new `nextcloud-aio-caddy` folder and inside there an `allowed-countries.txt` file when you open the files app with the default `admin` user. In there you can adjust the allowed country codes for caddy by adding them to the first line, e.g. `IT FR` would allow access from italy and france. Private ip-ranges are always allowed. Additionally, in order to activate this config, you need to get an account at https://dev.maxmind.com/geoip/geolite2-free-geolocation-data and download the `GeoLite2-Country.mmdb` and upload it with this exact name into the `nextcloud-aio-caddy` folder. Afterwards restart all containers from the AIO interface and your new config should be active!

View File

@@ -2,13 +2,13 @@
"aio_services_v1": [
{
"container_name": "nextcloud-aio-jellyseerr",
"display_name": "Jellyseerr",
"display_name": "Seerr",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/jellyseerr",
"image": "fallenbagel/jellyseerr",
"image": "ghcr.io/seerr-team/seerr",
"image_tag": "latest",
"internal_port": "5055",
"restart": "unless-stopped",
"init": false,
"init": true,
"ports": [
{
"ip_binding": "%APACHE_IP_BINDING%",

View File

@@ -1,16 +1,17 @@
## Jellyseerr
This container bundles Jellyseerr and auto-configures it for you.
## Seerr
This container bundles Seerr and auto-configures it for you.
### Notes
- **Migration from Jellyseerr**: Jellyseer previously ran as the root user. With the migration to Seerr, the container now runs rootless with userid 1000, meaning that if you previously used Jellyseerr, Seerr will not be able to access the config files generated by the old Jellyseerr container. To migrate, execute the following steps: 1. stop all containers using the AIO-interface, 2. run `sudo docker run --rm -v nextcloud_aio_jellyseerr:/data alpine chown -R 1000:1000 /data`
- This container is only intended to be used inside home networks as it uses http for its management page by default.
- After adding and starting the container, you can directly visit `http://ip.address.of.server:5055` and access your new Jellyseerr instance, which can be used to manage Plex, Jellyfin, and Emby.
- In order to access your Jellyseerr outside the local network, you have to set up your own reverse proxy. You can set up a reverse proxy following [these instructions](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md) and [Jellyseerr's reverse proxy documentation.](https://docs.jellyseerr.dev/extending-jellyseerr/reverse-proxy), OR use the Caddy community container that will automatically configure requests.$NC_DOMAIN to redirect to your Jellyseerr. Note that it is recommended to [enable CSRF protection in Jellyseerr](https://docs.jellyseerr.dev/using-jellyseerr/settings/general#enable-csrf-protection) for added security if you plan to use Jellyseerr outside the local network, but make sure to read up on it and understand the caveats first.
- If you want to secure the installation with fail2ban, you might want to check out https://github.com/nextcloud/all-in-one/tree/main/community-containers/fail2ban. Note that [enabling the proxy support option in Jellyseerr](https://docs.jellyseerr.dev/using-jellyseerr/settings/general#enable-proxy-support) is required for this to work properly.
- The config of Jellyseerr will be automatically included in AIO's backup solution!
- After adding and starting the container, you can directly visit `http://ip.address.of.server:5055` and access your new Seerr instance, which can be used to manage Plex, Jellyfin, and Emby.
- In order to access your Seerr outside the local network, you have to set up your own reverse proxy. You can set up a reverse proxy following [these instructions](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md) and [Seerr's reverse proxy documentation.](https://docs.seerr.dev/extending-Seerr/reverse-proxy), OR use the Caddy community container that will automatically configure requests.$NC_DOMAIN to redirect to your Seerr. Note that it is recommended to [enable CSRF protection in Seerr](https://docs.seerr.dev/using-Seerr/settings/general#enable-csrf-protection) for added security if you plan to use Seerr outside the local network, but make sure to read up on it and understand the caveats first.
- If you want to secure the installation with fail2ban, you might want to check out https://github.com/nextcloud/all-in-one/tree/main/community-containers/fail2ban. Note that [enabling the proxy support option in Seerr](https://docs.seerr.dev/using-Seerr/settings/general#enable-proxy-support) is required for this to work properly.
- The config of Seerr will be automatically included in AIO's backup solution!
- See [here](https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers) how to add it to the AIO stack.
### Repository
https://github.com/Fallenbagel/jellyseerr
https://github.com/seerr-team/seerr
### Maintainer
https://github.com/Anvil5465

View File

@@ -33,6 +33,7 @@ There is a testing-VM available for the maintainer of AIO that allows for some f
Additionally, there are now E2E tests available that can be run via https://github.com/nextcloud/all-in-one/actions/workflows/playwright.yml
## How to promote builds from develop to beta
1. Verify that GitHub Services are running correctly: https://www.githubstatus.com/
1. Verify that no job is running here: https://github.com/nextcloud-releases/all-in-one/actions/workflows/build_images.yml
2. Go to https://github.com/nextcloud-releases/all-in-one/actions/workflows/promote-to-beta.yml, click on `Run workflow`.

View File

@@ -45,6 +45,7 @@ services:
- APACHE_MAX_TIME=${NEXTCLOUD_MAX_TIME}
- NOTIFY_PUSH_HOST=nextcloud-aio-notify-push
- WHITEBOARD_HOST=nextcloud-aio-whiteboard
- HARP_HOST=nextcloud-aio-harp
volumes:
- nextcloud_aio_nextcloud:/var/www/html:ro
- nextcloud_aio_apache:/mnt/data:rw
@@ -202,19 +203,10 @@ services:
expose:
- "7867"
volumes:
- nextcloud_aio_nextcloud:/nextcloud:ro
- nextcloud_aio_nextcloud:/var/www/html:ro
environment:
- NC_DOMAIN
- NEXTCLOUD_HOST=nextcloud-aio-nextcloud
- TZ=${TIMEZONE}
- REDIS_HOST=nextcloud-aio-redis
- REDIS_PORT=6379
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
- POSTGRES_HOST=nextcloud-aio-database
- POSTGRES_PORT=5432
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=nextcloud_database
- POSTGRES_USER=nextcloud
restart: unless-stopped
read_only: true
cap_drop:

View File

@@ -12,7 +12,7 @@ You can run the containers that are build for AIO with docker-compose. This come
- You lose the AIO interface
- You lose update notifications and automatic updates
- You lose all AIO backup and restore features
- You lose the built-in [Docker Socket Proxy container](https://github.com/nextcloud/docker-socket-proxy#readme) (needed for [Nextcloud App API](https://github.com/nextcloud/app_api#nextcloud-appapi))
- You lose the built-in [Docker Socket Proxy container](https://github.com/nextcloud/docker-socket-proxy#readme) and [HaRP container](https://github.com/nextcloud/HaRP) (needed for [Nextcloud App API](https://github.com/nextcloud/app_api#nextcloud-appapi))
- You lose all community containers: https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers
- **You need to know what you are doing, especially when modifying the compose.yaml file**
- For updating, you need to strictly follow the at the bottom described update routine

View File

@@ -27,6 +27,8 @@ OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "next
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-borgbackup"))')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-docker-socket-proxy"))')"
OUTPUT="$(echo "$OUTPUT" | jq '.services[] |= if has("depends_on") then .depends_on |= if contains(["nextcloud-aio-docker-socket-proxy"]) then del(.[index("nextcloud-aio-docker-socket-proxy")]) else . end else . end')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-harp"))')"
OUTPUT="$(echo "$OUTPUT" | jq '.services[] |= if has("depends_on") then .depends_on |= if contains(["nextcloud-aio-harp"]) then del(.[index("nextcloud-aio-harp")]) else . end else . end')"
OUTPUT="$(echo "$OUTPUT" | jq '.services[] |= if has("depends_on") then .depends_on |= map({ (.): { "condition": "service_started", "required": false } }) else . end' | jq '.services[] |= if has("depends_on") then .depends_on |= reduce .[] as $item ({}; . + $item) else . end')"
sudo snap install yq
@@ -45,6 +47,8 @@ sed -i 's|- ip_binding: |- |' containers.yml
sed -i '/AIO_TOKEN/d' containers.yml
sed -i '/AIO_URL/d' containers.yml
sed -i '/DOCKER_SOCKET_PROXY_ENABLED/d' containers.yml
sed -i '/HARP_ENABLED/d' containers.yml
sed -i '/HP_SHARED_KEY/d' containers.yml
sed -i '/ADDITIONAL_TRUSTED_PROXY/d' containers.yml
sed -i '/TURN_DOMAIN/d' containers.yml
sed -i '/NC_AIO_VERSION/d' containers.yml

View File

@@ -1,6 +1,6 @@
name: nextcloud-aio-helm-chart
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
version: 12.5.0
version: 12.8.0
apiVersion: v2
keywords:
- latest

View File

@@ -47,6 +47,8 @@ spec:
value: "{{ .Values.APACHE_PORT }}"
- name: COLLABORA_HOST
value: nextcloud-aio-collabora
- name: HARP_HOST
value: nextcloud-aio-harp
- name: NC_DOMAIN
value: "{{ .Values.NC_DOMAIN }}"
- name: NEXTCLOUD_HOST
@@ -61,7 +63,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: ghcr.io/nextcloud-releases/aio-apache:20260122_105751
image: ghcr.io/nextcloud-releases/aio-apache:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -36,7 +36,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
command:
- mkdir
- "-p"
@@ -59,7 +59,7 @@ spec:
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-clamav:20260122_105751
image: ghcr.io/nextcloud-releases/aio-clamav:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -36,9 +36,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:20260122_105751
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260306_081319
{{- else }}
image: ghcr.io/nextcloud-releases/aio-collabora:20260122_105751
image: ghcr.io/nextcloud-releases/aio-collabora:20260306_081319
{{- end }}
readinessProbe:
exec:

View File

@@ -35,7 +35,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
command:
- mkdir
- "-p"
@@ -64,7 +64,7 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-postgresql:20260122_105751
image: ghcr.io/nextcloud-releases/aio-postgresql:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
command:
- chmod
- "777"
@@ -54,7 +54,7 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260122_105751
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -38,7 +38,7 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-imaginary:20260122_105751
image: ghcr.io/nextcloud-releases/aio-imaginary:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -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:20260122_105751
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
command:
- chmod
- "777"
@@ -190,7 +190,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260122_105751
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260306_081319
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
securityContext:
# The items below only work in container context

View File

@@ -35,29 +35,11 @@ spec:
{{- end }}
containers:
- env:
- name: NC_DOMAIN
value: "{{ .Values.NC_DOMAIN }}"
- name: NEXTCLOUD_HOST
value: nextcloud-aio-nextcloud
- name: POSTGRES_DB
value: nextcloud_database
- name: POSTGRES_HOST
value: nextcloud-aio-database
- name: POSTGRES_PASSWORD
value: "{{ .Values.DATABASE_PASSWORD }}"
- name: POSTGRES_PORT
value: "5432"
- name: POSTGRES_USER
value: nextcloud
- name: REDIS_HOST
value: nextcloud-aio-redis
- name: REDIS_HOST_PASSWORD
value: "{{ .Values.REDIS_PASSWORD }}"
- name: REDIS_PORT
value: "6379"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-notify-push:20260122_105751
image: ghcr.io/nextcloud-releases/aio-notify-push:20260306_081319
readinessProbe:
exec:
command:
@@ -86,7 +68,7 @@ spec:
drop: ["NET_RAW"]
{{- end }}
volumeMounts:
- mountPath: /nextcloud
- mountPath: /var/www/html
name: nextcloud-aio-nextcloud
readOnly: true
volumes:

View File

@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
command:
- chmod
- "777"
@@ -42,7 +42,7 @@ spec:
value: "{{ .Values.ONLYOFFICE_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260122_105751
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -39,7 +39,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-redis:20260122_105751
image: ghcr.io/nextcloud-releases/aio-redis:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -52,7 +52,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk:20260122_105751
image: ghcr.io/nextcloud-releases/aio-talk:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -44,7 +44,7 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260122_105751
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -50,7 +50,7 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260122_105751
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260306_081319
readinessProbe:
exec:
command:

View File

@@ -407,7 +407,7 @@ rm latest.yml
mv latest.yml.backup latest.yml
# Get version of AIO
AIO_VERSION="$(grep 'Nextcloud AIO ' ../php/templates/includes/aio-version.twig | grep -oP '[0-9]+.[0-9]+.[0-9]+')"
AIO_VERSION="$(grep -oP '[0-9]+.[0-9]+.[0-9]+' ../php/templates/includes/aio-version.twig)"
sed -i "s|^version:.*|version: $AIO_VERSION|" ../helm-chart/Chart.yaml
# Conversion of sample.conf
@@ -418,8 +418,9 @@ sed -i 's|= |: |' /tmp/sample.conf
sed -i '/^NEXTCLOUD_DATADIR/d' /tmp/sample.conf
sed -i '/^APACHE_IP_BINDING/d' /tmp/sample.conf
sed -i '/^NEXTCLOUD_MOUNT/d' /tmp/sample.conf
sed -i '/_ENABLED.*/s/ yes / "yes" /' /tmp/sample.conf
sed -i '/_ENABLED.*/s/ no / "no" /' /tmp/sample.conf
sed -i 's/ yes / "yes" /' /tmp/sample.conf
sed -i 's/ no / "no" /' /tmp/sample.conf
sed -i 's/"no" authentication/no authentication/' /tmp/sample.conf
sed -i 's|^NEXTCLOUD_TRUSTED_CACERTS_DIR: .*|NEXTCLOUD_TRUSTED_CACERTS_DIR: # Setting this to any value allows to automatically import root certificates into the Nextcloud container|' /tmp/sample.conf
sed -i 's|17179869184|"17179869184"|' /tmp/sample.conf
# shellcheck disable=SC2129

View File

@@ -26,7 +26,7 @@ APACHE_PORT: 443 # Changing this to a different value than 443 will all
ADDITIONAL_COLLABORA_OPTIONS: ['--o:security.seccomp=true'] # You can add additional collabora options here by using the array syntax.
COLLABORA_DICTIONARIES: de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru # You can change this in order to enable other dictionaries for collabora
FULLTEXTSEARCH_JAVA_OPTIONS: -Xms512M -Xmx512M # Allows to adjust the fulltextsearch java options.
INSTALL_LATEST_MAJOR: no # Setting this to yes will install the latest Major Nextcloud version upon the first installation
INSTALL_LATEST_MAJOR: "no" # Setting this to "yes" will install the latest Major Nextcloud version upon the first installation
NEXTCLOUD_ADDITIONAL_APKS: imagemagick # This allows to add additional packages to the Nextcloud container permanently. Default is imagemagick but can be overwritten by modifying this value.
NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS: imagick # This allows to add additional php extensions to the Nextcloud container permanently. Default is imagick but can be overwritten by modifying this value.
NEXTCLOUD_MAX_TIME: 3600 # This allows to change the upload time limit of the Nextcloud container
@@ -34,9 +34,9 @@ NEXTCLOUD_MEMORY_LIMIT: 512M # This allows to change the PHP memory lim
NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # Allows to modify the Nextcloud apps that are installed on starting AIO the first time
NEXTCLOUD_TRUSTED_CACERTS_DIR: # Setting this to any value allows to automatically import root certificates into the Nextcloud container
NEXTCLOUD_UPLOAD_LIMIT: 16G # This allows to change the upload limit of the Nextcloud container
REMOVE_DISABLED_APPS: yes # Setting this to no keep Nextcloud apps that are disabled via their switch and not uninstall them if they should be installed in Nextcloud.
REMOVE_DISABLED_APPS: "yes" # Setting this to "no" keep Nextcloud apps that are disabled via their switch and not uninstall them if they should be installed in Nextcloud.
TALK_PORT: 3478 # This allows to adjust the port that the talk container is using. It should be set to something higher than 1024! Otherwise it might not work!
UPDATE_NEXTCLOUD_APPS: no # When setting to yes (with quotes), it will automatically update all installed Nextcloud apps upon container startup on saturdays.
UPDATE_NEXTCLOUD_APPS: "no" # When setting to "yes" (with quotes), it will automatically update all installed Nextcloud apps upon container startup on saturdays.
STORAGE_CLASS: # By setting this, you can adjust the storage class for your volumes. This should be a fast storage like SSD backed storage! This storage class must provide RWX and RWO volumes (ReadWriteMany and ReadWriteOnce).
STORAGE_CLASS_DATA: # Allows to set a dedicated storage class for the Nextcloud data volume. This can be a bit slower storage than the one above. This storage class must provide RWX volumes (ReadWriteMany). ⚠️ Warning: only set this for new installations, not existing ones!

View File

@@ -5,7 +5,7 @@
}
},
"require": {
"php": "8.4.*",
"php": "8.5.*",
"ext-json": "*",
"ext-sodium": "*",
"ext-curl": "*",
@@ -16,7 +16,8 @@
"http-interop/http-factory-guzzle": "^1.2",
"slim/twig-view": "^3.3",
"slim/csrf": "^1.3",
"ext-apcu": "*"
"ext-apcu": "*",
"slim/psr7": "^1.8"
},
"require-dev": {
"sserbin/twig-linter": "@dev",
@@ -33,6 +34,6 @@
"psalm:strict": "psalm --threads=1 --show-info=true",
"lint": "php -l src/*.php src/**/*.php public/index.php",
"lint:twig": "twig-linter lint ./templates",
"php-deprecation-detector": "phpdd scan -n -t 8.4 src/*.php src/**/*.php public/index.php"
"php-deprecation-detector": "phpdd scan -n -t 8.5 src/*.php src/**/*.php public/index.php"
}
}

239
php/composer.lock generated
View File

@@ -4,8 +4,64 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "19598625395cc28e64f15d2719f8f98f",
"content-hash": "e49cef2ac29c2198aececcb842fce2fe",
"packages": [
{
"name": "fig/http-message-util",
"version": "1.1.5",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message-util.git",
"reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765",
"reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
"shasum": ""
},
"require": {
"php": "^5.3 || ^7.0 || ^8.0"
},
"suggest": {
"psr/http-message": "The package containing the PSR-7 interfaces"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Fig\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"support": {
"issues": "https://github.com/php-fig/http-message-util/issues",
"source": "https://github.com/php-fig/http-message-util/tree/1.1.5"
},
"time": "2020-11-24T22:02:12+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "7.10.0",
@@ -391,27 +447,27 @@
},
{
"name": "laravel/serializable-closure",
"version": "v2.0.8",
"version": "v2.0.10",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b"
"reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b",
"reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669",
"reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
"illuminate/support": "^10.0|^11.0|^12.0",
"illuminate/support": "^10.0|^11.0|^12.0|^13.0",
"nesbot/carbon": "^2.67|^3.0",
"pestphp/pest": "^2.36|^3.0|^4.0",
"phpstan/phpstan": "^2.0",
"symfony/var-dumper": "^6.2.0|^7.0.0"
"symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0"
},
"type": "library",
"extra": {
@@ -448,7 +504,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
"time": "2026-01-08T16:22:46+00:00"
"time": "2026-02-20T19:59:49+00:00"
},
{
"name": "nikic/fast-route",
@@ -1146,6 +1202,85 @@
},
"time": "2025-11-02T14:58:28+00:00"
},
{
"name": "slim/psr7",
"version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim-Psr7.git",
"reference": "76e7e3b1cdfd583e9035c4c966c08e01e45ce959"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Slim-Psr7/zipball/76e7e3b1cdfd583e9035c4c966c08e01e45ce959",
"reference": "76e7e3b1cdfd583e9035c4c966c08e01e45ce959",
"shasum": ""
},
"require": {
"fig/http-message-util": "^1.1.5",
"php": "^8.0",
"psr/http-factory": "^1.1",
"psr/http-message": "^1.0 || ^2.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
"psr/http-factory-implementation": "^1.0",
"psr/http-message-implementation": "^1.0 || ^2.0"
},
"require-dev": {
"adriansuter/php-autoload-override": "^1.5|| ^2.0",
"ext-json": "*",
"http-interop/http-factory-tests": "^1.0 || ^2.0",
"php-http/psr7-integration-tests": "^1.5",
"phpstan/phpstan": "^2.1",
"phpunit/phpunit": "^9.6 || ^10",
"squizlabs/php_codesniffer": "^3.13"
},
"type": "library",
"autoload": {
"psr-4": {
"Slim\\Psr7\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Josh Lockhart",
"email": "hello@joshlockhart.com",
"homepage": "https://joshlockhart.com"
},
{
"name": "Andrew Smith",
"email": "a.smith@silentworks.co.uk",
"homepage": "https://silentworks.co.uk"
},
{
"name": "Rob Allen",
"email": "rob@akrabat.com",
"homepage": "https://akrabat.com"
},
{
"name": "Pierre Berube",
"email": "pierre@lgse.com",
"homepage": "https://www.lgse.com"
}
],
"description": "Strict PSR-7 implementation",
"homepage": "https://www.slimframework.com",
"keywords": [
"http",
"psr-7",
"psr7"
],
"support": {
"issues": "https://github.com/slimphp/Slim-Psr7/issues",
"source": "https://github.com/slimphp/Slim-Psr7/tree/1.8.0"
},
"time": "2025-11-02T17:51:19+00:00"
},
{
"name": "slim/slim",
"version": "4.15.1",
@@ -2888,29 +3023,29 @@
},
{
"name": "doctrine/deprecations",
"version": "1.1.5",
"version": "1.1.6",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
"reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
"reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"phpunit/phpunit": "<=7.5 || >=13"
"phpunit/phpunit": "<=7.5 || >=14"
},
"require-dev": {
"doctrine/coding-standard": "^9 || ^12 || ^13",
"phpstan/phpstan": "1.4.10 || 2.1.11",
"doctrine/coding-standard": "^9 || ^12 || ^14",
"phpstan/phpstan": "1.4.10 || 2.1.30",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0",
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
@@ -2930,9 +3065,9 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.5"
"source": "https://github.com/doctrine/deprecations/tree/1.1.6"
},
"time": "2025-04-07T20:06:18+00:00"
"time": "2026-02-07T07:09:04+00:00"
},
{
"name": "felixfbecker/language-server-protocol",
@@ -3293,16 +3428,16 @@
},
{
"name": "netresearch/jsonmapper",
"version": "v5.0.0",
"version": "v5.0.1",
"source": {
"type": "git",
"url": "https://github.com/cweiske/jsonmapper.git",
"reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c"
"reference": "980674efdda65913492d29a8fd51c82270dd37bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c",
"reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb",
"reference": "980674efdda65913492d29a8fd51c82270dd37bb",
"shasum": ""
},
"require": {
@@ -3338,9 +3473,9 @@
"support": {
"email": "cweiske@cweiske.de",
"issues": "https://github.com/cweiske/jsonmapper/issues",
"source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0"
"source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1"
},
"time": "2024-09-08T10:20:00+00:00"
"time": "2026-02-22T16:28:03+00:00"
},
{
"name": "nikic/php-parser",
@@ -3697,29 +3832,29 @@
},
{
"name": "sebastian/diff",
"version": "7.0.0",
"version": "8.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "7ab1ea946c012266ca32390913653d844ecd085f"
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f",
"reference": "7ab1ea946c012266ca32390913653d844ecd085f",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"shasum": ""
},
"require": {
"php": ">=8.3"
"php": ">=8.4"
},
"require-dev": {
"phpunit/phpunit": "^12.0",
"phpunit/phpunit": "^13.0",
"symfony/process": "^7.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "7.0-dev"
"dev-main": "8.0-dev"
}
},
"autoload": {
@@ -3752,15 +3887,27 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/7.0.0"
"source": "https://github.com/sebastianbergmann/diff/tree/8.0.0"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
},
{
"url": "https://liberapay.com/sebastianbergmann",
"type": "liberapay"
},
{
"url": "https://thanks.dev/u/gh/sebastianbergmann",
"type": "thanks_dev"
},
{
"url": "https://tidelift.com/funding/github/packagist/sebastian/diff",
"type": "tidelift"
}
],
"time": "2025-02-07T04:55:46+00:00"
"time": "2026-02-06T04:42:27+00:00"
},
{
"name": "spatie/array-to-xml",
@@ -4551,16 +4698,16 @@
},
{
"name": "vimeo/psalm",
"version": "6.14.3",
"version": "6.15.1",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
"reference": "d0b040a91f280f071c1abcb1b77ce3822058725a"
"reference": "28dc127af1b5aecd52314f6f645bafc10d0e11f9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a",
"reference": "d0b040a91f280f071c1abcb1b77ce3822058725a",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/28dc127af1b5aecd52314f6f645bafc10d0e11f9",
"reference": "28dc127af1b5aecd52314f6f645bafc10d0e11f9",
"shasum": ""
},
"require": {
@@ -4584,7 +4731,7 @@
"netresearch/jsonmapper": "^5.0",
"nikic/php-parser": "^5.0.0",
"php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0",
"sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0",
"sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0",
"spatie/array-to-xml": "^2.17.0 || ^3.0",
"symfony/console": "^6.0 || ^7.0 || ^8.0",
"symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0",
@@ -4665,7 +4812,7 @@
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm"
},
"time": "2025-12-23T15:36:48+00:00"
"time": "2026-02-07T19:27:16+00:00"
},
{
"name": "wapmorgan/php-deprecation-detector",
@@ -4736,16 +4883,16 @@
},
{
"name": "webmozart/assert",
"version": "2.1.2",
"version": "2.1.5",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649"
"reference": "79155f94852fa27e2f73b459f6503f5e87e2c188"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
"reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188",
"reference": "79155f94852fa27e2f73b459f6503f5e87e2c188",
"shasum": ""
},
"require": {
@@ -4792,9 +4939,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/2.1.2"
"source": "https://github.com/webmozarts/assert/tree/2.1.5"
},
"time": "2026-01-13T14:02:24+00:00"
"time": "2026-02-18T14:09:36+00:00"
}
],
"aliases": [],
@@ -4806,7 +4953,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": "8.4.*",
"php": "8.5.*",
"ext-json": "*",
"ext-sodium": "*",
"ext-curl": "*",

View File

@@ -47,7 +47,7 @@
},
"display_name": {
"type": "string",
"pattern": "^[()A-Za-z 0-9-]+$"
"pattern": "^[()A-Za-z &0-9-]+$"
},
"environment": {
"type": "array",

View File

@@ -10,9 +10,10 @@
"nextcloud-aio-talk",
"nextcloud-aio-notify-push",
"nextcloud-aio-whiteboard",
"nextcloud-aio-harp",
"nextcloud-aio-nextcloud"
],
"display_name": "Apache",
"display_name": "Apache & Caddy",
"image": "ghcr.io/nextcloud-releases/aio-apache",
"user": "33",
"init": true,
@@ -49,7 +50,8 @@
"APACHE_MAX_SIZE=%APACHE_MAX_SIZE%",
"APACHE_MAX_TIME=%NEXTCLOUD_MAX_TIME%",
"NOTIFY_PUSH_HOST=nextcloud-aio-notify-push",
"WHITEBOARD_HOST=nextcloud-aio-whiteboard"
"WHITEBOARD_HOST=nextcloud-aio-whiteboard",
"HARP_HOST=nextcloud-aio-harp"
],
"volumes": [
{
@@ -83,7 +85,7 @@
{
"container_name": "nextcloud-aio-database",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Database",
"display_name": "PostgreSQL",
"image": "ghcr.io/nextcloud-releases/aio-postgresql",
"user": "999",
"init": true,
@@ -172,7 +174,8 @@
"SIGNALING_SECRET",
"FULLTEXTSEARCH_PASSWORD",
"IMAGINARY_SECRET",
"WHITEBOARD_SECRET"
"WHITEBOARD_SECRET",
"HP_SHARED_KEY"
],
"volumes": [
{
@@ -258,7 +261,9 @@
"THIS_IS_AIO=true",
"IMAGINARY_SECRET=%IMAGINARY_SECRET%",
"WHITEBOARD_SECRET=%WHITEBOARD_SECRET%",
"WHITEBOARD_ENABLED=%WHITEBOARD_ENABLED%"
"WHITEBOARD_ENABLED=%WHITEBOARD_ENABLED%",
"HARP_ENABLED=%HARP_ENABLED%",
"HP_SHARED_KEY=%HP_SHARED_KEY%"
],
"stop_grace_period": 600,
"restart": "unless-stopped",
@@ -276,7 +281,7 @@
{
"container_name": "nextcloud-aio-notify-push",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Notify Push",
"display_name": "Client Push",
"image": "ghcr.io/nextcloud-releases/aio-notify-push",
"user": "33",
"init": true,
@@ -299,22 +304,13 @@
"volumes": [
{
"source": "nextcloud_aio_nextcloud",
"destination": "/nextcloud",
"destination": "/var/www/html",
"writeable": false
}
],
"environment": [
"NC_DOMAIN=%NC_DOMAIN%",
"NEXTCLOUD_HOST=nextcloud-aio-nextcloud",
"TZ=%TIMEZONE%",
"REDIS_HOST=nextcloud-aio-redis",
"REDIS_PORT=6379",
"REDIS_HOST_PASSWORD=%REDIS_PASSWORD%",
"POSTGRES_HOST=nextcloud-aio-database",
"POSTGRES_PORT=5432",
"POSTGRES_PASSWORD=%DATABASE_PASSWORD%",
"POSTGRES_DB=nextcloud_database",
"POSTGRES_USER=nextcloud"
"TZ=%TIMEZONE%"
],
"restart": "unless-stopped",
"read_only": true,
@@ -367,7 +363,7 @@
"container_name": "nextcloud-aio-collabora",
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Collabora",
"display_name": "Nextcloud Office",
"image": "ghcr.io/nextcloud-releases/aio-collabora",
"init": true,
"healthcheck": {
@@ -413,7 +409,7 @@
"container_name": "nextcloud-aio-talk",
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Talk",
"display_name": "Nextcloud Talk",
"image": "ghcr.io/nextcloud-releases/aio-talk",
"user": "1000",
"init": true,
@@ -475,7 +471,7 @@
{
"container_name": "nextcloud-aio-talk-recording",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Talk Recording",
"display_name": "Nextcloud Talk Recording",
"image": "ghcr.io/nextcloud-releases/aio-talk-recording",
"user": "122",
"init": true,
@@ -824,7 +820,7 @@
{
"container_name": "nextcloud-aio-docker-socket-proxy",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Docker Socket Proxy",
"display_name": "Docker Socket Proxy (deprecated)",
"image": "ghcr.io/nextcloud-releases/aio-docker-socket-proxy",
"init": true,
"internal_port": "2375",
@@ -847,10 +843,52 @@
"NET_RAW"
]
},
{
"container_name": "nextcloud-aio-harp",
"image_tag": "release",
"display_name": "HaRP",
"image": "ghcr.io/nextcloud/nextcloud-appapi-harp",
"init": true,
"internal_port": "8780",
"expose": [
"8780"
],
"environment": [
"HP_SHARED_KEY=%HP_SHARED_KEY%",
"NC_INSTANCE_URL=https://%NC_DOMAIN%",
"HP_LOG_LEVEL=warning",
"HP_FRP_DISABLE_TLS=true",
"TZ=%TIMEZONE%"
],
"secrets": [
"HP_SHARED_KEY"
],
"volumes": [
{
"source": "%WATCHTOWER_DOCKER_SOCKET_PATH%",
"destination": "/var/run/docker.sock",
"writeable": false
},
{
"source": "nextcloud_aio_harp",
"destination": "/certs",
"writeable": true
}
],
"restart": "unless-stopped",
"read_only": true,
"tmpfs": [
"/tmp",
"/run/harp"
],
"cap_drop": [
"NET_RAW"
]
},
{
"container_name": "nextcloud-aio-whiteboard",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Whiteboard",
"display_name": "Nextcloud Whiteboard",
"image": "ghcr.io/nextcloud-releases/aio-whiteboard",
"user": "65534",
"init": true,

View File

@@ -1,6 +1,10 @@
<?php
declare(strict_types=1);
$domain = $_GET['domain'] ?? '';
$domain = '';
if (isset($_GET['domain']) && is_string($_GET['domain'])) {
$domain = $_GET['domain'];
}
if (!str_contains($domain, '.')) {
http_response_code(400);

View File

@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="6.14.3@d0b040a91f280f071c1abcb1b77ce3822058725a"/>
<files psalm-version="6.15.1@28dc127af1b5aecd52314f6f645bafc10d0e11f9"/>

View File

@@ -1,4 +1,9 @@
document.addEventListener("DOMContentLoaded", function () {
// Don't run if the expected form isn't present.
if (document.getElementById('options-form') === null) {
return;
}
// Hide submit button initially
const optionsFormSubmit = document.querySelectorAll(".options-form-submit");
optionsFormSubmit.forEach(element => {
@@ -116,13 +121,26 @@ document.addEventListener("DOMContentLoaded", function () {
function handleDockerSocketProxyWarning() {
if (document.getElementById("docker-socket-proxy").checked) {
// TODO: remove the line below and uncomment the lines further down once https://github.com/nextcloud/app_api/pull/800 is included
alert('⚠️ Warning! Enabling this container comes with possible Security problems since you are exposing the docker socket and all its privileges to the Nextcloud container. Enable this only if you are sure what you are doing!');
// alert('⚠️ The docker socket proxy container is deprecated. Please use the HaRP (High-availability Reverse Proxy for Nextcloud ExApps) instead!');
// document.getElementById("docker-socket-proxy").checked = false
}
}
function handleHarpWarning() {
if (document.getElementById("harp").checked) {
alert('⚠️ Warning! Enabling this container comes with possible Security problems since you are exposing the docker socket and all its privileges to the HaRP container. Enable this only if you are sure what you are doing!');
document.getElementById("docker-socket-proxy").checked = false
}
}
// Initialize event listeners for specific behaviors
document.getElementById("talk").addEventListener('change', handleTalkVisibility);
document.getElementById("docker-socket-proxy").addEventListener('change', handleDockerSocketProxyWarning);
if (document.getElementById("harp")) {
document.getElementById("harp").addEventListener('change', handleHarpWarning);
}
// Initialize talk-recording visibility on page load
handleTalkVisibility(); // Ensure talk-recording is correctly initialized

View File

@@ -0,0 +1,7 @@
document.addEventListener("DOMContentLoaded", function(event) {
// HaRP
let harp = document.getElementById("harp");
if (harp) {
harp.disabled = true;
}
});

View File

@@ -70,15 +70,24 @@ function showPassword(id) {
}
form.onsubmit = submit;
console.info(form);
}
function initForms() {
const forms = document.querySelectorAll('form.xhr')
console.info("Making " + forms.length + " form(s) use XHR.");
for (const form of forms) {
initForm(form);
}
const overlayLogForms = document.querySelectorAll('form[target="overlay-log"]')
for (const form of overlayLogForms) {
form.onsubmit = function() {
enableSpinner();
document.getElementById('overlay-log')?.classList.add('visible');
// Reload the page after the response was fully loaded into the iframe.
document.querySelector('iframe[name="overlay-log"]').addEventListener('load', () => {
location.reload();
});
};
}
}
if (document.readyState === 'loading') {

View File

@@ -11,6 +11,7 @@ ini_set('max_execution_time', '7200');
ini_set('log_errors_max_len', '0');
use DI\Container;
use DI\NotFoundException;
use Slim\Csrf\Guard;
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
@@ -136,6 +137,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_nvidia_gpu_enabled' => $configurationManager->enableNvidiaGpu,
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_harp_enabled' => $configurationManager->isHarpEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
'community_containers_enabled' => $configurationManager->aioCommunityContainers,
@@ -170,6 +172,15 @@ $app->get('/setup', function (Request $request, Response $response, array $args)
]
);
});
$app->get('/log', function (Request $request, Response $response, array $args) use ($container) {
$params = $request->getQueryParams();
$id = $params['id'] ?? '';
if (!str_starts_with($id, 'nextcloud-aio-')) {
throw new DI\NotFoundException();
}
$view = Twig::fromRequest($request);
return $view->render($response, 'log.twig', ['id' => $id]);
});
// Auth Redirector
$app->get('/', function (\Psr\Http\Message\RequestInterface $request, Response $response, array $args) use ($container) {
@@ -197,4 +208,13 @@ $app->get('/', function (\Psr\Http\Message\RequestInterface $request, Response $
$errorMiddleware = $app->addErrorMiddleware(false, true, true);
// Set a custom Not Found handler, which doesn't pollute the app output with 404 errors.
$errorMiddleware->setErrorHandler(
\Slim\Exception\HttpNotFoundException::class,
function (Request $request, Throwable $exception, bool $displayErrorDetails) use ($app) {
$response = $app->getResponseFactory()->createResponse();
$response->getBody()->write('Not Found');
return $response->withStatus(404);
});
$app->run();

142
php/public/log-view.js Normal file
View File

@@ -0,0 +1,142 @@
class LogViewer {
// Configure the interval in seconds for autoloading log data.
autoloadIntervalSec = 5;
// Set to true to see some debug log statements in the browser console.
debugLog = false;
// Don't touch these, please.
containerId;
apiBaseUrl = 'api/docker/logs';
autoloadIntervalId = null;
logElem;
lastLogTimestamp = '';
autoloadingDisabledFromButton = false;
loaderElem;
dataLoadingLock;
constructor() {
const id = document.body.dataset.containerId;
if (typeof(id) !== 'string' || !id.startsWith('nextcloud-aio-')) {
throw new Exception('Invalid container ID');
}
this.containerId = id;
this.logElem = document.querySelector('pre');
this.loaderElem = document.querySelector('.loader');
this.initAutoloadingControls();
// Enable automatic log data loading.
this.startAutoloading();
}
startAutoloading() {
// Load log data immediately.
this.loadAndAppendLogData();
// Load new log data repeatedly.
this.debug("Starting autoloading");
this.autoloadIntervalId = setInterval(() => {
if (this.isAutoloadingEnabled()) {
this.loadAndAppendLogData();
}
}, 5000);
}
stopAutoloading() {
this.debug("Stopping autoloading");
clearInterval(this.autoloadIntervalId);
this.autoloadIntervalId = null;
}
isAutoloadingEnabled() {
return !!this.autoloadIntervalId;
}
getUrl() {
return `${this.apiBaseUrl}?id=${this.containerId}&since=${this.lastLogTimestamp}`;
}
debug(...args) {
if (this.debugLog) {
console.debug('LogViewer:', ...args);
}
}
// Load log data and append it to the DOM.
loadAndAppendLogData() {
if (this.dataLoadingLock) {
this.debug("Another log data loading request is still running, cancelling this request");
return;
}
this.debug("Loading new log data");
this.dataLoadingLock = true;
this.loaderElem.classList.remove('hidden');
fetch(this.getUrl())
.then((response) => {
if (!response.ok) {
throw new Error("Error while fetching log data!");
}
return response;
})
.then((response) => response.text())
.then((text) => {
text = text.trim();
if (text.length === 0) {
this.debug("Received no new log data from server");
return;
}
this.debug("Received", Math.round(text.length / 1024), "KB of new log data from server");
this.logElem.append(text + "\n");
this.scrollToBottom();
this.lastLogTimestamp = text.split("\n").at(-1)?.split(' ')[0] ?? '';
})
.finally(() => {
this.dataLoadingLock = false;
this.loaderElem.classList.add('hidden');
this.debug("Finished log data loading");
})
.catch((err) => console.error(err));
}
scrollToBottom() {
window.scrollTo(0, document.body.scrollHeight);
}
initAutoloadingControls() {
// Provide a button that allows to manually disable the autoloading.
const button = document.getElementById('autoloading-control');
const statusElem = document.getElementById('autoloading-status');
if (!button) {
return;
}
button.addEventListener('click', (event) => {
event.preventDefault();
if (this.isAutoloadingEnabled()) {
this.stopAutoloading();
statusElem.textContent = 'disabled';
button.textContent = 'Enable';
this.autoloadingDisabledFromButton = true;
} else {
this.startAutoloading();
statusElem.textContent = 'enabled';
button.textContent = 'Disable';
this.autoloadingDisabledFromButton = false;
}
});
// Load new data immediately if the window gets visible to the user again (unless autoloading has been
// disabled).
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
this.debug("Window became visible");
if (!this.autoloadingDisabledFromButton) {
this.startAutoloading();
}
} else {
this.debug("Window became hidden");
this.stopAutoloading();
}
});
}
}
document.addEventListener("DOMContentLoaded", () => {
new LogViewer();
});

View File

@@ -468,7 +468,29 @@ input[type="checkbox"]:disabled:not(:checked) + label {
}
#overlay.loading {
display: block;
display: grid;
justify-items: center;
row-gap: 2rem;
}
#overlay #overlay-log.visible {
visibility: visible;
opacity: 1;
transition: opacity 1s ease-in;
}
#overlay #overlay-log {
visibility: hidden;
opacity: 0;
align-self: start;
width: 20%;
height: 7rem;
border-radius: var(--border-radius-large);
border: solid thin rgb(192, 192, 192);
}
.overlay-iframe {
padding: 1rem;
}
.loader {
@@ -479,9 +501,7 @@ input[type="checkbox"]:disabled:not(:checked) + label {
height: 120px;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
position: absolute;
top: calc(50% - 60px);
left: calc(50% - 60px);
align-self: end;
}
/* Safari */
@@ -705,4 +725,4 @@ input[type="checkbox"]:disabled:not(:checked) + label {
.office-suite-cards {
grid-template-columns: 1fr;
}
}
}

View File

@@ -2,28 +2,26 @@
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = (currentTheme === 'dark') ? '' : 'dark'; // Toggle between no theme and dark theme
document.documentElement.setAttribute('data-theme', newTheme);
setThemeToDOM(newTheme);
localStorage.setItem('theme', newTheme);
// Change the icon based on the current theme
const themeIcon = document.getElementById('theme-icon');
themeIcon.textContent = newTheme === 'dark' ? '☀️' : '🌙'; // Switch between moon and sun icons
setThemeIcon(newTheme);
}
// Function to immediately apply saved theme without icon update
function applySavedThemeImmediately() {
const savedTheme = localStorage.getItem('theme');
if (savedTheme === 'dark') {
document.documentElement.setAttribute('data-theme', 'dark');
} else {
document.documentElement.removeAttribute('data-theme'); // Default to light theme
}
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()
documents.forEach((doc) => doc.documentElement.setAttribute('data-theme', value));
}
function getSavedTheme() {
return localStorage.getItem('theme') ?? '';
}
// Function to apply theme-icon update
function setThemeIcon() {
const savedTheme = localStorage.getItem('theme');
if (savedTheme === 'dark') {
function setThemeIcon(theme) {
if (theme === 'dark') {
document.getElementById('theme-icon').textContent = '☀️'; // Sun icon for dark mode
} else {
document.getElementById('theme-icon').textContent = '🌙'; // Moon icon for light mode
@@ -31,7 +29,7 @@ function setThemeIcon() {
}
// Immediately apply the saved theme to avoid flickering
applySavedThemeImmediately();
setThemeToDOM(getSavedTheme());
// Apply theme when the page loads
document.addEventListener('DOMContentLoaded', setThemeIcon);
document.addEventListener('DOMContentLoaded', () => setThemeIcon(getSavedTheme()));

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Auth;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Auth;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Container;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO;
@@ -90,6 +91,10 @@ readonly class ContainerDefinitionFetcher {
if (!$this->configurationManager->isDockerSocketProxyEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-harp') {
if (!$this->configurationManager->isHarpEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') {
if (!$this->configurationManager->isWhiteboardEnabled) {
continue;
@@ -199,6 +204,10 @@ readonly class ContainerDefinitionFetcher {
if (!$this->configurationManager->isDockerSocketProxyEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-harp') {
if (!$this->configurationManager->isHarpEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-whiteboard') {
if (!$this->configurationManager->isWhiteboardEnabled) {
continue;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Controller;
@@ -95,6 +96,7 @@ readonly class ConfigurationController {
$this->configurationManager->isImaginaryEnabled = isset($request->getParsedBody()['imaginary']);
$this->configurationManager->isFulltextsearchEnabled = isset($request->getParsedBody()['fulltextsearch']);
$this->configurationManager->isDockerSocketProxyEnabled = isset($request->getParsedBody()['docker-socket-proxy']);
$this->configurationManager->isHarpEnabled = isset($request->getParsedBody()['harp']);
$this->configurationManager->isWhiteboardEnabled = isset($request->getParsedBody()['whiteboard']);
}

View File

@@ -1,13 +1,16 @@
<?php
declare(strict_types=1);
namespace AIO\Controller;
use AIO\Container\Container;
use AIO\Container\ContainerState;
use AIO\ContainerDefinitionFetcher;
use AIO\Docker\DockerActionManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use AIO\Data\ConfigurationManager;
use Slim\Psr7\NonBufferedBody;
readonly class DockerController {
private const string TOP_CONTAINER = 'nextcloud-aio-apache';
@@ -19,12 +22,12 @@ readonly class DockerController {
) {
}
private function PerformRecursiveContainerStart(string $id, bool $pullImage = true) : void {
private function PerformRecursiveContainerStart(string $id, bool $pullImage = true, ?\Closure $addToStreamingResponseBody = null) : void {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
// Start all dependencies first and then itself
foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveContainerStart($dependency, $pullImage);
$this->PerformRecursiveContainerStart($dependency, $pullImage, $addToStreamingResponseBody);
}
// Don't start if container is already running
@@ -36,9 +39,9 @@ readonly class DockerController {
$this->dockerActionManager->DeleteContainer($container);
$this->dockerActionManager->CreateVolumes($container);
$this->dockerActionManager->PullImage($container, $pullImage);
$this->dockerActionManager->PullImage($container, $pullImage, $addToStreamingResponseBody);
$this->dockerActionManager->CreateContainer($container);
$this->dockerActionManager->StartContainer($container);
$this->dockerActionManager->StartContainer($container, $addToStreamingResponseBody);
$this->dockerActionManager->ConnectContainerToNetwork($container);
}
@@ -68,7 +71,8 @@ readonly class DockerController {
$id = $requestParams['id'];
}
if (str_starts_with($id, 'nextcloud-aio-')) {
$logs = $this->dockerActionManager->GetLogs($id);
$since = $this->getTimestampForDockerLogsApiSince($requestParams['since'] ?? '');
$logs = $this->dockerActionManager->GetLogs($id, $since);
} else {
$logs = 'Container not found.';
}
@@ -178,7 +182,7 @@ readonly class DockerController {
}
if (isset($request->getParsedBody()['install_latest_major'])) {
$installLatestMajor = '32';
$installLatestMajor = '33';
} else {
$installLatestMajor = '';
}
@@ -197,17 +201,37 @@ readonly class DockerController {
if ($pullImage === false) {
error_log('WARNING: Not pulling container images. Instead, using local ones.');
}
$nonbufResp = $response
->withBody(new NonBufferedBody())
->withHeader('Content-Type', 'text/html; charset=utf-8')
->withHeader('X-Accel-Buffering', 'no')
->withHeader('Cache-Control', 'no-cache');
// Text written into this body is immediately sent to the client, without waiting for later content.
$streamingResponseBody = $nonbufResp->getBody();
$streamingResponseBody->write($this->getStreamingResponseHtmlStart());
// 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 ($streamingResponseBody) : void {
$streamingResponseBody->write("<div>{$container->displayName}: {$message}</div>");
};
// Start container
$this->startTopContainer($pullImage);
$this->startTopContainer($pullImage, $addToStreamingResponseBody);
// Clear apcu cache in order to check if container updates are available
// Temporarily disabled as it leads much faster to docker rate limits
// apcu_clear_cache();
return $response->withStatus(201)->withHeader('Location', '.');
$streamingResponseBody->write($this->getStreamingResponseHtmlEnd());
return $nonbufResp;
}
public function startTopContainer(bool $pullImage) : void {
public function startTopContainer(bool $pullImage, ?\Closure $addToStreamingResponseBody = null) : void {
$this->configurationManager->aioToken = bin2hex(random_bytes(24));
// Stop domaincheck since apache would not be able to start otherwise
@@ -215,7 +239,7 @@ readonly class DockerController {
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStart($id, $pullImage);
$this->PerformRecursiveContainerStart($id, $pullImage, $addToStreamingResponseBody);
}
public function StartWatchtowerContainer(Request $request, Response $response, array $args) : Response {
@@ -307,4 +331,65 @@ readonly class DockerController {
$id = 'nextcloud-aio-domaincheck';
$this->PerformRecursiveContainerStop($id);
}
private function getStreamingResponseHtmlStart() : string {
return <<<END
<!DOCTYPE html>
<html lang="en" class="overlay-iframe">
<head>
<link rel="stylesheet" href="../../style.css?v8" media="all" />
<script>
const observer = new MutationObserver((records) => {
const node = records[0]?.addedNodes[0];
// Text nodes also appear here but can't be scrolled to, so we have to check for the
// function being present.
if (node && typeof(node.scrollIntoView) === 'function') {
node.scrollIntoView();
}
});
observer.observe(document, {childList: true, subtree: true});
</script>
</head>
<body>
END;
}
private function getStreamingResponseHtmlEnd() : string {
return "\n </body>\n</html>";
}
private function getTimestampForDockerLogsApiSince(string $input) : string
{
if ($input === '') {
return '';
}
// We expect an RFC3339Nano string with Timezone UTC here, as docker will put out.
// Unfortunately PHP doesn't support this format with nanoseconds, so we have to help
// ourselves a little bit.
// First we split off the nanoseconds.
preg_match('/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\.(\d{9}).*/', $input, $match);
if (count($match) !== 3) {
// The input doesn't match our expectations, it might be manipulated, we ignore it.
return '';
}
$datetime = \DateTimeImmutable::createFromFormat("Y-m-d\\TH:i:s", $match[1]);
$nanoseconds = $match[2];
if ($datetime === false) {
// Input was not parseable, it might be manipulated, we ignore it.
return '';
}
// Format the datetime as unix timestamp.
$timestamp = $datetime->format('U');
// Increase the nanoseconds by 1, so we don't get the line with exactly the original datetime again.
$nanoseconds = strval(intval($nanoseconds) + 1);
// Now append the nanoseconds to the timestamp-string.
return "{$timestamp}.{$nanoseconds}";
}
}

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Controller;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Data;
@@ -29,6 +30,11 @@ class ConfigurationManager
set { $this->set('isDockerSocketProxyEnabled', $value); }
}
public bool $isHarpEnabled {
get => $this->get('isHarpEnabled', false);
set { $this->set('isHarpEnabled', $value); }
}
public bool $isWhiteboardEnabled {
// Type-cast because old configs could have 1/0 for this key.
get => (bool) $this->get('isWhiteboardEnabled', true);
@@ -114,7 +120,7 @@ class ConfigurationManager
// Type-cast because old configs could have 1/0 for this key.
get => (bool) $this->get('isFulltextsearchEnabled', false);
// Elasticsearch does not work on kernels without seccomp anymore. See https://github.com/nextcloud/all-in-one/discussions/5768
set { $this->set('isFulltextsearchEnabled', ($this->collaboraSeccompDisabled && $value)); }
set { $this->set('isFulltextsearchEnabled', (!$this->collaboraSeccompDisabled && $value)); }
}
public string $domain {
@@ -1034,6 +1040,7 @@ class ConfigurationManager
'IMAGINARY_ENABLED' => $this->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
'HARP_ENABLED' => $this->isHarpEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloudUploadLimit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloudMemoryLimit,
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Data;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Data;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Docker;
@@ -144,11 +145,12 @@ readonly class DockerActionManager {
}
}
public function GetLogs(string $id): string {
public function GetLogs(string $id, string $since = ''): string {
$url = $this->BuildApiUrl(
sprintf(
'containers/%s/logs?stdout=true&stderr=true&timestamps=true',
urlencode($id)
'containers/%s/logs?stdout=true&stderr=true&timestamps=true&since=%s',
urlencode($id),
$since
));
$responseBody = (string)$this->guzzleClient->get($url)->getBody();
@@ -165,9 +167,12 @@ readonly class DockerActionManager {
return $response;
}
public function StartContainer(Container $container): void {
public function StartContainer(Container $container, ?\Closure $addToStreamingResponseBody = null): void {
$url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->identifier)));
try {
if ($addToStreamingResponseBody !== null) {
$addToStreamingResponseBody($container, "Starting container");
}
$this->guzzleClient->post($url);
} catch (RequestException $e) {
throw new \Exception("Could not start container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
@@ -472,8 +477,7 @@ readonly class DockerActionManager {
}
}
public function PullImage(Container $container, bool $pullImage = true): void {
public function PullImage(Container $container, bool $pullImage = true, ?\Closure $addToStreamingResponseBody = null): void {
// Skip database image pull if the last shutdown was not clean
if ($container->identifier === 'nextcloud-aio-database') {
if ($this->GetDatabasecontainerExitCode() > 0) {
@@ -501,6 +505,9 @@ readonly class DockerActionManager {
$url = $this->BuildApiUrl(sprintf('images/create?fromImage=%s', $encodedImageName));
$imageIsThere = true;
try {
if ($addToStreamingResponseBody) {
$addToStreamingResponseBody($container, "Pulling image");
}
$imageUrl = $this->BuildApiUrl(sprintf('images/%s/json', $encodedImageName));
$this->guzzleClient->get($imageUrl)->getBody()->getContents();
} catch (\Throwable $e) {
@@ -648,8 +655,8 @@ readonly class DockerActionManager {
if (count($imageNameArray) === 2) {
$imageName = $imageNameArray[0];
} else {
error_log("No tag was found when getting the current channel. You probably did not follow the documentation correctly. Changing the imageName to the default " . $output['Config']['Image']);
$imageName = $output['Config']['Image'];
error_log("Unexpected image name was found when getting the current image name of the mastercontainer. You probably did not follow the documentation correctly. Changing the image name to the default 'ghcr.io/nextcloud-releases/all-in-one'.");
$imageName = 'ghcr.io/nextcloud-releases/all-in-one';
}
apcu_add($cacheKey, $imageName);
return $imageName;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Docker;

View File

@@ -1,5 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Docker;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Middleware;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Twig;

View File

@@ -1,4 +1,5 @@
<?php
declare(strict_types=1);
namespace AIO\Twig;

View File

@@ -4,19 +4,22 @@
{% if c.GetStartingState().value == 'starting' %}
<span class="status running"></span>
{{ c.displayName }}
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Starting</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">Starting</a>)
{% elseif c.GetRunningState().value == 'running' %}
<span class="status success"></span>
{{ c.displayName }}
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Running</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">Running</a>)
{% else %}
<span class="status error"></span>
{{ c.displayName }}
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Stopped</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">Stopped</a>)
{% endif %}
{% if c.documentation != '' %}
(<a target="_blank" href="{{ c.documentation }}">docs</a>)
{% endif %}
{% if c.GetUpdateState().value == 'different' %}
⚠️&nbsp;Update&nbsp;available
{% endif %}
</span>
{% if c.GetUiSecret() != '' %}
<details>
@@ -24,4 +27,4 @@
<input type="text" value="{{ c.GetUiSecret() }}" readonly>
</details>
{% endif %}
</li>
</li>

View File

@@ -27,7 +27,7 @@
<script type="text/javascript" src="timezone.js"></script>
{# js for optional containers and additional containers forms #}
<script type="text/javascript" src="containers-form-submit.js?v5"></script>
<script type="text/javascript" src="containers-form-submit.js?v6"></script>
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
{% set isAnyRunning = false %}
@@ -37,7 +37,8 @@
{% 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 Winter' %}
{% set oldMajorVersionString = '25 Autumn' %}
{% if is_backup_container_running == true %}
{% if borg_backup_mode == 'backup' or borg_backup_mode == 'restore' %}
@@ -64,11 +65,11 @@
{% endfor %}
{% if is_daily_backup_running == true %}
<p><span class="status running"></span> Daily backup currently running. (<a href="api/docker/logs?id=nextcloud-aio-mastercontainer" target="_blank">Mastercontainer logs</a>) (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Borg backup container logs</a>)</p>
<p><span class="status running"></span> Daily backup currently running. (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">Mastercontainer logs</a>) (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Borg backup container logs</a>)</p>
{% if automatic_updates == true %}
<p>This will update your containers, the mastercontainer and, on Saturdays, your Nextcloud apps if the backup is successful.</p>
{% if is_mastercontainer_update_available == true %}
<p>When the mastercontainer is updated it will restart, making it unavailable for a moment. (<a href="api/docker/logs?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
<p>When the mastercontainer is updated it will restart, making it unavailable for a moment. (<a href="log?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
{% endif %}
{% endif %}
{% if has_update_available == false %}
@@ -79,7 +80,7 @@
<p><a href="" class="button reload">Reload ↻</a></p>
<p>If the daily backup is stuck somehow, you can unstick it by running <strong>sudo docker exec nextcloud-aio-mastercontainer rm /mnt/docker-aio-config/data/daily_backup_running</strong> and afterwards reloading this interface.</p>
{% elseif isWatchtowerRunning == true %}
<p><span class="status running"></span> Mastercontainer update currently running. Once the update is complete the mastercontainer will restart, making it unavailable for a moment. Please wait until it's done. (<a href="api/docker/logs?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
<p><span class="status running"></span> Mastercontainer update currently running. Once the update is complete the mastercontainer will restart, making it unavailable for a moment. Please wait until it's done. (<a href="log?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
<p><a href="" class="button reload">Reload ↻</a></p>
{% else %}
{% if is_backup_container_running == false and domain == "" %}
@@ -141,7 +142,7 @@
{% if hasBackupLocation %}
{% if borg_backup_mode in ['test', 'check'] %}
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
{% if borg_backup_mode == 'test' %}
<p>Please adjust the path and/or the encryption password in order to make it work!</p>
{% elseif borg_backup_mode == 'check' %}
@@ -157,7 +158,7 @@
</details>
{% endif %}
{% elseif backup_exit_code == 0 %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
{% if borg_backup_mode == 'test' %}
<p>Feel free to check the integrity of the backup archive below before starting the restore process in order to make ensure that the restore will work. This can take a long time though depending on the size of the backup archive and is thus not required.</p>
<form method="POST" action="api/docker/backup-check" class="xhr">
@@ -182,7 +183,7 @@
{% endif %}
{% elseif borg_backup_mode == 'restore' %}
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last restore failed! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status error"></span> Last restore failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p>The restore process has unexpectedly failed! Please adjust the path and encryption password, test it and try to restore again!</p>
{% endif %}
{% endif %}
@@ -227,14 +228,14 @@
{% if was_start_button_clicked == true %}
{% if current_channel starts with 'latest' or current_channel starts with 'beta' or current_channel starts with 'develop' %}
<p>You are running the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-switch-the-channel"><strong>{{ current_channel }}</strong></a> channel. (<a href="api/docker/logs?id=nextcloud-aio-mastercontainer" target="_blank">Logs</a>)</p>
<p>You are running the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-switch-the-channel"><strong>{{ current_channel }}</strong></a> channel. (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">Logs</a>)</p>
{% else %}
<p>No channel was found. This means that AIO is not able to update itself and its component and will also not be able to report about updates. Updates need to be done externally.</p>
{% endif %}
{% endif %}
{% if is_backup_container_running == true %}
<p><span class="status running"></span> Backup container is currently running: {{ borg_backup_mode }} (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status running"></span> Backup container is currently running: {{ borg_backup_mode }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><a href="" class="button reload">Reload ↻</a></p>
{% endif %}
@@ -297,7 +298,7 @@
{% 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/6865">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 follow <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/7523">this documentation</a></strong></p>
</details>
{% endif %}
{% endif %}
@@ -338,24 +339,24 @@
</form>
{% else %}
{% if was_start_button_clicked == false %}
<form method="POST" action="api/docker/start" class="xhr">
<form method="POST" action="api/docker/start" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input id="base_path" type="hidden" name="base_path" value="">
{% if newMajorVersionString != '' %}
<input type="checkbox" id="install_latest_major" name="install_latest_major"><label for="install_latest_major">Install Nextcloud Hub {{ newMajorVersionString }} (if unchecked, Nextcloud Hub 10 will get installed)</label><br>
<input type="checkbox" id="install_latest_major" name="install_latest_major"><label for="install_latest_major">Install Nextcloud Hub {{ newMajorVersionString }} (if unchecked, Nextcloud Hub {{ oldMajorVersionString }} will get installed)</label><br>
{% endif %}
<input type="submit" value="Download and start containers" />
</form>
{% elseif has_update_available == false %}
<form method="POST" action="api/docker/start" class="xhr">
<form method="POST" action="api/docker/start" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input id="base_path" type="hidden" name="base_path" value="">
<input type="submit" value="Start containers" />
</form>
{% else %}
<form method="POST" action="api/docker/start" class="xhr">
<form method="POST" action="api/docker/start" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input id="base_path" type="hidden" name="base_path" value="">
@@ -400,7 +401,7 @@
{% if is_backup_container_running == false %}
<h2>Backup and restore</h2>
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
{% if borg_backup_mode == "check" %}
<p>The backup check was not successful. This might indicate a corrupt archive (look at the logs). If that should be the case, you can try to fix it by following <a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/faq.html#i-get-an-integrityerror-or-similar-what-now"><strong>this documentation</strong></a></p>
<details>
@@ -434,9 +435,9 @@
{% endif %}
{% elseif backup_exit_code == 0 %}
{% if borg_backup_mode == "backup" %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful on {{ last_backup_time }} UTC! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful on {{ last_backup_time }} UTC! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
{% else %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="api/docker/logs?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
{% endif %}
{% endif %}
{% endif %}

View File

@@ -1 +1 @@
12.6.1
12.8.0

View File

@@ -72,8 +72,8 @@
<li>Good Nextcloud integration</li>
<li>Open core</li>
<li>Best performance</li>
<li>Limited ODF compatibility</li>
<li>Best Microsoft compatibility</li>
<li>Limited ODF compatibility</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.onlyoffice.com/" target="_blank" class="office-learn-more" onclick="event.stopPropagation();">
@@ -196,8 +196,24 @@
data-initial-state="false"
{% endif %}
>
<label for="docker-socket-proxy">Docker Socket Proxy (needed for <a target="_blank" href="https://github.com/cloud-py-api/app_api#nextcloud-appapi">Nextcloud App API</a>)</label>
<label for="docker-socket-proxy">Docker Socket Proxy (needed for <a target="_blank" href="https://github.com/cloud-py-api/app_api#nextcloud-appapi">Nextcloud App API</a>) ⚠️ The docker socket proxy container is deprecated. Please use the HaRP (High-availability Reverse Proxy for Nextcloud ExApps) instead!</label>
</p>
{#
<p>
<input
type="checkbox"
id="harp"
name="harp"
{% if is_harp_enabled == true %}
checked="checked"
data-initial-state="true"
{% else %}
data-initial-state="false"
{% endif %}
>
<label for="harp">HaRP (<a target="_blank" href="https://github.com/nextcloud/HaRP">High-availability Reverse Proxy</a> for Nextcloud ExApps)</label>
</p>
#}
<p>
<input
type="checkbox"
@@ -218,6 +234,7 @@
{% if isAnyRunning == true %}
<script type="text/javascript" src="disable-clamav.js"></script>
<script type="text/javascript" src="disable-docker-socket-proxy.js"></script>
<script type="text/javascript" src="disable-harp.js"></script>
<script type="text/javascript" src="disable-talk.js"></script>
<script type="text/javascript" src="disable-collabora.js?v2"></script>
<script type="text/javascript" src="disable-onlyoffice.js?v2"></script>

View File

@@ -1,10 +1,10 @@
<html>
<head>
<title>AIO</title>
<link rel="stylesheet" href="style.css?v7" media="all" />
<link rel="stylesheet" href="style.css?v8" media="all" />
<link rel="icon" href="img/favicon.png">
<script type="text/javascript" src="forms.js"></script>
<script type="text/javascript" src="toggle-dark-mode.js"></script>
<script type="text/javascript" src="forms.js?v1"></script>
<script type="text/javascript" src="toggle-dark-mode.js?v1"></script>
</head>
<body>
@@ -13,6 +13,7 @@
</div>
<div id="overlay">
<div class="loader"></div>
<iframe name="overlay-log" id="overlay-log"></iframe>
</div>
<button id="theme-toggle" onclick="toggleTheme()">
<span id="theme-icon"></span>

Some files were not shown because too many files have changed in this diff Show More