Compare commits

...

59 Commits

Author SHA1 Message Date
Anvil5465
1d5b39b98a Create readme.md
Signed-off-by: Anvil5465 <119350594+Anvil5465@users.noreply.github.com>
2025-03-29 18:07:34 -05:00
Simon L.
25c580bca3 fix update-helm by removing spaces
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-26 19:00:31 +01:00
Simon L.
80920778fb update update-helm with correct syntax
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-26 18:55:50 +01:00
Simon L.
d3ac48f352 add a note to NEXTCLOUD_TRUSTED_CACERTS_DIR
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-26 10:45:15 +01:00
Simon L.
13e9829a85 fix detail
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-25 11:01:42 +01:00
Simon L.
7cb96aed74 Merge pull request #6203 from nextcloud/dependabot/docker/Containers/mastercontainer/docker-28.0.2-cli
build(deps): bump docker from 28.0.1-cli to 28.0.2-cli in /Containers/mastercontainer
2025-03-25 10:50:44 +01:00
Simon L.
ecb2e1ad87 Merge pull request #6202 from nextcloud/dependabot/docker/Containers/docker-socket-proxy/haproxy-3.1.6-alpine
build(deps): bump haproxy from 3.1.5-alpine to 3.1.6-alpine in /Containers/docker-socket-proxy
2025-03-25 10:50:31 +01:00
Simon L.
378346c9c1 Merge pull request #6204 from nextcloud/enh/noid/increase-default-socket-timeout
nextcloud: adjust `default_socket_timeout` to `${PHP_MAX_TIME}` in order to make it configurable
2025-03-25 10:50:03 +01:00
Simon L.
edbdac6af4 Merge pull request #6205 from nextcloud/dsp/more-struct-regexes
docker-socket-proxy: more strict rules for the container creation
2025-03-25 10:49:27 +01:00
Simon L.
a4fa22ec22 increase to 10.10.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-25 10:49:03 +01:00
Simon L.
fa87a5ca6a Merge pull request #6200 from nextcloud/enh/noid/allow-set-skeletondir
helm: allow to set the skeleton directory
2025-03-25 10:47:56 +01:00
Simon L.
c65eb16a15 Revert "Revert changes to helm-chart updates"
This reverts commit ac2c97a08e.
2025-03-25 10:47:12 +01:00
Simon L.
3dffd46e8b Merge pull request #6219 from nextcloud/aio-helm-update
Helm Chart updates
2025-03-25 10:46:54 +01:00
szaimen
7f76f622e1 Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-25 09:46:29 +00:00
Simon L.
ac2c97a08e Revert changes to helm-chart updates
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-25 10:45:35 +01:00
Simon L.
d5c195aa0c Merge pull request #6217 from nextcloud/enh/6123/move-images-to-ghcr.io
move images to ghcr.io
2025-03-25 10:41:36 +01:00
Simon L.
5d090018f9 move images to ghcr.io
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-25 10:36:25 +01:00
Simon L.
b8d08fc77b Merge pull request #6139 from nextcloud/aio-yaml-update
Yaml updates
2025-03-25 09:48:17 +01:00
Simon L.
4669ad430c helm: allow to set the skeleton directory
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-24 18:31:03 +01:00
Oleksander Piskun
348a08a720 more strict rules for the container creation
Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
2025-03-21 18:45:00 +02:00
szaimen
167c2dc389 Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-21 12:03:18 +00:00
Simon L.
4c14fa9b13 nextcloud: adjust default_socket_timeout to ${PHP_MAX_TIME} in order to make it configurable
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-21 10:06:41 +01:00
dependabot[bot]
9b8a9de565 build(deps): bump docker in /Containers/mastercontainer
Bumps docker from 28.0.1-cli to 28.0.2-cli.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 04:26:03 +00:00
dependabot[bot]
b9a04858ca build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.1.5-alpine to 3.1.6-alpine.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 04:25:41 +00:00
Simon L.
91e99dcba9 Update develop.md
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 17:30:49 +01:00
Simon L.
6b9e68d55f fix typo
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 13:19:49 +01:00
Simon L.
0ed524baba modify two details in initial-setup test
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 13:13:09 +01:00
Simon L.
7eabc59328 adjust some details to actually do what the test is intended to do
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 13:08:54 +01:00
Simon L.
8ddd123568 fix removing tests from aio-interface
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 12:45:05 +01:00
Simon L.
b1f2d6f691 increase to 10.9.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 12:42:03 +01:00
Simon L.
2cc4c6813f Merge pull request #6178 from nextcloud/enh/noid/test-file
nextcloud-entrypoint: output error message if touch failed
2025-03-20 12:41:04 +01:00
Simon L.
91ca184262 Merge pull request #6196 from nextcloud/enh/noid/update-nc-30.0.8
nextcloud: update to 30.0.8
2025-03-20 12:37:37 +01:00
Simon L.
6d1f1c1aeb nextcloud: update to 30.0.8
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 12:36:57 +01:00
Simon L.
f876b23c0b develop.md: add note how to run E2EE tests
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 12:23:33 +01:00
Simon L.
d6446d5f03 Merge pull request #6189 from nextcloud/test/e2e-tests
aio-interface: add e2e tests via playwright
2025-03-20 12:14:24 +01:00
Simon L.
c1b60f9a51 Dockerfile: remove tests subfolder
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 12:12:57 +01:00
Richard Steinmetz
e37611a759 test: add e2e tests via playwright
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-03-20 12:08:32 +01:00
Simon L.
4f68d3ed1c Merge pull request #6195 from nextcloud/test/more-ids
test: add more ids for e2e tests
2025-03-20 10:56:11 +01:00
Simon L.
43f73ccbfe Merge pull request #6194 from nextcloud/dependabot/docker/Containers/talk/nats-2.11.0-scratch
build(deps): bump nats from 2.10.26-scratch to 2.11.0-scratch in /Containers/talk
2025-03-20 10:55:03 +01:00
Simon L.
a4aa1baf54 update OO
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-20 10:54:34 +01:00
Richard Steinmetz
38254f76ab test: add more ids for e2e tests
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-03-20 10:52:38 +01:00
dependabot[bot]
80ae736633 build(deps): bump nats in /Containers/talk
Bumps nats from 2.10.26-scratch to 2.11.0-scratch.

