Compare commits

...

145 Commits

Author SHA1 Message Date
Zoey
3ef61ade4d Merge branch 'main' into copilot/fix-issue-comment-4099645562
Signed-off-by: Zoey <zoey@z0ey.de>
2026-04-12 14:01:22 +02:00
Simon L.
d8d54fb9b5 Merge pull request #7889 from nextcloud/aio-dependency-update
PHP dependency updates
2026-04-10 15:08:47 +02:00
Simon L.
04eeca91cc Merge pull request #7890 from nextcloud/caddyfile-le-challenge-comment
Add an explanation why we disable the HTTP challenge in that Caddy instance
2026-04-10 15:03:27 +02:00
Pablo Zmdl
3f11a48657 Update Containers/apache/Caddyfile
Co-authored-by: Simon L. <szaimen@e.mail.de>
Signed-off-by: Pablo Zmdl <57864086+pabzm@users.noreply.github.com>
2026-04-10 14:56:44 +02:00
Pablo Zmdl
0a96759c72 Add an explanation why we disable the HTTP challenge in that Caddy instance
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-04-10 14:51:51 +02:00
szaimen
13c194716d php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-10 12:13:21 +00:00
Simon L.
0b4e9ab520 Merge pull request #7886 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.5.5-fpm-alpine3.23
build(deps): bump php from 8.5.4-fpm-alpine3.23 to 8.5.5-fpm-alpine3.23 in /Containers/mastercontainer
2026-04-10 08:32:49 +02:00
dependabot[bot]
c2fd040d06 build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.5.4-fpm-alpine3.23 to 8.5.5-fpm-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-10 04:17:04 +00:00
Simon L.
d67a6da456 Merge pull request #7856 from nextcloud/aio-dependency-update
PHP dependency updates
2026-04-09 14:51:28 +02:00
Simon L.
5079acfa21 Merge pull request #7823 from nextcloud/acme-shortlived-profile
use acme shortlived profile
2026-04-09 14:35:37 +02:00
Simon L.
e563102339 Merge pull request #7863 from nextcloud/time-punish-failed-logins
aio-interface: Punish failed login attempts with a delay
2026-04-09 14:35:22 +02:00
szaimen
e9e22cd3c5 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-09 12:16:06 +00:00
Simon L.
11fcb7d25e Merge pull request #7872 from nextcloud/dependabot/docker/Containers/fulltextsearch/elasticsearch-8.19.14
build(deps): bump elasticsearch from 8.19.13 to 8.19.14 in /Containers/fulltextsearch
2026-04-09 12:52:25 +02:00
Simon L.
8a1c9b7369 Merge pull request #7870 from nextcloud/grotax/exporter
Update Prometheus Nextcloud Exporter to 0.9.1
2026-04-09 12:52:14 +02:00
Simon L.
12ad9b8c4d Merge pull request #7869 from nextcloud/dependabot/docker/Containers/watchtower/golang-1.26.2-alpine3.23
build(deps): bump golang from 1.26.1-alpine3.23 to 1.26.2-alpine3.23 in /Containers/watchtower
2026-04-09 12:52:01 +02:00
Simon L.
228a2a2372 Merge pull request #7868 from nextcloud/dependabot/docker/Containers/mastercontainer/docker-29.4.0-cli
build(deps): bump docker from 29.3.1-cli to 29.4.0-cli in /Containers/mastercontainer
2026-04-09 12:51:48 +02:00
Simon L.
dd53793f13 Merge pull request #7867 from nextcloud/dependabot/docker/Containers/imaginary/golang-1.26.2-alpine3.23
build(deps): bump golang from 1.26.1-alpine3.23 to 1.26.2-alpine3.23 in /Containers/imaginary
2026-04-09 12:51:37 +02:00
Simon L.
a26a3235d7 Merge pull request #7821 from nextcloud/watchtower-container-update
watchtower container update
2026-04-09 12:51:22 +02:00
derStephan
dd707478d0 aio-caddy: add description of new feature how to add caddy imports via Nextcloud (#7835)
Signed-off-by: derStephan <derStephan@users.noreply.github.com>
Co-authored-by: Simon L. <szaimen@e.mail.de>
2026-04-09 12:50:13 +02:00
Simon L.
784cb111d1 Merge pull request #7875 from nextcloud/aio-helm-update
Helm Chart updates
2026-04-09 11:58:54 +02:00
szaimen
e73e5abb4c Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-09 09:55:16 +00:00
Simon L.
85c28415eb Merge pull request #7708 from nextcloud/aio-yaml-update
Yaml updates
2026-04-09 11:52:27 +02:00
dependabot[bot]
088cfce5f3 build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 8.19.13 to 8.19.14.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 04:16:17 +00:00
szaimen
ccd94dfaf7 watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-08 12:25:55 +00:00
szaimen
7256f96dcd Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-08 12:15:49 +00:00
Benjamin Brahmer
fc9a7769b4 Update Prometheus Nextcloud Exporter to 0.9.1
Signed-off-by: Benjamin Brahmer <info@b-brahmer.de>
2026-04-08 09:53:24 +02:00
Simon L.
af57ffc29d Merge pull request #7866 from Croydon/readme
Readme: Fix broken OCC security link
2026-04-08 09:24:16 +02:00
dependabot[bot]
a2531182d1 build(deps): bump golang in /Containers/watchtower
Bumps golang from 1.26.1-alpine3.23 to 1.26.2-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-08 04:17:54 +00:00
dependabot[bot]
83a77ae625 build(deps): bump docker in /Containers/mastercontainer
Bumps docker from 29.3.1-cli to 29.4.0-cli.

---
updated-dependencies:
- dependency-name: docker
  dependency-version: 29.4.0-cli
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-08 04:17:00 +00:00
dependabot[bot]
67515899e2 build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.26.1-alpine3.23 to 1.26.2-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-08 04:16:54 +00:00
Michael Keck
f57d0becd0 Readme: Fix broken OCC security link
Signed-off-by: Michael Keck <git@cr0ydon.com>
2026-04-07 21:25:51 +02:00
Pablo Zmdl
b67b3bbe15 Also punish failed logins via GET and URL-token
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-04-07 15:08:01 +02:00
Pablo Zmdl
bc968d18e6 Punish failed login attempts with a delay
This is a very simple means against bots, until we find the time to discuss
and implement something better.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-04-07 14:52:55 +02:00
Simon L.
b9b622755b increase to 12.9.2
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-07 11:37:52 +02:00
Simon L.
b7bf642ad8 Merge pull request #7851 from nextcloud/alan/fix-7850-avoid-post-resend-popup
aio-interface: avoid `Resend` popups on Firefox on start/stop containers
2026-04-07 11:37:20 +02:00
Alan Savage
0bad0849c1 Avoid Resend popups on Firefox on start/stop containers
Use `location.reload(true)` instead of `reload` or `reload(1)`
to ensure we use a GET request.

See also:
https://stackoverflow.com/a/41122753
https://developer.mozilla.org/en-US/docs/Web/API/Location/reload#forceget

Fixes #7850

Signed-off-by: Alan Savage <3028205+asavageiv@users.noreply.github.com>
2026-04-02 10:55:25 -07:00
Simon L.
1a7feba6bd Merge pull request #7845 from nextcloud/enh/noid/fix-automatic-reloading
aio-interface: fix page not automatic reloading after container starting progress spinner
2026-04-02 14:17:06 +02:00
Simon L.
7a9bab5776 aio-interface: fix page not automatic reloading after container starting progress spinner
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-02 14:06:39 +02:00
Simon L.
e45d34ab50 Merge pull request #7844 from nextcloud/enh/noid/disable-redirects
internal.Caddyfile: disable auto redirects
2026-04-02 13:52:52 +02:00
Simon L.
41c677abd9 internal.Caddyfile: disable auto redirects
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-02 13:50:47 +02:00
Simon L.
dbf796aba3 Merge pull request #7842 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2026-04-02 13:20:30 +02:00
szaimen
a85641ceb9 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-02 11:19:39 +00:00
Simon L.
39d3a73088 Merge pull request #7837 from nextcloud/enh/7808/clarify-port-80
readme: clarify for which use case port 80 is used
2026-04-02 12:06:27 +02:00
Simon L.
c7f0aa8a19 Merge pull request #7840 from nextcloud/hash-equal
aio-interface: Use timeing-safe password comparison
2026-04-02 10:26:00 +02:00
Simon L.
2eeada43b5 Merge pull request #7839 from nextcloud/regenerate-session-id
aio-interface: regenerate session id on login to avoid session fixation attacks
2026-04-02 10:24:40 +02:00
Simon L.
1bbda0a5ce Merge pull request #7838 from nextcloud/enh/noid/caddy-internal
caddy-internal: adjust to different root path to separate from the acme caddy
2026-04-02 10:05:36 +02:00
Simon L.
af9e983b04 caddy-internal: adjust to different root path to separate from the acme caddy
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-02 10:01:03 +02:00
Simon L.
1d2149241d readme: clarify for which use case port 80 is used
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-02 09:45:31 +02:00
Simon L.
b9ec0f2ffe Merge pull request #7836 from nextcloud/aio-dependency-update
PHP dependency updates
2026-04-01 21:38:51 +02:00
szaimen
3586dbedb0 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-01 12:14:25 +00:00
Pablo Zmdl
2a7c686247 Use timeing-safe password comparison
AI-assistant: Copilot v1.0.7 (Claude Opus 4.6)

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-31 23:56:03 +02:00
Pablo Zmdl
f9e6339044 Regenerate session id on login to avoid session fixation attacks
AI-assistant: Copilot v1.0.7 (Claude Opus 4.6)

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-31 23:54:56 +02:00
Simon L.
bb4790ed3a increase to 12.9.1
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-27 13:32:11 +01:00
Simon L.
b21b5535f2 Merge pull request #7827 from nextcloud/revert-7655-enh/7654/hide-harp
aio-interface: show harp again
2026-03-27 13:30:45 +01:00
Simon L.
75e18bb40a aio-interface: make Harp visible again
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-27 13:24:05 +01:00
Simon L.
4591d112c3 Merge pull request #7826 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2026-03-27 13:21:49 +01:00
Simon L.
250f5cbe37 Merge pull request #7806 from nextcloud/fix-responsive-log-view
Fix log viewer on small screens
2026-03-27 13:19:40 +01:00
Simon L.
c0cabcf73f Merge pull request #7824 from nextcloud/dependabot/docker/Containers/mastercontainer/docker-29.3.1-cli
build(deps): bump docker from 29.3.0-cli to 29.3.1-cli in /Containers/mastercontainer
2026-03-27 13:19:25 +01:00
Simon L.
7deafec42d Merge pull request #7818 from nextcloud/dependabot/docker/Containers/talk/nats-2.12.6-scratch
build(deps): bump nats from 2.12.5-scratch to 2.12.6-scratch in /Containers/talk
2026-03-27 13:18:51 +01:00
Simon L.
a79b3475c4 Merge pull request #7817 from nextcloud/dependabot/docker/Containers/redis/redis-8.6.2-alpine
build(deps): bump redis from 8.6.1-alpine to 8.6.2-alpine in /Containers/redis
2026-03-27 13:18:29 +01:00
Simon L.
aa670af518 Merge pull request #7816 from hartmann-daniel/patch-1
smbserver: update json to enable the check of filesystem changes automatically
2026-03-27 13:18:10 +01:00
szaimen
960fe801df nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-27 12:16:30 +00:00
Simon L.
80c7e90ab4 Merge pull request #7822 from SomeMichael/patch-1
Update Docker rootless documentation
2026-03-26 11:19:19 +01:00
dependabot[bot]
bc9817873c build(deps): bump docker in /Containers/mastercontainer
Bumps docker from 29.3.0-cli to 29.3.1-cli.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 04:07:17 +00:00
Zoey
b578322d16 change default acme profile (2/2)
Signed-off-by: Zoey <zoey@z0ey.de>
2026-03-25 20:49:05 +01:00
Zoey
4ac496b89c change default acme profile (1/2)
Signed-off-by: Zoey <zoey@z0ey.de>
2026-03-25 20:48:21 +01:00
SomeMichael
cfea3ef7e6 Update Docker rootless documentation
Updated exposing privileged ports link

Signed-off-by: SomeMichael <43578183+SomeMichael@users.noreply.github.com>
2026-03-25 19:43:22 +01:00
copilot-swe-agent[bot]
3d322e2fe2 Move security headers from Caddyfiles to PHP middleware
- Add SecurityHeadersMiddleware that sets Content-Security-Policy,
  X-Content-Type-Options, X-Frame-Options, X-Permitted-Cross-Domain-Policies,
  X-DNS-Prefetch-Control, Referrer-Policy, and X-Robots-Tag on all responses
- Register SecurityHeadersMiddleware in index.php
- Add click-handlers.js for CSP-compliant event handling (data-confirm,
  data-stop-event-propagation)
- Update toggle-dark-mode.js to attach click handler via addEventListener
- Remove inline onclick from theme toggle button in layout.twig
- Replace all inline onclick with data-confirm in containers.twig,
  community-containers.twig, and optional-containers.twig

Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/d87889ba-d2ad-4d76-b257-2afd725dac28
2026-03-25 11:39:40 +00:00
dependabot[bot]
3838c49834 build(deps): bump nats in /Containers/talk
Bumps nats from 2.12.5-scratch to 2.12.6-scratch.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 04:08:02 +00:00
dependabot[bot]
188f0f89a0 build(deps): bump redis in /Containers/redis
Bumps redis from 8.6.1-alpine to 8.6.2-alpine.

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 8.6.2-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 04:07:47 +00:00
Daniel Hartmann
ee41f1814f Update smbserver.json
Activate filesystem_check_changes
https://github.com/szaimen/aio-smbserver/issues/27

Signed-off-by: Daniel Hartmann <60435198+hartmann-daniel@users.noreply.github.com>
2026-03-24 23:18:02 +01:00
Simon L.
c777cbaf45 Merge pull request #7809 from nextcloud/dependabot/github_actions/dot-github/workflows/astral-sh/setup-uv-7.6.0
build(deps): bump astral-sh/setup-uv from 7.3.1 to 7.6.0 in /.github/workflows
2026-03-24 15:39:35 +01:00
dependabot[bot]
1739ab0a7b build(deps): bump astral-sh/setup-uv in /.github/workflows
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.1 to 7.6.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](5a095e7a20...37802adc94)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-24 12:06:03 +00:00
Pablo Zmdl
74693303a3 Force loading of changed JS despite possible caches
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-24 08:03:37 +01:00
Pablo Zmdl
387b39099f Fix log viewer on small screens
Previously it showed a lot of white space at the bottom, and the floating box
didn't stick. Both is now fixed.

