Compare commits

...

28 Commits

Author SHA1 Message Date
Pablo Zmdl
dc32dd2954 Throttle login attempts to 5 failures per 5 minutes
AI-assistant: Copilot v1.0.7 (Claude Opus 4.6)

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
2026-04-02 10:22:48 +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
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
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
23 changed files with 75 additions and 31 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

@@ -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

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

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.3.1-cli AS docker
ARG CADDY_REMOTE_HOST_HASH=b21775afa730ffb52a24ddff310c8a6d1fd37276

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 {
@@ -39,7 +40,6 @@ https://:8443 {
abort @denied
root * /var/www/docker-aio/php/public
encode
php_fastcgi unix//run/php.sock
file_server

View File

@@ -13,7 +13,8 @@
}
servers {
protocols h1 h2
# Only h1 is allowed as we prevent `ERR_NETWORK_CHANGED` from happening
protocols h1
}
skip_install_trust
@@ -27,7 +28,6 @@ https://:8080 {
abort @denied
root * /var/www/docker-aio/php/public
encode
php_fastcgi unix//run/php.sock
file_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.7
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,5 +1,5 @@
# 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.1 AS signaling
FROM alpine:3.23.3 AS janus

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

@@ -379,7 +379,7 @@
],
"internal_port": "9980",
"environment": [
"aliasgroup1=https://%NC_DOMAIN%:443,http://nextcloud-aio-apache:23973",
"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%",
@@ -389,7 +389,7 @@
"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"

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

@@ -29,6 +29,9 @@ function showPassword(id) {
const xhr = e.target;
if (xhr.status === 201) {
window.location.replace(xhr.getResponseHeader('Location'));
} else if ([422, 429].includes(xhr.status)) {
disableSpinner()
showError(xhr.response);
} else if (xhr.status === 422) {
disableSpinner()
showError(xhr.response);

View File

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

View File

@@ -11,23 +11,52 @@ use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
readonly class LoginController {
private const int MAX_LOGIN_ATTEMPTS_PER_TTL = 5;
private const int LOGIN_COUNTER_TTL = 300;
private const string RATE_LIMIT_CACHE_KEY = 'login_failed_attempts';
public function __construct(
private AuthManager $authManager,
private DockerActionManager $dockerActionManager,
) {
}
private function getFailedLoginCount() : int {
$count = apcu_fetch(self::RATE_LIMIT_CACHE_KEY);
return $count !== false ? (int)$count : 0;
}
private function incrementFailedLoginCount() : void {
if (!apcu_exists(self::RATE_LIMIT_CACHE_KEY)) {
apcu_store(self::RATE_LIMIT_CACHE_KEY, 1, self::LOGIN_COUNTER_TTL);
} else {
apcu_inc(self::RATE_LIMIT_CACHE_KEY);
}
}
private function resetFailedLoginCount() : void {
apcu_delete(self::RATE_LIMIT_CACHE_KEY);
}
public function TryLogin(Request $request, Response $response, array $args) : Response {
if (!$this->dockerActionManager->isLoginAllowed()) {
$response->getBody()->write("The login is blocked since Nextcloud is running.");
return $response->withHeader('Location', '.')->withStatus(422);
}
if ($this->getFailedLoginCount() >= self::MAX_LOGIN_ATTEMPTS_PER_TTL) {
$response->getBody()->write("Too many failed login attempts. Please try again in some minutes.");
return $response->withHeader('Location', '.')->withStatus(429);
}
$password = $request->getParsedBody()['password'] ?? '';
if($this->authManager->CheckCredentials($password)) {
$this->resetFailedLoginCount();
$this->authManager->SetAuthState(true);
return $response->withHeader('Location', '.')->withStatus(201);
}
$this->incrementFailedLoginCount();
$response->getBody()->write("The password is incorrect.");
return $response->withHeader('Location', '.')->withStatus(422);
}

View File

@@ -27,7 +27,7 @@
<script type="text/javascript" src="timezone.js"></script>
{# js for optional containers and additional containers forms #}
<script type="text/javascript" src="containers-form-submit.js?v6"></script>
<script type="text/javascript" src="containers-form-submit.js?v7"></script>
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
{% set isAnyRunning = false %}
@@ -353,6 +353,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,7 +364,7 @@
<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.')" />
</form>

View File

@@ -1 +1 @@
12.9.0
12.9.1

View File

@@ -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,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

@@ -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>