---
updated-dependencies:
- dependency-name: nats
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-20 04:31:25 +00:00
Simon L.
0e0dc0da6f Merge pull request #6172 from nextcloud/dependabot/docker/Containers/nextcloud/php-8.3.19-fpm-alpine3.21
build(deps): bump php from 8.3.17-fpm-alpine3.21 to 8.3.19-fpm-alpine3.21 in /Containers/nextcloud
2025-03-19 15:31:52 +01:00
Simon L.
4e922c0943 Merge pull request #6171 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.3.19-fpm-alpine3.21
build(deps): bump php from 8.3.17-fpm-alpine3.21 to 8.3.19-fpm-alpine3.21 in /Containers/mastercontainer
2025-03-19 15:31:43 +01:00
Simon L.
1fbc3074dd Merge pull request #6167 from nextcloud/enh/noid/stalwart
Change stalwart tag
2025-03-19 15:31:33 +01:00
Simon L.
4cb258e7d2 Merge pull request #6190 from nextcloud/test/e2e-prep
test: prepare for e2e tests
2025-03-19 14:48:08 +01:00
Richard Steinmetz
f90631125e test: prepare for e2e tests
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-03-19 14:46:41 +01:00
Simon L.
7062b6aa90 add about info to documentation about aio section
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-18 23:44:03 +01:00
Simon L.
38a11c4624 Update config.yml
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-18 22:39:17 +01:00
Simon L.
c525f802d5 Update Bug_report.md
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-18 22:34:50 +01:00
Simon L.
c973834733 Merge pull request #6183 from nextcloud/dependabot/github_actions/dot-github/workflows/shivammathur/setup-php-2.32.0
build(deps): bump shivammathur/setup-php from 2.30.0 to 2.32.0 in /.github/workflows
2025-03-17 13:23:29 +01:00
dependabot[bot]
ccc6487877 build(deps): bump shivammathur/setup-php in /.github/workflows
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.30.0 to 2.32.0.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](a4e22b60bb...9e72090525)

---
updated-dependencies:
- dependency-name: shivammathur/setup-php
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-17 12:09:48 +00:00
Simon L.
1b6524b904 Update dependabot.yml
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-17 13:06:18 +01:00
Simon L.
47964fc16c Merge pull request #6181 from nextcloud/enh/noid/update-GA
update Github Actions to use commit hashes for 3rd party actions instead of version tags
2025-03-17 11:17:36 +01:00
Simon L.
63d9343972 update Github Actions to use commit hashes for 3rd party actions instead of version tags
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-17 11:15:23 +01:00
Simon L.
d164eea1ee nextcloud-entrypoint: output error message if touch failed
Signed-off-by: Simon L. <szaimen@e.mail.de>
2025-03-16 14:05:12 +01:00
dependabot[bot]
fbb71586e8 build(deps): bump php in /Containers/nextcloud
Bumps php from 8.3.17-fpm-alpine3.21 to 8.3.19-fpm-alpine3.21.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-14 04:44:11 +00:00
dependabot[bot]
8fe6821038 build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.3.17-fpm-alpine3.21 to 8.3.19-fpm-alpine3.21.

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-14 04:43:55 +00:00
Jean-Yves
36dc60e9d2 Update stalwart.json
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2025-03-13 17:45:35 +01:00
59 changed files with 552 additions and 95 deletions

View File

@@ -5,8 +5,10 @@ labels: 0. Needs triage
---
<!---
- Before submitting a bug report, please read through the documentation available at https://github.com/nextcloud/all-in-one#faq
- If you use Cloudflare Tunnel or Cloudflare Proxy, see https://github.com/nextcloud/all-in-one#notes-on-cloudflare-proxytunnel for known issues/limitations and workarounds.
- For issues with Collabora or Talk, make sure to follow https://github.com/nextcloud/all-in-one/discussions/1358. It may already resolve your issue and makes it easier to help you.
--->
<!--- Please fill out the whole template below -->

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 📘 Documentation on Nextcloud AIO
url: https://github.com/nextcloud/all-in-one#faq
about: Please read the docs first before submitting any report or request!
- name: ⛑️ General questions and support
url: https://help.nextcloud.com/tag/aio
about: For general questions, support and help
@@ -11,4 +14,4 @@ contact_links:
about: For questions specifically about AIO
- name: 💼 Nextcloud Enterprise
url: https://portal.nextcloud.com/
about: If you are a Nextcloud Enterprise customer, or need Professional support, so it can be resolved directly by our dedicated engineers more quickly
about: If you are a Nextcloud Enterprise customer, or need Professional support, so it can be resolved directly by our dedicated engineers more quickly

View File

@@ -1,7 +1,7 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
directory: ".github/workflows"
schedule:
interval: "daily"
time: "12:00"

View File

@@ -14,7 +14,7 @@ jobs:
- name: Check out code
uses: actions/checkout@v4
- name: Check spelling
uses: codespell-project/actions-codespell@v2
uses: codespell-project/actions-codespell@406322ec52dd7b488e48c1c4b82e2a8b3a1bf630 # v2
with:
check_filenames: true
check_hidden: true

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
- uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: 8.3
extensions: apcu
@@ -44,7 +44,7 @@ jobs:
)"
sed -i "s|pecl install APCu.*\;|pecl install APCu-$apcu_version\;|" ./Containers/mastercontainer/Dockerfile
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: php dependency updates
signoff: true

View File

@@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@v4
- name: Turnstyle
uses: softprops/turnstyle@v2
uses: softprops/turnstyle@25dcee5c3fcb84375f3a3f93a3c97ed0d42cfcdc # v2
with:
continue-after-seconds: 180
env:
@@ -32,7 +32,7 @@ jobs:
# See https://github.com/helm/chart-releaser-action/issues/6
- name: Set up Helm
uses: azure/setup-helm@v4
uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # v4
with:
version: v3.6.3
@@ -41,7 +41,7 @@ jobs:
helm lint ./nextcloud-aio-helm-chart
- name: Run chart-releaser
uses: helm/chart-releaser-action@v1.7.0
uses: helm/chart-releaser-action@cae68fefc6b5f367a0275617c9f83181ba54714f # v1.7.0
with:
mark_as_latest: false
charts_dir: .

View File

@@ -22,7 +22,7 @@ jobs:
sed -i "s|^ENV IMAGINARY_HASH.*$|ENV IMAGINARY_HASH=$imaginary_version|" ./Containers/imaginary/Dockerfile
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: imaginary-update automated change
signoff: true

View File

@@ -16,7 +16,7 @@ jobs:
fetch-depth: 0
- name: Install Helm
uses: azure/setup-helm@v4
uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # v4
with:
version: v3.11.1

View File

@@ -36,7 +36,7 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: ${{ matrix.php-versions }}
coverage: none

View File

@@ -14,7 +14,7 @@ jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
- uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5
with:
issue-inactive-days: '14'
process-only: 'issues'

View File

@@ -85,7 +85,7 @@ jobs:
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: nextcloud-update automated change
signoff: true

View File

@@ -18,7 +18,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up php
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: 8.3
extensions: apcu