AI-assistant: Copilot v1.0.7 (Claude Sonnet 4.6)

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-23 13:39:04 +01:00
Simon L.
7c8cabdb2d Merge pull request #7802 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-25.04.9.4.1
build(deps): bump collabora/code from 25.04.9.3.1 to 25.04.9.4.1 in /Containers/collabora
2026-03-23 08:43:13 +01:00
dependabot[bot]
7049448541 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.9.3.1 to 25.04.9.4.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 04:08:55 +00:00
Simon L.
35dd0a2c00 Merge pull request #7762 from nextcloud/alan/fix-wopi
fix collabora not working anymore
2026-03-20 16:06:04 +01:00
Simon L.
fbe60b852c Merge pull request #7763 from nextcloud/alan/fix-bypass
aio-interface: Fix bypass_container_update when not detected as available
2026-03-20 16:05:44 +01:00
Alan Savage
5782a01b7f Fix bypass_container_update when not detected as available
isAnyUpdateAvailable is not necessarily synced with the PullImage
logic from DockerActionManager. This ensures no images are pulled
regardless of detection.

There's also a minor code improvement to avoid unnecessary interpolation.

Signed-off-by: Alan Savage <3028205+asavageiv@users.noreply.github.com>
2026-03-20 15:42:54 +01:00
Alan Savage
46b325f2bd Workaround #7757 with nextcloud-aio-apache FQDN
CollaboraOnline/online/pull/13869 prevents http://nextcloud-aio-apache:23973 from
being correctly recognized as a valid URI and thus breaks matching as an
authorized WOPI host.

This uses http://nextcloud-aio-apache.nextcloud-aio:23973 which is correctly
recognized as a valid URI.

Signed-off-by: Alan Savage <3028205+asavageiv@users.noreply.github.com>
2026-03-20 15:42:49 +01:00
Copilot
05f9fa0e25 Fix playwright CI tests broken by Apache→Caddy switch (#7795)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
2026-03-20 15:27:54 +01:00
Simon L.
443f3a4bee Merge pull request #6168 from nextcloud/enh/noid/update-qa-tests
QA-tests: update some sections and details
2026-03-20 13:35:00 +01:00
Simon L.
d280786934 QA-tests: update some details
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-Authored-By: szaimen <42591237+szaimen@users.noreply.github.com>
2026-03-20 13:34:16 +01:00
Simon L.
253df4ee0c Merge pull request #7789 from nextcloud/automated/noid/psalm-baseline-update
[Automated] Update psalm-baseline.xml
2026-03-20 09:41:01 +01:00
Simon L.
8073f3c562 Merge pull request #7788 from nextcloud/dependabot/docker/Containers/fulltextsearch/elasticsearch-8.19.13
build(deps): bump elasticsearch from 8.19.12 to 8.19.13 in /Containers/fulltextsearch
2026-03-20 09:40:44 +01:00
Simon L.
a3dac35edb Merge pull request #7787 from nextcloud/dependabot/docker/Containers/docker-socket-proxy/haproxy-3.3.6-alpine
build(deps): bump haproxy from 3.3.5-alpine to 3.3.6-alpine in /Containers/docker-socket-proxy
2026-03-20 09:40:26 +01:00
nextcloud-command
b222639bbd Update psalm baseline
Signed-off-by: GitHub <noreply@github.com>
2026-03-20 04:40:46 +00:00
dependabot[bot]
a5d4f2dd88 build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 8.19.12 to 8.19.13.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 04:06:40 +00:00
dependabot[bot]
51c7b270b4 build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.3.5-alpine to 3.3.6-alpine.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 04:06:36 +00:00
Simon L.
754a317fea Merge pull request #7783 from nextcloud/revert-7769-enh/7765/refactor-network-creation
Revert "mastercontainer: create the nextcloud-aio network during start.sh and attach mastercontainer to it"
2026-03-19 14:24:30 +01:00
Simon L.
7f35ee5fbb Revert "mastercontainer: create the nextcloud-aio network during start.sh and attach mastercontainer to it" 2026-03-19 14:22:13 +01:00
Simon L.
b7b6cc8a16 Merge pull request #7781 from nextcloud/dependabot/composer/php/vimeo/psalm-6.16.1
build(deps-dev): bump vimeo/psalm from 6.16.0 to 6.16.1 in /php
2026-03-19 13:52:28 +01:00
Simon L.
7dc489168a psalm: revert changes
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-19 13:51:12 +01:00
dependabot[bot]
d71683ff38 build(deps-dev): bump vimeo/psalm from 6.16.0 to 6.16.1 in /php
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 6.16.0 to 6.16.1.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/6.16.0...6.16.1)

---
updated-dependencies:
- dependency-name: vimeo/psalm
  dependency-version: 6.16.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 12:03:55 +00:00
Simon L.
d4743d9800 Merge pull request #7769 from nextcloud/enh/7765/refactor-network-creation
mastercontainer: create the nextcloud-aio network during start.sh and attach mastercontainer to it
2026-03-19 12:54:43 +01:00
Simon L.
f1b635c196 Merge pull request #7777 from nextcloud/enh/noid/fix-health-check
mastercontainer: fix health-check
2026-03-19 12:54:13 +01:00
Simon L.
ecd85281cc Merge pull request #7779 from nextcloud/enh/7778/remote-host-login-endpoints
mastercontainer: use remote-host caddy plugin only for login endpoints
2026-03-19 12:53:28 +01:00
Simon L.
558e8735b5 mastercontainer: create the nextcloud-aio network during start.sh and attach mastercontainer to it
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-19 12:49:33 +01:00
Simon L.
e0ff3acb3d mastercontainer: use remote-host caddy plugin only for login endpoints
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-19 12:21:36 +01:00
Simon L.
4963558691 mastercontainer: fix health-check
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-19 11:39:14 +01:00
Simon L.
90d5d6bcf1 Merge pull request #7756 from nextcloud/aio-dependency-update
PHP dependency updates
2026-03-19 11:28:15 +01:00
Simon L.
b19c6dfddb Merge pull request #7731 from nextcloud/enh/noid/move-appdata-dir
readme: add section how to move the appdata folder from the datadir to an ssd to improve the performance
2026-03-19 11:27:04 +01:00
szaimen
904921c815 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-19 09:14:59 +00:00
Simon L.
7d63b13a40 Merge pull request #7775 from nextcloud/automated/noid/psalm-baseline-update
[Automated] Update psalm-baseline.xml
2026-03-19 10:13:03 +01:00
nextcloud-command
83102e46b2 Update psalm baseline
Signed-off-by: GitHub <noreply@github.com>
2026-03-19 04:46:16 +00:00
Simon L.
9e49f81c43 Merge pull request #7772 from nextcloud/enh/noid/suppress-psalm
ignore psalm error
2026-03-18 20:02:13 +01:00
Pi-Farm
25a63abbc8 Merge pull request #7472 from pi-farm/cc_glances
New Community-Container: Glances
2026-03-18 20:01:24 +01:00
Simon L.
f1eeea9337 ignore psalm error
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-18 19:58:53 +01:00
Simon L.
156e55d0ad Merge pull request #7755 from nextcloud/dependabot/composer/php/vimeo/psalm-6.16.0
build(deps-dev): bump vimeo/psalm from 6.15.1 to 6.16.0 in /php
2026-03-18 18:25:08 +01:00
dependabot[bot]
c5501c885d build(deps-dev): bump vimeo/psalm from 6.15.1 to 6.16.0 in /php
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 6.15.1 to 6.16.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/6.15.1...6.16.0)

---
updated-dependencies:
- dependency-name: vimeo/psalm
  dependency-version: 6.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-18 18:10:41 +01:00