77
.github/workflows/playwright.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
name: Playwright Tests
on:
workflow_dispatch:
env:
BASE_URL: https://localhost:8080
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: cd php/tests && npm ci
- name: Install Playwright Browsers
run: cd php/tests && npx playwright install --with-deps chromium
- name: Start fresh development server
run: |
docker rm --force nextcloud-aio-{mastercontainer,apache,notify-push,nextcloud,redis,database,domaincheck,whiteboard,imaginary,talk,collabora,borgbackup} || true
docker volume rm nextcloud_aio_{mastercontainer,apache,database,database_dump,nextcloud,nextcloud_data,redis,backup_cache,elasticsearch} || true
docker pull ghcr.io/nextcloud-releases/all-in-one:develop
docker run \
-d \
--init \
--name nextcloud-aio-mastercontainer \
--restart always \
--publish 8080:8080 \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--env SKIP_DOMAIN_VALIDATION=true \
--env APACHE_PORT=11000 \
ghcr.io/nextcloud-releases/all-in-one:develop
echo Waiting for 10 seconds for the development container to start ...
sleep 10
- name: Run Playwright tests for initial setup
run: cd php/tests && DEBUG=pw:api npx playwright test tests/initial-setup.spec.js
- name: Start fresh development server
run: |
docker rm --force nextcloud-aio-{mastercontainer,apache,notify-push,nextcloud,redis,database,domaincheck,whiteboard,imaginary,talk,collabora,borgbackup} || true
docker volume rm nextcloud_aio_{mastercontainer,apache,database,database_dump,nextcloud,nextcloud_data,redis,backup_cache,elasticsearch} || true
docker run \
-d \
--init \
--name nextcloud-aio-mastercontainer \
--restart always \
--publish 8080:8080 \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--env SKIP_DOMAIN_VALIDATION=false \
--env APACHE_PORT=11000 \
ghcr.io/nextcloud-releases/all-in-one:develop
echo Waiting for 10 seconds for the development container to start ...
sleep 10
- name: Run Playwright tests for backup restore
run: cd php/tests && DEBUG=pw:api npx playwright test tests/restore-instance.spec.js
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: playwright-report
path: php/tests/playwright-report/
retention-days: 14
overwrite: true

View File

@@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set up php
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: 8.3
extensions: apcu
@@ -30,7 +30,7 @@ jobs:
continue-on-error: true
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: Update psalm baseline

View File

@@ -29,7 +29,7 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up php
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: 8.3
extensions: apcu

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Run Shellcheck
uses: ludeeus/action-shellcheck@2.0.0
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
with:
check_together: 'yes'
env:

View File

@@ -45,7 +45,7 @@ jobs:
sed -i "s|^ARG JANUS_VERSION=.*$|ARG JANUS_VERSION=$janus_version|" ./Containers/talk/Dockerfile
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: talk-update automated change
signoff: true

View File

@@ -27,7 +27,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@v2
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 # v2
with:
php-version: 8.3
extensions: apcu

View File

@@ -14,13 +14,16 @@ jobs:
uses: actions/checkout@v4
- name: update helm chart
run: |
DOCKER_TAG="$(curl -L -s 'https://registry.hub.docker.com/v2/repositories/nextcloud/all-in-one/tags?page_size=1024' | jq '."results"[]["name"]' | sed 's|"||g' | grep '^20[0-9_]\+' | grep -v latest | sort -r | head -1)"
set -x
GHCR_TOKEN="$(curl https://ghcr.io/token?scope=repository:nextcloud-releases/nce-php-fpm-mgmt:pull | jq '.token' | sed 's|"||g')"
DOCKER_TAG="$(curl -H "Authorization: Bearer ${GHCR_TOKEN}" -L -s 'https://ghcr.io/v2/nextcloud-releases/all-in-one/tags/list?page_size=1024' | jq '.tags' | sed 's|"||g;s|[[:space:]]||g' | grep '^20[0-9_]\+' | grep -v latest | sort -r | head -1)"
export DOCKER_TAG
set +x
if [ -n "$DOCKER_TAG" ] && ! grep -q "$DOCKER_TAG" ./nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml; then
sudo bash nextcloud-aio-helm-chart/update-helm.sh "$DOCKER_TAG"
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: Helm Chart updates
signoff: true

View File

@@ -16,7 +16,7 @@ jobs:
run: |
sudo bash manual-install/update-yaml.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7
with:
commit-message: Yaml updates
signoff: true

View File

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

View File

@@ -13,7 +13,7 @@ frontend http
bind :::2375 v4v6
http-request deny unless { src 127.0.0.1 } || { src ::1 } || { src NC_IPV4_PLACEHOLDER } || { src NC_IPV6_PLACEHOLDER }
# docker system _ping
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/_ping } METH_GET
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/_ping$ } METH_GET
# container inspect: GET containers/%s/json
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/nc_app_[a-zA-Z0-9_.-]+/json } METH_GET
# container inspect: GET containers/%s/logs
@@ -38,19 +38,19 @@ frontend http
# ACL to deny if there are any binds
acl binds_present req.body -m reg -i "\"HostConfig\"\s*:.*\"Binds\"\s*:"
# ACL to restrict the type of Mounts to volume
acl type_not_volume req.body -m reg -i "\"Mounts\":\s*\[[^\]]*(\"Type\":\s*\"(?!volume\b)\w+\"[^\]]*)+\]"
acl type_not_volume req.body -m reg -i "\"Mounts\"\s*:\s*\[[^\]]*(\"Type\"\s*:\s*\"(?!volume\b)\w+\"[^\]]*)+\]"
http-request deny if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/create } nc_app_container_name !one_mount_volume binds_present type_not_volume METH_POST
# ACL to restrict container creation, that it has HostConfig.Privileged not set
acl no_privileged_flag req.body -m reg -i "\"HostConfig\":\s?{[^}]*\"Privileged\""
# ACL to restrict container creation, that it has HostConfig.Privileged(by searching for "Privileged" word in all payload)
acl no_privileged_flag req.body -m reg -i "\"Privileged\""
# ACL to allow mount volume with strict pattern for name: nc_app_[a-zA-Z0-9_.-]+_data
acl nc_app_volume_data_only req.body -m reg -i "\"Mounts\":\s?\[\s?{[^}]*\"Source\":\s?\"nc_app_[a-zA-Z0-9_.-]+_data\""
acl nc_app_volume_data_only req.body -m reg -i "\"Mounts\"\s*:\s*\[\s*{[^}]*\"Source\"\s*:\s*\"nc_app_[a-zA-Z0-9_.-]+_data\""
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/create } nc_app_container_name !no_privileged_flag nc_app_volume_data_only METH_POST
# end of container create
# volume create: POST volumes/create
# restrict name
acl nc_app_volume_data req.body -m reg -i "\"Name\":\s?\"nc_app_[a-zA-Z0-9_.-]+_data\""
acl nc_app_volume_data req.body -m reg -i "\"Name\"\s*:\s*\"nc_app_[a-zA-Z0-9_.-]+_data\""
# do not allow to use "device" word e.g., "--opt device=:/path/to/dir"
acl volume_no_device req.body -m reg -i "\"device\""
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/volumes/create } nc_app_volume_data !volume_no_device METH_POST

View File

@@ -1,12 +1,12 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
FROM docker:28.0.1-cli AS docker
FROM docker:28.0.2-cli AS docker
# Caddy is a requirement
FROM caddy:2.9.1-alpine AS caddy
# From https://github.com/docker-library/php/blob/master/8.3/alpine3.21/fpm/Dockerfile
FROM php:8.3.17-fpm-alpine3.21
FROM php:8.3.19-fpm-alpine3.21
EXPOSE 80
EXPOSE 8080
@@ -66,6 +66,7 @@ RUN set -ex; \
cd /var/www/docker-aio; \
git clone https://github.com/nextcloud-releases/all-in-one.git --depth 1 .; \
find ./ -maxdepth 1 -mindepth 1 -not -path ./php -not -path ./community-containers -exec rm -r {} \; ; \
rm -r ./php/tests; \
chown www-data:www-data -R /var/www/docker-aio; \
cd php; \
sudo -u www-data composer install --no-dev; \

View File

@@ -283,10 +283,10 @@ if [ "$?" = 6 ]; then
exit 1
fi
# Check if auth.docker.io is reachable
# Check if ghcr.io is reachable
# Solves issues like https://github.com/nextcloud/all-in-one/discussions/5268
if ! curl https://auth.docker.io/token 2>&1 | grep -q token; then
print_red "Could not reach https://auth.docker.io."
if ! curl https://ghcr.io &>/dev/null; then
print_red "Could not reach https://ghcr.io."
echo "Most likely is something blocking access to it."
echo "You should be able to fix this by using https://github.com/nextcloud/all-in-one/tree/main/manual-install"
exit 1

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM php:8.3.17-fpm-alpine3.21
FROM php:8.3.19-fpm-alpine3.21
ENV PHP_MEMORY_LIMIT=512M
ENV PHP_UPLOAD_LIMIT=16G
@@ -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=30.0.7
ENV NEXTCLOUD_VERSION=30.0.8
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!
@@ -142,7 +142,7 @@ RUN set -ex; \
echo 'post_max_size=${PHP_UPLOAD_LIMIT}'; \
echo 'max_execution_time=${PHP_MAX_TIME}'; \
echo 'max_input_time=${PHP_MAX_TIME}'; \
echo 'default_socket_timeout=600'; \
echo 'default_socket_timeout=${PHP_MAX_TIME}'; \
} > /usr/local/etc/php/conf.d/nextcloud.ini; \
\
{ \

View File

@@ -33,7 +33,7 @@ while ! nc -z "$REDIS_HOST" "6379"; do
done
# Check permissions in ncdata
touch "$NEXTCLOUD_DATA_DIR/this-is-a-test-file" &>/dev/null
touch "$NEXTCLOUD_DATA_DIR/this-is-a-test-file"
if ! [ -f "$NEXTCLOUD_DATA_DIR/this-is-a-test-file" ]; then
echo "The www-data user doesn't seem to have access rights in the datadir.
Most likely are the files located on a drive that does not follow linux permissions.
@@ -535,6 +535,13 @@ php /var/www/html/occ config:system:set upgrade.cli-upgrade-link --value="https:
php /var/www/html/occ config:system:set logfile --value="/var/www/html/data/nextcloud.log"
php /var/www/html/occ config:app:set admin_audit logfile --value="/var/www/html/data/audit.log"
php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater"
if [ -n "$NEXTCLOUD_SKELETON_DIRECTORY" ]; then
if [ "$NEXTCLOUD_SKELETON_DIRECTORY" = "empty" ]; then
php /var/www/html/occ config:system:set skeletondirectory --value=""
else
php /var/www/html/occ config:system:set skeletondirectory --value="$NEXTCLOUD_SKELETON_DIRECTORY"
fi
fi
if [ -n "$SERVERINFO_TOKEN" ] && [ -z "$(php /var/www/html/occ config:app:get serverinfo token)" ]; then
php /var/www/html/occ config:app:set serverinfo token --value="$SERVERINFO_TOKEN"
fi

View File

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

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM nats:2.10.26-scratch AS nats
FROM nats:2.11.0-scratch AS nats
FROM eturnal/eturnal:1.12.1 AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.2 AS signaling
FROM alpine:3.21.3 AS janus

View File

@@ -0,0 +1,12 @@
## MollySocket
This container bundles MollySocket and auto-configures it for you.
### Notes
- This container is only intended to be used over https behind a reverse proxy. You can You can set up a reverse proxy following [these instructions](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md) OR use the Caddy community container that will automatically configure mollysocket.$NC_DOMAIN to redirect to your MollySocket.
- 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/mollyim/mollysocket
### Maintainer
https://github.com/Anvil5465

View File

@@ -5,7 +5,7 @@
"display_name": "Stalwart",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/stalwart",
"image": "ghcr.io/docjyj/aio-stalwart",
"image_tag": "%AIO_CHANNEL%",
"image_tag": "v3",
"internal_port": "10003",
"restart": "unless-stopped",
"ports": [

View File

@@ -11,7 +11,7 @@ sudo docker run \
--publish 8443:8443 \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
nextcloud/all-in-one:develop
ghcr.io/nextcloud-releases/all-in-one:develop
```
And you are done :)
It will now also select the developer channel for all other containers automatically.
@@ -19,6 +19,9 @@ It will now also select the developer channel for all other containers automatic
## How to publish new releases?
Simply use https://github.com/nextcloud/all-in-one/issues/180 as template.
## How to update existing instances to a new major Nextcloud version?
Simply use https://github.com/nextcloud/all-in-one/issues/6198 as template.
## How to build new containers
Go to https://github.com/nextcloud-releases/all-in-one/actions/workflows/repo-sync.yml and run the workflow that will first sync the repo and then build new container that automatically get published to `develop` and `develop-arm64`.
@@ -27,6 +30,8 @@ Before testing, make sure that at least the amd64 containers are built successfu
There is a testing-VM available for the maintainer of AIO that allows for some final testing before releasing new version. See [this](https://cloud.nextcloud.com/apps/collectives/Nextcloud%20Handbook/Technical/AIO%20testing%20VM?fileId=6350152) for details.
Additionally, there are now E2E tests available that can be run via https://github.com/nextcloud/all-in-one/actions/workflows/playwright.yml
## How to promote builds from develop to beta
1. Verify that no job is running here: https://github.com/nextcloud-releases/all-in-one/actions/workflows/build_images.yml
2. Go to https://github.com/nextcloud-releases/all-in-one/actions/workflows/promote-to-beta.yml, click on `Run workflow`.

View File

@@ -341,7 +341,7 @@ services:
init: false
healthcheck:
start_period: 60s
test: clamdcheck.sh
test: /healthcheck.sh
interval: 30s
timeout: 30s
start_interval: 5s
@@ -351,7 +351,6 @@ services:
environment:
- TZ=${TIMEZONE}
- MAX_SIZE=${NEXTCLOUD_UPLOAD_LIMIT}
- CLAMD_STARTUP_TIMEOUT=90
volumes:
- nextcloud_aio_clamav:/var/lib/clamav:rw
restart: unless-stopped
@@ -359,9 +358,11 @@ services:
- clamav
read_only: true
tmpfs:
- /var/lock
- /var/log/clamav
- /tmp
- /var/log/clamav
- /run/clamav
- /var/log/supervisord
- /var/run/supervisord
cap_drop:
- NET_RAW

View File

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

View File

@@ -61,7 +61,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: nextcloud/aio-apache:20250306_093458
image: nextcloud/aio-apache:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -55,17 +55,15 @@ spec:
{{- end }}
containers:
- env:
- name: CLAMD_STARTUP_TIMEOUT
value: "90"
- name: MAX_SIZE
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-clamav:20250306_093458
image: nextcloud/aio-clamav:20250325_084656
readinessProbe:
exec:
command:
- clamdcheck.sh
- /healthcheck.sh
failureThreshold: 9
initialDelaySeconds: 60
periodSeconds: 30
@@ -73,7 +71,7 @@ spec:
livenessProbe:
exec:
command:
- clamdcheck.sh
- /healthcheck.sh
failureThreshold: 9
initialDelaySeconds: 60
periodSeconds: 30

View File

@@ -35,7 +35,7 @@ spec:
value: --o:ssl.enable=false --o:ssl.termination=true --o:mount_jail_tree=false --o:logging.level=warning --o:home_mode.enable=true --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 }}"
image: nextcloud/aio-collabora:20250306_093458
image: nextcloud/aio-collabora:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -64,7 +64,7 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-postgresql:20250306_093458
image: nextcloud/aio-postgresql:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -54,7 +54,7 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
image: nextcloud/aio-fulltextsearch:20250306_093458
image: nextcloud/aio-fulltextsearch:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -38,7 +38,7 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-imaginary:20250306_093458
image: nextcloud/aio-imaginary:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -180,7 +180,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
image: nextcloud/aio-nextcloud:20250306_093458
image: nextcloud/aio-nextcloud:20250325_084656
{{- 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

@@ -55,7 +55,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-notify-push:20250306_093458
image: nextcloud/aio-notify-push:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -42,7 +42,7 @@ spec:
value: "{{ .Values.ONLYOFFICE_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-onlyoffice:20250306_093458
image: nextcloud/aio-onlyoffice:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -39,7 +39,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-redis:20250306_093458
image: nextcloud/aio-redis:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -52,7 +52,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-talk:20250306_093458
image: nextcloud/aio-talk:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -44,7 +44,7 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-talk-recording:20250306_093458
image: nextcloud/aio-talk-recording:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -48,7 +48,7 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: nextcloud/aio-whiteboard:20250306_093458
image: nextcloud/aio-whiteboard:20250325_084656
readinessProbe:
exec:
command:

View File

@@ -302,6 +302,8 @@ cat << EOL > /tmp/additional.config
value: "{{ .Values.SERVERINFO_TOKEN }}"
- name: NEXTCLOUD_DEFAULT_QUOTA
value: "{{ .Values.NEXTCLOUD_DEFAULT_QUOTA }}"
- name: NEXTCLOUD_SKELETON_DIRECTORY
value: "{{ .Values.NEXTCLOUD_SKELETON_DIRECTORY | default "" }}"
- name: NEXTCLOUD_MAINTENANCE_WINDOW
value: "{{ .Values.NEXTCLOUD_MAINTENANCE_WINDOW }}"
EOL
@@ -414,6 +416,7 @@ APPS_ALLOWLIST: # This allows to configure allowed apps that will be show
ADDITIONAL_TRUSTED_PROXY: # Allows to add one additional ip-address to Nextcloud's trusted proxies and to the Office WOPI-allowlist automatically. Set it e.g. like this: 'your.public.ip-address'. You can also use an ip-range here.
ADDITIONAL_TRUSTED_DOMAIN: # Allows to add one domain to Nextcloud's trusted domains and also generates a certificate automatically for it
NEXTCLOUD_DEFAULT_QUOTA: "10 GB" # Allows to adjust the default quota that will be taken into account in Nextcloud for new users. Setting it to "unlimited" will set it to unlimited
NEXTCLOUD_SKELETON_DIRECTORY: # Allows to adjust the sekeleton dir for Nextcloud. Setting it to "empty" will set the value to an empty string "" which will turn off the setting for new users in Nextcloud.
NEXTCLOUD_MAINTENANCE_WINDOW: # Allows to define the maintenance window for Nextcloud. See https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/background_jobs_configuration.html#parameters for possible values
SMTP_HOST: # (empty by default): The hostname of the SMTP server.
SMTP_SECURE: # (empty by default): Set to 'ssl' to use SSL, or 'tls' to use STARTTLS.

View File

@@ -13,7 +13,7 @@
"nextcloud-aio-whiteboard"
],
"display_name": "Apache",
"image": "nextcloud/aio-apache",
"image": "ghcr.io/nextcloud-releases/aio-apache",
"user": "33",
"init": true,
"healthcheck": {
@@ -84,7 +84,7 @@
"container_name": "nextcloud-aio-database",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Database",
"image": "nextcloud/aio-postgresql",
"image": "ghcr.io/nextcloud-releases/aio-postgresql",
"user": "999",
"init": true,
"healthcheck": {
@@ -149,7 +149,7 @@
"nextcloud-aio-docker-socket-proxy"
],
"display_name": "Nextcloud",
"image": "nextcloud/aio-nextcloud",
"image": "ghcr.io/nextcloud-releases/aio-nextcloud",
"init": true,
"healthcheck": {
"start_period": "0s",
@@ -271,7 +271,7 @@
"container_name": "nextcloud-aio-notify-push",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Notify Push",
"image": "nextcloud/aio-notify-push",
"image": "ghcr.io/nextcloud-releases/aio-notify-push",
"user": "33",
"init": true,
"healthcheck": {
@@ -319,7 +319,7 @@
"container_name": "nextcloud-aio-redis",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Redis",
"image": "nextcloud/aio-redis",
"image": "ghcr.io/nextcloud-releases/aio-redis",
"user": "999",
"init": true,
"healthcheck": {
@@ -361,7 +361,7 @@
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Collabora",
"image": "nextcloud/aio-collabora",
"image": "ghcr.io/nextcloud-releases/aio-collabora",
"init": true,
"healthcheck": {
"start_period": "60s",
@@ -404,7 +404,7 @@
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Talk",
"image": "nextcloud/aio-talk",
"image": "ghcr.io/nextcloud-releases/aio-talk",
"user": "1000",
"init": true,
"healthcheck": {
@@ -466,7 +466,7 @@
"container_name": "nextcloud-aio-talk-recording",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Talk Recording",
"image": "nextcloud/aio-talk-recording",
"image": "ghcr.io/nextcloud-releases/aio-talk-recording",
"user": "122",
"init": true,
"healthcheck": {
@@ -518,7 +518,7 @@
{
"container_name": "nextcloud-aio-borgbackup",
"image_tag": "%AIO_CHANNEL%",
"image": "nextcloud/aio-borgbackup",
"image": "ghcr.io/nextcloud-releases/aio-borgbackup",
"init": true,
"environment": [
"BORG_REMOTE_REPO=%BORGBACKUP_REMOTE_REPO%",
@@ -586,7 +586,7 @@
{
"container_name": "nextcloud-aio-watchtower",
"image_tag": "%AIO_CHANNEL%",
"image": "nextcloud/aio-watchtower",
"image": "ghcr.io/nextcloud-releases/aio-watchtower",
"init": true,
"environment": [
"CONTAINER_TO_UPDATE=nextcloud-aio-mastercontainer"
@@ -606,7 +606,7 @@
{
"container_name": "nextcloud-aio-domaincheck",
"image_tag": "%AIO_CHANNEL%",
"image": "nextcloud/aio-domaincheck",
"image": "ghcr.io/nextcloud-releases/aio-domaincheck",
"init": true,
"ports": [
{
@@ -637,7 +637,7 @@
"container_name": "nextcloud-aio-clamav",
"image_tag": "%AIO_CHANNEL%",
"display_name": "ClamAV",
"image": "nextcloud/aio-clamav",
"image": "ghcr.io/nextcloud-releases/aio-clamav",
"user": "100",
"init": false,
"healthcheck": {
@@ -683,7 +683,7 @@
"container_name": "nextcloud-aio-onlyoffice",
"image_tag": "%AIO_CHANNEL%",
"display_name": "OnlyOffice",
"image": "nextcloud/aio-onlyoffice",
"image": "ghcr.io/nextcloud-releases/aio-onlyoffice",
"init": true,
"healthcheck": {
"start_period": "60s",
@@ -729,7 +729,7 @@
"container_name": "nextcloud-aio-imaginary",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Imaginary",
"image": "nextcloud/aio-imaginary",
"image": "ghcr.io/nextcloud-releases/aio-imaginary",
"user": "65534",
"init": true,
"healthcheck": {
@@ -771,7 +771,7 @@
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1709",
"display_name": "Fulltextsearch",
"image": "nextcloud/aio-fulltextsearch",
"image": "ghcr.io/nextcloud-releases/aio-fulltextsearch",
"init": false,
"healthcheck": {
"start_period": "60s",
@@ -819,7 +819,7 @@
"container_name": "nextcloud-aio-docker-socket-proxy",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Docker Socket Proxy",
"image": "nextcloud/aio-docker-socket-proxy",
"image": "ghcr.io/nextcloud-releases/aio-docker-socket-proxy",
"init": true,
"internal_port": "2375",
"environment": [
@@ -845,7 +845,7 @@
"container_name": "nextcloud-aio-whiteboard",
"image_tag": "%AIO_CHANNEL%",
"display_name": "Whiteboard",
"image": "nextcloud/aio-whiteboard",
"image": "ghcr.io/nextcloud-releases/aio-whiteboard",
"user": "65534",
"init": true,
"healthcheck": {

View File

@@ -900,7 +900,7 @@ class ConfigurationManager
}
public function shouldDomainValidationBeSkipped() : bool {
if (getenv('SKIP_DOMAIN_VALIDATION') !== false) {
if (getenv('SKIP_DOMAIN_VALIDATION') === 'true') {
return true;
}
return false;

View File

@@ -742,6 +742,33 @@ readonly class DockerActionManager {
}
}
private function GetCurrentImageName(): string {
$cacheKey = 'aio-image-name';
$imageName = apcu_fetch($cacheKey);
if ($imageName !== false && is_string($imageName)) {
return $imageName;
}
$containerName = 'nextcloud-aio-mastercontainer';
$url = $this->BuildApiUrl(sprintf('containers/%s/json', $containerName));
try {
$output = json_decode($this->guzzleClient->get($url)->getBody()->getContents(), true);
$imageNameArray = explode(':', $output['Config']['Image']);
if (count($imageNameArray) === 2) {
$imageName = $imageNameArray[0];
} else {
error_log("No tag was found when getting the current channel. You probably did not follow the documentation correctly. Changing the imageName to the default " . $output['Config']['Image']);
$imageName = $output['Config']['Image'];
}
apcu_add($cacheKey, $imageName);
return $imageName;
} catch (\Exception $e) {
error_log('Could not get current imageName ' . $e->getMessage());
}
return 'nextcloud/all-in-one';
}
public function GetCurrentChannel(): string {
$cacheKey = 'aio-ChannelName';
$channelName = apcu_fetch($cacheKey);
@@ -753,7 +780,6 @@ readonly class DockerActionManager {
$url = $this->BuildApiUrl(sprintf('containers/%s/json', $containerName));
try {
$output = json_decode($this->guzzleClient->get($url)->getBody()->getContents(), true);
$containerChecksum = $output['Image'];
$tagArray = explode(':', $output['Config']['Image']);
if (count($tagArray) === 2) {
$tag = $tagArray[1];
@@ -771,7 +797,7 @@ readonly class DockerActionManager {
}
public function IsMastercontainerUpdateAvailable(): bool {
$imageName = 'nextcloud/all-in-one';
$imageName = $this->GetCurrentImageName();
$containerName = 'nextcloud-aio-mastercontainer';
$tag = $this->GetCurrentChannel();

View File

@@ -17,7 +17,7 @@
<div class="container">
<main>
<h1>Nextcloud AIO v10.8.0</h1>
<h1>Nextcloud AIO v10.10.0</h1>
{# Add 2nd tab warning #}
<script type="text/javascript" src="second-tab-warning.js"></script>
@@ -106,7 +106,7 @@
<p><strong>Please note:</strong> The domain validation is disabled so any domain will be accepted here! Make sure you do not make a typo here as you will not be able to change it afterwards!</p>
{% endif %}
<form method="POST" action="/api/configuration" class="xhr">
<input type="text" name="domain" value="{{ domain }}" placeholder="nextcloud.yourdomain.com"/>
<input type="text" id="domain" name="domain" value="{{ domain }}" placeholder="nextcloud.yourdomain.com"/>
<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 domain" />
@@ -195,9 +195,9 @@
if stored remotely; and the encryption password of the backup archive below:
</p>
<form method="POST" action="/api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" name="borg_restore_host_location" value="{{borg_backup_host_location}}" placeholder="/mnt/backup"/><br>
<label>Local backup location</label> <input type="text" id="borg_restore_host_location" name="borg_restore_host_location" value="{{borg_backup_host_location}}" placeholder="/mnt/backup"/><br>
<label>Remote borg repo</label> <input type="text" name="borg_restore_remote_repo" value="{{borg_remote_repo}}" placeholder="ssh://user@host:port/path/to/repo"/><br>
<label>Borg passphrase</label> <input type="text" name="borg_restore_password" value="{{borg_restore_password}}" placeholder="encryption password"/><br>
<label>Borg passphrase</label> <input type="text" id="borg_restore_password" name="borg_restore_password" value="{{borg_restore_password}}" placeholder="encryption password"/><br>
<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 location and encryption password" />
@@ -241,9 +241,9 @@
<p>Initial Nextcloud username: <strong>admin</strong></p>
{% if hasBackupLocation %}
{# nextcloud_password needs to be duplicated due to a bug in Firefox. See https://github.com/nextcloud/all-in-one/issues/638. #}
<p>Initial Nextcloud password: <strong>{{ nextcloud_password }}</strong></p></details>
<p>Initial Nextcloud password: <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p></details>
{% else %}
<p>Initial Nextcloud password: <strong>{{ nextcloud_password }}</strong></p>
<p>Initial Nextcloud password: <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p>
{% endif %}
<p><a href="https://{{ domain }}" class="button" target="_blank">Open your Nextcloud ↗</a></p>
{% if not hasBackupLocation %}
@@ -370,7 +370,7 @@
<a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls">remote borg repo url</a>.
</p>
<form method="POST" action="/api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>Local backup location</label> <input type="text" id="borg_backup_host_location" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>Remote borg repo</label> <input type="text" name="borg_remote_repo" placeholder="ssh://user@host:port/path/to/repo"/><br>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
@@ -408,7 +408,7 @@
To try again, click <strong>Create backup</strong>.
</p>
{% endif %}
<p>You may change the backup path again since the initial backup was not successful. After submitting the new value, you need to click on <strong>Create Backup</strong> to test the new value.</p>
<form method="POST" action="/api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
@@ -433,7 +433,7 @@
<summary>Click here to reveal all backup options (including an option for automatic updates)</summary>
{% endif %}
<h3>Backup information</h3>
<p>This is your encryption password for backups: <strong>{{ borgbackup_password }}</strong></p>
<p>This is your encryption password for backups: <strong id="borg-backup-password">{{ borgbackup_password }}</strong></p>
<p>Please save this password in a safe place. You won't be able to restore from backup if you lose this password!</p>
<p>All important data from your Nextcloud AIO instance such as the database, your files and the mastercontainer's configuration files, will be backed up.</p>
<p>The backup uses a tool called <a target="_blank" href="https://github.com/borgbackup/borg#what-is-borgbackup"><strong>BorgBackup</strong></a>, a well-known server backup tool that efficiently backs up your files and encrypts them on the fly.</p>

View File

@@ -10,7 +10,7 @@
<h1>All-in-One setup</h1>
<p>The official Nextcloud installation method. Nextcloud All-in-One provides easy deployment and maintenance with most features included in this one Nextcloud instance.</p>
<p>⚠️ <strong>Please note down the passphrase to access the AIO interface and don't lose it!</strong></p>
<strong>Passphrase</strong><br/><span class="monospace">{{ password }}</span><br>
<strong>Passphrase</strong><br/><span id="initial-password" class="monospace">{{ password }}</span><br>
<a href="/" class="button" target="_blank">Open Nextcloud AIO login ↗</a>
</div>
{% endblock %}

7
php/tests/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
# Playwright
node_modules/
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/

97
php/tests/package-lock.json generated Normal file
View File

@@ -0,0 +1,97 @@
{
"name": "e2e",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "e2e",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"@playwright/test": "^1.51.1",
"@types/node": "^22.13.10"
}
},
"node_modules/@playwright/test": {
"version": "1.51.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz",
"integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.51.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@types/node": {
"version": "22.13.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
"integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.20.0"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/playwright": {
"version": "1.51.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz",
"integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.51.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.51.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz",
"integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/undici-types": {
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"dev": true,
"license": "MIT"
}
}
}

8
php/tests/package.json Normal file
View File

@@ -0,0 +1,8 @@
{
"name": "nextcloud-aio-mastercontainer-tests",
"version": "1.0.0",
"license": "AGPL-3.0-or-later",
"devDependencies": {
"@playwright/test": "^1.51.1"
}
}

View File

@@ -0,0 +1,29 @@
import { defineConfig, devices } from '@playwright/test'
/**
* @see https://playwright.dev/docs/test-configuration
*/
export default defineConfig({
testDir: './tests',
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: 0,
workers: 1,
reporter: [
['list'],
['html'],
],
use: {
baseURL: process.env.BASE_URL ?? 'http://localhost:8080',
trace: 'on',
},
projects: [
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
ignoreHTTPSErrors: true,
},
},
],
})

View File

@@ -0,0 +1,96 @@
import { test, expect } from '@playwright/test';
import { writeFileSync } from 'node:fs'
test('Initial setup', async ({ page: setupPage }) => {
test.setTimeout(10 * 60 * 1000)
// Extract initial password
await setupPage.goto('./setup');
const password = await setupPage.locator('#initial-password').innerText()
const containersPagePromise = setupPage.waitForEvent('popup');
await setupPage.getByRole('link', { name: 'Open Nextcloud AIO login ↗' }).click();
const containersPage = await containersPagePromise;
// Log in and wait for redirect
await containersPage.locator('#master-password').click();
await containersPage.locator('#master-password').fill(password);
await containersPage.getByRole('button', { name: 'Log in' }).click();
await containersPage.waitForURL('./containers');
// Reject IP addresses
await containersPage.locator('#domain').click();
await containersPage.locator('#domain').fill('1.1.1.1');
await containersPage.getByRole('button', { name: 'Submit domain' }).click();
await expect(containersPage.locator('body')).toContainText('Please enter a domain and not an IP-address!');
// Accept example.com (requires disabled domain validation)
await containersPage.locator('#domain').click();
await containersPage.locator('#domain').fill('example.com');
await containersPage.getByRole('button', { name: 'Submit domain' }).click();
// Disable all additional containers
await containersPage.locator('#talk').uncheck();
await containersPage.getByRole('checkbox', { name: 'Whiteboard' }).uncheck();
await containersPage.getByRole('checkbox', { name: 'Imaginary' }).uncheck();
await containersPage.getByRole('checkbox', { name: 'Collabora' }).uncheck();
await containersPage.getByRole('button', { name: 'Save changes' }).click();
await expect(containersPage.locator('#talk')).not.toBeChecked()
await expect(containersPage.getByRole('checkbox', { name: 'Whiteboard' })).not.toBeChecked()
await expect(containersPage.getByRole('checkbox', { name: 'Imaginary' })).not.toBeChecked()
await expect(containersPage.getByRole('checkbox', { name: 'Collabora' })).not.toBeChecked()
// Reject invalid time zones
await containersPage.locator('#timezone').click();
await containersPage.locator('#timezone').fill('Invalid time zone');
containersPage.once('dialog', dialog => {
console.log(`Dialog message: ${dialog.message()}`)
dialog.accept()
});
await containersPage.getByRole('button', { name: 'Submit timezone' }).click();
await expect(containersPage.locator('body')).toContainText('The entered timezone does not seem to be a valid timezone!')
// Accept valid time zone
await containersPage.locator('#timezone').click();
await containersPage.locator('#timezone').fill('Europe/Berlin');
containersPage.once('dialog', dialog => {
console.log(`Dialog message: ${dialog.message()}`)
dialog.accept()
});
await containersPage.getByRole('button', { name: 'Submit timezone' }).click();
// Start containers and wait for starting message
await containersPage.getByRole('button', { name: 'Download and start containers' }).click();
await expect(containersPage.getByRole('main')).toContainText('Containers are currently starting.', { timeout: 3 * 60 * 1000 });
await expect(containersPage.getByRole('link', { name: 'Open your Nextcloud ↗' })).toBeVisible({ timeout: 2 * 60 * 1000 });
await expect(containersPage.getByRole('link', { name: 'Open your Nextcloud ↗' })).toHaveAttribute('href', 'https://example.com');
// Extract initial nextcloud password
await expect(containersPage.getByRole('main')).toContainText('Initial Nextcloud password:')
const initialNextcloudPassword = await containersPage.locator('#initial-nextcloud-password').innerText();
// Set backup location and create backup
const borgBackupLocation = `/mnt/test/aio-${Math.floor(Math.random() * 2147483647)}`
await containersPage.locator('#borg_backup_host_location').click();
await containersPage.locator('#borg_backup_host_location').fill(borgBackupLocation);
await containersPage.getByRole('button', { name: 'Submit backup location' }).click();
containersPage.once('dialog', dialog => {
console.log(`Dialog message: ${dialog.message()}`)
dialog.accept()
});
await containersPage.getByRole('button', { name: 'Create backup' }).click();
await expect(containersPage.getByRole('main')).toContainText('Backup container is currently running:', { timeout: 3 * 60 * 1000 });
await expect(containersPage.getByRole('main')).toContainText('Last backup successful on', { timeout: 3 * 60 * 1000 });
await containersPage.getByText('Click here to reveal all backup options').click();
await expect(containersPage.locator('#borg-backup-password')).toBeVisible();
const borgBackupPassword = await containersPage.locator('#borg-backup-password').innerText();
// Assert that all containers are stopped
await expect(containersPage.getByRole('button', { name: 'Start containers' })).toBeVisible();
// Save passwords for restore backup test
writeFileSync('test_data.json', JSON.stringify({
initialNextcloudPassword,
borgBackupLocation,
borgBackupPassword,
}))
});

View File

@@ -0,0 +1,79 @@
import { test, expect } from '@playwright/test';
import { readFileSync } from 'node:fs';
test('Restore instance', async ({ page: setupPage }) => {
test.setTimeout(10 * 60 * 1000)
// Load passwords from previous test
const {
initialNextcloudPassword,
borgBackupLocation,
borgBackupPassword,
} = JSON.parse(readFileSync('test_data.json'))
// Extract initial password
await setupPage.goto('./setup');
const password = await setupPage.locator('#initial-password').innerText()
const containersPagePromise = setupPage.waitForEvent('popup');
await setupPage.getByRole('link', { name: 'Open Nextcloud AIO login ↗' }).click();
const containersPage = await containersPagePromise;
// Log in and wait for redirect
await containersPage.locator('#master-password').click();
await containersPage.locator('#master-password').fill(password);
await containersPage.getByRole('button', { name: 'Log in' }).click();
await containersPage.waitForURL('./containers');
// Reject example.com (requires enabled domain validation)
await containersPage.locator('#domain').click();
await containersPage.locator('#domain').fill('example.com');
await containersPage.getByRole('button', { name: 'Submit domain' }).click();
await expect(containersPage.locator('body')).toContainText('Domain does not point to this server or the reverse proxy is not configured correctly.');
// Reject invalid backup location
await containersPage.locator('#borg_restore_host_location').click();
await containersPage.locator('#borg_restore_host_location').fill('/mnt/test/aio-incorrect-path');
await containersPage.locator('#borg_restore_password').click();
await containersPage.locator('#borg_restore_password').fill(borgBackupPassword);
await containersPage.getByRole('button', { name: 'Submit location and encryption password' }).click()
await containersPage.getByRole('button', { name: 'Test path and encryption' }).click();
await expect(containersPage.getByRole('main')).toContainText('Last test failed!', { timeout: 60 * 1000 });
// Reject invalid backup password
await containersPage.locator('#borg_restore_host_location').click();
await containersPage.locator('#borg_restore_host_location').fill(borgBackupLocation);
await containersPage.locator('#borg_restore_password').click();
await containersPage.locator('#borg_restore_password').fill('foobar');
await containersPage.getByRole('button', { name: 'Submit location and encryption password' }).click()
await containersPage.getByRole('button', { name: 'Test path and encryption' }).click();
await expect(containersPage.getByRole('main')).toContainText('Last test failed!', { timeout: 60 * 1000 });
// Accept correct backup location and password
await containersPage.locator('#borg_restore_host_location').click();
await containersPage.locator('#borg_restore_host_location').fill(borgBackupLocation);
await containersPage.locator('#borg_restore_password').click();
await containersPage.locator('#borg_restore_password').fill(borgBackupPassword);
await containersPage.getByRole('button', { name: 'Submit location and encryption password' }).click()
await containersPage.getByRole('button', { name: 'Test path and encryption' }).click();
// Check integrity and restore backup
await containersPage.getByRole('button', { name: 'Check backup integrity' }).click();
await expect(containersPage.getByRole('main')).toContainText('Last check successful!', { timeout: 5 * 60 * 1000 });
await containersPage.getByRole('button', { name: 'Restore selected backup' }).click();
await expect(containersPage.getByRole('main')).toContainText('Backup container is currently running:');
// Verify a successful backup restore
await expect(containersPage.getByRole('main')).toContainText('Last restore successful!', { timeout: 3 * 60 * 1000 });
await expect(containersPage.getByRole('main')).toContainText('⚠️ Container updates are available. Click on Stop containers and Start and update containers to update them. You should consider creating a backup first.');
containersPage.once('dialog', dialog => {
console.log(`Dialog message: ${dialog.message()}`)
dialog.accept()
});
await containersPage.getByRole('button', { name: 'Start and update containers' }).click();
await expect(containersPage.getByRole('link', { name: 'Open your Nextcloud ↗' })).toBeVisible({ timeout: 5 * 60 * 1000 });
await expect(containersPage.getByRole('main')).toContainText(initialNextcloudPassword);
// Verify that containers are all stopped
await containersPage.getByRole('button', { name: 'Stop containers' }).click();
await expect(containersPage.getByRole('button', { name: 'Start containers' })).toBeVisible({ timeout: 60 * 1000 });
});

View File

@@ -486,6 +486,9 @@ In certain situations you might want to keep Nextcloud apps that are disabled in
> Doing this might cause unintended problems in Nextcloud if an app that requires an external dependency is still installed but the external dependency not for example.
### How to trust user-defined Certification Authorities (CA)?
> [!NOTE]
> Please note, that this feature is only intended to make LDAPS connections with self-signed certificates work. It will not make other interconnectivity between the different containers work, as they expect a valid publicly trusted certificate like one from Let's Encrypt.
For some applications it might be necessary to establish a secure connection to another host/server which is using a certificate issued by a Certification Authority that is not trusted out of the box. An example could be configuring LDAPS against a domain controller (Active Directory or Samba-based) of an organization.
You can make the Nextcloud container trust any Certification Authority by providing the environmental variable `NEXTCLOUD_TRUSTED_CACERTS_DIR` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used). The value of the variables should be set to the absolute paths of the directory on the host, which contains one or more Certification Authorities certificates. You should use X.509 certificates, Base64 encoded. (Other formats may work but have not been tested!) All the certificates in the directory will be trusted.