Simon L.
de7b5cd8e4 Merge pull request #7767 from nextcloud/watchtower-container-update
watchtower container update
2026-03-18 18:03:56 +01:00
Simon L.
d6981be067 Merge pull request #7768 from nextcloud/fix-streaming-responses-in-caddy
aio-interface: fix streaming responses in Caddy
2026-03-18 18:00:38 +01:00
Simon L.
0755000456 fix typo
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-18 17:56:37 +01:00
Pablo Zmdl
b169790488 Fix streaming responses in Caddy
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-18 17:53:54 +01:00
Simon L.
9a6b74dd16 Merge pull request #7771 from nextcloud/enh/noid/fix-psalm-2
second attempt to fix psalm
2026-03-18 17:53:42 +01:00
Simon L.
b28572e67f second attempt to fix psalm
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-18 17:50:34 +01:00
Simon L.
8b2a4c057a Merge pull request #7770 from nextcloud/enh/7766/fix-psalm
try to fix psalm
2026-03-18 17:42:45 +01:00
Simon L.
669ea45749 fix psalm
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-18 17:42:05 +01:00
szaimen
1e76d39742 watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-18 12:23:46 +00:00
Simon L.
c2e7990d33 increase to 12.9.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-17 13:10:37 +01:00
Simon L.
1821e695aa Merge pull request #7753 from Fs00/collabora-flags
Tweak Collabora params to disable background update checks and notifications
2026-03-17 12:08:16 +01:00
Simon L.
d761f22fa1 address review
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-17 11:53:35 +01:00
Simon L.
3738890c05 Merge pull request #7754 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-25.04.9.3.1
build(deps): bump collabora/code from 25.04.9.2.1 to 25.04.9.3.1 in /Containers/collabora
2026-03-17 09:22:25 +01:00
dependabot[bot]
726e639f0b build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 25.04.9.2.1 to 25.04.9.3.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-17 04:06:30 +00:00
Francesco Saltori
8bac8f029f Remove unused MKNOD capability from Collabora container
Signed-off-by: Francesco Saltori <francescosaltori@gmail.com>
2026-03-16 22:01:14 +01:00
Francesco Saltori
828b7784f7 Disable Collabora update checks and notifications
Signed-off-by: Francesco Saltori <francescosaltori@gmail.com>
2026-03-16 22:00:01 +01:00
Simon L.
0cb0d86471 Merge pull request #7705 from nextcloud/enh/noid/show-stop-and-starting-state
DockerController: refactor `StartBackupContainerBackup` to show the stopping and starting state
2026-03-16 18:03:25 +01:00
Simon L.
1b69fb88ae readme: add section how to move the appdata folder from the datadir to an ssd to improve the performance
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-16 14:04:03 +01:00
Simon L.
6fd537cd5d Merge pull request #7749 from nextcloud/aio-dependency-update
PHP dependency updates
2026-03-16 13:59:22 +01:00
szaimen
11dbc4978d php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-16 12:12:24 +00:00
Simon L.
43de29e071 Merge pull request #7743 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.5.4-fpm-alpine3.23
build(deps): bump php from 8.5.3-fpm-alpine3.23 to 8.5.4-fpm-alpine3.23 in /Containers/mastercontainer
2026-03-13 08:30:26 +01:00
Simon L.
eed853e942 Merge pull request #7744 from nextcloud/dependabot/docker/Containers/talk/strukturag/nextcloud-spreed-signaling-2.1.1
build(deps): bump strukturag/nextcloud-spreed-signaling from 2.1.0 to 2.1.1 in /Containers/talk
2026-03-13 08:27:01 +01:00
dependabot[bot]
bdb8e171f7 build(deps): bump strukturag/nextcloud-spreed-signaling
Bumps strukturag/nextcloud-spreed-signaling from 2.1.0 to 2.1.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 04:08:31 +00:00
dependabot[bot]
68c5dc8d60 build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.5.3-fpm-alpine3.23 to 8.5.4-fpm-alpine3.23.

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 04:07:53 +00:00
Simon L.
dfe7eb7ec1 Merge pull request #7721 from nextcloud/enh/7664/backup-restore
DockerController: refactor `StartBackupContainerRestore` to show the stopping and starting state
2026-03-12 18:35:47 +01:00
Simon L.
2016789bea Merge pull request #7741 from nextcloud/hide-from-list
Give all containers a display_name, hide from list by dedicated attribute
2026-03-12 18:31:14 +01:00
Simon L.
b0969d9644 Merge pull request #7723 from nextcloud/enh/7664/backup-list
DockerController: refactor `StartBackupContainerList` to show the starting state
2026-03-12 18:24:09 +01:00
Pablo Zmdl
6e8c8dab19 Reorder arguments
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-12 17:34:51 +01:00
Simon L.
1e23c1a6dd apply suggestions by @pabzm
Co-authored-by: Pablo Zmdl <57864086+pabzm@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-12 16:20:17 +01:00
Pablo Zmdl
9ce33d1d1d Fix JSON syntax error
Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-12 15:55:56 +01:00
Pablo Zmdl
d86eee5847 Give all containers a display_name, hide from list by dedicated attribute
We want a display-name for all containers in the overlay-log, but still want
to exclude some containers from the list on top of the web UI.

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-03-12 15:44:19 +01:00
Simon L.
c45913a6ff DockerController: refactor StartBackupContainerListto show the starting state
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-09 18:07:46 +01:00
Simon L.
e561fad2af DockerController: refactor StartBackupContainerRestore to show the stopping and starting state
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-09 17:55:50 +01:00
Simon L.
6e87758ba9 DockerController: refactor StartBackupContainerBackup to show the stopping and starting state
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-06 10:42:08 +01:00
75 changed files with 491 additions and 233 deletions

View File

@@ -36,7 +36,7 @@ jobs:
line-length: warning
- name: Install the latest version of uv
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- name: Check GitHub actions
run: uvx zizmor --min-severity medium .github/workflows/*.yml

View File

@@ -18,6 +18,7 @@ jobs:
php-version: 8.5
extensions: apcu
coverage: none
ini-file: development
- name: Run script
run: |

View File

@@ -43,8 +43,7 @@ jobs:
extensions: apcu
coverage: none
ini-file: development
# Temporary workaround for missing pcntl_* in PHP 8.3
ini-values: disable_functions=
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -15,7 +15,7 @@
}
https://{$ADDITIONAL_TRUSTED_DOMAIN}:443,
http://{$APACHE_HOST}:23973, # For Collabora callback and WOPI requests, see containers.json
http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI requests, see containers.json
{$PROTOCOL}://{$NC_DOMAIN}:{$APACHE_PORT} {
header -Server
header -X-Powered-By
@@ -74,6 +74,9 @@ http://{$APACHE_HOST}:23973, # For Collabora callback and WOPI requests, see con
# TLS options
tls {
issuer acme {
profile shortlived
# Disable HTTP challenge because that would require port 80, which we don't get (it's exposed to the mastercontainer).
# This container by default only exposes port 443 if not configured otherwise via APACHE_PORT.
disable_http_challenge
}
}

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From a file located probably somewhere here: https://github.com/CollaboraOnline/online/blob/master/docker/from-packages/Dockerfile
FROM collabora/code:25.04.9.2.1
FROM collabora/code:25.04.9.4.1
USER root
ARG DEBIAN_FRONTEND=noninteractive

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM haproxy:3.3.5-alpine
FROM haproxy:3.3.6-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.12
FROM elasticsearch:8.19.14
USER root

View File

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

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
FROM docker:29.3.0-cli AS docker
FROM docker:29.4.0-cli AS docker
ARG CADDY_REMOTE_HOST_HASH=b21775afa730ffb52a24ddff310c8a6d1fd37276
@@ -11,7 +11,7 @@ RUN set -ex; \
/usr/bin/caddy list-modules
# From https://github.com/docker-library/php/blob/master/8.5/alpine3.23/fpm/Dockerfile
FROM php:8.5.3-fpm-alpine3.23
FROM php:8.5.5-fpm-alpine3.23
EXPOSE 80
EXPOSE 8080

View File

@@ -17,7 +17,8 @@
}
servers {
protocols h1 h2 h2c
# Only h1 is allowed as we prevent `ERR_NETWORK_CHANGED` from happening
protocols h1
}
on_demand_tls {
@@ -32,17 +33,20 @@ http://:80 {
}
https://:8443 {
@denied remote_host nextcloud-aio-nextcloud
@denied {
path /api/auth/login /api/auth/getlogin
remote_host nextcloud-aio-nextcloud
}
abort @denied
root * /var/www/docker-aio/php/public
encode
php_fastcgi unix//run/php.sock
file_server
tls {
on_demand
issuer acme {
profile shortlived
disable_tlsalpn_challenge
}
}

View File

@@ -4,6 +4,6 @@ if [ -f "/mnt/docker-aio-config/data/configuration.json" ]; then
nc -z 127.0.0.1 80 || exit 1
nc -z 127.0.0.1 8080 || exit 1
nc -z 127.0.0.1 8443 || exit 1
[ -f /run/php.sock ] || exit 1
test -S /run/php.sock || exit 1
nc -z 127.0.0.1 9876 || exit 1
fi

View File

@@ -1,8 +1,11 @@
{
admin off
# auto_https will be handled manually in acme.Caddyfile
auto_https disable_redirects
storage file_system {
root /mnt/docker-aio-config/caddy/
root /mnt/docker-aio-config/caddy-internal/
}
log {
@@ -13,18 +16,21 @@
}
servers {
protocols h1 h2
# Only h1 is allowed as we prevent `ERR_NETWORK_CHANGED` from happening
protocols h1
}
skip_install_trust
}
https://:8080 {
@denied remote_host nextcloud-aio-nextcloud
@denied {
path /api/auth/login /api/auth/getlogin
remote_host nextcloud-aio-nextcloud
}
abort @denied
root * /var/www/docker-aio/php/public
encode
php_fastcgi unix//run/php.sock
file_server

View File

@@ -364,6 +364,7 @@ fi
mkdir -p /mnt/docker-aio-config/data/
mkdir -p /mnt/docker-aio-config/session/
mkdir -p /mnt/docker-aio-config/caddy/
mkdir -p /mnt/docker-aio-config/caddy-internal/
# Adjust permissions for all instances
chmod 770 -R /mnt/docker-aio-config
@@ -371,6 +372,7 @@ chmod 777 /mnt/docker-aio-config
chown www-data:www-data -R /mnt/docker-aio-config/data/
chown www-data:www-data -R /mnt/docker-aio-config/session/
chown www-data:www-data -R /mnt/docker-aio-config/caddy/
chown www-data:www-data -R /mnt/docker-aio-config/caddy-internal/
print_green "Initial startup of Nextcloud All-in-One complete!
You should be able to open the Nextcloud AIO Interface now on port 8080 of this server!

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.6
ENV NEXTCLOUD_VERSION=32.0.8
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!

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.6.1-alpine
FROM redis:8.6.2-alpine
COPY --chmod=775 start.sh /start.sh

View File

@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:latest
FROM nats:2.12.5-scratch AS nats
FROM nats:2.12.6-scratch AS nats
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.1.0 AS signaling
FROM strukturag/nextcloud-spreed-signaling:2.1.1 AS signaling
FROM alpine:3.23.3 AS janus
ARG JANUS_VERSION=v1.4.0

View File

@@ -1,13 +1,13 @@
# syntax=docker/dockerfile:latest
FROM golang:1.26.1-alpine3.23 AS go
FROM golang:1.26.2-alpine3.23 AS go
ENV WATCHTOWER_COMMIT_HASH=2a3fe10ad86f36a7f208105bbe1fb29e51caac5b
ENV WATCHTOWER_COMMIT_HASH=652c89577076f6bc6f2af4465217589641216ee3
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.3
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.16.1
FROM alpine:3.23.3

View File

@@ -16,7 +16,8 @@ This container bundles caddy and auto-configures it for you. It also covers [vau
- 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!
- You can add your own Caddy configurations in `/data/caddy-imports/` inside the Caddy container (`sudo docker exec -it nextcloud-aio-caddy bash`). These will be imported on container startup. **Please note:** If you do not have CLI access to the server, you can now run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
- You can add your own Caddy configurations in the folder `nextcloud-aio-caddy/caddy-imports` in the files app of the default `admin` user. You need to create that folder manually. These will be imported on container startup.
- You can alternatively add your own Caddy configurations in `/data/caddy-imports/` inside the Caddy container (`sudo docker exec -it nextcloud-aio-caddy bash`). These will be imported on container startup. **Please note:** If you do not have CLI access to the server use the previous option or run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
- If you want to remove the container again and revert back to the default, you need to disable the container via the AIO-interface and follow https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#8-removing-the-reverse-proxy

View File

@@ -0,0 +1,38 @@
{
"aio_services_v1": [
{
"container_name": "nextcloud-aio-glances",
"display_name": "Glances",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/glances",
"image": "nicolargo/glances",
"image_tag": "latest-full",
"internal_port": "61208",
"restart": "unless-stopped",
"ports": [
{
"ip_binding": "",
"port_number": "61208",
"protocol": "tcp"
}
],
"volumes": [
{
"source": "nextcloud_aio_glances",
"destination": "/etc/glances",
"writeable": true
},
{
"source": "%WATCHTOWER_DOCKER_SOCKET_PATH%",
"destination": "/var/run/docker.sock",
"writeable": false
}
],
"environment": [
"GLANCES_OPT=-w"
],
"backup_volumes": [
"nextcloud_aio_glances"
]
}
]
}

View File

@@ -0,0 +1,18 @@
## Glances
This container starts Glances, a web-based info-board, and auto-configures it for you.
> [!CAUTION]
> This container mounts the docker-socket from the host-system.
### Notes
- After adding and starting the container, you can directly visit http://ip.address.of.server:61208/ and access your new Glances instance!
- It is recommended to start this container only in home networks, because there is no built-in authentication. But you can do a http-auth with your proxy.
- In order to access your Glances 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).
- The data of Glances 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/nicolargo/glances
### Maintainer
https://github.com/pi-farm

View File

@@ -5,7 +5,7 @@
"display_name": "Prometheus Nextcloud Exporter",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter",
"image": "ghcr.io/xperimental/nextcloud-exporter",
"image_tag": "0.9.0",
"image_tag": "0.9.1",
"internal_port": "9205",
"restart": "unless-stopped",
"ports": [

View File

@@ -54,6 +54,9 @@
"ui_secret": "SMBSERVER_PASSWORD",
"backup_volumes": [
"nextcloud_aio_smbserver"
],
"nextcloud_exec_commands": [
"php /var/www/html/occ config:system:set filesystem_check_changes --value=1 --type=integer"
]
}
]

View File

@@ -9,7 +9,7 @@ You can run AIO with docker rootless by following the steps below.
1. If you need ipv6 support, you should enable it by following https://github.com/nextcloud/all-in-one/blob/main/docker-ipv6-support.md.
1. Do not forget to set the mentioned environmental variables `PATH` and `DOCKER_HOST` and in best case add them to your `~/.bashrc` file as shown!
1. Also do not forget to run `loginctl enable-linger USERNAME` (and substitute USERNAME with the correct one) in order to make sure that user services are automatically started after every reboot.
1. Expose the privileged ports by following https://docs.docker.com/engine/security/rootless/#exposing-privileged-ports. (`sudo setcap cap_net_bind_service=ep $(which rootlesskit); systemctl --user restart docker`). If you require the correct source IP you must expose them via `/etc/sysctl.conf`, [see note below](#note-regarding-docker-network-driver).
1. Expose the privileged ports by following https://docs.docker.com/engine/security/rootless/tips/#exposing-privileged-ports. (`sudo setcap cap_net_bind_service=ep $(which rootlesskit); systemctl --user restart docker`). If you require the correct source IP you must expose them via `/etc/sysctl.conf`, [see note below](#note-regarding-docker-network-driver).
1. Use the official AIO startup command but use `--volume $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock:ro` instead of `--volume /var/run/docker.sock:/var/run/docker.sock:ro` and also add `--env WATCHTOWER_DOCKER_SOCKET_PATH=$XDG_RUNTIME_DIR/docker.sock` to the initial container startup (which is needed for mastercontainer updates to work correctly). When you are using Portainer to deploy AIO, the variable `$XDG_RUNTIME_DIR` is not available. In this case, it is necessary to manually add the path (e.g. `/run/user/1000/docker.sock`) to the Docker compose file to replace the `$XDG_RUNTIME_DIR` variable. If you are not sure how to get the path, you can run on the host: `echo $XDG_RUNTIME_DIR`.
1. Now everything should work like without docker rootless. You can consider using docker-compose for this or running it behind a reverse proxy. Basically the only thing that needs to be adjusted always in the startup command or compose.yaml file (after installing docker rootles) are things that are mentioned in point 3.
1. ⚠️ **Important:** Please read through all notes below!

View File

@@ -249,8 +249,8 @@ services:
expose:
- "9980"
environment:
- aliasgroup1=https://${NC_DOMAIN}:443,http://nextcloud-aio-apache:23973
- extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false --o:remote_font_config.url=https://${NC_DOMAIN}/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+
- aliasgroup1=https://${NC_DOMAIN}:443,http://nextcloud-aio-apache.nextcloud-aio:23973
- extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false --o:fetch_update_check=0 --o:allow_update_popup=false --o:remote_font_config.url=https://${NC_DOMAIN}/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+
- dictionaries=${COLLABORA_DICTIONARIES}
- TZ=${TIMEZONE}
- server_name=${NC_DOMAIN}
@@ -259,7 +259,6 @@ services:
profiles:
- collabora
cap_add:
- MKNOD
- SYS_ADMIN
- SYS_CHROOT
- FOWNER
@@ -283,6 +282,8 @@ services:
- ${TALK_PORT}:${TALK_PORT}/udp
expose:
- "8081"
volumes:
- ${NEXTCLOUD_TRUSTED_CACERTS_DIR}:/usr/local/share/ca-certificates:ro
environment:
- NC_DOMAIN
- TALK_HOST=nextcloud-aio-talk

View File

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

View File

@@ -63,7 +63,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: ghcr.io/nextcloud-releases/aio-apache:20260306_081319
image: ghcr.io/nextcloud-releases/aio-apache:20260409_094910
readinessProbe:
exec:
command:

View File

@@ -36,7 +36,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
image: ghcr.io/nextcloud-releases/aio-alpine:20260409_094910
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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-clamav:20260409_094910
readinessProbe:
exec:
command:

View File

@@ -28,17 +28,17 @@ spec:
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- name: aliasgroup1
value: https://{{ .Values.NC_DOMAIN }}:443,http://nextcloud-aio-apache:23973
value: https://{{ .Values.NC_DOMAIN }}:443,http://nextcloud-aio-apache.nextcloud-aio:23973
- name: dictionaries
value: "{{ .Values.COLLABORA_DICTIONARIES }}"
- name: extra_params
value: --o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false --o:remote_font_config.url=https://{{ .Values.NC_DOMAIN }}/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+
value: --o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false --o:fetch_update_check=0 --o:allow_update_popup=false --o:remote_font_config.url=https://{{ .Values.NC_DOMAIN }}/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+
- 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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260409_094910
{{- else }}
image: ghcr.io/nextcloud-releases/aio-collabora:20260306_081319
image: ghcr.io/nextcloud-releases/aio-collabora:20260409_094910
{{- end }}
readinessProbe:
exec:
@@ -63,7 +63,6 @@ spec:
securityContext:
capabilities:
add:
- MKNOD
- CAP_SYS_ADMIN
- SYS_CHROOT
- FOWNER

View File

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

View File

@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
image: ghcr.io/nextcloud-releases/aio-alpine:20260409_094910
command:
- chmod
- "777"
@@ -54,7 +54,7 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260306_081319
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260409_094910
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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-imaginary:20260409_094910
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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-alpine:20260409_094910
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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260409_094910
{{- 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

@@ -39,7 +39,7 @@ spec:
value: nextcloud-aio-nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-notify-push:20260306_081319
image: ghcr.io/nextcloud-releases/aio-notify-push:20260409_094910
readinessProbe:
exec:
command:

View File

@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260306_081319
image: ghcr.io/nextcloud-releases/aio-alpine:20260409_094910
command:
- chmod
- "777"
@@ -42,7 +42,7 @@ spec:
value: "{{ .Values.ONLYOFFICE_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260306_081319
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260409_094910
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:20260306_081319
image: ghcr.io/nextcloud-releases/aio-redis:20260409_094910
readinessProbe:
exec:
command:

View File

@@ -13,6 +13,8 @@ spec:
selector:
matchLabels:
io.kompose.service: nextcloud-aio-talk
strategy:
type: Recreate
template:
metadata:
annotations:
@@ -52,7 +54,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk:20260306_081319
image: ghcr.io/nextcloud-releases/aio-talk:20260409_094910
readinessProbe:
exec:
command:
@@ -84,4 +86,12 @@ spec:
{{- else }}
drop: ["NET_RAW"]
{{- end }}
volumeMounts:
- mountPath: /usr/local/share/ca-certificates
name: nextcloud-aio-nextcloud-trusted-cacerts
readOnly: true
volumes:
- name: nextcloud-aio-nextcloud-trusted-cacerts
persistentVolumeClaim:
claimName: nextcloud-aio-nextcloud-trusted-cacerts
{{- end }}

View File

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

View File

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

162
php/composer.lock generated
View File

@@ -448,16 +448,16 @@
},
{
"name": "laravel/serializable-closure",
"version": "v2.0.10",
"version": "v2.0.11",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669"
"reference": "d1af40ac4a6ccc12bd062a7184f63c9995a63bdd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669",
"reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/d1af40ac4a6ccc12bd062a7184f63c9995a63bdd",
"reference": "d1af40ac4a6ccc12bd062a7184f63c9995a63bdd",
"shasum": ""
},
"require": {
@@ -505,7 +505,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
"time": "2026-02-20T19:59:49+00:00"
"time": "2026-04-07T13:32:18+00:00"
},
{
"name": "nikic/fast-route",
@@ -1780,16 +1780,16 @@
},
{
"name": "twig/twig",
"version": "v3.23.0",
"version": "v3.24.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9"
"reference": "a6769aefb305efef849dc25c9fd1653358c148f0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
"reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0",
"reference": "a6769aefb305efef849dc25c9fd1653358c148f0",
"shasum": ""
},
"require": {
@@ -1799,7 +1799,8 @@
"symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
"phpstan/phpstan": "^2.0",
"php-cs-fixer/shim": "^3.0@stable",
"phpstan/phpstan": "^2.0@stable",
"psr/container": "^1.0|^2.0",
"symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
},
@@ -1843,7 +1844,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.23.0"
"source": "https://github.com/twigphp/Twig/tree/v3.24.0"
},
"funding": [
{
@@ -1855,7 +1856,7 @@
"type": "tidelift"
}
],
"time": "2026-01-23T21:00:41+00:00"
"time": "2026-03-17T21:31:11+00:00"
}
],
"packages-dev": [
@@ -2452,24 +2453,27 @@
},
{
"name": "amphp/serialization",
"version": "v1.0.0",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/amphp/serialization.git",
"reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1"
"reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1",
"reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1",
"url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0",
"reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.4"
},
"require-dev": {
"amphp/php-cs-fixer-config": "dev-master",
"phpunit/phpunit": "^9 || ^8 || ^7"
"amphp/php-cs-fixer-config": "^2",
"ext-json": "*",
"ext-zlib": "*",
"phpunit/phpunit": "^9",
"psalm/phar": "6.16.1"
},
"type": "library",
"autoload": {
@@ -2504,9 +2508,15 @@
],
"support": {
"issues": "https://github.com/amphp/serialization/issues",
"source": "https://github.com/amphp/serialization/tree/master"
"source": "https://github.com/amphp/serialization/tree/v1.1.0"
},
"time": "2020-03-25T21:39:07+00:00"
"funding": [
{
"url": "https://github.com/amphp",
"type": "github"
}
],
"time": "2026-04-05T15:59:53+00:00"
},
{
"name": "amphp/socket",
@@ -3247,20 +3257,20 @@
},
{
"name": "league/uri",
"version": "7.8.0",
"version": "7.8.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri.git",
"reference": "4436c6ec8d458e4244448b069cc572d088230b76"
"reference": "08cf38e3924d4f56238125547b5720496fac8fd4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76",
"reference": "4436c6ec8d458e4244448b069cc572d088230b76",
"url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4",
"reference": "08cf38e3924d4f56238125547b5720496fac8fd4",
"shasum": ""
},
"require": {
"league/uri-interfaces": "^7.8",
"league/uri-interfaces": "^7.8.1",
"php": "^8.1",
"psr/http-factory": "^1"
},
@@ -3333,7 +3343,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
"source": "https://github.com/thephpleague/uri/tree/7.8.0"
"source": "https://github.com/thephpleague/uri/tree/7.8.1"
},
"funding": [
{
@@ -3341,20 +3351,20 @@
"type": "github"
}
],
"time": "2026-01-14T17:24:56+00:00"
"time": "2026-03-15T20:22:25+00:00"
},
{
"name": "league/uri-interfaces",
"version": "7.8.0",
"version": "7.8.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri-interfaces.git",
"reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4"
"reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
"reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928",
"reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928",
"shasum": ""
},
"require": {
@@ -3417,7 +3427,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
"source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0"
"source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1"
},
"funding": [
{
@@ -3425,7 +3435,7 @@
"type": "github"
}
],
"time": "2026-01-15T06:54:53+00:00"
"time": "2026-03-08T20:05:35+00:00"
},
{
"name": "netresearch/jsonmapper",
@@ -3591,16 +3601,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "6.0.2",
"version": "6.0.3",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf"
"reference": "7bae67520aa9f5ecc506d646810bd40d9da54582"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/897b5986ece6b4f9d8413fea345c7d49c757d6bf",
"reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582",
"reference": "7bae67520aa9f5ecc506d646810bd40d9da54582",
"shasum": ""
},
"require": {
@@ -3650,9 +3660,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.2"
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3"
},
"time": "2026-03-01T18:43:49+00:00"
"time": "2026-03-18T20:49:53+00:00"
},
{
"name": "phpdocumentor/type-resolver",
@@ -3833,16 +3843,16 @@
},
{
"name": "sebastian/diff",
"version": "8.0.0",
"version": "8.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3"
"reference": "9c957d730257f49c873f3761674559bd90098a7d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"reference": "a2b6d09d7729ee87d605a439469f9dcc39be5ea3",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/9c957d730257f49c873f3761674559bd90098a7d",
"reference": "9c957d730257f49c873f3761674559bd90098a7d",
"shasum": ""
},
"require": {
@@ -3855,7 +3865,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "8.0-dev"
"dev-main": "8.1-dev"
}
},
"autoload": {
@@ -3888,7 +3898,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/8.0.0"
"source": "https://github.com/sebastianbergmann/diff/tree/8.1.0"
},
"funding": [
{
@@ -3908,7 +3918,7 @@
"type": "tidelift"
}
],
"time": "2026-02-06T04:42:27+00:00"
"time": "2026-04-05T12:02:33+00:00"
},
{
"name": "spatie/array-to-xml",
@@ -4038,16 +4048,16 @@
},
{
"name": "symfony/console",
"version": "v6.4.35",
"version": "v6.4.36",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "49257c96304c508223815ee965c251e7c79e614e"
"reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/49257c96304c508223815ee965c251e7c79e614e",
"reference": "49257c96304c508223815ee965c251e7c79e614e",
"url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5",
"reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5",
"shasum": ""
},
"require": {
@@ -4112,7 +4122,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.4.35"
"source": "https://github.com/symfony/console/tree/v6.4.36"
},
"funding": [
{
@@ -4132,20 +4142,20 @@
"type": "tidelift"
}
],
"time": "2026-03-06T13:31:08+00:00"
"time": "2026-03-27T15:30:51+00:00"
},
{
"name": "symfony/filesystem",
"version": "v8.0.6",
"version": "v8.0.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "7bf9162d7a0dff98d079b72948508fa48018a770"
"reference": "66b769ae743ce2d13e435528fbef4af03d623e5a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/7bf9162d7a0dff98d079b72948508fa48018a770",
"reference": "7bf9162d7a0dff98d079b72948508fa48018a770",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/66b769ae743ce2d13e435528fbef4af03d623e5a",
"reference": "66b769ae743ce2d13e435528fbef4af03d623e5a",
"shasum": ""
},
"require": {
@@ -4182,7 +4192,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v8.0.6"
"source": "https://github.com/symfony/filesystem/tree/v8.0.8"
},
"funding": [
{
@@ -4202,7 +4212,7 @@
"type": "tidelift"
}
],
"time": "2026-02-25T16:59:43+00:00"
"time": "2026-03-30T15:14:47+00:00"
},
{
"name": "symfony/finder",
@@ -4608,16 +4618,16 @@
},
{
"name": "symfony/string",
"version": "v7.4.6",
"version": "v7.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "9f209231affa85aa930a5e46e6eb03381424b30b"
"reference": "114ac57257d75df748eda23dd003878080b8e688"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b",
"reference": "9f209231affa85aa930a5e46e6eb03381424b30b",
"url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688",
"reference": "114ac57257d75df748eda23dd003878080b8e688",
"shasum": ""
},
"require": {
@@ -4675,7 +4685,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.4.6"
"source": "https://github.com/symfony/string/tree/v7.4.8"
},
"funding": [
{
@@ -4695,20 +4705,20 @@
"type": "tidelift"
}
],
"time": "2026-02-09T09:33:46+00:00"
"time": "2026-03-24T13:12:05+00:00"
},
{
"name": "vimeo/psalm",
"version": "6.15.1",
"version": "6.16.1",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
"reference": "28dc127af1b5aecd52314f6f645bafc10d0e11f9"
"reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/28dc127af1b5aecd52314f6f645bafc10d0e11f9",
"reference": "28dc127af1b5aecd52314f6f645bafc10d0e11f9",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/f1f5de594dc76faf8784e02d3dc4716c91c6f6ac",
"reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac",
"shasum": ""
},
"require": {
@@ -4813,7 +4823,7 @@
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm"
},
"time": "2026-02-07T19:27:16+00:00"
"time": "2026-03-19T10:56:09+00:00"
},
{
"name": "wapmorgan/php-deprecation-detector",
@@ -4884,16 +4894,16 @@
},
{
"name": "webmozart/assert",
"version": "2.1.6",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8"
"reference": "1b99650e7ffcad232624a260bc7fbdec2ffc407c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8",
"reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/1b99650e7ffcad232624a260bc7fbdec2ffc407c",
"reference": "1b99650e7ffcad232624a260bc7fbdec2ffc407c",
"shasum": ""
},
"require": {
@@ -4940,9 +4950,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/2.1.6"
"source": "https://github.com/webmozarts/assert/tree/2.2.0"
},
"time": "2026-02-27T10:28:38+00:00"
"time": "2026-04-09T16:54:47+00:00"
}
],
"aliases": [],

View File

@@ -49,6 +49,9 @@
"type": "string",
"pattern": "^[()A-Za-z &0-9-]+$"
},
"hide_from_list": {
"type": "boolean"
},
"environment": {
"type": "array",
"items": {
@@ -229,4 +232,4 @@
}
}
}
}
}

View File

@@ -379,8 +379,8 @@
],
"internal_port": "9980",
"environment": [
"aliasgroup1=https://%NC_DOMAIN%:443,http://nextcloud-aio-apache:23973",
"extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false %COLLABORA_SECCOMP_POLICY% --o:remote_font_config.url=https://%NC_DOMAIN%/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+",
"aliasgroup1=https://%NC_DOMAIN%:443,http://nextcloud-aio-apache.nextcloud-aio:23973",
"extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:logging.disable_server_audit=true --o:logging.level=warning --o:logging.level_startup=warning --o:welcome.enable=false --o:fetch_update_check=0 --o:allow_update_popup=false %COLLABORA_SECCOMP_POLICY% --o:remote_font_config.url=https://%NC_DOMAIN%/apps/richdocuments/settings/fonts.json --o:net.post_allow.host[0]=.+",
"dictionaries=%COLLABORA_DICTIONARIES%",
"TZ=%TIMEZONE%",
"server_name=%NC_DOMAIN%",
@@ -389,13 +389,12 @@
"restart": "unless-stopped",
"nextcloud_exec_commands": [
"echo 'Activating Collabora config...'",
"php /var/www/html/occ richdocuments:activate-config --wopi-url='http://nextcloud-aio-apache:23973' --callback-url='http://nextcloud-aio-apache:23973'"
"php /var/www/html/occ richdocuments:activate-config --wopi-url='http://nextcloud-aio-apache.nextcloud-aio:23973' --callback-url='http://nextcloud-aio-apache.nextcloud-aio:23973'"
],
"profiles": [
"collabora"
],
"cap_add": [
"MKNOD",
"SYS_ADMIN",
"SYS_CHROOT",
"FOWNER",
@@ -530,6 +529,8 @@
},
{
"container_name": "nextcloud-aio-borgbackup",
"display_name": "Borgbackup",
"hide_from_list": true,
"image_tag": "%AIO_CHANNEL%",
"image": "ghcr.io/nextcloud-releases/aio-borgbackup",
"init": true,
@@ -598,6 +599,8 @@
},
{
"container_name": "nextcloud-aio-watchtower",
"display_name": "Watchtower",
"hide_from_list": true,
"image_tag": "%AIO_CHANNEL%",
"image": "ghcr.io/nextcloud-releases/aio-watchtower",
"init": true,
@@ -618,6 +621,8 @@
},
{
"container_name": "nextcloud-aio-domaincheck",
"display_name": "Domaincheck",
"hide_from_list": true,
"image_tag": "%AIO_CHANNEL%",
"image": "ghcr.io/nextcloud-releases/aio-domaincheck",
"init": true,

View File

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

View File

@@ -1,4 +1,4 @@
document.addEventListener("DOMContentLoaded", function(event) {
window.addEventListener("load", function(event) {
if (document.hasFocus()) {
// hide reload button if the site reloads automatically
let list = document.getElementsByClassName("reload button");
@@ -9,7 +9,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
// set timeout for reload
setTimeout(function(){
window.location.reload(1);
window.location.reload(true);
}, 5000);
} else {
window.addEventListener("beforeunload", function() {

View File

@@ -0,0 +1,15 @@
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll('input[data-confirm]').forEach((element) => {
element.addEventListener('click', (event) => {
if (!confirm(element.dataset.confirm)) {
event.preventDefault();
}
});
});
document.querySelectorAll('[data-stop-event-propagation="true"]').forEach((element) => {
element.addEventListener('click', (event) => {
event.stopPropagation();
});
});
});

View File

@@ -121,10 +121,8 @@ 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
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
}
}

View File

@@ -36,11 +36,11 @@ function showPassword(id) {
showError("Server error. Please check the mastercontainer logs for details. This page will reload after 10s automatically. Then you can check the mastercontainer logs.");
// Reload after 10s since it is expected that the updated view is shown (e.g. after starting containers)
setTimeout(function(){
window.location.reload(1);
window.location.reload(true);
}, 10000);
} else {
// If the responose is not one of the above, we should reload to show the latest content
window.location.reload(1);
window.location.reload(true);
}
}
@@ -84,7 +84,7 @@ function showPassword(id) {
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();
location.reload(true);
});
};
}

View File

@@ -55,6 +55,9 @@ $twig->addExtension(new \AIO\Twig\CsrfExtension($container->get(Guard::class)));
// Auth Middleware
$app->add(new \AIO\Middleware\AuthMiddleware($container->get(\AIO\Auth\AuthManager::class)));
// Security Headers Middleware
$app->add(new \AIO\Middleware\SecurityHeadersMiddleware());
// API
$app->post('/api/docker/watchtower', AIO\Controller\DockerController::class . ':StartWatchtowerContainer');
$app->get('/api/docker/getwatchtower', AIO\Controller\DockerController::class . ':StartWatchtowerContainer');

View File

@@ -96,7 +96,7 @@ class LogViewer {
}
scrollToBottom() {
window.scrollTo(0, document.body.scrollHeight);
this.logElem.scrollTop = this.logElem.scrollHeight;
}
initAutoloadingControls() {

View File

@@ -32,4 +32,7 @@ function setThemeIcon(theme) {
setThemeToDOM(getSavedTheme());
// Apply theme when the page loads
document.addEventListener('DOMContentLoaded', () => setThemeIcon(getSavedTheme()));
document.addEventListener('DOMContentLoaded', () => {
setThemeIcon(getSavedTheme())
document.querySelector('button#theme-toggle')?.addEventListener('click', toggleTheme);
});

View File

@@ -26,6 +26,7 @@ readonly class AuthManager {
public function SetAuthState(bool $isLoggedIn) : void {
if (!$this->IsAuthenticated() && $isLoggedIn === true) {
session_regenerate_id(true);
$date = new DateTime();
$dateTime = $date->getTimestamp();
$_SESSION['date_time'] = $dateTime;

View File

@@ -38,6 +38,7 @@ readonly class Container {
public string $imageTag,
public AioVariables $aioVariables,
public string $documentation,
public bool $hideFromList,
private DockerActionManager $dockerActionManager
) {
}

View File

@@ -324,6 +324,8 @@ readonly class ContainerDefinitionFetcher {
$documentation = $entry['documentation'];
}
$hideFromList = $entry['hide_from_list'] ?? false;
$containers[] = new Container(
$entry['container_name'],
$displayName,
@@ -349,6 +351,7 @@ readonly class ContainerDefinitionFetcher {
$imageTag,
$aioVariables,
$documentation,
$hideFromList,
$this->container->get(DockerActionManager::class)
);
}

View File

@@ -87,19 +87,26 @@ readonly class DockerController {
}
public function StartBackupContainerBackup(Request $request, Response $response, array $args) : Response {
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$forceStopNextcloud = true;
$this->startBackup($forceStopNextcloud);
return $response->withStatus(201)->withHeader('Location', '.');
$this->startBackup($forceStopNextcloud, $addToStreamingResponseBody);
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function startBackup(bool $forceStopNextcloud = false) : void {
public function startBackup(bool $forceStopNextcloud = false, ?\Closure $addToStreamingResponseBody = null) : void {
$this->configurationManager->backupMode = 'backup';
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud);
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud, $addToStreamingResponseBody);
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
$this->PerformRecursiveContainerStart($id, true, $addToStreamingResponseBody);
}
public function StartBackupContainerCheck(Request $request, Response $response, array $args) : Response {
@@ -115,8 +122,15 @@ readonly class DockerController {
}
public function StartBackupContainerList(Request $request, Response $response, array $args) : Response {
$this->listBackup();
return $response->withStatus(201)->withHeader('Location', '.');
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$this->listBackup($addToStreamingResponseBody);
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function checkBackup(?\Closure $addToStreamingResponseBody = null) : void {
@@ -126,11 +140,11 @@ readonly class DockerController {
$this->PerformRecursiveContainerStart($id, true, $addToStreamingResponseBody);
}
private function listBackup() : void {
private function listBackup(?\Closure $addToStreamingResponseBody = null) : void {
$this->configurationManager->backupMode = 'list';
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
$this->PerformRecursiveContainerStart($id, true, $addToStreamingResponseBody);
}
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
@@ -140,14 +154,20 @@ readonly class DockerController {
$this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
$this->configurationManager->commitTransaction();
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$id = self::TOP_CONTAINER;
$forceStopNextcloud = true;
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud);
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud, $addToStreamingResponseBody);
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
$this->PerformRecursiveContainerStart($id, true, $addToStreamingResponseBody);
return $response->withStatus(201)->withHeader('Location', '.');
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function StartBackupContainerCheckRepair(Request $request, Response $response, array $args) : Response {
@@ -383,6 +403,7 @@ readonly class DockerController {
->withBody(new NonBufferedBody())
->withHeader('Content-Type', 'text/html; charset=utf-8')
->withHeader('X-Accel-Buffering', 'no')
->withHeader('Content-Length', '-1')
->withHeader('Cache-Control', 'no-cache');
// Text written into this body is immediately sent to the client, without waiting for later content.

View File

@@ -28,6 +28,9 @@ readonly class LoginController {
return $response->withHeader('Location', '.')->withStatus(201);
}
// Punish failed auth attempts with a delay, as a very simple means against bots.
sleep(5);
$response->getBody()->write("The password is incorrect.");
return $response->withHeader('Location', '.')->withStatus(422);
}
@@ -39,6 +42,9 @@ readonly class LoginController {
return $response->withHeader('Location', '../..')->withStatus(302);
}
// Punish failed auth attempts with a delay, as a very simple means against bots.
sleep(5);
return $response->withHeader('Location', '../..')->withStatus(302);
}

View File

@@ -657,7 +657,7 @@ class ConfigurationManager
throw new InvalidSettingConfigurationException("Please enter your current password.");
}
if ($currentPassword !== $this->password) {
if (!hash_equals($this->password, $currentPassword)) {
throw new InvalidSettingConfigurationException("The entered current password is not correct.");
}

View File

@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace AIO\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
readonly class SecurityHeadersMiddleware {
public function __invoke(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $handler->handle($request);
return $response
->withHeader('Content-Security-Policy', "default-src 'self'; base-uri 'self'; worker-src 'none'; object-src 'none'; upgrade-insecure-requests;")
->withHeader('X-Content-Type-Options', 'nosniff')
->withHeader('X-Frame-Options', 'DENY')
->withHeader('X-Permitted-Cross-Domain-Policies', 'none')
->withHeader('X-DNS-Prefetch-Control', 'off')
->withHeader('Referrer-Policy', 'no-referrer')
->withHeader('X-Robots-Tag', 'noindex, nofollow');
}
}

View File

@@ -27,7 +27,8 @@
<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?v6"></script>
<script type="text/javascript" src="containers-form-submit.js?v7"></script>
<script type="text/javascript" src="click-handlers.js?v1"></script>
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
{% set isAnyRunning = false %}
@@ -47,10 +48,10 @@
{% endif %}
{% for container in containers %}
{% if container.displayName != '' and container.GetRunningState().value == 'running' %}
{% if container.hideFromList != true and container.GetRunningState().value == 'running' %}
{% set isAnyRunning = true %}
{% endif %}
{% if container.displayName != '' and container.GetRestartingState().value == 'restarting' %}
{% if container.hideFromList != true and container.GetRestartingState().value == 'restarting' %}
{% set isAnyRestarting = true %}
{% endif %}
{% if container.identifier == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %}
@@ -153,7 +154,7 @@
<form method="POST" action="api/docker/backup-check-repair" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check and repair backup integrity" onclick="return confirm('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.')"/>
<input type="submit" value="Check and repair backup integrity" data-confirm='Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.'/>
</form>
</details>
{% endif %}
@@ -169,7 +170,7 @@
{% endif %}
<p>Choose the backup that you want to restore and click on the button below to restore the selected backup. This will restore the whole AIO instance. Please note that the current AIO passphrase will be kept and the previous AIO passphrase will not be restored from backup!</p>
<p><strong>Important:</strong> If the backup that you want to restore contained any <a target="_blank" href="https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers">community container</a>, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.</p>
<form method="POST" action="api/docker/restore" class="xhr" id="restore_selection">
<form method="POST" action="api/docker/restore" target="overlay-log" id="restore_selection">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<select id="selected_restore_time" name="selected_restore_time" form="restore_selection">
@@ -178,7 +179,7 @@
{% endfor %}
</select><br>
<input type="checkbox" id="restore-exclude-previews" name="restore-exclude-previews"><label for="restore-exclude-previews">Exclude previews from restore which will speed up the restore process but will trigger a scan of the preview folder as soon as the Nextcloud container starts the next time</label><br>
<input type="submit" value="Restore selected backup" onclick="return confirm('⚠️ Important: If the backup that you want to restore contained any community container, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.')"/>
<input type="submit" value="Restore selected backup" data-confirm='⚠️ Important: If the backup that you want to restore contained any community container, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.'/>
</form>
{% endif %}
{% elseif borg_backup_mode == 'restore' %}
@@ -282,7 +283,7 @@
<ul>
{# @var containers \AIO\Container\Container[] #}
{% for container in containers %}
{% if container.displayName != '' %}
{% if container.hideFromList != true %}
{% include 'components/container-state.twig' with {'c': container} only %}
{% endif %}
{% endfor %}
@@ -353,6 +354,9 @@
<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 bypass_container_update == true %}
<input type="hidden" name="bypass_container_update" value="true">
{% endif %}
<input type="submit" value="Start containers" />
</form>
{% else %}
@@ -361,9 +365,9 @@
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input id="base_path" type="hidden" name="base_path" value="">
{% if bypass_container_update == true %}
<input type="hidden" name="bypass_container_update" value="{{bypass_container_update}}">
<input type="hidden" name="bypass_container_update" value="true">
{% endif %}
<input class="button " type="submit" value="Start and update containers" onclick="return confirm('Start and update containers? You should consider creating a backup first.')" />
<input class="button " type="submit" value="Start and update containers" data-confirm='Start and update containers? You should consider creating a backup first.' />
</form>
{% endif %}
{% endif %}
@@ -410,7 +414,7 @@
<form method="POST" action="api/docker/backup-check-repair" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check and repair backup integrity" onclick="return confirm('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.')"/>
<input type="submit" value="Check and repair backup integrity" data-confirm='Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.'/>
</form>
</details>
{% endif %}
@@ -472,10 +476,10 @@
{% if isApacheStarting != true %}
<h3>Backup creation</h3>
<p>Clicking on the button below will create a backup.</p>
<form method="POST" action="api/docker/backup" class="xhr">
<form method="POST" action="api/docker/backup" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Create backup" onclick="return confirm('Create backup? Are you sure that you want to create a backup? This will stop all running containers and create the backup.')" />
<input type="submit" value="Create backup" data-confirm='Create backup? Are you sure that you want to create a backup? This will stop all running containers and create the backup.' />
</form>
{% if has_backup_run_once == true %}
@@ -487,12 +491,12 @@
<form method="POST" action="api/docker/backup-check" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check backup integrity" onclick="return confirm('Check backup integrity? Are you sure that you want to check the backup? This can take a long time depending on the size of your backup.')" />
<input type="submit" value="Check backup integrity" data-confirm='Check backup integrity? Are you sure that you want to check the backup? This can take a long time depending on the size of your backup.' />
</form>
<h3>Backup restore</h3>
<p>Choose the backup that you want to restore and click on the button below to restore the selected backup. This will overwrite all your files with the chosen backup so you should consider creating a backup first. You can run an integrity check before restoring your files but this shouldn't be needed in most situations. Please note that this will not restore additionally chosen backup directories! The restore process should be pretty fast as rsync, which only transfers changed files, is used to restore the chosen backup.</p>
<form method="POST" action="api/docker/restore" class="xhr" id="restore_selection">
<form method="POST" action="api/docker/restore" target="overlay-log" id="restore_selection">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<select id="selected_restore_time" name="selected_restore_time" form="restore_selection">
@@ -500,14 +504,14 @@
<option value="{{ restore_time }}">{{ restore_time }} UTC</option>
{% endfor %}
</select>
<input type="submit" value="Restore selected backup" onclick="return confirm('Restore the selected backup? Are you sure that you want to restore the selected backup? This will stop all running containers and restore the selected backup. It is recommended to create a backup first. You might also want to check the backup integrity.')" />
<input type="submit" value="Restore selected backup" data-confirm='Restore the selected backup? Are you sure that you want to restore the selected backup? This will stop all running containers and restore the selected backup. It is recommended to create a backup first. You might also want to check the backup integrity.' />
</form>
<h3>Update backup list</h3>
<details>
<summary>Click here to reveal this option</summary>
<p>If you use an external snapshot tool to restore the server that runs AIO, you might run into a problem that the above listed available backups are not up-to-date to restore your server from. You can click the button below to update this list.</p>
<form method="POST" action="api/docker/backup-list" class="xhr">
<form method="POST" action="api/docker/backup-list" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Update backup list" />
@@ -567,7 +571,7 @@
<input type="hidden" name="delete_borg_backup_location_vars" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Reset backup location" onclick="return confirm('Are you sure that you want to reset the backup location?')" />
<input type="submit" value="Reset backup location" data-confirm='Are you sure that you want to reset the backup location?' />
</form>
{% endif %}
{% if has_backup_run_once == true %}
@@ -613,7 +617,7 @@
<input type="text" id="timezone" name="timezone" placeholder="Europe/Berlin" />
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit timezone" onclick="return confirm('Are you sure that this is a valid timezone? Please double check by following the wikipedia article and checking the correct column. If the timezone is not valid, it will break the startup since the database will not be correctly initialized and you will end up in a startup loop.')" />
<input type="submit" value="Submit timezone" data-confirm='Are you sure that this is a valid timezone? Please double check by following the wikipedia article and checking the correct column. If the timezone is not valid, it will break the startup since the database will not be correctly initialized and you will end up in a startup loop.' />
</form>
<p>You need to make sure that the timezone that you enter is valid. An example is <strong>Europe/Berlin</strong>. You can get valid values by looking at the 'TZ identifier' column of this list: <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List"><strong>click here</strong></a>. The default is <strong>Etc/UTC</strong> if nothing is entered.</p>
{% else %}
@@ -632,7 +636,7 @@
{% endif %}
{% if isApacheStarting == true or is_backup_container_running == true or isWatchtowerRunning == true or is_daily_backup_running == true %}
<script type="text/javascript" src="automatic_reload.js"></script>
<script type="text/javascript" src="automatic_reload.js?v2"></script>
{% else %}
<script type="text/javascript" src="before-unload.js"></script>
{% endif %}

View File

@@ -1 +1 @@
12.8.0
12.9.2

View File

@@ -37,6 +37,6 @@
</p>
{% endfor %}
<input id="community-form-submit" type="submit" value="Save changes" onclick="return confirm('Are you sure that you read the documentation of all community containers that you enabled? If no, please do not continue as this might break your instance!')" />
<input id="community-form-submit" type="submit" value="Save changes" data-confirm='Are you sure that you read the documentation of all community containers that you enabled? If no, please do not continue as this might break your instance!' />
</form>
</details>

View File

@@ -41,7 +41,7 @@
<li>Best support for legacy files</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.collaboraoffice.com/code/" target="_blank" class="office-learn-more" onclick="event.stopPropagation();">
<a href="https://www.collaboraoffice.com/code/" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
Learn more
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" style="vertical-align: middle; margin-left: 4px;">
<path d="M6 12L10 8L6 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
@@ -76,7 +76,7 @@
<li>Limited ODF compatibility</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.onlyoffice.com/" target="_blank" class="office-learn-more" onclick="event.stopPropagation();">
<a href="https://www.onlyoffice.com/" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
Learn more
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" style="vertical-align: middle; margin-left: 4px;">
<path d="M6 12L10 8L6 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
@@ -198,7 +198,6 @@
>
<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"
@@ -213,7 +212,6 @@
>
<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"

View File

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

View File

@@ -3,15 +3,25 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="style.css">
<style>
body {
html, body {
height: 100%;
overflow: hidden;
padding: 0;
margin: 0;
}
pre {
height: 100%;
overflow: auto;
margin: 0;
padding: 1rem;
box-sizing: border-box;
}
#floating-box {
position: sticky;
position: fixed;
top: 1rem;
float: right;
right: 1rem;
width: 20rem;
max-width: calc(100vw - 2rem);
z-index: 10;
display: flex;
justify-content: end;
align-items: center;
@@ -43,7 +53,7 @@
transition: opacity 1s, display 1s allow-discrete;
}
</style>
<script src="log-view.js"></script>
<script src="log-view.js?v1"></script>
</head>
<body data-container-id="{{ id }}">
<div id="floating-box">

0
php/tests/tests/initial-setup.spec.js Normal file → Executable file
View File

0
php/tests/tests/restore-instance.spec.js Normal file → Executable file
View File

View File

@@ -151,7 +151,7 @@ sudo docker run \
- `--sig-proxy=false` — prevents Ctrl+C in the attached terminal from stopping the container.
- `--name nextcloud-aio-mastercontainer` — the container name. Do not change this name; mastercontainer updates rely on it.
- `--restart always` — ensures the container restarts automatically with the Docker daemon.
- `--publish 80:80` — publishes container port 80 on host port 80 (used for ACME http-challenge when obtaining certificates). Not required if you run AIO behind a reverse proxy.
- `--publish 80:80` — publishes container port 80 on host port 80 (used for ACME http-challenge when obtaining certificates, used for for the AIO-interface running inside the mastercontainer). Not required if you run AIO behind a reverse proxy.
- `--publish 8080:8080` — publishes the AIO interface (self-signed certificate) on host port 8080. You may map a different host port if 8080 is in use (e.g. `--publish 8081:8080`).
- `--publish 8443:8443` — publishes the AIO interface with a valid certificate on host port 8443 (requires ports 80 and 8443 to be reachable and a domain pointing to your server). Not required if you run AIO behind a reverse proxy.
- `--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config` — stores mastercontainer configuration in the named Docker volume. Do not change this volume name; built-in backups depend on it.
@@ -221,6 +221,7 @@ https://your-domain-that-points-to-this-server.tld:8443
- [How to adjust the internally used docker api version?](#how-to-adjust-the-internally-used-docker-api-version)
- [How to change the default location of Nextcloud's Datadir?](#how-to-change-the-default-location-of-nextclouds-datadir)
- [How to configure custom UID/GID?](#how-to-configure-custom-uidgid)
- [How to move the appdata folder from the datadir to an ssd to improve the performance?](#how-to-move-the-appdata-folder-from-the-datadir-to-an-ssd-to-improve-the-performance)
- [How to store the files/installation on a separate drive?](#how-to-store-the-filesinstallation-on-a-separate-drive)
- [How to limit the resource usage of AIO?](#how-to-limit-the-resource-usage-of-aio)
- [How to allow the Nextcloud container to access directories on the host?](#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host)
@@ -475,7 +476,26 @@ Another solution if you really need to use host mounts is to use a bind mount to
/source/path /target/path/where/the/source/directory/will/be/mounted/on/the/server fuse.bindfs force-user=33,force-group=33,allow_other 0 0
```
You can then use `--env NEXTCLOUD_DATADIR="/target/path/where/the/source/directory/will/be/mounted/on/the/server"` as described in the section above.
Then use `sudo mount /target/path/where/the/source/directory/will/be/mounted/on/the/server` to mount it directly.
You can afterwards use `--env NEXTCLOUD_DATADIR="/target/path/where/the/source/directory/will/be/mounted/on/the/server"` as described in the section above.
### How to move the appdata folder from the datadir to an ssd to improve the performance?
If the datadir in your setup is configured to be placed on an HDD or network FS like SMB or NFS, you can follow the steps below to change the location of the appdata folder to be located on an SSD in order to improve the performance of the setup.
> [!NOTE]
> The following steps only work if you already configured and used NEXTCLOUD_DATADIR as mentioned [two sections above](#how-to-change-the-default-location-of-nextclouds-datadir).
> In this example here, we assume that you used `NEXTCLOUD_DATADIR="/target/path/`.
After the initial installation is done and all datadir files of Nextcloud are stored inside the configured `/target/path` directory, you will also see an `appdata_*` folder in there that stores app-related data. You can now move that folder to a faster SSD if the target dir is not already positioned on an SSD by first using `rsync` to sync the files a location on an SSD. Afterwards rename the appdata folder in the datadir to something like `appdata_*-backup`. Afterwards add the following line to `/etc/fstab`:
```
/source/path/on/ssd /target/path/<appdata-path> fuse.bindfs force-user=33,force-group=33,allow_other 0 0
```
Do not forget to adjust `<appdata-path>` to the correct `appdata_*` name that your installation initially created automatically.
Then use `sudo mount /target/path/<appdata-path>` to mount it directly.
Afterwards things should be speed up.
### How to store the files/installation on a separate drive?
You can move the whole docker library and all its files including all Nextcloud AIO files and folders to a separate drive by first mounting the drive in the host OS (NTFS is not supported and ext4 is recommended as FS) and then following this tutorial: https://www.guguweb.com/2019/02/07/how-to-move-docker-data-directory-to-another-location-on-ubuntu/<br>
@@ -683,7 +703,7 @@ Simply run the following command: `sudo docker exec --user www-data nextcloud-ai
See [multiple-instances.md](./multiple-instances.md) for some documentation on this.
### Bruteforce protection FAQ
Nextcloud features a built-in bruteforce protection which may get triggered and will block an ip-address or disable a user. You can unblock an ip-address by running `sudo docker exec --user www-data -it nextcloud-aio-nextcloud php occ security:bruteforce:reset <ip-address>` and enable a disabled user by running `sudo docker exec --user www-data -it nextcloud-aio-nextcloud php occ user:enable <name of user>`. See https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html#security for further information. **Please note:** If you do not have CLI access to the server, you can now run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
Nextcloud features a built-in bruteforce protection which may get triggered and will block an ip-address or disable a user. You can unblock an ip-address by running `sudo docker exec --user www-data -it nextcloud-aio-nextcloud php occ security:bruteforce:reset <ip-address>` and enable a disabled user by running `sudo docker exec --user www-data -it nextcloud-aio-nextcloud php occ user:enable <name of user>`. See https://docs.nextcloud.com/server/latest/admin_manual/occ_command.html#security-commands-label for further information. **Please note:** If you do not have CLI access to the server, you can now run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
### How to switch the channel?
You can switch to a different channel like e.g. the beta channel or from the beta channel back to the latest channel by stopping the mastercontainer, removing it (no data will be lost) and recreating the container using the same command that you used initially to create the mastercontainer. You simply need to change the last line `ghcr.io/nextcloud-releases/all-in-one:latest` to `ghcr.io/nextcloud-releases/all-in-one:beta` and vice versa. ⚠️ In some rare occurrences, you might need to run `docker pull ghcr.io/nextcloud-releases/all-in-one:latest` or `docker pull ghcr.io/nextcloud-releases/all-in-one:beta` first before being able to use the image.
@@ -748,7 +768,10 @@ password=<password>
```
(Of course you need to modify `<smb/cifs username>` and `<password>` for your specific case.)
Now you can use `/mnt/storagebox` as Nextcloud's datadir like described in the section above this one.
Now you can use `/mnt/storagebox` as Nextcloud's datadir like described in the section [here](#how-to-change-the-default-location-of-nextclouds-datadir).
> [!NOTE]
> You also might want to move the appdata dir after the initial installation is done to improve the performance. See [this section](#how-to-move-the-appdata-folder-from-the-datadir-to-an-ssd-to-improve-the-performance)
### Can I run this with Docker swarm?
Yes. For that to work, you need to use and follow the [manual-install documentation](./manual-install/).

View File

@@ -169,8 +169,8 @@ The process to run Nextcloud AIO behind a reverse proxy has three required steps
The reverse-proxy container needs to be connected to the nextcloud containers. This can be achieved one of these 3 ways:
1. Utilize host networking instead of docker bridge networking: Specify `--network host` option (or `network_mode: host` for docker-compose) as setting for the reverse proxy container to connect it to the host network. If you are using a firewall on the server, you need to open ports 80 and 443 for the reverse proxy manually. With this setup, the default sample configurations with reverse-proxy pointing to `localhost:$APACHE_PORT` should work directly.
1. Connect nextcloud's external-facing containers to the reverse-proxy's docker network by specifying env variable APACHE_ADDITIONAL_NETWORK. With this setup, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache:$APACHE_PORT`. ⚠️⚠️⚠️ Note, the specified network must already exist before Nextcloud AIO is started. Otherwise it will fail to start the container because the network is not existing.
1. Connect the reverse-proxy container to the `nextcloud-aio` network by specifying it as a secondary (external) network for the reverse proxy container. With this setup also, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache:$APACHE_PORT` .
1. Connect nextcloud's external-facing containers to the reverse-proxy's docker network by specifying env variable APACHE_ADDITIONAL_NETWORK. With this setup, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache.nextcloud-aio:$APACHE_PORT`. ⚠️⚠️⚠️ Note, the specified network must already exist before Nextcloud AIO is started. Otherwise it will fail to start the container because the network is not existing.
1. Connect the reverse-proxy container to the `nextcloud-aio` network by specifying it as a secondary (external) network for the reverse proxy container. With this setup also, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache.nextcloud-aio:$APACHE_PORT` .
</details>

View File

@@ -1,10 +1,10 @@
# Initial setup
- [ ] Verify that after starting the test container, you can access the AIO interface using https://internal.ip.address:8080
- [ ] After clicking the self-signed-certificate warning away, it should show the setup page with an explanation what AIO is and the initial password and a button that contains a link to the AIO login page
- [ ] After copying the password and clicking on this button, it should open a new tab with the login page
- [ ] The login page should show an input field that allows to enter the AIO password and a `Log in` button
- [ ] After pasting the new password into the input field and clicking on this button button, you should be logged in
- [ ] After clicking the self-signed-certificate warning away, it should show the setup page with an explanation what AIO is and the initial passphrase and a button that contains a link to the AIO login page
- [ ] After copying the passphrase and clicking on this button, it should open a new tab with the login page
- [ ] The login page should show an input field that allows to enter the AIO passphrase and a `Log in` button
- [ ] After pasting the passphrase into the input field and clicking on this button, you should be logged in
- [ ] You should now see the containers page and you should see three sections: one general section which explains what AIO is, one `New AIO instance` section and one section that allows to restore the whole AIO instance from backup.
You can now continue with [002-new-instance.md](./002-new-instance.md) or [010-restore-instance.md](./010-restore-instance.md).

View File

@@ -11,7 +11,7 @@ For the below to work, it is important that you have a domain that you point ont
- [ ] Entering the domain that does point to your server e.g. `yourdomain.com` should finally redirect you to the next screen (if you did not configure your domain yet or did not open port 443, it should report that to you)
- [ ] Now you should see a button `Start containers` and an explanation which points out that clicking on the button will start the containers and that this can take a long time.
- [ ] Below that you should see a section `Optional addons` which shows a checkbox list with addons that can be enabled or disabled.
- [ ] Collabora and Nextcloud Talk should be enabled, the rest disabled
- [ ] Collabora, Imaginary, Talk and Whiteboard should be enabled, the rest disabled
- [ ] Unchecking/Checking any of these should insert a button that allows to save the set config
- [ ] Checking OnlyOffice and Collabora at the same time should show a warning that this is not supported and should not saving the new config
- [ ] Recommended is to uncheck all options now

View File

@@ -1,18 +1,32 @@
# Initial backup
- [ ] In the Backup and restore section, you should now see and input box where you should type in the path where the backup should get created and some explanation below
- [ ] In the Backup and restore section, you should now see two input boxes where for one you should type in the path where the backup should get created and some explanation below or the other type in a remote ssh location
- [ ] First, check a local backup:
- [ ] Enter `/` which should send an error
- [ ] Enter `/mnt/` or `/media/` or `/host_mnt/` or `/var/backups/` should send an error as well
- [ ] Accepted should be `/mnt/backup`, `/media/backup`, `/host_mnt/c/backup` and `/var/backups`.
- [ ] The side should now reload
- [ ] In the Backup restore section you should now see a Backup information section with important info like the encryption password, the backup location and more.
- [ ] Also you should see a Backup creation section that contains a `Create backup` button.
- [ ] Clicking on the `Create backup` button should open a window prompt that allows to cancel the operation.
- [ ] Canceling should return to the website, confirming should reveal the big spinner again which should block the website again.
- [ ] After a while you should see the information that Backup container is currently running
- [ ] another option are remote backups via SSH using borgbackup. The remote borg repo URL must contain both `@` and `:`. The process works as follows:
1. You enter a remote borg repo URL (e.g. `ssh://user@host:port/path/to/repo` or `user@host:/path/to/repo`).
2. On the first connection attempt, a SSH key pair is generated automatically and the public key is displayed.
3. You add the public key to the `~/.ssh/authorized_keys` file on the remote server so that AIO can connect to it.
4. Once authorized, AIO can create and restore backups on the remote server.
- [ ] Enter `user` (no `@` and no `:`) which should send an error
- [ ] Enter `user@host` (no `:`) which should send an error
- [ ] Enter `userhost:/path` (no `@`) which should send an error
- [ ] Accepted should be `ssh://user@host:22/path/to/repo` or `user@host:/path/to/repo`
- [ ] Both a local backup location and a remote repo URL should not be accepted at the same time
- [ ] The page should now reload
- [ ] Now click on `Create backup`
- [ ] After the first failed backup attempt with a remote repo, the SSH public key for borg should be shown so it can be authorized on the remote server
- [ ] After authorizing the server on the remote, scroll down and click on `Create backup` again to create another backup. This time it should succeed.
- [ ] The initial Nextcloud credentials on top of the page that are visible when the containers are running should now be hidden in a details tag
- [ ] In the Backup restore section you should now see a Backup information section with important info like the encryption password, the backup location and more.
- [ ] Also you should see a Backup cretion section that contains a `Create backup` button.
- [ ] Clicking on the `Create backup` button should open a window prompt that allows to cancel the operation.
- [ ] Canceling should return to the website, confirming should reveal the big spinner again which should block the website again.
- [ ] After a while you should see the information that Backup container is currently running
- [ ] Below the Containers section you should see the option to `Start containers` again.
- [ ] After a while and a few automatic reloads (as long as the side is focused), you should be redirected to the usual page and seen in the Backup and restore section that the last backup was successful.
- [ ] Below thhat you should see a details tag that allows to reveal all backup options
- [ ] Below that you should see a details tag that allows to reveal all backup options
You can now continue with [020-backup-and-restore.md](.//020-backup-and-restore.md)

View File

@@ -2,17 +2,34 @@
For the below to work, you need a backup archive of an AIO instance and the location on the test machine and the password for the backup archive. You can get one here: [backup-archive](./assets/backup-archive/)
- [ ] The section that allows to restore the whole AIO instance from backup should show two input fields: one that allows to enter a location where the backup archive is located and one that allows to enter password of the archive. It should also show a short explanation regarding the path requirements
- [ ] Entering an incorrect path and/or password should let you continue and test your settings in the next step
- [ ] Clicking on the test button should after a reload bring you back to the initial screen where it should say that the test was unsuccessful. Also you should be able to have a look at the backup container logs for investigation what exactly failed.
- [ ] You should also now see the input boxes again where you can change the path and password, confirm it and bring you again to the screen where you can test your settings.
- [ ] Entering the correct path to the backup archive and the correct password here should:
- [ ] Should reload and should hide all options except the option to test the path and password
- [ ] After the test you should see the options to check the integrity of the backup and a list of backup archives that you can choose from to restore your instance
- [ ] Clicking on either option should show a window prompt that lets you cancel the operation
- [ ] Clicking on the integrity check option should check the integrity and report that the backup integrity is good after a while which should then only show the option to choose the backup archive that should be restored
- [ ] Choosing the restore option should finally restore your files.
- [ ] After waiting a while it should reload the page and should show the usual container interface again with the state of your containers (stopped) and the option to start and update the containers again.
- [ ] The section that allows to restore the whole AIO instance from backup should show three input fields: one that allows to enter a location where the backup archive is located and one that allows to enter a remote ssh path and one that allows to enter password of the archive. It should also show a short explanation regarding the path requirements
- [ ] First, check restoring from a local backup location:
- [ ] Entering an incorrect path and/or password should let you continue and test your settings in the next step
- [ ] Clicking on the test button should after a reload bring you back to the initial screen where it should say that the test was unsuccessful. Also you should be able to have a look at the backup container logs for investigation what exactly failed.
- [ ] You should also now see the input boxes again where you can change the path and password, confirm it and bring you again to the screen where you can test your settings.
- [ ] Entering the correct path to the backup archive and the correct password here should:
- [ ] Should reload and should hide all options except the option to test the path and password
- [ ] After the test you should see the options to check the integrity of the backup and a list of backup archives that you can choose from to restore your instance
- [ ] Clicking on either option should show a window prompt that lets you cancel the operation
- [ ] Clicking on the integrity check option should check the integrity and report that the backup integrity is good after a while which should then only show the option to choose the backup archive that should be restored
- [ ] Choosing the restore option should finally restore your files.
- [ ] After waiting a while it should reload the page and should show the usual container interface again with the state of your containers (stopped) and the option to start and update the containers again.
- [ ] Next, check restoring from a remote backup location via SSH. The remote borg repo URL must contain both `@` and `:`. The restore process works as follows:
1. You enter a remote borg repo URL (e.g. `ssh://user@host:port/path/to/repo` or `user@host:/path/to/repo`) and the backup password.
2. On the first connection attempt, a SSH key pair is generated automatically and the public key is displayed.
3. You add the public key to the `~/.ssh/authorized_keys` file on the remote server so that AIO can connect to it.
4. Once authorized, AIO can list and restore backups from the remote server.
- [ ] Enter an invalid remote repo URL (e.g. `user` without `@` and `:`) which should send an error
- [ ] Enter a valid remote borg repo URL and the correct backup password:
- [ ] Should reload and should hide all options except the option to test the path and password
- [ ] After the first failed connection attempt, the SSH public key for borg should be shown so it can be authorized on the remote server
- [ ] After authorizing the key on the remote server, scroll down and click on the test button again. This time it should succeed and show the options to check the integrity and list backup archives
- [ ] After the test you should see the options to check the integrity of the backup and a list of backup archives that you can choose from to restore your instance
- [ ] Clicking on either option should show a window prompt that lets you cancel the operation
- [ ] Clicking on the integrity check option should check the integrity and report that the backup integrity is good after a while which should then only show the option to choose the backup archive that should be restored
- [ ] Choosing the restore option should finally restore your files.
- [ ] After waiting a while it should reload the page and should show the usual container interface again with the state of your containers (stopped) and the option to start and update the containers again.
- [ ] Clicking on `Start and update containers` should show a window prompt that you should create a backup. Canceling should cancel the operation, confirming should reveal the big spinner again.
- [ ] After waiting a bit, all containers should be green and your instance should be fully functional again

View File

@@ -1,6 +1,6 @@
# Backup and restore
- [ ] Expanding all backup options in the Backup and restore sectioin should reveal a Backup information section, Backup creation section, Backup check section, Backup restore section and a Daily backup section.
- [ ] Expanding all backup options in the Backup and restore sectioin should reveal a Backup information section, Backup creation section, Backup check section, Backup restore section and a Daily backup section as well as a additional backup location section
- [ ] The backup restore section should list all available backup archives and list them from most recent to least recent.
- [ ] Clicking on either option of Create backup, Check backup integrity or Restore selected backup should run the corresponding action and report after a while in the last check, backup or restore was successful.
- [ ] Daily backup creatio should allow to enter a time in 24h format e.g. `04:00` should be accepted, `24:00` or `dfjlk` not.

View File

@@ -1,12 +1,12 @@
# AIO password change
# AIO passphrase change
- [ ] In the AIO password change section you should see two input fields. And below the requirements for a new password
- [ ] When entering nothing it should report that you need to enter your current aio password
- [ ] When entering a false password, it should report that to you
- [ ] After entering your current password and leaving the new password empty it should report that you need to enter a new password
- [ ] After entering a new passwort shorter than 24 characters or not allowed characters, it should report that the password requirements are not met.
- [ ] In the AIO passphrase change section you should see two input fields. And below the requirements for a new passphrase
- [ ] When entering nothing it should report that you need to enter your current AIO passphrase
- [ ] When entering a false passphrase, it should report that to you
- [ ] After entering your current passphrase and leaving the new passphrase empty it should report that you need to enter a new passphrase
- [ ] After entering a new passphrase shorter than 24 characters or not allowed characters, it should report that the passphrase requirements are not met.
- [ ] `sdfjlksj` should not be accepted
- [ ] `jdsfklöjiroewoäsadjkfölk` should not be accepted
- [ ] `sdjlfj SDJFLK 32489 sdjklf` should which should reload the page
- [ ] `sdjlfj SDJFLK 32489 sdjklf` should be accepted, which should reload the page
You can now continue with [040-login-behavior.md](./040-login-behavior.md)

View File

@@ -1,7 +1,7 @@
# Login behavior
- [ ] When opening the AIO interface in a new tab while the apache container is running, it should report on the login page that Nextcloud is running and you should use the automatic login
- [ ] When the apache container is stopped, you should see here an input field that allows you to enter the AIO password which should log you in
- [ ] When the apache container is stopped, you should see here an input field that allows you to enter the AIO passphrase which should log you in
- [ ] Starting and stopping the containers multiple times should every time produce a new token that is used in the admin overview in Nextcloud as link in the button to log you into the AIO interface. (see [003-automatic-login.md](./003-automatic-login.md))
You can now continue with [050-optional-addons.md](./050-optional-addons.md)

View File

@@ -10,6 +10,8 @@
- [ ] Imaginary by having a look if when uploading a new picture in Nextcloud, it adds some log entries to the container
- [ ] Fulltextsearch by trying to search for a heading inside a file in Nextcloud
- [ ] Talk-recording by starting a call and trying to record something
- [ ] When Collabora is enabled, it should show below the Optional Addons section a section where you can change the dictionaries for collabora. `de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru` should be a valid setting. E.g. `de.De` not. If already set, it should show a button that allows to remove the setting again.
- [ ] When Collabora is enabled
- [ ] It should show below the Optional Addons section a section where you can change the dictionaries for collabora. `de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru` should be a valid setting. E.g. `de.De` not. If already set, it should show a button that allows to remove the setting again.
- [ ] Also, you should see an input field that allows to enter additional collabora options. E.g. `net.content_security_policy=false` should not be accepted, but `--o:net.content_security_policy="frame-ancestors *.example.com:*;"` should.
You can now continue with [060-environmental-variables.md](./060-environmental-variables.md)
You can now continue with [055-community-containers.md](./055-community-containers.md)

View File

@@ -0,0 +1,13 @@
# Community Containers
- [ ] At the very bottom of the page, there should be a Community Containers section
- [ ] The section should show a details element that allows to reveal the list of available community containers
- [ ] When containers are running, the checkboxes should be disabled and a notice should inform the user that changes can only be made when containers are stopped
- [ ] When containers are stopped, checkboxes should be enabled
- [ ] Enabling a community container and clicking `Save changes` should show a confirmation dialog
- [ ] Canceling the confirmation dialog should not save the changes
- [ ] Confirming should save the changes and reload the page
- [ ] After saving, the enabled community container should appear in the containers section and start along with the other containers when `Start containers` is clicked
- [ ] Disabling a previously enabled community container and saving should remove it from the containers section after stopping and starting containers
You can now continue with [060-environmental-variables.md](./060-environmental-variables.md)