Compare commits

...

280 Commits

Author SHA1 Message Date
Simon L.
ed28174020 nextcloud dockerfile: fix small mistake with imagick
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-12 16:04:51 +01:00
Simon L.
36c0041305 Merge pull request #5575 from nextcloud/ernolf/nextcloud-php8.3
build(nextcloud): bump php to 8.3
2024-11-12 15:40:10 +01:00
ernolf
2a3438fd56 build: add imagick commit hash to update workflow
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-11-12 15:30:22 +01:00
Simon L.
c9c55be87b Merge pull request #5576 from nextcloud/ernolf/submit-button-fix
feat: toggle submit button based on unsaved changes
2024-11-12 15:14:39 +01:00
Simon L.
16e4f41ca7 increase to v3
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-12 15:08:05 +01:00
Simon L.
057924f17f Merge pull request #5581 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-12 14:09:22 +01:00
szaimen
96f3dc7ab3 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-12 13:05:53 +00:00
Simon L.
dc5a540ab7 Merge pull request #5550 from nextcloud/enh/5451/exclude-previews
allow to exclude previews from restore upon instance restore
2024-11-12 12:17:36 +01:00
Tim Diels
af3f00c3cc Allow to exclude previews from restore in the remote case too
Signed-off-by: Tim Diels <tim@diels.me>
2024-11-12 12:16:19 +01:00
Simon L.
47e0ac7b4d allow to exclude previews from restore upon instance restore
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-12 12:16:19 +01:00
ernolf
41c29b90a2 feat: toggle submit button based on unsaved changes
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-11-11 22:28:57 +01:00
ernolf
816921e2e2 refactor: extract 'optional containers' to separate twig include
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-11-11 21:35:24 +01:00
ernolf
aff6aecff6 build(nextcloud): workaround for imagick php8.3
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-11-11 19:46:55 +01:00
ernolf
875281e48d build(nextcloud): bump php to 8.3
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-11-11 19:44:30 +01:00
Simon L.
9b3b153d13 Merge pull request #5573 from nextcloud/enh/noid/fix-small-borg-detail
aio-interface: fix small detail in `Reset backup location` section
2024-11-11 08:55:04 +01:00
Simon L.
ce5287d4e2 aio-interface: fix small detail in Reset backup location section
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-11 08:42:29 +01:00
Simon L.
596a4669fd Merge pull request #5558 from mihaicmn/disable-domain-validator-logs
Correctly disable some supervisord logs
2024-11-11 07:22:32 +01:00
Simon L.
6d51b673fc adjust additional places
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-11 07:18:59 +01:00
Simon L.
c0a5248e0e Merge pull request #5566 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-11 07:15:24 +01:00
Simon L.
46343a958e Merge pull request #5572 from nextcloud/dependabot/docker/Containers/docker-socket-proxy/haproxy-3.0.6-alpine
build(deps): bump haproxy from 3.0.5-alpine to 3.0.6-alpine in /Containers/docker-socket-proxy
2024-11-11 07:10:50 +01:00
Simon L.
24e2feb16a Merge pull request #5571 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-12
build(deps): bump clamav/clamav from 1.4.1-11 to 1.4.1-12 in /Containers/clamav
2024-11-11 07:10:32 +01:00
dependabot[bot]
1697f43db3 build(deps): bump haproxy in /Containers/docker-socket-proxy
Bumps haproxy from 3.0.5-alpine to 3.0.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>
2024-11-11 04:43:24 +00:00
dependabot[bot]
b53e3ebaa6 build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-11 to 1.4.1-12.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 04:43:20 +00:00
szaimen
6431e4dee8 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-10 12:02:40 +00:00
Mihai Coman
45973ef12e disable domain-validator logs
Explicitly use NONE value for stdout_logfile and stderr_logfile
to disable domain-validator logs.

Accoring to supervisord documentation, if stdout_logfile/stderr_logfile
is unset or set to AUTO, supervisor will automatically choose a file location.
If this is set to NONE, supervisord will create no log file.

Signed-off-by: Mihai Coman <mihai.cmn@gmail.com>
2024-11-09 12:55:11 +02:00
Simon L.
267aebf941 Merge pull request #5553 from nextcloud/enh/4804/clean-borg
borgbackup: make logs a bit cleaner if local archive is used
2024-11-08 14:57:32 +01:00
Simon L.
ccf445a5d1 fix the commit
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 14:56:56 +01:00
Simon L.
ada09ed674 Merge pull request #5554 from nextcloud/enh/5178/add-object-type-and-id
notify-scripts: add object type and object id
2024-11-08 14:46:57 +01:00
Simon L.
0b3f63bf74 notify-scripts: add object type and object id
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 14:42:07 +01:00
Simon L.
019664afc1 borgbackup: make logs a bit cleaner if local archive is used
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 14:29:36 +01:00
Simon L.
d32190660a Merge pull request #5552 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-08 13:54:33 +01:00
szaimen
fc33a7c7fd php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-08 12:05:22 +00:00
Simon L.
ceda2d694b increase to 10.0.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 11:55:40 +01:00
Simon L.
b39354ac38 Merge pull request #5551 from nextcloud/enh/noid/upgrade-to-nc-30
nextcloud: upgrade to 30.0.2
2024-11-08 11:44:53 +01:00
Simon L.
91913145d9 nextcloud: upgrade to 30.0.2
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 11:44:16 +01:00
Simon L.
8fb7a21a72 Merge pull request #5547 from nextcloud/enh/5249/increase-aio-app
nextcloud-aio-app: increase to v0.7.0
2024-11-08 11:32:36 +01:00
Simon L.
2225fc589e Merge pull request #5548 from nextcloud/enh/5249/remove-update-hint
aio-interface: remove hint regarding nc 30 update
2024-11-08 11:32:24 +01:00
Simon L.
6625813b8c Merge pull request #5549 from nextcloud/enh/noid/remove-image-orgs
helm: remove IMAGE_MIRROR_PREFIX, NEXTCLOUD_IMAGE_ORG and ALPINE_IMAGE_ORG
2024-11-08 10:20:53 +01:00
Simon L.
5bc3cab1af helm: remove IMAGE_MIRROR_PREFIX, NEXTCLOUD_IMAGE_ORG and ALPINE_IMAGE_ORG
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 10:17:30 +01:00
Simon L.
a70fbd2137 aio-interface: remove hint regarding nc 30 update
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 10:06:04 +01:00
Simon L.
135a42c36d nextcloud-aio-app: increase to v0.7.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-08 09:55:43 +01:00
Simon L.
ec226d7943 Merge pull request #5546 from nextcloud/dependabot/docker/Containers/imaginary/golang-1.23.3-alpine3.20
build(deps): bump golang from 1.23.2-alpine3.20 to 1.23.3-alpine3.20 in /Containers/imaginary
2024-11-08 09:15:53 +01:00
Simon L.
4302e37779 Merge pull request #5545 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-24.04.9.2.1
build(deps): bump collabora/code from 24.04.9.1.1 to 24.04.9.2.1 in /Containers/collabora
2024-11-08 09:15:33 +01:00
dependabot[bot]
144df87b74 build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.23.2-alpine3.20 to 1.23.3-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-08 05:04:56 +00:00
dependabot[bot]
8e105857ab build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 24.04.9.1.1 to 24.04.9.2.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-08 05:04:49 +00:00
Simon L.
d904aff3ec Merge pull request #5426 from nextcloud/enh/4657/add-docs-url
nextcloud: add `documentation_url.server_logs`
2024-11-07 22:23:42 +01:00
Simon L.
76ae1fbbe9 Merge pull request #5314 from nextcloud/enh/noid/ping-alpine-image
helm: adjust initcontainer: use fixed alpine tag
2024-11-07 22:23:20 +01:00
Tim Diels
3eeda1ea91 Add remote borg backup support (#4804)
Signed-off-by: Tim Diels <tim@diels.me>
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-authored-by: Simon L. <szaimen@e.mail.de>
2024-11-07 22:19:56 +01:00
Simon L.
34a264d945 Merge pull request #5543 from nextcloud/revert-5537-enh/noid/fix-talk-recording
Revert "talk-recording: change to firefox-esr"
2024-11-07 14:51:59 +01:00
Simon L.
16a3c32ec3 Revert "talk-recording: change to firefox-esr" 2024-11-07 14:51:37 +01:00
Simon L.
30614ad9b6 Merge pull request #5540 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-07 13:50:38 +01:00
Simon L.
b7355b12b7 Merge pull request #5541 from nextcloud/imaginary-container-update
Imaginary update
2024-11-07 13:50:08 +01:00
szaimen
d5b6e6653d imaginary-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-07 12:02:52 +00:00
szaimen
7d286edc5f php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-07 12:02:48 +00:00
Simon L.
d6bd5b407a Merge pull request #5538 from nextcloud/enh/noid/change-talk-recording
talk-recording: change tmpfs to volume
2024-11-07 12:12:42 +01:00
Simon L.
56864dde66 talk-recording: change tmpfs to volume
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-07 12:07:44 +01:00
Simon L.
adc9c1ea44 Merge pull request #5537 from nextcloud/enh/noid/fix-talk-recording
talk-recording: change to firefox-esr
2024-11-07 11:43:52 +01:00
Simon L.
4e2bb8f1a7 talk-recording: change to firefox-esr
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-07 11:22:29 +01:00
Simon L.
74e5a58a4c increase to 9.9.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-07 10:50:26 +01:00
Simon L.
bcd3fd80ec Merge pull request #5536 from nextcloud/enh/noid/update-nc
nextcloud: update to 29.0.9
2024-11-07 10:49:11 +01:00
Simon L.
01e10aa3f2 nextcloud: update to 29.0.9
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-07 10:48:35 +01:00
Simon L.
cd3a33a800 Merge pull request #5484 from apparle/apache_additional_network
Specifying additional docker network for Apache container
2024-11-07 09:37:56 +01:00
Simon L.
4a8e0c8415 fix indentation
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-07 09:34:37 +01:00
Apoorv Parle
e30b4562b2 Remove mastercontainer connection to APACHE_ADDITIONAL_CONTAINER. Follow that up in a separate PR.
Signed-off-by: Apoorv Parle <19315187+apparle@users.noreply.github.com>
2024-11-07 00:26:35 -08:00
Simon L.
798c250db2 Merge pull request #5534 from nextcloud/dependabot/composer/php/twig/twig-3.14.1
build(deps): bump twig/twig from 3.14.0 to 3.14.1 in /php
2024-11-06 22:31:18 +01:00
Simon L.
57884a1c79 Merge pull request #5535 from Martinligabue/patch-1
readme reset instance guide typo
2024-11-06 22:27:06 +01:00
Martin Ligabue
5125ec934f readme reset instance guide typo
probably due to a copypaste

Signed-off-by: Martin Ligabue <martinligabue@gmail.com>
2024-11-06 21:18:59 +01:00
dependabot[bot]
9deb2e0356 build(deps): bump twig/twig from 3.14.0 to 3.14.1 in /php
Bumps [twig/twig](https://github.com/twigphp/Twig) from 3.14.0 to 3.14.1.
- [Changelog](https://github.com/twigphp/Twig/blob/v3.14.1/CHANGELOG)
- [Commits](https://github.com/twigphp/Twig/compare/v3.14.0...v3.14.1)

---
updated-dependencies:
- dependency-name: twig/twig
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-06 19:54:39 +00:00
Simon L.
45a0350b16 Merge pull request #5532 from nextcloud/ci/json-validator/use-venv
ci(json-validator): use venv
2024-11-06 16:33:52 +01:00
Simon L.
72d1c2c14e Merge pull request #5525 from nextcloud/aio-helm-update
Helm Chart updates
2024-11-06 16:32:14 +01:00
Richard Steinmetz
4f808d2d67 ci(json-validator): use venv
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2024-11-06 16:28:36 +01:00
szaimen
d50ec29cf0 Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-06 15:27:52 +00:00
Simon L.
5c4d0b7a4a Merge pull request #5530 from nextcloud/enh/noid/user-string
user must be a string
2024-11-06 16:26:52 +01:00
szaimen
4c83aac666 Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 16:24:29 +01:00
Simon L.
ad32d0af9c try to fix workflows
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 16:22:54 +01:00
Simon L.
b498f557cf user must be a string
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 16:17:22 +01:00
Simon L.
8d81f56a9f Merge pull request #5528 from nextcloud/enh/noid/add-user-ids
add user-IDs to all containers
2024-11-06 16:13:50 +01:00
Simon L.
bc36ce9aab fix some issues
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 16:12:36 +01:00
Simon L.
f617a94af5 fix json-validator workflow
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 15:59:45 +01:00
Simon L.
1632e14380 nextcloud: remove chpasswd
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 15:03:17 +01:00
Simon L.
2f4acc52ad Merge pull request #5527 from nextcloud/enh/5526/add-libreoffice
nextcloud: add libreoffice by default
2024-11-06 14:49:03 +01:00
szaimen
c686afb6da Yaml updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 14:35:40 +01:00
Simon L.
faecc028fe add user-IDs to all containers
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 14:35:40 +01:00
Simon L.
0d9a22346e nextcloud: add libreoffice by default
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 14:08:46 +01:00
Simon L.
5499bc8a5d Merge pull request #5524 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-06 13:04:57 +01:00
szaimen
f6cfa071a0 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-06 12:03:27 +00:00
Simon L.
24a249be05 Update json-validator.yml
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-06 13:01:55 +01:00
Simon L.
bb3236d3e5 Merge pull request #5503 from nextcloud/enh/noid/fix-getting-tag
DockerActionManager: fix getting the tag from the image
2024-11-06 12:59:54 +01:00
Simon L.
9e2b86232f Merge pull request #5507 from nextcloud/enh/noid/add-debug-docs
aio-interface: add debug docs to collabora, talk and fts
2024-11-06 12:59:18 +01:00
Simon L.
e9e444efbe Merge pull request #5510 from nextcloud/docjyJ-patch-1
Fix twig
2024-11-06 12:58:07 +01:00
Simon L.
096de1af7f Merge pull request #5515 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-11
build(deps): bump clamav/clamav from 1.4.1-10 to 1.4.1-11 in /Containers/clamav
2024-11-06 12:57:18 +01:00
Simon L.
7795bda828 Merge pull request #5516 from nextcloud/aio-dependency-update
PHP dependency updates
2024-11-06 12:57:04 +01:00
Simon L.
a26dbfc0b1 Merge pull request #5520 from nextcloud/enh/noid/user-value
helm: add additional security settings
2024-11-05 16:29:07 +01:00
Simon L.
b81ae86e8a helm: add additional security settings
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-05 16:21:52 +01:00
Simon L.
89739b26ed Merge pull request #5519 from nextcloud/enh/noid/adjust-network-policy
helm: update network policy
2024-11-05 13:28:34 +01:00
szaimen
347e83c08a php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-05 12:05:58 +00:00
Simon L.
5131a2f34a helm: update network policy
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-05 11:49:52 +01:00
Simon L.
a625570c31 address review
Co-authored-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-04 21:09:15 +01:00
Apoorv Parle
974ad1ef9b Improve error checking and connect mastercontainer right from the start to make inital process seamless.
Signed-off-by: Apoorv Parle <19315187+apparle@users.noreply.github.com>
2024-11-04 05:27:30 -08:00
Apoorv Parle
f5990cc0ef Add APACHE_ADDITIONAL_NETWORK variable to env variables QA test
Signed-off-by: Apoorv Parle <19315187+apparle@users.noreply.github.com>
2024-11-04 04:10:47 -08:00
Apoorv Parle
75c2407afa Apply suggestions from code review
Co-authored-by: Simon L. <szaimen@e.mail.de>
Signed-off-by: Apoorv Parle <19315187+apparle@users.noreply.github.com>
2024-11-04 02:44:10 -08:00
Simon L.
9df3a171da update apache_port description
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-04 10:42:10 +01:00
dependabot[bot]
e73e272e31 build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-10 to 1.4.1-11.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 05:09:49 +00:00
Apoorv Parle
4ad749a265 Merge branch 'main' into apache_additional_network 2024-11-02 14:14:42 -07:00
Apoorv Parle
f644e83935 Add ability to specify additional docker network and update documentation for it.
Signed-off-by: Apoorv Parle <19315187+apparle@users.noreply.github.com>
2024-11-02 14:11:17 -07:00
Jean-Yves
b5492f28ae Update already-installed.twig
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-11-02 18:30:01 +01:00
Jean-Yves
9af90f00f8 Update setup.twig
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-11-02 18:29:06 +01:00
Jean-Yves
d748134533 Fix twig
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-11-02 18:28:31 +01:00
Simon L.
c823816a79 Update readme.md
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-02 17:22:25 +01:00
Simon L.
013306fff7 update screenshot
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-01 11:57:03 +01:00
Simon L.
44ecde5d64 Merge pull request #5505 from zybster/patch-1
Update truenas scale section in readme.md
2024-11-01 10:46:59 +01:00
Simon L.
0ff08f00f1 adjust the PR and add link to guide
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-01 10:42:18 +01:00
Simon L.
315c29c81e try to fix the json-validator workflow
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-01 10:35:04 +01:00
Simon L.
329e2e7805 aio-interface: add debug docs to collabora, talk and fts
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-11-01 10:28:19 +01:00
zybster
c78bffbff9 Update readme.md
Since IX System ditched Kubernetes and integrated a full-fledged docker environment in Truenas Scale 24.10.0 (Electric Eel) it is now very easy to install Nextcloud AIO on Scale
On way is listed here.

Signed-off-by: zybster <zybster@gmail.com>
2024-11-01 09:09:21 +01:00
Simon L.
0f91f39dbe Merge pull request #5499 from Perlover/patch-1
Update docker-rootless.md - missprint + improvement
2024-10-31 13:22:19 +01:00
Simon L.
3ede76af8f DockerActionManager: fix getting the tag from the image
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-31 13:14:12 +01:00
Simon L.
bd799bd753 address review
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-31 11:48:39 +01:00
Simon L.
476d80ca54 Merge pull request #5500 from jr551/patch-1
npmplus: Update readme.md
2024-10-30 20:42:48 +01:00
jr_blue_551
4b51f85d98 Update readme.md
Signed-off-by: jr_blue_551 <johnrowe551@gmail.com>
2024-10-30 19:27:10 +00:00
Simon L.
d133e285d5 Merge pull request #5495 from rriemann/elastic-no-ingest-plugin
elastic container: ingest-attachment is now module and not a plugin
2024-10-30 14:55:25 +01:00
Simon L.
ccf21e065c Merge pull request #5497 from nextcloud/enh/3673/clean-up-old-sessions
nextcloud: clean up old sessions after 24h latest
2024-10-30 14:45:09 +01:00
Perlover
9316555ecb Update docker-rootless.md
1) No NEXTCLOUD_MOUNT but there is NEXTCLOUD_DATADIR
2) Now in Docker recommended the few different detailed config: https://docs.docker.com/engine/security/rootless/#docker-run--p-does-not-propagate-source-ip-addresses

Signed-off-by: Perlover <perlover@perlover.com>
2024-10-30 13:43:19 +01:00
Simon L.
95c20fdfff nextcloud: clean up old sessions after 24h latest
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-30 10:56:06 +01:00
Robert Riemann
cf8ba936c9 elastic container: ingest-attachment is now module and not a plugin
When this command is executed in elastic search v8.15.3, then this warning shows up:

~~~
bin/elasticsearch-plugin install --batch ingest-attachment
warning: ignoring JAVA_HOME=/opt/bitnami/java; using ES_JAVA_HOME
-> Installing ingest-attachment
[ingest-attachment] is no longer a plugin but instead a module packaged with this distribution of Elasticsearch
-> Please restart Elasticsearch to activate any plugins installed
~~~

The elastic website says: "The Ingest Attachment plugin is now included in Elasticsearch. See the Ingest Attachment processor."

Source: <https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment.html>

Hence, I remove the explicit installation from the elastic container image.

Signed-off-by: Robert Riemann <robert.riemann@edps.europa.eu>
2024-10-29 15:12:15 +01:00
Simon L.
af975f6fde Merge pull request #5494 from nextcloud/dependabot/docker/Containers/talk/strukturag/nextcloud-spreed-signaling-2.0.1
build(deps): bump strukturag/nextcloud-spreed-signaling from 2.0.0 to 2.0.1 in /Containers/talk
2024-10-29 09:07:58 +01:00
dependabot[bot]
1d96efe07c build(deps): bump strukturag/nextcloud-spreed-signaling
Bumps strukturag/nextcloud-spreed-signaling from 2.0.0 to 2.0.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-29 04:59:07 +00:00
Simon L.
a02d1644f7 Merge pull request #5488 from nextcloud/aio-dependency-update
PHP dependency updates
2024-10-28 13:04:17 +01:00
szaimen
6a74ab6363 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-28 12:03:09 +00:00
Simon L.
335ed24469 Merge pull request #5487 from nextcloud/dependabot/docker/Containers/talk/eturnal/eturnal-1.12.1
build(deps): bump eturnal/eturnal from 1.12.0 to 1.12.1 in /Containers/talk
2024-10-28 10:10:51 +01:00
Simon L.
40ab0f9f9e Merge pull request #5486 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-24.04.9.1.1
build(deps): bump collabora/code from 24.04.8.2.1 to 24.04.9.1.1 in /Containers/collabora
2024-10-28 10:10:32 +01:00
Simon L.
eac7d4fd88 Merge pull request #5485 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-10
build(deps): bump clamav/clamav from 1.4.1-9 to 1.4.1-10 in /Containers/clamav
2024-10-28 10:10:06 +01:00
dependabot[bot]
d2adea5fe4 build(deps): bump eturnal/eturnal in /Containers/talk
Bumps eturnal/eturnal from 1.12.0 to 1.12.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 04:40:04 +00:00
dependabot[bot]
d2f00b44d4 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 24.04.8.2.1 to 24.04.9.1.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 04:39:27 +00:00
dependabot[bot]
017ed64f6b build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-9 to 1.4.1-10.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 04:39:26 +00:00
sunjam
b814a51d0b Update readme.md local documentation (#5473)
Adding more wording to local description to clarify it relates to having "no domain" and other keywords/phrases users must be missing, because so many people are confused about this.

Signed-off-by: sunjam <sunjam@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-authored-by: Simon L. <szaimen@e.mail.de>
2024-10-27 15:43:10 +01:00
Simon L.
37d4366392 Merge pull request #5481 from nextcloud/ernolf/ui-darkmode-fixes
aio-interface: fix dark-mode and checkbox style
2024-10-27 14:59:43 +01:00
ernolf
4ff189fce1 fix(ui): adjust height of main to fit in container
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-26 14:49:28 +02:00
Simon L.
dc9d10d4e6 Merge pull request #5476 from nextcloud/enh/5469/feature-inline-config
refactor compose.yaml: adjust the caddy setup to feature inline config
2024-10-25 23:48:38 +02:00
ernolf
55b5469260 fix(ui): correct style for disabled checkbox labels
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-25 20:43:42 +02:00
ernolf
3f3ae167e9 fix(ui): split theme & icon load to prevent flicker, errors
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-25 20:30:30 +02:00
Simon L.
d35d97b316 refactor compose.yaml: adjust the caddy setup to feature inline config
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-25 11:01:06 +02:00
Simon L.
a0ce2c1bec Merge pull request #5470 from nextcloud/enh/noid/document-more-varilables
compose.yaml: document additional available envs
2024-10-25 09:36:40 +02:00
Simon L.
67944aa009 Merge pull request #5475 from nextcloud/dependabot/docker/Containers/nextcloud/php-8.2.25-fpm-alpine3.20
build(deps): bump php from 8.2.24-fpm-alpine3.20 to 8.2.25-fpm-alpine3.20 in /Containers/nextcloud
2024-10-25 09:36:16 +02:00
Simon L.
c183fe3d4c Merge pull request #5474 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.3.13-fpm-alpine3.20
build(deps): bump php from 8.3.12-fpm-alpine3.20 to 8.3.13-fpm-alpine3.20 in /Containers/mastercontainer
2024-10-25 09:35:57 +02:00
dependabot[bot]
0066ad6a37 build(deps): bump php in /Containers/nextcloud
Bumps php from 8.2.24-fpm-alpine3.20 to 8.2.25-fpm-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 05:00:57 +00:00
dependabot[bot]
459edf573c build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.3.12-fpm-alpine3.20 to 8.3.13-fpm-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 05:00:45 +00:00
Simon L.
bdc782e74c compose.yaml: document additional available envs
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-24 15:59:49 +02:00
Simon L.
997b986dfe Merge pull request #5467 from nextcloud/enh/noid/add-tailscale-to-local-instance
local-instance-docs: add content and add tailscale network as option
2024-10-24 14:38:31 +02:00
Simon L.
68d75dc01a local-instance-docs: add content and add tailscale network as option
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-24 13:09:22 +02:00
Simon L.
d9142871f6 Refactor manual-install Compose.yml: Simplify Environment Variables (#5459)
* 🔧 Refactor manual-install Compose.yml: Simplify Environment Variables

- Removed explicit values for environment variables in `docker-compose.yml`.
- Utilized default values for better flexibility and maintainability.
- Updated network configuration to use the default bridge driver.

Note: Using `network: default` is sufficient within Docker Compose; there's no need to create a separate `nextcloud-network` for all hosts. 🚀


Signed-off-by: lll <2844835+flll@users.noreply.github.com>
2024-10-24 12:03:53 +02:00
Simon L.
680310c3e8 Merge pull request #5441 from nextcloud/enh/noid/add-db-type
nextcloud&notify-push: allow to adjust the DATABASE_TYPE
2024-10-24 10:18:00 +02:00
Simon L.
026b1b87fa Merge pull request #5460 from nextcloud/enh/noid/tailscale
readme: add tailscale network instructions
2024-10-22 11:57:28 +02:00
Simon L.
5849a1fce9 readme: add tailscale network
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-22 11:13:41 +02:00
Simon L.
3dfbf3d9ab Revert "change Hint to github hint" because it does not seem to work inside a details tag
This reverts commit 5b4edc2c34.
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-22 11:05:51 +02:00
Simon L.
bff1d6138b Merge pull request #5457 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-9
build(deps): bump clamav/clamav from 1.4.1-8 to 1.4.1-9 in /Containers/clamav
2024-10-22 08:33:18 +02:00
dependabot[bot]
5100bcddda build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-8 to 1.4.1-9.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 04:36:19 +00:00
Simon L.
86e2d559d2 Merge pull request #5440 from nextcloud/enh/noid/add-rp-examples
rp-docs: add links to examples direclty to each rp section
2024-10-21 15:38:51 +02:00
Simon L.
a1bc150612 Merge pull request #5409 from flll/patch-2
[reverse-proxy.md] Add Tailscale integration setup
2024-10-21 10:28:15 +02:00
Simon L.
70e31a40b4 update wording
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-21 10:27:35 +02:00
Simon L.
5b4edc2c34 address review
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-21 10:01:02 +02:00
Simon L.
4be6d492ea nextcloud&notify-push: allow to adjust the DATABASE_TYPE
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 17:50:31 +02:00
lll
42a39397e4 to wiki
Signed-off-by: lll <2844835+flll@users.noreply.github.com>
2024-10-18 23:40:21 +09:00
Simon L.
8fae9b669f rp-docs: add links to examples direclty to each rp section
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 16:30:06 +02:00
Simon L.
9bf38d2795 only apply saved theme when dom content has loaded
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 15:56:39 +02:00
Simon L.
0e960b8ca4 increase to 9.8.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 15:04:59 +02:00
Simon L.
327c91d0b7 Merge pull request #5434 from nextcloud/ernolf/darkmode-fix
aio-interface: fix dark-mode
2024-10-18 14:59:02 +02:00
Simon L.
2d78730f75 Merge pull request #5438 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2024-10-18 14:58:10 +02:00
Simon L.
9da4094ff8 fix mobile layout
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 14:57:06 +02:00
szaimen
0067ec3bca nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-18 12:11:10 +00:00
Simon L.
a530cee7e4 update OO
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-18 13:47:10 +02:00
Simon L.
737decb114 Merge pull request #5437 from nextcloud/dependabot/docker/Containers/talk/nats-2.10.22-scratch
build(deps): bump nats from 2.10.21-scratch to 2.10.22-scratch in /Containers/talk
2024-10-18 08:26:48 +02:00
Simon L.
7da2f3da65 Merge pull request #5435 from nextcloud/dependabot/docker/Containers/fulltextsearch/elasticsearch-8.15.3
build(deps): bump elasticsearch from 8.15.2 to 8.15.3 in /Containers/fulltextsearch
2024-10-18 08:26:11 +02:00
dependabot[bot]
fa9ae2bc53 build(deps): bump nats in /Containers/talk
Bumps nats from 2.10.21-scratch to 2.10.22-scratch.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 04:44:08 +00:00
dependabot[bot]
99caab3625 build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 8.15.2 to 8.15.3.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 04:43:28 +00:00
ernolf
de372c11f3 fix(ui): ad darkmode for loading spinner
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-17 19:53:11 +02:00
ernolf
a5b25ab56b fix(ui): ensure theme-toggle button is visible on first visit
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-17 19:53:11 +02:00
ernolf
2b6e81c074 fix(ui): make loading-overlay cover the logout button
Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-17 17:08:38 +02:00
Simon L.
97dcab58d8 Merge pull request #5431 from nextcloud/aio-dependency-update
PHP dependency updates
2024-10-17 14:20:00 +02:00
szaimen
814a1eca53 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-17 12:02:46 +00:00
Simon L.
7ac2d60e51 local-ai: add hint how to improve ai task pickup speed
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-17 13:20:33 +02:00
Simon L.
80e7f45748 Merge pull request #5428 from nextcloud/aio-helm-update
Helm Chart updates
2024-10-17 11:46:32 +02:00
szaimen
fb3c8ec4de Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-17 09:39:05 +00:00
Simon L.
6e26dfccaf Merge pull request #5423 from nextcloud/dependabot/docker/Containers/whiteboard/nextcloud-releases/whiteboard-v1.0.4
build(deps): bump nextcloud-releases/whiteboard from v1.0.3 to v1.0.4 in /Containers/whiteboard
2024-10-17 10:56:51 +02:00
Simon L.
45317e3304 Merge pull request #5417 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-24.04.8.2.1
build(deps): bump collabora/code from 24.04.8.1.1 to 24.04.8.2.1 in /Containers/collabora
2024-10-17 10:56:09 +02:00
Simon L.
d9f8bfebfa Merge pull request #5416 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-8
build(deps): bump clamav/clamav from 1.4.1-7 to 1.4.1-8 in /Containers/clamav
2024-10-17 10:55:04 +02:00
Simon L.
908ebe0b97 Merge pull request #5412 from nextcloud/aio-dependency-update
PHP dependency updates
2024-10-17 10:54:50 +02:00
Simon L.
e6c6b170e5 Merge pull request #5397 from nextcloud/ernolf/ui_dark-mode
feat(ui): introducing dark-mode and refactor some templates and css
2024-10-17 10:54:19 +02:00
szaimen
3ffc511c10 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-16 12:03:01 +00:00
Simon L.
5cf711399f nextcloud: add documentation_url.server_logs
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-16 12:30:31 +02:00
Simon L.
266526557d Update local-instance.md
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-15 16:13:52 +02:00
dependabot[bot]
6e0c76a23b build(deps): bump nextcloud-releases/whiteboard
Bumps nextcloud-releases/whiteboard from v1.0.3 to v1.0.4.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 05:05:32 +00:00
Simon L.
9130cff804 remove the schedule foor update-copyright for now
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-14 14:20:25 +02:00
Simon L.
e2f76b8685 add copyright update workflow
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-14 11:08:29 +02:00
dependabot[bot]
2c81cb0a0a build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 24.04.8.1.1 to 24.04.8.2.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 04:32:47 +00:00
dependabot[bot]
83ac2a0c99 build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-7 to 1.4.1-8.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 04:32:45 +00:00
lll
17362bc234 [reverse-proxy.md] Add Tailscale integration setup
- Detailed explanation of integrating Tailscale, Caddy, and AIO
- Add example configuration for Compose file
- Include example Caddyfile configuration
- Provide instructions for setting environment variables
- Include notes on security and network configuration


Signed-off-by: lll <2844835+flll@users.noreply.github.com>
2024-10-13 18:56:34 +09:00
ernolf
1f144b9ee7 feat(ui): introducing dark-mode and refactor some template details and css
- chore: increase to 9.7.0 - reconcile with main after rebase
- chore: reconcile fixes to containers.twig from main after rebase
- refactor(layout): increment CSS version from v2 to v3

Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-10 17:08:21 +02:00
Simon L.
10495fd56e Merge pull request #5241 from punkyard/patch-1
Update reverse-proxy.md
2024-10-10 15:41:18 +02:00
Simon L.
9b25f8b061 make wording consistant
Signed-off-by: Simon L. <szaimen@e.mail.de>

Co-authored-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-10 15:34:31 +02:00
Simon L.
e45bd1ef2d address review
Signed-off-by: Simon L. <szaimen@e.mail.de>

Co-authored-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-10 15:34:15 +02:00
Simon L.
e4528678b1 adjust description of reverse proxy
Signed-off-by: Simon L. <szaimen@e.mail.de>

Co-authored-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-10 15:33:29 +02:00
Simon L.
a647d10bf0 Merge pull request #5401 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2024-10-10 12:56:28 +02:00
szaimen
ce29c17ca4 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-10 10:52:10 +00:00
Simon L.
6b30744fc3 revert headings so that old links still work and adjust some details
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-10 12:43:46 +02:00
pun kyard
0051b04683 Update reverse-proxy.md
59349105+punkyard@users.noreply.github.com>
Signed-off-by: Simon L. <szaimen@e.mail.de>
Co-Authored-By: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-10 12:37:56 +02:00
Simon L.
1050095d89 Merge pull request #5398 from nextcloud/enn/noid/adjust-config
nginx: adjust configs
2024-10-09 15:42:14 +02:00
Simon L.
0250098a71 Merge pull request #5399 from nextcloud/imaginary-container-update
Imaginary update
2024-10-09 15:29:54 +02:00
szaimen
1ea728bd2a imaginary-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-09 12:10:45 +00:00
Simon L.
bf8395c62e nginx: radjust configs
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-09 13:51:29 +02:00
Simon L.
531104db66 increase to 9.7.0
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-08 11:08:23 +02:00
Simon L.
32f8c6587c Merge pull request #5372 from nextcloud/enh/noid/enum
Use enum instead of interface for state
2024-10-08 10:57:01 +02:00
Simon L.
b375f61a70 Merge pull request #5395 from nextcloud/dependabot/docker/Containers/talk-recording/python-3.13.0-alpine3.20
build(deps): bump python from 3.12.7-alpine3.20 to 3.13.0-alpine3.20 in /Containers/talk-recording
2024-10-08 09:47:44 +02:00
Simon L.
519b5114d7 Merge pull request #5394 from nextcloud/dependabot/docker/Containers/redis/redis-7.2.6-alpine
build(deps): bump redis from 7.2.5-alpine to 7.2.6-alpine in /Containers/redis
2024-10-08 09:47:25 +02:00
dependabot[bot]
bd9070ec6a build(deps): bump python in /Containers/talk-recording
Bumps python from 3.12.7-alpine3.20 to 3.13.0-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 05:04:23 +00:00
dependabot[bot]
966e0175ab build(deps): bump redis in /Containers/redis
Bumps redis from 7.2.5-alpine to 7.2.6-alpine.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 05:04:09 +00:00
Simon L.
433a7c81fe Merge pull request #5392 from nextcloud/dependabot/docker/Containers/whiteboard/nextcloud-releases/whiteboard-v1.0.3
build(deps): bump nextcloud-releases/whiteboard from v1.0.2 to v1.0.3 in /Containers/whiteboard
2024-10-07 18:08:50 +02:00
dependabot[bot]
386bab0958 build(deps): bump nextcloud-releases/whiteboard
Bumps nextcloud-releases/whiteboard from v1.0.2 to v1.0.3.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-07 16:08:00 +00:00
Jean-Yves
dc209adb84 Update php/src/Container/WorkingState.php
Co-authored-by: Simon L. <szaimen@e.mail.de>
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-07 13:24:21 +02:00
Jean-Yves
edeb5ca40a Fix containers.twig
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-07 13:22:38 +02:00
Jean-Yves
a0ec043c49 Add Enum
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-07 13:22:37 +02:00
Simon L.
a54cfed53d Merge pull request #5389 from nextcloud/enh/noid/constructor
Inprove constructor
2024-10-07 12:49:08 +02:00
Simon L.
a5e8c82e59 Merge pull request #5382 from nextcloud/nextcloud-container-update
Nextcloud dependency update
2024-10-07 11:27:37 +02:00
Simon L.
43e60cb76f Merge pull request #5388 from nextcloud/dependabot/docker/Containers/clamav/clamav/clamav-1.4.1-7
build(deps): bump clamav/clamav from 1.4.1-5 to 1.4.1-7 in /Containers/clamav
2024-10-07 11:27:23 +02:00
Jean-Yves
496ec9ba17 update constructor
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-07 10:12:43 +02:00
dependabot[bot]
505e2dc2ab build(deps): bump clamav/clamav in /Containers/clamav
Bumps clamav/clamav from 1.4.1-5 to 1.4.1-7.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-07 04:34:27 +00:00
szaimen
4aaf8e9067 nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-05 12:09:56 +00:00
Simon L.
69d9c925d0 Merge pull request #5379 from nextcloud/enh/5378/fix-chache
aio-interface: invalidate cache of options-form-submit.js
2024-10-04 15:42:38 +02:00
Simon L.
55e5ff0bd5 Merge pull request #5375 from nextcloud/aio-dependency-update
PHP dependency updates
2024-10-04 15:42:23 +02:00
Simon L.
d9bf933937 Merge pull request #5373 from nextcloud/ernolf/fix/pecl-install-invocation
fix(pecl): configuration options in the right order
2024-10-04 15:41:36 +02:00
Simon L.
09a3212b6b Merge pull request #5369 from nextcloud/enh/noid/psalm
aio-interface: Improve psalm
2024-10-04 15:40:38 +02:00
Simon L.
6e7f547ccd add psalm:strict to the readme
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-04 15:38:35 +02:00
Simon L.
eb7921c9f9 drop the comment - we know that we can improve the errorlevel
Follow up already noted in https://github.com/nextcloud/all-in-one/issues/5368

Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-04 15:36:59 +02:00
Simon L.
63bb1d86c1 aio-interface: invalidate cache of options-form-submit.js
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-04 13:08:49 +02:00
ernolf
d7428f0424 fix(pecl): configuration options in the right order
build(pecl): update sed commands in workflow script to handle module versions dynamically
build(imagick): update url

Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2024-10-03 14:30:35 +02:00
szaimen
593dfe731a php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-03 12:02:57 +00:00
Simon L.
72a15055b9 Merge pull request #5374 from Cloudboom/patch-1
Readme: update instructions for cifs mounts
2024-10-03 10:36:26 +02:00
Bastian
4a7e6ba6e0 Update readme.md
Clarify th location of ect/fstab

Signed-off-by: Bastian <48765834+Cloudboom@users.noreply.github.com>
2024-10-02 23:58:50 +02:00
Jean-Yves
0e99adeb94 psalm.xml
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-02 18:29:17 +02:00
Simon L.
4b10d77f6a Merge pull request #5371 from nextcloud/enh/noid/readme
Add docker in readme
2024-10-02 15:50:52 +02:00
Jean-Yves
7c61a2d346 Add docker
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
2024-10-02 14:33:47 +02:00
Simon L.
d8d15b3d8b Merge pull request #5367 from nextcloud/dependabot/docker/Containers/talk-recording/python-3.12.7-alpine3.20
build(deps): bump python from 3.12.6-alpine3.20 to 3.12.7-alpine3.20 in /Containers/talk-recording
2024-10-02 08:27:21 +02:00
Simon L.
303c777123 Merge pull request #5366 from nextcloud/dependabot/docker/Containers/imaginary/golang-1.23.2-alpine3.20
build(deps): bump golang from 1.23.1-alpine3.20 to 1.23.2-alpine3.20 in /Containers/imaginary
2024-10-02 08:26:27 +02:00
Simon L.
c0eeb64a53 Merge pull request #5365 from nextcloud/dependabot/docker/Containers/collabora/collabora/code-24.04.8.1.1
build(deps): bump collabora/code from 24.04.7.2.1 to 24.04.8.1.1 in /Containers/collabora
2024-10-02 08:26:03 +02:00
dependabot[bot]
0ecbf79cf2 build(deps): bump python in /Containers/talk-recording
Bumps python from 3.12.6-alpine3.20 to 3.12.7-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-02 04:27:31 +00:00
dependabot[bot]
bb07424ae6 build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.23.1-alpine3.20 to 1.23.2-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-02 04:26:49 +00:00
dependabot[bot]
5b35c443e7 build(deps): bump collabora/code in /Containers/collabora
Bumps collabora/code from 24.04.7.2.1 to 24.04.8.1.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-02 04:26:42 +00:00
Simon L.
b5f579d0f9 adjust text
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-01 13:21:02 +02:00
Simon L.
df89a24077 Merge pull request #5354 from nextcloud/revert-5306-patch-1
Revert "Update containers.json to fix inter-container-connectivity"
2024-10-01 12:18:41 +02:00
Simon L.
e72163e731 Revert "Update containers.json to fix inter-container-connectivity"
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-01 12:15:28 +02:00
Simon L.
c7634883af Merge pull request #5353 from nextcloud/nickvergessen-patch-1
Use GitHub Markdown boxes in readme
2024-10-01 12:01:34 +02:00
Simon L.
0495efcbbb fix typos
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-10-01 12:00:29 +02:00
Simon L.
804f58bd2f Merge pull request #5348 from eltociear/patch-1
docs: update readme.md
2024-10-01 11:23:01 +02:00
Joas Schilling
a901c08702 Use GitHub Markdown boxes in readme
Signed-off-by: Joas Schilling <213943+nickvergessen@users.noreply.github.com>
2024-10-01 10:16:37 +02:00
Ikko Eltociear Ashimine
6365b86107 docs: update readme.md
minor fix

Signed-off-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
2024-10-01 03:06:04 +09:00
Simon L.
c993a66eaf Merge pull request #5345 from nextcloud/aio-dependency-update
PHP dependency updates
2024-09-30 16:19:45 +02:00
szaimen
af2cbb5a88 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-30 14:13:00 +00:00
Simon L.
94b01818c3 Merge pull request #5344 from nextcloud/enh/5332/add-nc-mount-to-m-cc
memories: add NEXTCLOUD_MOUNT to CC
2024-09-30 10:55:26 +02:00
Simon L.
9ecfe60b3b memories: add NEXTCLOUD_MOUNT to CC
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-09-30 09:55:03 +02:00
Simon L.
5021fba8a4 Merge pull request #5343 from nextcloud/dependabot/docker/Containers/talk/nats-2.10.21-scratch
build(deps): bump nats from 2.10.20-scratch to 2.10.21-scratch in /Containers/talk
2024-09-30 09:53:33 +02:00
Simon L.
43a2aadad2 Merge pull request #5342 from nextcloud/dependabot/docker/Containers/nextcloud/php-8.2.24-fpm-alpine3.20
build(deps): bump php from 8.2.23-fpm-alpine3.20 to 8.2.24-fpm-alpine3.20 in /Containers/nextcloud
2024-09-30 09:53:22 +02:00
Simon L.
1bb4817671 Merge pull request #5341 from nextcloud/dependabot/docker/Containers/mastercontainer/php-8.3.12-fpm-alpine3.20
build(deps): bump php from 8.3.11-fpm-alpine3.20 to 8.3.12-fpm-alpine3.20 in /Containers/mastercontainer
2024-09-30 09:53:11 +02:00
Simon L.
378e0cdb96 Merge pull request #5340 from nextcloud/dependabot/docker/Containers/fulltextsearch/elasticsearch-8.15.2
build(deps): bump elasticsearch from 8.15.1 to 8.15.2 in /Containers/fulltextsearch
2024-09-30 09:52:59 +02:00
dependabot[bot]
35011bf58b build(deps): bump nats in /Containers/talk
Bumps nats from 2.10.20-scratch to 2.10.21-scratch.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 05:22:07 +00:00
dependabot[bot]
bd43ed3b82 build(deps): bump php in /Containers/nextcloud
Bumps php from 8.2.23-fpm-alpine3.20 to 8.2.24-fpm-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 05:21:58 +00:00
dependabot[bot]
40436549e7 build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.3.11-fpm-alpine3.20 to 8.3.12-fpm-alpine3.20.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 05:21:47 +00:00
dependabot[bot]
728f5eac3a build(deps): bump elasticsearch in /Containers/fulltextsearch
Bumps elasticsearch from 8.15.1 to 8.15.2.

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 05:21:35 +00:00
Simon L.
0be33a9973 Merge pull request #5333 from nextcloud/aio-dependency-update
PHP dependency updates
2024-09-27 14:06:17 +02:00
szaimen
460791c516 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-27 12:02:57 +00:00
Simon L.
a740c10edd adjust readme for local-ai
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-09-27 10:53:48 +02:00
Simon L.
8e5612977e Merge pull request #5330 from nextcloud/aio-dependency-update
PHP dependency updates
2024-09-26 14:16:35 +02:00
szaimen
26f76e95b1 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-26 12:03:02 +00:00
Simon L.
7c0caaef82 Merge pull request #5324 from nextcloud/aio-dependency-update
PHP dependency updates
2024-09-25 14:37:01 +02:00
szaimen
6756330ec7 php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-09-25 12:02:53 +00:00
Simon L.
0544abbced Merge pull request #5306 from qudiqudi/patch-1
Update containers.json to fix inter-container-connectivity
2024-09-25 13:02:41 +02:00
Simon L.
6ddf0fb077 also add the other services that use direct communication
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-09-25 13:00:27 +02:00
Simon L.
4351034143 Merge pull request #5293 from nextcloud/enh/noid/remove-whitespace
aio-interface: setup.twig: remove whitespace after br, before span tag
2024-09-25 11:45:21 +02:00
Simon L.
e52e5df09b helm: adjust initcontainer: use fixed alpine tag
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-09-23 17:32:57 +02:00
Basti Qdoba
c46b6b13a7 Update containers.json
correct FULLTEXTSEARCH_HOST resolution to get the fulltextsearch container connect to the right network and the nextcloud container, fixes https://github.com/nextcloud/fulltextsearch/issues/831

Signed-off-by: Basti Qdoba <sebastian.chudoba@googlemail.com>
2024-09-21 13:26:49 +02:00
Simon L.
24357e34b2 aio-interface: setup.twig: remove whitespace after br, before span tag
Signed-off-by: Simon L. <szaimen@e.mail.de>
2024-09-19 10:51:07 +02:00
107 changed files with 2487 additions and 1698 deletions

View File

@@ -1,35 +1,37 @@
name: Json Validator
on:
pull_request:
paths:
- '**.json'
push:
branches:
- main
paths:
- '**.json'
jobs:
json-validator:
name: Json Validator
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Validate Json
run: |
sudo apt-get update
sudo apt-get install python3-pip -y --no-install-recommends
sudo pip3 install json-spec
if ! json validate --schema-file=php/containers-schema.json --document-file=php/containers.json; then
exit 1
fi
JSON_FILES="$(find ./community-containers -name '*.json')"
mapfile -t JSON_FILES <<< "$JSON_FILES"
for file in "${JSON_FILES[@]}"; do
json validate --schema-file=php/containers-schema.json --document-file="$file" 2>&1 | tee -a ./json-validator.log
done
if grep -q "document does not validate with schema.\|invalid JSONFile" ./json-validator.log; then
exit 1
fi
name: Json Validator
on:
pull_request:
paths:
- '**.json'
push:
branches:
- main
paths:
- '**.json'
jobs:
json-validator:
name: Json Validator
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Validate Json
run: |
sudo apt-get update
sudo apt-get install python3-venv -y --no-install-recommends
python3 -m venv venv
. venv/bin/activate
pip3 install json-spec
if ! json validate --schema-file=php/containers-schema.json --document-file=php/containers.json; then
exit 1
fi
JSON_FILES="$(find ./community-containers -name '*.json')"
mapfile -t JSON_FILES <<< "$JSON_FILES"
for file in "${JSON_FILES[@]}"; do
json validate --schema-file=php/containers-schema.json --document-file="$file" 2>&1 | tee -a ./json-validator.log
done
if grep -q "document does not validate with schema.\|invalid JSONFile" ./json-validator.log; then
exit 1
fi

View File

@@ -25,7 +25,7 @@ jobs:
| sort -V \
| tail -1
)"
sed -i "s|pecl install APCu.*\;|pecl install APCu-$apcu_version\;|" ./Containers/nextcloud/Dockerfile
sed -i "s|\(pecl install[^;]*APCu-\)[0-9.]*|\1$apcu_version|" ./Containers/nextcloud/Dockerfile
# Memcached
memcached_version="$(
@@ -36,7 +36,7 @@ jobs:
| sort -V \
| tail -1
)"
sed -i "s|pecl install memcached.* |pecl install memcached-$memcached_version |" ./Containers/nextcloud/Dockerfile
sed -i "s|\(pecl install[^;]*memcached-\)[0-9.]*|\1$memcached_version|" ./Containers/nextcloud/Dockerfile
# Redis
redis_version="$(
@@ -47,18 +47,24 @@ jobs:
| sort -V \
| tail -1
)"
sed -i "s|pecl install redis.* |pecl install redis-$redis_version |" ./Containers/nextcloud/Dockerfile
sed -i "s|\(pecl install[^;]*redis-\)[0-9.]*|\1$redis_version|" ./Containers/nextcloud/Dockerfile
# Imagick
imagick_version="$(
git ls-remote --tags https://github.com/mkoppanen/imagick.git \
git ls-remote --tags https://github.com/imagick/imagick.git \
| cut -d/ -f3 \
| grep -viE '[a-z]' \
| tr -d '^{}' \
| sort -V \
| tail -1
)"
sed -i "s|pecl install imagick.*\;|pecl install imagick-$imagick_version\;|" ./Containers/nextcloud/Dockerfile
sed -i "s|\(pecl install[^;]*imagick-\)[0-9.]*|\1$imagick_version|" ./Containers/nextcloud/Dockerfile
# Imagick git-commit-hash from HEAD
imagick_commit_hash="$(
git ls-remote https://github.com/imagick/imagick.git HEAD | awk '{print $1}'
)"
sed -i "s/\(ARG IMAGICK_COMMIT_HASH=\)[a-fA-F0-9]*$/\1$imagick_commit_hash/" ./Containers/nextcloud/Dockerfile
# Igbinary
igbinary_version="$(
@@ -69,7 +75,7 @@ jobs:
| sort -V \
| tail -1
)"
sed -i "s|pecl install igbinary.*\;|pecl install igbinary-$igbinary_version\;|" ./Containers/nextcloud/Dockerfile
sed -i "s|\(pecl install[^;]*igbinary-\)[0-9.]*|\1$igbinary_version|" ./Containers/nextcloud/Dockerfile
# Nextcloud
NC_MAJOR="$(grep "ENV NEXTCLOUD_VERSION" ./Containers/nextcloud/Dockerfile | grep -oP '[23][0-9]')"

11
.github/workflows/update-copyright.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
name: Update Copyright
on:
workflow_dispatch:
jobs:
update-copyright:
name: update copyright
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

View File

@@ -81,7 +81,7 @@ RUN set -ex; \
\
echo "root:$(openssl rand -base64 12)" | chpasswd
USER www-data
USER 33
ENTRYPOINT ["/start.sh"]
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]

View File

@@ -9,8 +9,8 @@ logfile_backups=10
loglevel=error
[program:apache]
# stdout_logfile=/dev/stdout
# stdout_logfile_maxbytes=0
# Stdout logging is disabled as otherwise the logs are spammed
stdout_logfile=NONE
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=apachectl -DFOREGROUND

View File

@@ -11,11 +11,13 @@ RUN set -ex; \
rsync \
fuse \
py3-llfuse \
jq
jq \
openssh-client
VOLUME /root
COPY --chmod=770 *.sh /
COPY borg_excludes /
ENTRYPOINT ["/start.sh"]
# hadolint ignore=DL3002

View File

@@ -34,19 +34,23 @@ for volume in "${DEFAULT_VOLUMES[@]}"; do
done
# Check if target is mountpoint
if ! mountpoint -q /mnt/borgbackup; then
echo "/mnt/borgbackup is not a mountpoint which is not allowed."
if [ -z "$BORG_REMOTE_REPO" ] && ! mountpoint -q "$MOUNT_DIR"; then
echo "$MOUNT_DIR is not a mountpoint which is not allowed."
exit 1
fi
# Check if target is empty
if [ "$BORG_MODE" != backup ] && [ "$BORG_MODE" != test ] && ! [ -f "$BORG_BACKUP_DIRECTORY/config" ]; then
echo "The repository is empty. Cannot perform check or restore."
# Check if repo is uninitialized
if [ "$BORG_MODE" != backup ] && [ "$BORG_MODE" != test ] && ! borg info > /dev/null; then
if [ -n "$BORG_REMOTE_REPO" ]; then
echo "The repository is uninitialized or cannot connect to remote. Cannot perform check or restore."
else
echo "The repository is uninitialized. Cannot perform check or restore."
fi
exit 1
fi
# Do not continue if this file exists (needed for simple external blocking)
if [ -f "$BORG_BACKUP_DIRECTORY/aio-lockfile" ]; then
if [ -z "$BORG_REMOTE_REPO" ] && [ -f "$BORG_BACKUP_DIRECTORY/aio-lockfile" ]; then
echo "Not continuing because aio-lockfile exists it seems like a script is externally running which is locking the backup archive."
echo "If this should not be the case, you can fix this by deleting the 'aio-lockfile' file from the backup archive directory."
exit 1
@@ -57,6 +61,15 @@ if [ "$BORG_MODE" = backup ] || [ "$BORG_MODE" = restore ]; then
touch "/nextcloud_aio_volumes/nextcloud_aio_database_dump/backup-is-running"
fi
if [ -n "$BORG_REMOTE_REPO" ] && ! [ -f "$BORGBACKUP_KEY" ]; then
echo "First run, creating borg ssh key"
ssh-keygen -f "$BORGBACKUP_KEY" -N ""
echo "You should configure the remote to accept this public key"
fi
if [ -n "$BORG_REMOTE_REPO" ] && [ -f "$BORGBACKUP_KEY.pub" ]; then
echo "Your public ssh key for borgbackup is: $(cat "$BORGBACKUP_KEY.pub")"
fi
# Do the backup
if [ "$BORG_MODE" = backup ]; then
@@ -100,15 +113,22 @@ if [ "$BORG_MODE" = backup ]; then
exit 1
fi
# Create backup folder
mkdir -p "$BORG_BACKUP_DIRECTORY"
if [ -z "$BORG_REMOTE_REPO" ]; then
# Create backup folder
mkdir -p "$BORG_BACKUP_DIRECTORY"
fi
# Initialize the repository if the target is empty
if ! [ -f "$BORG_BACKUP_DIRECTORY/config" ]; then
# Initialize the repository if can't get info from target
if ! borg info > /dev/null; then
# Don't initialize if already initialized
if [ -f "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config" ]; then
echo "No borg config file was found in the targeted directory."
echo "This might happen if the targeted directory is located on an external drive and the drive not connected anymore. You should check this."
if [ -n "$BORG_REMOTE_REPO" ]; then
echo "Borg could not get info from the remote repo."
echo "This might be a failure to connect to the remote server. See the above borg info output for details."
else
echo "Borg could not get info from the targeted directory."
echo "This might happen if the targeted directory is located on an external drive and the drive not connected anymore. You should check this."
fi
echo "If you instead want to initialize a new backup repository, you may delete the 'borg.config' file that is stored in the mastercontainer volume manually, which will allow you to initialize a new borg repository in the chosen directory:"
echo "sudo docker exec nextcloud-aio-mastercontainer rm /mnt/docker-aio-config/data/borg.config"
exit 1
@@ -116,28 +136,44 @@ if [ "$BORG_MODE" = backup ]; then
echo "Initializing repository..."
NEW_REPOSITORY=1
if ! borg init --debug --encryption=repokey-blake2 "$BORG_BACKUP_DIRECTORY"; then
if ! borg init --debug --encryption=repokey-blake2; then
echo "Could not initialize borg repository."
rm -f "$BORG_BACKUP_DIRECTORY/config"
if [ -z "$BORG_REMOTE_REPO" ]; then
# Originally we checked for presence of the config file instead of calling `borg info`. Likely `borg info`
# will error on a partially initialized repo, so this line is probably no longer necessary
rm -f "$BORG_BACKUP_DIRECTORY/config"
fi
exit 1
fi
borg config "$BORG_BACKUP_DIRECTORY" additional_free_space 2G
# Fix too large Borg cache
# https://borgbackup.readthedocs.io/en/stable/faq.html#the-borg-cache-eats-way-too-much-disk-space-what-can-i-do
BORG_ID="$(borg config "$BORG_BACKUP_DIRECTORY" id)"
rm -r "/root/.cache/borg/$BORG_ID/chunks.archive.d"
touch "/root/.cache/borg/$BORG_ID/chunks.archive.d"
if [ -z "$BORG_REMOTE_REPO" ]; then
# borg config only works for local repos; it's up to the remote to ensure the disk isn't full
borg config :: additional_free_space 2G
# Make a backup from the borg config file
if ! [ -f "$BORG_BACKUP_DIRECTORY/config" ]; then
echo "The borg config file wasn't created. Something is wrong."
# Fix too large Borg cache
# https://borgbackup.readthedocs.io/en/stable/faq.html#the-borg-cache-eats-way-too-much-disk-space-what-can-i-do
BORG_ID="$(borg config :: id)"
rm -r "/root/.cache/borg/$BORG_ID/chunks.archive.d"
touch "/root/.cache/borg/$BORG_ID/chunks.archive.d"
fi
if ! borg info > /dev/null; then
echo "Borg can't get info from the repo it created. Something is wrong."
exit 1
fi
rm -f "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config"
if ! cp "$BORG_BACKUP_DIRECTORY/config" "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config"; then
echo "Could not copy config file to second place. Cannot perform backup."
exit 1
if [ -n "$BORG_REMOTE_REPO" ]; then
# `borg config` does not support remote repos so instead create a dummy file and rely on the remote to avoid
# corruption of the config file (which contains the encryption key). We don't actually use the contents of
# this file anywhere, so a touch is all we need so we remember we already initialized the repo.
touch "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config"
else
# Make a backup from the borg config file
if ! cp "$BORG_BACKUP_DIRECTORY/config" "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config"; then
echo "Could not copy config file to second place. Cannot perform backup."
exit 1
fi
fi
echo "Repository successfully initialized."
@@ -167,9 +203,9 @@ if [ "$BORG_MODE" = backup ]; then
# Create the backup
echo "Starting the backup..."
get_start_time
if ! borg create "${BORG_OPTS[@]}" "${BORG_EXCLUDE[@]}" "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-nextcloud-aio" "/nextcloud_aio_volumes/"; then
if ! borg create "${BORG_OPTS[@]}" "${BORG_EXCLUDE[@]}" "::$CURRENT_DATE-nextcloud-aio" "/nextcloud_aio_volumes/" --exclude-from /borg_excludes; then
echo "Deleting the failed backup archive..."
borg delete --stats "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-nextcloud-aio"
borg delete --stats "::$CURRENT_DATE-nextcloud-aio"
echo "Backup failed!"
echo "You might want to check the backup integrity via the AIO interface."
if [ "$NEW_REPOSITORY" = 1 ]; then
@@ -188,14 +224,14 @@ if [ "$BORG_MODE" = backup ]; then
# Prune archives
echo "Pruning the archives..."
if ! borg prune --stats --glob-archives '*_*-nextcloud-aio' "${BORG_PRUNE_OPTS[@]}" "$BORG_BACKUP_DIRECTORY"; then
if ! borg prune --stats --glob-archives '*_*-nextcloud-aio' "${BORG_PRUNE_OPTS[@]}"; then
echo "Failed to prune archives!"
exit 1
fi
# Compact archives
echo "Compacting the archives..."
if ! borg compact "$BORG_BACKUP_DIRECTORY"; then
if ! borg compact; then
echo "Failed to compact archives!"
exit 1
fi
@@ -212,19 +248,19 @@ if [ "$BORG_MODE" = backup ]; then
fi
done
echo "Starting the backup for additional volumes..."
if ! borg create "${BORG_OPTS[@]}" "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-additional-docker-volumes" "/docker_volumes/"; then
if ! borg create "${BORG_OPTS[@]}" "::$CURRENT_DATE-additional-docker-volumes" "/docker_volumes/"; then
echo "Deleting the failed backup archive..."
borg delete --stats "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-additional-docker-volumes"
borg delete --stats "::$CURRENT_DATE-additional-docker-volumes"
echo "Backup of additional docker-volumes failed!"
exit 1
fi
echo "Pruning additional volumes..."
if ! borg prune --stats --glob-archives '*_*-additional-docker-volumes' "${BORG_PRUNE_OPTS[@]}" "$BORG_BACKUP_DIRECTORY"; then
if ! borg prune --stats --glob-archives '*_*-additional-docker-volumes' "${BORG_PRUNE_OPTS[@]}"; then
echo "Failed to prune additional docker-volumes archives!"
exit 1
fi
echo "Compacting additional volumes..."
if ! borg compact "$BORG_BACKUP_DIRECTORY"; then
if ! borg compact; then
echo "Failed to compact additional docker-volume archives!"
exit 1
fi
@@ -242,19 +278,19 @@ if [ "$BORG_MODE" = backup ]; then
EXCLUDE_DIRS+=(--exclude "/host_mounts/$directory/")
done
echo "Starting the backup for additional host mounts..."
if ! borg create "${BORG_OPTS[@]}" "${EXCLUDE_DIRS[@]}" "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-additional-host-mounts" "/host_mounts/"; then
if ! borg create "${BORG_OPTS[@]}" "${EXCLUDE_DIRS[@]}" "::$CURRENT_DATE-additional-host-mounts" "/host_mounts/"; then
echo "Deleting the failed backup archive..."
borg delete --stats "$BORG_BACKUP_DIRECTORY::$CURRENT_DATE-additional-host-mounts"
borg delete --stats "::$CURRENT_DATE-additional-host-mounts"
echo "Backup of additional host-mounts failed!"
exit 1
fi
echo "Pruning additional host mounts..."
if ! borg prune --stats --glob-archives '*_*-additional-host-mounts' "${BORG_PRUNE_OPTS[@]}" "$BORG_BACKUP_DIRECTORY"; then
if ! borg prune --stats --glob-archives '*_*-additional-host-mounts' "${BORG_PRUNE_OPTS[@]}"; then
echo "Failed to prune additional host-mount archives!"
exit 1
fi
echo "Compacting additional host mounts..."
if ! borg compact "$BORG_BACKUP_DIRECTORY"; then
if ! borg compact; then
echo "Failed to compact additional host-mount archives!"
exit 1
fi
@@ -276,17 +312,24 @@ fi
if [ "$BORG_MODE" = restore ]; then
get_start_time
# Perform the restore
# Pick archive to restore
if [ -n "$SELECTED_RESTORE_TIME" ]; then
SELECTED_ARCHIVE="$(borg list "$BORG_BACKUP_DIRECTORY" | grep "nextcloud-aio" | grep "$SELECTED_RESTORE_TIME" | awk -F " " '{print $1}' | head -1)"
SELECTED_ARCHIVE="$(borg list | grep "nextcloud-aio" | grep "$SELECTED_RESTORE_TIME" | awk -F " " '{print $1}' | head -1)"
else
SELECTED_ARCHIVE="$(borg list "$BORG_BACKUP_DIRECTORY" | grep "nextcloud-aio" | awk -F " " '{print $1}' | sort -r | head -1)"
SELECTED_ARCHIVE="$(borg list | grep "nextcloud-aio" | awk -F " " '{print $1}' | sort -r | head -1)"
fi
echo "Restoring '$SELECTED_ARCHIVE'..."
mkdir -p /tmp/borg
if ! borg mount "$BORG_BACKUP_DIRECTORY::$SELECTED_ARCHIVE" /tmp/borg; then
echo "Could not mount the backup!"
exit 1
# Exclude previews from restore if selected to speed up process
ADDITIONAL_RSYNC_EXCLUDES=()
ADDITIONAL_BORG_EXCLUDES=()
ADDITIONAL_FIND_EXCLUDES=()
if [ -n "$RESTORE_EXCLUDE_PREVIEWS" ]; then
# Keep these 3 in sync. Beware, the pattern syntax and the paths differ
ADDITIONAL_RSYNC_EXCLUDES=(--exclude "nextcloud_aio_nextcloud_data/appdata_*/preview/**")
ADDITIONAL_BORG_EXCLUDES=(--exclude "sh:nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/appdata_*/preview/**")
ADDITIONAL_FIND_EXCLUDES=(-o -regex 'nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/appdata_[^/]*/preview\(/.*\)?')
echo "Excluding previews from restore"
fi
# Save Additional Backup dirs
@@ -299,27 +342,12 @@ if [ "$BORG_MODE" = restore ]; then
DAILY_BACKUPTIME="$(cat /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/daily_backup_time)"
fi
# Restore everything except the configuration file
if ! rsync --stats --archive --human-readable -vv --delete \
--exclude "nextcloud_aio_apache/caddy/**" \
--exclude "nextcloud_aio_mastercontainer/caddy/**" \
--exclude "nextcloud_aio_nextcloud/data/nextcloud.log*" \
--exclude "nextcloud_aio_nextcloud/data/audit.log" \
--exclude "nextcloud_aio_mastercontainer/certs/**" \
--exclude "nextcloud_aio_mastercontainer/data/configuration.json" \
--exclude "nextcloud_aio_mastercontainer/data/daily_backup_running" \
--exclude "nextcloud_aio_mastercontainer/data/session_date_file" \
--exclude "nextcloud_aio_mastercontainer/session/**" \
/tmp/borg/nextcloud_aio_volumes/ /nextcloud_aio_volumes/; then
RESTORE_FAILED=1
echo "Something failed while restoring from backup."
fi
# Save current aio password
AIO_PASSWORD="$(jq '.password' /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
# Save current path
# Save current backup location vars
BORG_LOCATION="$(jq '.borg_backup_host_location' /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
REMOTE_REPO="$(jq '.borg_remote_repo' /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
# Save current nextcloud datadir
if grep -q '"nextcloud_datadir":' /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json; then
@@ -328,21 +356,114 @@ if [ "$BORG_MODE" = restore ]; then
NEXTCLOUD_DATADIR='""'
fi
# Restore the configuration file
if ! rsync --archive --human-readable -vv \
/tmp/borg/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json \
/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json; then
RESTORE_FAILED=1
echo "Something failed while restoring the configuration.json."
if [ -z "$BORG_REMOTE_REPO" ]; then
mkdir -p /tmp/borg
if ! borg mount "::$SELECTED_ARCHIVE" /tmp/borg; then
echo "Could not mount the backup!"
exit 1
fi
# Restore everything except the configuration file
#
# These exclude patterns need to be kept in sync with the borg_excludes file and the find excludes in this file,
# which use a different syntax (patterns appear in 3 places in total)
if ! rsync --stats --archive --human-readable -vv --delete \
--exclude "nextcloud_aio_apache/caddy/**" \
--exclude "nextcloud_aio_mastercontainer/caddy/**" \
--exclude "nextcloud_aio_nextcloud/data/nextcloud.log*" \
--exclude "nextcloud_aio_nextcloud/data/audit.log" \
--exclude "nextcloud_aio_mastercontainer/certs/**" \
--exclude "nextcloud_aio_mastercontainer/data/configuration.json" \
--exclude "nextcloud_aio_mastercontainer/data/daily_backup_running" \
--exclude "nextcloud_aio_mastercontainer/data/session_date_file" \
--exclude "nextcloud_aio_mastercontainer/session/**" \
"${ADDITIONAL_RSYNC_EXCLUDES[@]}" \
/tmp/borg/nextcloud_aio_volumes/ /nextcloud_aio_volumes/; then
RESTORE_FAILED=1
echo "Something failed while restoring from backup."
fi
# Restore the configuration file
if ! rsync --archive --human-readable -vv \
/tmp/borg/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json \
/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json; then
RESTORE_FAILED=1
echo "Something failed while restoring the configuration.json."
fi
if ! umount /tmp/borg; then
echo "Failed to unmount the borg archive but should still be able to restore successfully"
fi
else
# Restore nearly everything
#
# borg mount is really slow for remote repos (did not check whether it's slow for local repos too),
# using extract to /tmp would require temporarily storing a second copy of the data.
# So instead extract directly on top of the destination with exclude patterns for the config, but
# then we do still need to delete local files which are not present in the archive.
#
# Older backups may still contain files we've since excluded, so we have to exclude on extract as well.
cd / # borg extract has no destination arg and extracts to CWD
if ! borg extract "::$SELECTED_ARCHIVE" --progress --exclude-from /borg_excludes "${ADDITIONAL_BORG_EXCLUDES[@]}" --pattern '+nextcloud_aio_volumes/**'
then
RESTORE_FAILED=1
echo "Failed to extract backup archive."
else
# Delete files/dirs present locally, but not in the backup archive, excluding conf files
# https://unix.stackexchange.com/a/759341
# This comm does not support -z, but I doubt any file names would have \n in them
#
# These find patterns need to be kept in sync with the borg_excludes file and the rsync excludes in this
# file, which use a different syntax (patterns appear in 3 places in total)
echo "Deleting local files which do not exist in the backup"
if ! find nextcloud_aio_volumes \
-not \( \
-path nextcloud_aio_volumes/nextcloud_aio_apache/caddy \
-o -path "nextcloud_aio_volumes/nextcloud_aio_apache/caddy/*" \
-o -path nextcloud_aio_volumes/nextcloud_aio_mastercontainer/caddy \
-o -path "nextcloud_aio_volumes/nextcloud_aio_mastercontainer/caddy/*" \
-o -path nextcloud_aio_volumes/nextcloud_aio_mastercontainer/certs \
-o -path "nextcloud_aio_volumes/nextcloud_aio_mastercontainer/certs/*" \
-o -path nextcloud_aio_volumes/nextcloud_aio_mastercontainer/session \
-o -path "nextcloud_aio_volumes/nextcloud_aio_mastercontainer/session/*" \
-o -path "nextcloud_aio_volumes/nextcloud_aio_nextcloud/data/nextcloud.log*" \
-o -path nextcloud_aio_volumes/nextcloud_aio_nextcloud/data/audit.log \
-o -path nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/daily_backup_running \
-o -path nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/session_date_file \
-o -path "nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/id_borg*" \
"${ADDITIONAL_FIND_EXCLUDES[@]}" \
\) \
| LC_ALL=C sort \
| LC_ALL=C comm -23 - \
<(borg list "::$SELECTED_ARCHIVE" --short --exclude-from /borg_excludes --pattern '+nextcloud_aio_volumes/**' | LC_ALL=C sort) \
> /tmp/local_files_not_in_backup
then
RESTORE_FAILED=1
echo "Failed to delete local files not in backup archive."
else
# More robust than e.g. xargs as I got a ~"args line too long" error while testing that, but it's slower
# https://stackoverflow.com/a/21848934
while IFS= read -r file
do rm -vrf -- "$file" || DELETE_FAILED=1
done < /tmp/local_files_not_in_backup
if [ "$DELETE_FAILED" = 1 ]; then
RESTORE_FAILED=1
echo "Failed to delete (some) local files not in backup archive."
fi
fi
fi
fi
# Set backup-mode to restore since it was a restore
CONTENTS="$(jq '."backup-mode" = "restore"' /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
echo -E "${CONTENTS}" > /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json
# Reset the backup path to the currently used one
# Reset the backup location vars to the currently used one
CONTENTS="$(jq ".borg_backup_host_location = $BORG_LOCATION" /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
echo -E "${CONTENTS}" > /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json
CONTENTS="$(jq ".borg_remote_repo = $REMOTE_REPO" /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
echo -E "${CONTENTS}" > /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json
# Reset the AIO password to the currently used one
CONTENTS="$(jq ".password = $AIO_PASSWORD" /nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/configuration.json)"
@@ -366,8 +487,6 @@ if [ "$BORG_MODE" = restore ]; then
chmod 770 "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/daily_backup_time"
fi
umount /tmp/borg
if [ "$RESTORE_FAILED" = 1 ]; then
exit 1
fi
@@ -384,6 +503,12 @@ if [ "$BORG_MODE" = restore ]; then
touch "/nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/fingerprint.update"
chmod 777 "/nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/fingerprint.update"
# Add file to Netcloud container to trigger a preview scan the next time it starts
if [ -n "$RESTORE_EXCLUDE_PREVIEWS" ]; then
touch "/nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/trigger-preview.scan"
chmod 777 "/nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/trigger-preview.scan"
fi
# Delete redis cache
rm -f "/mnt/redis/dump.rdb"
fi
@@ -394,7 +519,7 @@ if [ "$BORG_MODE" = check ]; then
echo "Checking the backup integrity..."
# Perform the check
if ! borg check -v --verify-data "$BORG_BACKUP_DIRECTORY"; then
if ! borg check -v --verify-data; then
echo "Some errors were found while checking the backup integrity!"
echo "Check the AIO interface for advices on how to proceed now!"
exit 1
@@ -412,7 +537,7 @@ if [ "$BORG_MODE" = "check-repair" ]; then
echo "Checking the backup integrity and repairing it..."
# Perform the check-repair
if ! echo YES | borg check -v --repair "$BORG_BACKUP_DIRECTORY"; then
if ! echo YES | borg check -v --repair; then
echo "Some errors were found while checking and repairing the backup integrity!"
exit 1
fi
@@ -425,19 +550,29 @@ fi
# Do the backup test
if [ "$BORG_MODE" = test ]; then
if ! [ -d "$BORG_BACKUP_DIRECTORY" ]; then
echo "No 'borg' directory in the given backup directory found!"
echo "Only the files/folders below have been found in the given directory."
ls -a "$MOUNT_DIR"
echo "Please adjust the directory so that the borg archive is positioned in a folder named 'borg' inside the given directory!"
exit 1
elif ! [ -f "$BORG_BACKUP_DIRECTORY/config" ]; then
echo "A 'borg' directory was found but could not find the borg archive."
echo "Only the files/folders below have been found in the borg directory."
ls -a "$BORG_BACKUP_DIRECTORY"
echo "The archive and most importantly the config file must be positioned directly in the 'borg' subfolder."
exit 1
elif ! borg list "$BORG_BACKUP_DIRECTORY"; then
if [ -n "$BORG_REMOTE_REPO" ]; then
if ! borg info > /dev/null; then
echo "Borg could not get info from the remote repo."
echo "See the above borg info output for details."
exit 1
fi
else
if ! [ -d "$BORG_BACKUP_DIRECTORY" ]; then
echo "No 'borg' directory in the given backup directory found!"
echo "Only the files/folders below have been found in the given directory."
ls -a "$MOUNT_DIR"
echo "Please adjust the directory so that the borg archive is positioned in a folder named 'borg' inside the given directory!"
exit 1
elif ! [ -f "$BORG_BACKUP_DIRECTORY/config" ]; then
echo "A 'borg' directory was found but could not find the borg archive."
echo "Only the files/folders below have been found in the borg directory."
ls -a "$BORG_BACKUP_DIRECTORY"
echo "The archive and most importantly the config file must be positioned directly in the 'borg' subfolder."
exit 1
fi
fi
if ! borg list; then
echo "The entered path seems to be valid but could not open the backup archive."
echo "Most likely the entered password was wrong so please adjust it accordingly!"
exit 1

View File

@@ -0,0 +1,11 @@
# These patterns need to be kept in sync with rsync and find excludes in backupscript.sh,
# which use a different syntax (patterns appear in 3 places in total)
nextcloud_aio_volumes/nextcloud_aio_apache/caddy/
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/caddy/
nextcloud_aio_volumes/nextcloud_aio_nextcloud/data/nextcloud.log*
nextcloud_aio_volumes/nextcloud_aio_nextcloud/data/audit.log
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/certs/
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/daily_backup_running
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/session_date_file
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/session/
nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/id_borg*

View File

@@ -2,7 +2,7 @@
# Variables
export MOUNT_DIR="/mnt/borgbackup"
export BORG_BACKUP_DIRECTORY="$MOUNT_DIR/borg"
export BORG_BACKUP_DIRECTORY="$MOUNT_DIR/borg" # necessary even when remote to store the aio-lockfile
# Validate BORG_PASSWORD
if [ -z "$BORG_PASSWORD" ] && [ -z "$BACKUP_RESTORE_PASSWORD" ]; then
@@ -18,6 +18,18 @@ else
fi
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
if [ -n "$BORG_REMOTE_REPO" ]; then
export BORG_REPO="$BORG_REMOTE_REPO"
# Location to create the borg ssh pub/priv key
export BORGBACKUP_KEY="/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/id_borg"
# Accept any host key the first time connecting to the remote. Strictly speaking should be provided by user but you'd
# have to be very unlucky to get MitM'ed on your first connection.
export BORG_RSH="ssh -o StrictHostKeyChecking=accept-new -i $BORGBACKUP_KEY"
else
export BORG_REPO="$BORG_BACKUP_DIRECTORY"
fi
# Validate BORG_MODE
if [ "$BORG_MODE" != backup ] && [ "$BORG_MODE" != restore ] && [ "$BORG_MODE" != check ] && [ "$BORG_MODE" != "check-repair" ] && [ "$BORG_MODE" != test ]; then
@@ -36,8 +48,8 @@ fi
rm -f "/nextcloud_aio_volumes/nextcloud_aio_database_dump/backup-is-running"
# Get a list of all available borg archives
if borg list "$BORG_BACKUP_DIRECTORY" &>/dev/null; then
borg list "$BORG_BACKUP_DIRECTORY" | grep "nextcloud-aio" | awk -F " " '{print $1","$3,$4}' > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
if borg list &>/dev/null; then
borg list | grep "nextcloud-aio" | awk -F " " '{print $1","$3,$4}' > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
else
echo "" > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
fi

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Probably from this file: https://github.com/Cisco-Talos/clamav-docker/blob/main/clamav/1.3/alpine/Dockerfile
FROM clamav/clamav:1.4.1-5
FROM clamav/clamav:1.4.1-12
COPY clamav.conf /clamav.conf
COPY --chmod=775 start.script /start.script
@@ -19,7 +19,7 @@ RUN set -ex; \
VOLUME /var/lib/clamav
USER clamav
USER 100
LABEL com.centurylinklabs.watchtower.enable="false"

View File

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

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM haproxy:3.0.5-alpine
FROM haproxy:3.0.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.15.1
FROM elasticsearch:8.15.3
USER root
@@ -14,8 +14,7 @@ RUN set -ex; \
apt-get install -y --no-install-recommends \
tzdata \
; \
rm -rf /var/lib/apt/lists/*; \
elasticsearch-plugin install --batch ingest-attachment
rm -rf /var/lib/apt/lists/*;
USER 1000:0

View File

@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:latest
FROM golang:1.23.1-alpine3.20 AS go
FROM golang:1.23.3-alpine3.20 AS go
ENV IMAGINARY_HASH=6cd9edd1d3fb151eb773c14552886e4fc8e50138
ENV IMAGINARY_HASH=8f36a26c448be8c151a3878404b75fcd1cd3cf0c
RUN set -ex; \
apk add --no-cache \
@@ -33,7 +33,7 @@ COPY --chmod=775 start.sh /start.sh
ENV PORT=9000
USER nobody
USER 65534
# https://github.com/h2non/imaginary#memory-issues
ENV MALLOC_ARENA_MAX=2

View File

@@ -6,7 +6,7 @@ FROM docker:27.3.1-cli AS docker
FROM caddy:2.8.4-alpine AS caddy
# From https://github.com/docker-library/php/blob/master/8.3/alpine3.20/fpm/Dockerfile
FROM php:8.3.11-fpm-alpine3.20
FROM php:8.3.13-fpm-alpine3.20
EXPOSE 80
EXPOSE 8080

View File

@@ -193,6 +193,14 @@ It is set to '$APACHE_IP_BINDING'."
exit 1
fi
fi
if [ -n "$APACHE_ADDITIONAL_NETWORK" ]; then
if ! echo "$APACHE_ADDITIONAL_NETWORK" | grep -q "^[a-zA-Z0-9_-]\+$"; then
print_red "You've set APACHE_ADDITIONAL_NETWORK but not to an allowed value.
It needs to be a string with letters, numbers, hyphens and underscores.
It is set to '$APACHE_ADDITIONAL_NETWORK'."
exit 1
fi
fi
if [ -n "$TALK_PORT" ]; then
if ! check_if_number "$TALK_PORT"; then
print_red "You provided an Talk port but did not only use numbers.

View File

@@ -9,16 +9,16 @@ loglevel=error
user=root
[program:php-fpm]
# stdout_logfile=/dev/stdout
# stdout_logfile_maxbytes=0
# Stdout logging is disabled as otherwise the logs are spammed
stdout_logfile=NONE
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=php-fpm
user=root
[program:apache]
# stdout_logfile=/dev/stdout
# stdout_logfile_maxbytes=0
# Stdout logging is disabled as otherwise the logs are spammed
stdout_logfile=NONE
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=httpd -DFOREGROUND
@@ -58,9 +58,7 @@ user=root
[program:domain-validator]
# Logging is disabled as otherwise all attempts will be logged which spams the logs
# stdout_logfile=/dev/stdout
# stdout_logfile_maxbytes=0
# stderr_logfile=/dev/stderr
# stderr_logfile_maxbytes=0
stdout_logfile=NONE
stderr_logfile=NONE
command=php -S 127.0.0.1:9876 /var/www/docker-aio/php/domain-validator.php
user=www-data

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM php:8.2.23-fpm-alpine3.20
FROM php:8.3.13-fpm-alpine3.20
ENV PHP_MEMORY_LIMIT=512M
ENV PHP_UPLOAD_LIMIT=10G
@@ -8,11 +8,14 @@ ENV SOURCE_LOCATION=/usr/src/nextcloud
ENV REDIS_DB_INDEX=0
# AIO settings start # Do not remove or change this line!
ENV NEXTCLOUD_VERSION=29.0.7
ENV NEXTCLOUD_VERSION=30.0.2
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!
# Define the commit hash for imagick as a variable
ARG IMAGICK_COMMIT_HASH=28f27044e435a2b203e32675e942eb8de620ee58
COPY --chmod=775 *.sh /
COPY --chmod=774 upgrade.exclude /upgrade.exclude
COPY config/*.php /
@@ -78,13 +81,24 @@ RUN set -ex; \
; \
\
# pecl will claim success even if one install fails, so we need to perform each install separately
pecl install igbinary-3.2.16; \
pecl install -o igbinary-3.2.16; \
pecl install APCu-5.1.24; \
pecl install memcached-3.2.0 \
--configureoptions 'enable-memcached-igbinary="yes"'; \
pecl install redis-6.0.2 \
--configureoptions 'enable-redis-igbinary="yes" enable-redis-zstd="yes" enable-redis-lz4="yes"'; \
pecl install imagick-3.7.0; \
pecl install -D 'enable-memcached-igbinary="yes"' memcached-3.3.0; \
pecl install -oD 'enable-redis-igbinary="yes" enable-redis-zstd="yes" enable-redis-lz4="yes"' redis-6.1.0; \
# pecl install -o imagick-3.7.0; \
# Begin workaround ->
# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet.
# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround.
apk add --no-cache --virtual .git-build-deps git \
&& git clone https://github.com/imagick/imagick.git --depth 1 /tmp/imagick \
&& cd /tmp/imagick \
&& git fetch --depth 1 origin ${IMAGICK_COMMIT_HASH} \
&& git checkout ${IMAGICK_COMMIT_HASH} \
&& sed -i "s/@PACKAGE_VERSION@/git-${IMAGICK_COMMIT_HASH:0:7}/" php_imagick.h \
&& phpize && ./configure && make && make install; \
apk del .git-build-deps; \
cd && rm -r /tmp/imagick; \
# <- End workaround
\
docker-php-ext-enable \
igbinary \
@@ -136,6 +150,7 @@ RUN set -ex; \
echo 'redis.session.locking_enabled = 1'; \
echo 'redis.session.lock_retries = -1'; \
echo 'redis.session.lock_wait_time = 10000'; \
echo 'session.gc_maxlifetime = 86400'; \
} > /usr/local/etc/php/conf.d/redis-session.ini; \
\
mkdir -p /var/www/data; \
@@ -223,6 +238,7 @@ RUN set -ex; \
sudo \
grep \
nodejs \
libreoffice \
bind-tools \
imagemagick \
imagemagick-svg \
@@ -256,10 +272,7 @@ RUN set -ex; \
\
mkdir -p /nc-updater; \
chown -R www-data:www-data /nc-updater; \
chmod -R 770 /nc-updater; \
\
# Give root a random password
echo "root:$(openssl rand -base64 12)" | chpasswd
chmod -R 770 /nc-updater
# hadolint ignore=DL3002
USER root

View File

@@ -20,6 +20,11 @@ run_upgrade_if_needed_due_to_app_update() {
fi
}
# Adjust DATABASE_TYPE to by Nextcloud supported value
if [ "$DATABASE_TYPE" = postgres ]; then
export DATABASE_TYPE=pgsql
fi
# Only start container if redis is accessible
# shellcheck disable=SC2153
while ! nc -z "$REDIS_HOST" "6379"; do
@@ -237,12 +242,12 @@ if ! [ -f "$NEXTCLOUD_DATA_DIR/skip.update" ]; then
);
DATADIR_PERMISSION_CONF
echo "Installing with PostgreSQL database"
echo "Installing with $DATABASE_TYPE database"
# Set a default value for POSTGRES_PORT
if [ -z "$POSTGRES_PORT" ]; then
POSTGRES_PORT=5432
fi
INSTALL_OPTIONS+=(--database pgsql --database-name "$POSTGRES_DB" --database-user "$POSTGRES_USER" --database-pass "$POSTGRES_PASSWORD" --database-host "$POSTGRES_HOST" --database-port "$POSTGRES_PORT")
INSTALL_OPTIONS+=(--database "$DATABASE_TYPE" --database-name "$POSTGRES_DB" --database-user "$POSTGRES_USER" --database-pass "$POSTGRES_PASSWORD" --database-host "$POSTGRES_HOST" --database-port "$POSTGRES_PORT")
echo "Starting Nextcloud installation..."
if ! php /var/www/html/occ maintenance:install "${INSTALL_OPTIONS[@]}"; then
@@ -490,6 +495,12 @@ if [ -f "$NEXTCLOUD_DATA_DIR/fingerprint.update" ]; then
rm "$NEXTCLOUD_DATA_DIR/fingerprint.update"
fi
# Perform preview scan if previews were excluded from restore
if [ -f "$NEXTCLOUD_DATA_DIR/trigger-preview.scan" ]; then
php /var/www/html/occ files:scan-app-data preview -vvv
rm "$NEXTCLOUD_DATA_DIR/trigger-preview.scan"
fi
# AIO one-click settings start # Do not remove or change this line!
# Apply one-click-instance settings
echo "Applying one-click-instance settings..."
@@ -531,6 +542,7 @@ php /var/www/html/occ config:system:set allow_local_remote_servers --type=bool -
php /var/www/html/occ config:system:set davstorage.request_timeout --value="$PHP_MAX_TIME" --type=int
php /var/www/html/occ config:system:set trusted_domains 1 --value="$NC_DOMAIN"
php /var/www/html/occ config:system:set overwrite.cli.url --value="https://$NC_DOMAIN/"
php /var/www/html/occ config:system:set documentation_url.server_logs --value="https://github.com/nextcloud/all-in-one/discussions/5425"
php /var/www/html/occ config:system:set htaccess.RewriteBase --value="/"
php /var/www/html/occ maintenance:update:htaccess

View File

@@ -20,7 +20,7 @@ mapfile -t NC_USERS <<< "$NC_USERS"
for user in "${NC_USERS[@]}"
do
echo "Posting '$SUBJECT' to: $user"
"${COMMAND[@]}" notification:generate "$user" "$NC_DOMAIN: $SUBJECT" -l "$MESSAGE"
"${COMMAND[@]}" notification:generate "$user" "$NC_DOMAIN: $SUBJECT" -l "$MESSAGE" --object-type='update' --object-id="$SUBJECT"
done
echo "Done!"

View File

@@ -28,7 +28,7 @@ done
for admin in "${NC_ADMIN_USER[@]}"
do
echo "Posting '$SUBJECT' to: $admin"
"${COMMAND[@]}" notification:generate "$admin" "$NC_DOMAIN: $SUBJECT" -l "$MESSAGE"
"${COMMAND[@]}" notification:generate "$admin" "$NC_DOMAIN: $SUBJECT" -l "$MESSAGE" --object-type='update' --object-id="$SUBJECT"
done
echo "Done!"

View File

@@ -17,6 +17,11 @@ done
POSTGRES_USER="oc_$POSTGRES_USER"
export POSTGRES_USER
# Check that db type is not empty
if [ -z "$DATABASE_TYPE" ]; then
export DATABASE_TYPE=postgres
fi
# Fix false database connection on old instances
if [ -f "/var/www/html/config/config.php" ]; then
sleep 2

View File

@@ -1,13 +1,13 @@
#!/bin/bash
if [ -z "$NEXTCLOUD_HOST" ]; then
echo "NEXTCLOUD_HOST need to be provided. Exiting!"
echo "NEXTCLOUD_HOST needs to be provided. Exiting!"
exit 1
elif [ -z "$POSTGRES_HOST" ]; then
echo "POSTGRES_HOST need to be provided. Exiting!"
echo "POSTGRES_HOST needs to be provided. Exiting!"
exit 1
elif [ -z "$REDIS_HOST" ]; then
echo "REDIS_HOST need to be provided. Exiting!"
echo "REDIS_HOST needs to be provided. Exiting!"
exit 1
fi
@@ -52,9 +52,16 @@ fi
if [ -z "$REDIS_DB_INDEX" ]; then
REDIS_DB_INDEX=0
fi
# Set a default for db type
if [ -z "$DATABASE_TYPE" ]; then
DATABASE_TYPE=postgres
elif [ "$DATABASE_TYPE" != postgres ] && [ "$DATABASE_TYPE" != mysql ]; then
echo "DB type must be either postgres or mysql"
exit 1
fi
# Set sensitive values as env
export DATABASE_URL="postgres://oc_$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB"
export DATABASE_URL="$DATABASE_TYPE://oc_$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB"
export REDIS_URL="redis://:$REDIS_HOST_PASSWORD@$REDIS_HOST/$REDIS_DB_INDEX"
# Run it

View File

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

View File

@@ -39,7 +39,7 @@ RUN set -ex; \
VOLUME /mnt/data
USER postgres
USER 999
ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From https://github.com/docker-library/redis/blob/master/7.2/alpine/Dockerfile
FROM redis:7.2.5-alpine
FROM redis:7.2.6-alpine
COPY --chmod=775 start.sh /start.sh
@@ -14,7 +14,7 @@ RUN set -ex; \
# Get rid of unused binaries
rm -f /usr/local/bin/gosu;
USER redis
USER 999
ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD redis-cli -a $REDIS_HOST_PASSWORD PING || exit 1

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
FROM python:3.12.6-alpine3.20
FROM python:3.13.0-alpine3.20
COPY --chmod=775 start.sh /start.sh
@@ -28,7 +28,7 @@ RUN set -ex; \
build-base \
linux-headers \
geckodriver; \
useradd -d /tmp --system recording; \
useradd -d /tmp --system recording -u 122; \
# Give root a random password
echo "root:$(openssl rand -base64 12)" | chpasswd; \
git clone --recursive https://github.com/nextcloud/nextcloud-talk-recording --depth=1 --single-branch --branch "$RECORDING_VERSION" /src; \
@@ -48,8 +48,9 @@ RUN set -ex; \
build-base \
linux-headers;
VOLUME /tmp
WORKDIR /tmp
USER recording
USER 122
ENTRYPOINT ["/start.sh"]
CMD ["python", "-m", "nextcloud.talk.recording", "--config", "/conf/recording.conf"]

View File

@@ -16,6 +16,9 @@ if [ -z "$HPB_DOMAIN" ]; then
export HPB_DOMAIN="$NC_DOMAIN"
fi
# Delete all contents on startup to start fresh
rm -fr /tmp/{*,.*}
cat << RECORDING_CONF > "/conf/recording.conf"
[logs]
# 30 means Warning

View File

@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:latest
FROM nats:2.10.20-scratch AS nats
FROM eturnal/eturnal:1.12.0 AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.0 AS signaling
FROM nats:2.10.22-scratch AS nats
FROM eturnal/eturnal:1.12.1 AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.1 AS signaling
FROM alpine:3.20.3 AS janus
ARG JANUS_VERSION=v0.14.4
@@ -99,7 +99,7 @@ RUN set -ex; \
ln -s /opt/eturnal/bin/stun /usr/local/bin/stun; \
ln -s /opt/eturnal/bin/eturnalctl /usr/local/bin/eturnalctl
USER eturnal
USER 1000
ENTRYPOINT ["/start.sh"]
CMD ["supervisord", "-c", "/supervisord.conf"]

View File

@@ -1,11 +1,11 @@
# syntax=docker/dockerfile:latest
FROM ghcr.io/nextcloud-releases/whiteboard:v1.0.2
FROM ghcr.io/nextcloud-releases/whiteboard:v1.0.4
USER root
RUN set -ex; \
apk upgrade --no-cache -a; \
apk add --no-cache bash
USER nobody
USER 65534
COPY --chmod=775 start.sh /start.sh

View File

@@ -5,7 +5,7 @@
<name>Nextcloud All-in-One</name>
<summary>Provides a login link for admins.</summary>
<description>Add a link to the admin settings that gives access to the Nextcloud All-in-One admin interface</description>
<version>0.6.0</version>
<version>0.7.0</version>
<licence>agpl</licence>
<author>Azul</author>
<namespace>AllInOne</namespace>
@@ -13,7 +13,7 @@
<category>monitoring</category>
<bugs>https://github.com/nextcloud/all-in-one/issues</bugs>
<dependencies>
<nextcloud min-version="28" max-version="29"/>
<nextcloud min-version="29" max-version="30"/>
</dependencies>
<settings>

View File

@@ -18,8 +18,8 @@ This container bundles Local AI and auto-configures it for you.
- url: github:go-skynet/model-gallery/gpt4all-j.yaml
name: gpt4all-j
```
- You need to add gpt4all-j under Text Generation (Default completion model to use) in Connected Accounts in the Administration Settings in Nextcloud, the default does not work.
- Additionally after doing so, you might want to enable or disable specific features for your models in the integration_openai settings: `https://your-nc-domain.com/settings/admin/connected-accounts`
- To make it work, you first need to browse `https://your-nc-domain.com/settings/admin/ai` and enable or disable specific features for your models in the openAI settings. Afterwards using the Nextcloud Assistant should work.
- See [this guide](https://github.com/nextcloud/all-in-one/discussions/5430) for how to improve AI task pickup speed
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
### Repository

View File

@@ -17,6 +17,11 @@
"source": "%NEXTCLOUD_DATADIR%",
"destination": "/mnt/ncdata",
"writeable": false
},
{
"source": "%NEXTCLOUD_MOUNT%",
"destination": "%NEXTCLOUD_MOUNT%",
"writeable": false
}
],
"devices": [

View File

@@ -7,7 +7,7 @@ This container contains a fork of the Nginx Proxy Manager, which is a WebUI for
- Make sure that no other service is using port `443 (tcp/upd)` or `81 (tcp)` on your host as otherwise the containers will fail to start. You can check this with `sudo netstat -tulpn | grep "443\|81"` before installing AIO.
- Please change the default login data first, after you can read inside the logs that the default config for AIO is created and there are no errors.
- After the container was started the first time, please check the logs for errors. Then you can open NPMplus on `https://<ip>:81` and change the password.
- The default password is `iArhP1j7p1P6TA92FA2FMbbUGYqwcYzxC4AVEe12Wbi94FY9gNN62aKyF1shrvG4NycjjX9KfmDQiwkLZH1ZDR9xMjiG2QmoHXi` and the default email is `admin@example.com`
- The default password is `iArhP1j7p1P6TA92FA2FMbbUGYqwcYzxC4AVEe12Wbi94FY9gNN62aKyF1shrvG4NycjjX9KfmDQiwkLZH1ZDR9xMjiG2QmoHXi` and the default email is `admin@example.org`
- If you want to use NPMplus behind a domain and outside localhost just create a new proxy host inside the NPMplus which proxies to `https`, `127.0.0.1` and port `81` - all other settings should be the same as for the AIO host.
- If you want to set env options from this [compose.yaml](https://github.com/ZoeyVid/NPMplus/blob/develop/compose.yaml), please set them inside the `.env` file which you can find in the `nextcloud_aio_npmplus` volume
- The data (certs, configs, etc.) of NPMplus will be automatically included in AIOs backup solution!

View File

@@ -14,8 +14,10 @@ services:
- 8443:8443 # Can be removed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
# environment: # Is needed when using any of the options below
# AIO_DISABLE_BACKUP_SECTION: false # Setting this to true allows to hide the backup section in the AIO interface. See https://github.com/nextcloud/all-in-one#how-to-disable-the-backup-section
# AIO_COMMUNITY_CONTAINERS: # With this variable, you can add community containers very easily. See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers
# APACHE_PORT: 11000 # Is needed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
# APACHE_IP_BINDING: 127.0.0.1 # Should be set when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) that is running on the same host. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
# APACHE_ADDITIONAL_NETWORK: frontend_net # (Optional) Connect the apache container to an additional docker network. Needed when behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) running in a different docker network on same server. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
# BORG_RETENTION_POLICY: --keep-within=7d --keep-weekly=4 --keep-monthly=6 # Allows to adjust borgs retention policy. See https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy
# COLLABORA_SECCOMP_DISABLED: false # Setting this to true allows to disable Collabora's Seccomp feature. See https://github.com/nextcloud/all-in-one#how-to-disable-collaboras-seccomp-feature
# NEXTCLOUD_DATADIR: /mnt/ncdata # Allows to set the host directory for Nextcloud's datadir. ⚠️⚠️⚠️ Warning: do not set or adjust this value after the initial Nextcloud installation is done! See https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir
@@ -29,25 +31,39 @@ services:
# NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS: imagick # This allows to add additional php extensions to the Nextcloud container permanently. Default is imagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-php-extensions-permanently-to-the-nextcloud-container
# NEXTCLOUD_ENABLE_DRI_DEVICE: true # This allows to enable the /dev/dri device in the Nextcloud container. ⚠️⚠️⚠️ Warning: this only works if the '/dev/dri' device is present on the host! If it should not exist on your host, don't set this to true as otherwise the Nextcloud container will fail to start! See https://github.com/nextcloud/all-in-one#how-to-enable-hardware-transcoding-for-nextcloud
# NEXTCLOUD_KEEP_DISABLED_APPS: false # Setting this to true will keep Nextcloud apps that are disabled in the AIO interface and not uninstall them if they should be installed. See https://github.com/nextcloud/all-in-one#how-to-keep-disabled-apps
# SKIP_DOMAIN_VALIDATION: false # This should only be set to true if things are correctly configured. See https://github.com/nextcloud/all-in-one?tab=readme-ov-file#how-to-skip-the-domain-validation
# TALK_PORT: 3478 # This allows to adjust the port that the talk container is using. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-talk-port
# WATCHTOWER_DOCKER_SOCKET_PATH: /var/run/docker.sock # Needs to be specified if the docker socket on the host is not located in the default '/var/run/docker.sock'. Otherwise mastercontainer updates will fail. For macos it needs to be '/var/run/docker.sock'
# security_opt: ["label:disable"] # Is needed when using SELinux
# # Optional: Caddy reverse proxy. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md
# # You can find further examples here: https://github.com/nextcloud/all-in-one/discussions/588
# caddy:
# image: caddy:alpine
# restart: always
# container_name: caddy
# volumes:
# - ./Caddyfile:/etc/caddy/Caddyfile
# - ./certs:/certs
# - ./config:/config
# - ./data:/data
# - ./sites:/srv
# network_mode: "host"
# # Optional: Caddy reverse proxy. See https://github.com/nextcloud/all-in-one/discussions/575
# # Hint: You need to uncomment APACHE_PORT: 11000 above, adjust cloud.example.com to your domain and uncomment the necessary docker volumes at the bottom of this file in order to make it work
# # You can find further examples here: https://github.com/nextcloud/all-in-one/discussions/588
# caddy:
# image: caddy:alpine
# restart: always
# container_name: caddy
# volumes:
# - caddy_certs:/certs
# - caddy_config:/config
# - caddy_data:/data
# - caddy_sites:/srv
# network_mode: "host"
# configs:
# - source: Caddyfile
# target: /etc/caddy/Caddyfile
# configs:
# Caddyfile:
# content: |
# # Adjust cloud.example.com to your domain below
# https://cloud.example.com:443 {
# reverse_proxy localhost:11000
# }
volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive
nextcloud_aio_mastercontainer:
name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work
# caddy_certs:
# caddy_config:
# caddy_data:
# caddy_sites:

View File

@@ -18,7 +18,8 @@ You can run AIO with docker rootless by following the steps below.
Almost all commands in this project's documentation use `sudo docker ...`. Since `sudo` is not needed in case of docker rootless, you simply remove `sudo` from the commands and they should work.
### Note regarding permissions
All files outside the containers get created, written to and accessed as the user that is running the docker daemon or a subuid of it. So for the built-in backup to work you need to allow this user to write to the target directory. E.g. with `sudo chown -R USERNAME:GROUPNAME /mnt/backup`. The same applies when changing Nextcloud's datadir. E.g. `sudo chown -R USERNAME:GROUPNAME /mnt/ncdata`. When you want to use the NEXTCLOUD_MOUNT option for local external storage, you need to adjust the permissions of the chosen folders to be accessible/writeable by the userid `100032:100032` (if running `grep ^$(whoami): /etc/subuid` as the user that is running the docker daemon returns 100000 as first value).
All files outside the containers get created, written to and accessed as the user that is running the docker daemon or a subuid of it. So for the built-in backup to work you need to allow this user to write to the target directory. E.g. with `sudo chown -R USERNAME:GROUPNAME /mnt/backup`. The same applies when changing Nextcloud's datadir via NEXTCLOUD_DATADIR. E.g. `sudo chown -R USERNAME:GROUPNAME /mnt/ncdata`. When you want to use the NEXTCLOUD_MOUNT option for local external storage, you need to adjust the permissions of the chosen folders to be accessible/writeable by the userid `100032:100032` (if running `grep ^$(whoami): /etc/subuid` as the user that is running the docker daemon returns 100000 as first value).
### Note regarding docker network driver
By default rootless docker uses the `slirp4netns` IP driver and the `builtin` port driver. As mentioned in [the documentation](https://docs.docker.com/engine/security/rootless/#networking-errors), this combination doesn't provide "Source IP propagation". This means that Apache and Nextcloud will see all connections as coming from the docker gateway (e.g 172.19.0.1), which can lead to the Nextcloud brute force protection blocking all connection attempts. To expose the correct source IP, you will need to configure docker to also use `slirp4netns` as the port driver (see also [this guide](https://rootlesscontaine.rs/getting-started/docker/#changing-the-port-forwarder)).
@@ -29,9 +30,10 @@ As stated in the documentation, this change will likely lead to decreased networ
with the following content:
```
[Service]
Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_NET=slirp4netns"
Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns"
```
* Restart the docker daemon
```
systemctl --user restart docker
```
```

View File

@@ -1,5 +1,12 @@
# Local instance
It is possible due to several reasons that you do not want or cannot open Nextcloud to the public internet. However AIO requires a valid certificate to work correctly. Below is discussed how you can achieve both: Having a valid certificate for Nextcloud and only using it locally.
It is possible due to several reasons that you do not want or cannot open Nextcloud to the public internet. Perhaps you were hoping to access AIO directly from an `ip.add.r.ess` (unsupported) or without a valid domain. However, AIO requires a valid certificate to work correctly. Below is discussed how you can achieve both: Having a valid certificate for Nextcloud and only using it locally.
### Content
- [1. The recommended way](#1-the-recommended-way)
- [2. Use the ACME DNS-challenge](#2-use-the-acme-dns-challenge)
- [3. Use Cloudflare](#3-use-cloudflare)
- [4. Buy a certificate and use that](#4-buy-a-certificate-and-use-that)
- [5. Tailscale network](#5-tailscale-network)
## 1. The recommended way
The recommended way is the following:
@@ -9,6 +16,8 @@ The recommended way is the following:
1. Enter the ip-address of your local dns-server in the daemon.json file for docker so that you are sure that all docker containers use the correct local dns-server.
1. Now, entering the domain in the AIO-interface should work as expected and should allow you to continue with the setup
**Hint:** You may have a look at [this video](https://youtu.be/zk-y2wVkY4c) for a more complete but possibly outdated example.
## 2. Use the ACME DNS-challenge
You can alternatively use the ACME DNS-challenge to get a valid certificate for Nextcloud. Here is described how to set it up: https://github.com/nextcloud/all-in-one#how-to-get-nextcloud-running-using-the-acme-dns-challenge
@@ -17,3 +26,6 @@ If you do not have any control over the network, you may think about using Cloud
## 4. Buy a certificate and use that
If none of the above ways work for you, you may simply buy a certificate from an issuer for your domain. You then download the certificate onto your server, configure AIO in [reverse proxy mode](./reverse-proxy.md) and use the certificate for your domain in your reverse proxy config.
## 5. Tailscale network
For a reverse proxy example guide for Tailscale, see this guide by @flll: https://github.com/nextcloud/all-in-one/discussions/5439

View File

@@ -20,20 +20,21 @@ services:
condition: service_started
required: false
image: nextcloud/aio-apache:latest
user: "33"
init: true
ports:
- ${APACHE_IP_BINDING}:${APACHE_PORT}:${APACHE_PORT}/tcp
- ${APACHE_IP_BINDING}:${APACHE_PORT}:${APACHE_PORT}/udp
environment:
- NC_DOMAIN=${NC_DOMAIN}
- NC_DOMAIN
- NEXTCLOUD_HOST=nextcloud-aio-nextcloud
- APACHE_HOST=nextcloud-aio-apache
- COLLABORA_HOST=nextcloud-aio-collabora
- TALK_HOST=nextcloud-aio-talk
- APACHE_PORT=${APACHE_PORT}
- APACHE_PORT
- ONLYOFFICE_HOST=nextcloud-aio-onlyoffice
- TZ=${TIMEZONE}
- APACHE_MAX_SIZE=${APACHE_MAX_SIZE}
- APACHE_MAX_SIZE
- APACHE_MAX_TIME=${NEXTCLOUD_MAX_TIME}
- NOTIFY_PUSH_HOST=nextcloud-aio-notify-push
- WHITEBOARD_HOST=nextcloud-aio-whiteboard
@@ -41,8 +42,6 @@ services:
- nextcloud_aio_nextcloud:/var/www/html:ro
- nextcloud_aio_apache:/mnt/data:rw
restart: unless-stopped
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /var/log/supervisord
@@ -55,6 +54,7 @@ services:
nextcloud-aio-database:
image: nextcloud/aio-postgresql:latest
user: "999"
init: true
expose:
- "5432"
@@ -70,8 +70,6 @@ services:
stop_grace_period: 1800s
restart: unless-stopped
shm_size: 268435456
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /var/run/postgresql
@@ -116,64 +114,63 @@ services:
- POSTGRES_USER=nextcloud
- REDIS_HOST=nextcloud-aio-redis
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
- NC_DOMAIN=${NC_DOMAIN}
- NC_DOMAIN
- ADMIN_USER=admin
- ADMIN_PASSWORD=${NEXTCLOUD_PASSWORD}
- NEXTCLOUD_DATA_DIR=/mnt/ncdata
- OVERWRITEHOST=${NC_DOMAIN}
- OVERWRITEPROTOCOL=https
- TURN_SECRET=${TURN_SECRET}
- SIGNALING_SECRET=${SIGNALING_SECRET}
- ONLYOFFICE_SECRET=${ONLYOFFICE_SECRET}
- NEXTCLOUD_MOUNT=${NEXTCLOUD_MOUNT}
- CLAMAV_ENABLED=${CLAMAV_ENABLED}
- TURN_SECRET
- SIGNALING_SECRET
- ONLYOFFICE_SECRET
- NEXTCLOUD_MOUNT
- CLAMAV_ENABLED
- CLAMAV_HOST=nextcloud-aio-clamav
- ONLYOFFICE_ENABLED=${ONLYOFFICE_ENABLED}
- COLLABORA_ENABLED=${COLLABORA_ENABLED}
- ONLYOFFICE_ENABLED
- COLLABORA_ENABLED
- COLLABORA_HOST=nextcloud-aio-collabora
- TALK_ENABLED=${TALK_ENABLED}
- TALK_ENABLED
- ONLYOFFICE_HOST=nextcloud-aio-onlyoffice
- UPDATE_NEXTCLOUD_APPS=${UPDATE_NEXTCLOUD_APPS}
- UPDATE_NEXTCLOUD_APPS
- TZ=${TIMEZONE}
- TALK_PORT=${TALK_PORT}
- IMAGINARY_ENABLED=${IMAGINARY_ENABLED}
- TALK_PORT
- IMAGINARY_ENABLED
- IMAGINARY_HOST=nextcloud-aio-imaginary
- CLAMAV_MAX_SIZE=${APACHE_MAX_SIZE}
- PHP_UPLOAD_LIMIT=${NEXTCLOUD_UPLOAD_LIMIT}
- PHP_MEMORY_LIMIT=${NEXTCLOUD_MEMORY_LIMIT}
- FULLTEXTSEARCH_ENABLED=${FULLTEXTSEARCH_ENABLED}
- FULLTEXTSEARCH_ENABLED
- FULLTEXTSEARCH_HOST=nextcloud-aio-fulltextsearch
- PHP_MAX_TIME=${NEXTCLOUD_MAX_TIME}
- TRUSTED_CACERTS_DIR=${NEXTCLOUD_TRUSTED_CACERTS_DIR}
- STARTUP_APPS=${NEXTCLOUD_STARTUP_APPS}
- ADDITIONAL_APKS=${NEXTCLOUD_ADDITIONAL_APKS}
- ADDITIONAL_PHP_EXTENSIONS=${NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS}
- INSTALL_LATEST_MAJOR=${INSTALL_LATEST_MAJOR}
- TALK_RECORDING_ENABLED=${TALK_RECORDING_ENABLED}
- RECORDING_SECRET=${RECORDING_SECRET}
- INSTALL_LATEST_MAJOR
- TALK_RECORDING_ENABLED
- RECORDING_SECRET
- TALK_RECORDING_HOST=nextcloud-aio-talk-recording
- FULLTEXTSEARCH_PASSWORD=${FULLTEXTSEARCH_PASSWORD}
- REMOVE_DISABLED_APPS=${REMOVE_DISABLED_APPS}
- APACHE_PORT=${APACHE_PORT}
- IMAGINARY_SECRET=${IMAGINARY_SECRET}
- WHITEBOARD_SECRET=${WHITEBOARD_SECRET}
- WHITEBOARD_ENABLED=${WHITEBOARD_ENABLED}
- FULLTEXTSEARCH_PASSWORD
- REMOVE_DISABLED_APPS
- APACHE_PORT
- IMAGINARY_SECRET
- WHITEBOARD_SECRET
- WHITEBOARD_ENABLED
stop_grace_period: 600s
restart: unless-stopped
networks:
- nextcloud-aio
cap_drop:
- NET_RAW
nextcloud-aio-notify-push:
image: nextcloud/aio-notify-push:latest
user: "33"
init: true
expose:
- "7867"
volumes:
- nextcloud_aio_nextcloud:/nextcloud:ro
environment:
- NC_DOMAIN=${NC_DOMAIN}
- NC_DOMAIN
- NEXTCLOUD_HOST=nextcloud-aio-nextcloud
- REDIS_HOST=nextcloud-aio-redis
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
@@ -183,14 +180,13 @@ services:
- POSTGRES_DB=nextcloud_database
- POSTGRES_USER=nextcloud
restart: unless-stopped
networks:
- nextcloud-aio
read_only: true
cap_drop:
- NET_RAW
nextcloud-aio-redis:
image: nextcloud/aio-redis:latest
user: "999"
init: true
expose:
- "6379"
@@ -200,14 +196,13 @@ services:
volumes:
- nextcloud_aio_redis:/data:rw
restart: unless-stopped
networks:
- nextcloud-aio
read_only: true
cap_drop:
- NET_RAW
nextcloud-aio-collabora:
image: nextcloud/aio-collabora:latest
user: "100"
init: true
expose:
- "9980"
@@ -221,8 +216,6 @@ services:
restart: unless-stopped
profiles:
- collabora
networks:
- nextcloud-aio
cap_add:
- MKNOD
- SYS_ADMIN
@@ -231,6 +224,7 @@ services:
nextcloud-aio-talk:
image: nextcloud/aio-talk:latest
user: "1000"
init: true
ports:
- ${TALK_PORT}:${TALK_PORT}/tcp
@@ -238,19 +232,17 @@ services:
expose:
- "8081"
environment:
- NC_DOMAIN=${NC_DOMAIN}
- NC_DOMAIN
- TALK_HOST=nextcloud-aio-talk
- TURN_SECRET=${TURN_SECRET}
- SIGNALING_SECRET=${SIGNALING_SECRET}
- TURN_SECRET
- SIGNALING_SECRET
- TZ=${TIMEZONE}
- TALK_PORT=${TALK_PORT}
- TALK_PORT
- INTERNAL_SECRET=${TALK_INTERNAL_SECRET}
restart: unless-stopped
profiles:
- talk
- talk-recording
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /var/log/supervisord
@@ -263,20 +255,19 @@ services:
nextcloud-aio-talk-recording:
image: nextcloud/aio-talk-recording:latest
user: "122"
init: true
expose:
- "1234"
environment:
- NC_DOMAIN=${NC_DOMAIN}
- NC_DOMAIN
- TZ=${TIMEZONE}
- RECORDING_SECRET=${RECORDING_SECRET}
- RECORDING_SECRET
- INTERNAL_SECRET=${TALK_INTERNAL_SECRET}
shm_size: 2147483648
restart: unless-stopped
profiles:
- talk-recording
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /tmp
@@ -286,6 +277,7 @@ services:
nextcloud-aio-clamav:
image: nextcloud/aio-clamav:latest
user: "100"
init: false
expose:
- "3310"
@@ -298,8 +290,6 @@ services:
restart: unless-stopped
profiles:
- clamav
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /var/lock
@@ -323,19 +313,18 @@ services:
restart: unless-stopped
profiles:
- onlyoffice
networks:
- nextcloud-aio
cap_drop:
- NET_RAW
nextcloud-aio-imaginary:
image: nextcloud/aio-imaginary:latest
user: "65534"
init: true
expose:
- "9000"
environment:
- TZ=${TIMEZONE}
- IMAGINARY_SECRET=${IMAGINARY_SECRET}
- IMAGINARY_SECRET
restart: unless-stopped
cap_add:
- SYS_NICE
@@ -343,8 +332,6 @@ services:
- NET_RAW
profiles:
- imaginary
networks:
- nextcloud-aio
read_only: true
tmpfs:
- /tmp
@@ -364,19 +351,18 @@ services:
- http.port=9200
- xpack.license.self_generated.type=basic
- xpack.security.enabled=false
- FULLTEXTSEARCH_PASSWORD=${FULLTEXTSEARCH_PASSWORD}
- FULLTEXTSEARCH_PASSWORD
volumes:
- nextcloud_aio_elasticsearch:/usr/share/elasticsearch/data:rw
restart: unless-stopped
profiles:
- fulltextsearch
networks:
- nextcloud-aio
cap_drop:
- NET_RAW
nextcloud-aio-whiteboard:
image: nextcloud/aio-whiteboard:latest
user: "65534"
init: true
expose:
- "3002"
@@ -391,8 +377,6 @@ services:
profiles:
- whiteboard
read_only: true
networks:
- nextcloud-aio
cap_drop:
- NET_RAW
@@ -417,5 +401,5 @@ volumes:
name: nextcloud_aio_nextcloud_data
networks:
nextcloud-aio:
name: nextcloud-aio
default:
driver: bridge

View File

@@ -1,6 +1,6 @@
#!/bin/bash
#!/bin/bash -ex
set -ex
type {jq,sudo} || { echo "Commands not found. Please install them"; exit 127; }
jq -c . ./php/containers.json > /tmp/containers.json
sed -i 's|aio_services_v1|services|g' /tmp/containers.json
@@ -18,6 +18,8 @@ OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].devices)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].backup_volumes)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].nextcloud_exec_commands)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].image_tag)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].networks)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[].documentation)')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-watchtower"))')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-domaincheck"))')"
OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "nextcloud-aio-borgbackup"))')"
@@ -25,7 +27,7 @@ OUTPUT="$(echo "$OUTPUT" | jq 'del(.services[] | select(.container_name == "next
OUTPUT="$(echo "$OUTPUT" | jq '.services[] |= if has("depends_on") then .depends_on |= if contains(["nextcloud-aio-docker-socket-proxy"]) then del(.[index("nextcloud-aio-docker-socket-proxy")]) else . end else . end')"
OUTPUT="$(echo "$OUTPUT" | jq '.services[] |= if has("depends_on") then .depends_on |= map({ (.): { "condition": "service_started", "required": false } }) else . end' | jq '.services[] |= if has("depends_on") then .depends_on |= reduce .[] as $item ({}; . + $item) else . end')"
snap install yq
sudo snap install yq
mkdir -p ./manual-install
echo "$OUTPUT" | yq -P > ./manual-install/containers.yml
@@ -139,13 +141,12 @@ done
cat << NETWORK >> containers.yml
networks:
nextcloud-aio:
name: nextcloud-aio
default:
driver: bridge
NETWORK
cat containers.yml > latest.yml
mv containers.yml latest.yml
sed -i "/image:/s/$/:latest/" latest.yml
rm containers.yml
sed -i 's/\( *- \(\w*\)\)=\${\2\}/\1/' latest.yml
set +ex

View File

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

View File

@@ -25,7 +25,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -64,7 +64,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-apache:20240925_080419"
image: "nextcloud/aio-apache:20241106_101604"
name: nextcloud-aio-apache
ports:
- containerPort: {{ .Values.APACHE_PORT }}
@@ -72,9 +72,12 @@ spec:
- containerPort: {{ .Values.APACHE_PORT }}
protocol: UDP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 33
volumeMounts:
- mountPath: /var/www/html
name: nextcloud-aio-nextcloud

View File

@@ -26,7 +26,7 @@ spec:
spec:
initContainers:
- name: init-subpath
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- mkdir
- "-p"
@@ -36,7 +36,7 @@ spec:
- name: nextcloud-aio-clamav
mountPath: /nextcloud-aio-clamav
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chown
- 100:100
@@ -53,15 +53,18 @@ spec:
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-clamav:20240925_080419"
image: "nextcloud/aio-clamav:20241106_101604"
name: nextcloud-aio-clamav
ports:
- containerPort: 3310
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 100
volumeMounts:
- mountPath: /var/lib/clamav
subPath: data

View File

@@ -36,16 +36,19 @@ spec:
value: --o:ssl.enable=false --o:ssl.termination=true --o:mount_jail_tree=false --o:logging.level=warning --o:home_mode.enable=true {{ .Values.COLLABORA_SECCOMP_POLICY }} --o:remote_font_config.url=https://{{ .Values.NC_DOMAIN }}/apps/richdocuments/settings/fonts.json
- name: server_name
value: "{{ .Values.NC_DOMAIN }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-collabora:20240925_080419"
image: "nextcloud/aio-collabora:20241106_101604"
name: nextcloud-aio-collabora
ports:
- containerPort: 9980
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
add:
- MKNOD
- SYS_ADMIN
drop:
- NET_RAW
runAsUser: 100
{{- end }}

View File

@@ -25,7 +25,7 @@ spec:
spec:
initContainers:
- name: init-subpath
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- mkdir
- "-p"
@@ -38,7 +38,7 @@ spec:
- name: nextcloud-aio-database
mountPath: /nextcloud-aio-database
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chown
- 999:999
@@ -62,15 +62,18 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-postgresql:20240925_080419"
image: "nextcloud/aio-postgresql:20241106_101604"
name: nextcloud-aio-database
ports:
- containerPort: 5432
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 999
volumeMounts:
- mountPath: /var/lib/postgresql/data
subPath: data

View File

@@ -26,7 +26,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -56,12 +56,14 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-fulltextsearch:20240925_080419"
image: "nextcloud/aio-fulltextsearch:20241106_101604"
name: nextcloud-aio-fulltextsearch
ports:
- containerPort: 9200
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW

View File

@@ -28,15 +28,18 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-imaginary:20240925_080419"
image: "nextcloud/aio-imaginary:20241106_101604"
name: nextcloud-aio-imaginary
ports:
- containerPort: 9000
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
add:
- SYS_NICE
drop:
- NET_RAW
runAsUser: 65534
{{- end }}

View File

@@ -15,6 +15,22 @@ spec:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
- {} # Allows all egress traffic
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
namespace: "{{ .Values.NAMESPACE }}"
name: nextcloud-aio-webserver-allow
spec:
podSelector:
matchExpressions:
- key: io.kompose.service
operator: In
values:
- nextcloud-aio-apache
policyTypes:
- Ingress
ingress:
- {} # Allows all ingress traffic
{{- end }}

View File

@@ -25,7 +25,7 @@ spec:
spec:
initContainers:
- name: "delete-lost-found"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- rm
- "-rf"
@@ -36,7 +36,7 @@ spec:
- name: nextcloud-aio-nextcloud
mountPath: /nextcloud-aio-nextcloud
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -173,7 +173,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-nextcloud:20240925_080419"
image: "nextcloud/aio-nextcloud:20241106_101604"
name: nextcloud-aio-nextcloud
ports:
- containerPort: 9000

View File

@@ -25,7 +25,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -53,15 +53,18 @@ spec:
value: nextcloud-aio-redis
- name: REDIS_HOST_PASSWORD
value: "{{ .Values.REDIS_PASSWORD }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-notify-push:20240925_080419"
image: "nextcloud/aio-notify-push:20241106_101604"
name: nextcloud-aio-notify-push
ports:
- containerPort: 7867
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 33
volumeMounts:
- mountPath: /nextcloud
name: nextcloud-aio-nextcloud

View File

@@ -26,7 +26,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -44,7 +44,7 @@ spec:
value: "{{ .Values.ONLYOFFICE_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-onlyoffice:20240925_080419"
image: "nextcloud/aio-onlyoffice:20241106_101604"
name: nextcloud-aio-onlyoffice
ports:
- containerPort: 80

View File

@@ -25,7 +25,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -39,15 +39,18 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-redis:20240925_080419"
image: "nextcloud/aio-redis:20241106_101604"
name: nextcloud-aio-redis
ports:
- containerPort: 6379
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 999
volumeMounts:
- mountPath: /data
name: nextcloud-aio-redis

View File

@@ -42,7 +42,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-talk:20240925_080419"
image: "nextcloud/aio-talk:20241106_101604"
name: nextcloud-aio-talk
ports:
- containerPort: {{ .Values.TALK_PORT }}
@@ -52,7 +52,10 @@ spec:
- containerPort: 8081
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 1000
{{- end }}

View File

@@ -32,13 +32,16 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-talk-recording:20240925_080419"
image: "nextcloud/aio-talk-recording:20241106_101604"
name: nextcloud-aio-talk-recording
ports:
- containerPort: 1234
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 122
{{- end }}

View File

@@ -36,13 +36,16 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/aio-whiteboard:20240925_080419"
image: "nextcloud/aio-whiteboard:20241106_101604"
name: nextcloud-aio-whiteboard
ports:
- containerPort: 3002
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
capabilities:
drop:
- NET_RAW
runAsUser: 65534
{{- end }}

View File

@@ -1,9 +1,11 @@
#!/bin/bash
[ -z "$1" ] && { echo "Error: Docker tag is not specified. Usage: ./nextcloud-aio-helm-chart/update-helm.sh <Docker tag>"; exit 2; }
DOCKER_TAG="$1"
# The logic needs the files in ./helm-chart
mv ./nextcloud-aio-helm-chart ./helm-chart
cp -r ./nextcloud-aio-helm-chart ./helm-chart
# Clean
rm -f ./helm-chart/values.yaml
@@ -15,13 +17,15 @@ chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose
# Install yq
snap install yq
sudo snap install yq
set -ex
# Conversion of docker-compose
cd manual-install
cp latest.yml latest.yml.backup
sed -i -E '/^( *- )(NET_RAW|SYS_NICE|MKNOD|SYS_ADMIN)$/!s/( *- )([A-Z_]+)$/\1\2=${\2}/' latest.yml
cp sample.conf /tmp/
sed -i 's|^|export |' /tmp/sample.conf
# shellcheck disable=SC1091
@@ -41,8 +45,7 @@ sed -i "/NEXTCLOUD_DATADIR/d" latest.yml
sed -i "/\${NEXTCLOUD_MOUNT}/d" latest.yml
sed -i "/^volumes:/a\ \ nextcloud_aio_nextcloud_trusted_cacerts:\n \ \ \ \ name: nextcloud_aio_nextcloud_trusted_cacerts" latest.yml
sed -i "s|\${NEXTCLOUD_TRUSTED_CACERTS_DIR}:|nextcloud_aio_nextcloud_trusted_cacerts:|g#" latest.yml
sed -i 's|\${|{{ .Values.|g' latest.yml
sed -i 's|}| }}|g' latest.yml
sed -i 's/\${/{{ .Values./g; s/}/ }}/g' latest.yml
yq -i 'del(.services.[].profiles)' latest.yml
# Delete read_only and tmpfs setting while https://github.com/kubernetes/kubernetes/issues/48912 is not fixed
yq -i 'del(.services.[].read_only)' latest.yml
@@ -59,7 +62,7 @@ find ./ -name '*networkpolicy.yaml' -exec sed -i "s|manual-install-nextcloud-aio
cat << EOL > /tmp/initcontainers
initContainers:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -68,14 +71,14 @@ EOL
cat << EOL > /tmp/initcontainers.database
initContainers:
- name: init-subpath
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- mkdir
- "-p"
- /nextcloud-aio-database/data
volumeMountsInitContainer:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chown
- 999:999
@@ -85,14 +88,14 @@ EOL
cat << EOL > /tmp/initcontainers.clamav
initContainers:
- name: init-subpath
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- mkdir
- "-p"
- /nextcloud-aio-clamav/data
volumeMountsInitContainer:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chown
- 100:100
@@ -102,14 +105,14 @@ EOL
cat << EOL > /tmp/initcontainers.nextcloud
initContainers:
- name: "delete-lost-found"
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- rm
- "-rf"
- "/nextcloud-aio-nextcloud/lost+found"
volumeMountsInitRmLostFound:
- name: init-volumes
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
image: "alpine:3.20"
command:
- chmod
- "777"
@@ -286,9 +289,6 @@ EOL
# shellcheck disable=SC1083
find ./ -name '*talk-deployment.yaml' -exec sed -i "/^.*\- env:/r /tmp/additional-talk.config" \{} \;
# shellcheck disable=SC1083
find ./ -name '*deployment.yaml' -exec sed -i '/image: nextcloud/s/$/"/;s|image: nextcloud/|image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.NEXTCLOUD_IMAGE_ORG }}/|;' \{} \;
cat << EOL > templates/nextcloud-aio-networkpolicy.yaml
{{- if eq .Values.NETWORK_POLICY_ENABLED "yes" }}
# https://github.com/ahmetb/kubernetes-network-policy-recipes/blob/master/04-deny-traffic-from-other-namespaces.md
@@ -307,8 +307,24 @@ spec:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
- {} # Allows all egress traffic
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
namespace: "{{ .Values.NAMESPACE }}"
name: nextcloud-aio-webserver-allow
spec:
podSelector:
matchExpressions:
- key: io.kompose.service
operator: In
values:
- nextcloud-aio-apache
policyTypes:
- Ingress
ingress:
- {} # Allows all ingress traffic
{{- end }}
EOL
@@ -352,7 +368,7 @@ cat << ADDITIONAL_CONFIG >> /tmp/sample.conf
NAMESPACE: default # By changing this, you can adjust the namespace of the installation which allows to install multiple instances on one kubernetes cluster
NAMESPACE_DISABLED: "no" # By setting this to "yes", you can disabled the creation of the namespace so that you can use a pre-created one
NETWORK_POLICY_ENABLED: "no" # By setting this to "yes", you can enable a network policy that limits network access to the same namespace. ⚠️ Attention: this breaks if you use an ingress!!! So it should be disabled if you do so!
NETWORK_POLICY_ENABLED: "no" # By setting this to "yes", you can enable a network policy that limits network access to the same namespace. Except the Web server service which is reachable from all endpoints.
SUBSCRIPTION_KEY: # This allows to set the Nextcloud Enterprise key via ENV
SERVERINFO_TOKEN: # This allows to set the serverinfo app token for monitoring your Nextcloud via the serverinfo app
APPS_ALLOWLIST: # This allows to configure allowed apps that will be shown in Nextcloud's Appstore. You need to enter the app-IDs of the apps here and separate them with spaces. E.g. 'files richdocuments'
@@ -370,10 +386,6 @@ MAIL_FROM_ADDRESS: # (not set by default): Set the local-part for the 'f
MAIL_DOMAIN: # (not set by default): Set a different domain for the emails than the domain where Nextcloud is installed.
TALK_MAX_STREAM_BITRATE: "1048576" # This allows to adjust the max stream bitrate of the talk hpb
TALK_MAX_SCREEN_BITRATE: "2097152" # This allows to adjust the max stream bitrate of the talk hpb
IMAGE_MIRROR_PREFIX: # Setting this allows you to pull Nextcloud images through a mirror registry. It needs a trailing slash!
NEXTCLOUD_IMAGE_ORG: nextcloud # Setting this allows you to change the image's org name in case a different image needs to be used e.g. for compliance reasons.
ALPINE_IMAGE_ORG: # Setting this allows you to change the image's org name in case a different image needs to be used e.g. for compliance reasons. It needs a trailing slash!
ADDITIONAL_CONFIG
mv /tmp/sample.conf ../helm-chart/values.yaml
@@ -404,6 +416,13 @@ find ./ -name "*nextcloud-aio-elasticsearch-persistentvolumeclaim.yaml" -exec se
# shellcheck disable=SC1083
find ./ -name "*nextcloud-aio-elasticsearch-persistentvolumeclaim.yaml" -exec sed -i "$ a {{- end }}" \{} \;
cat << EOL >> /tmp/security.conf
allowPrivilegeEscalation: false
runAsNonRoot: true
EOL
# shellcheck disable=SC1083
find ./ \( -not -name '*nextcloud-deployment.yaml*' -not -name '*onlyoffice-deployment.yaml*' -name "*deployment.yaml" \) -exec sed -i "/^.*securityContext:$/r /tmp/security.conf" \{} \;
chmod 777 -R ./
# Seems like the dir needs to match the name of the chart

View File

@@ -51,7 +51,7 @@ REDIS_STORAGE_SIZE: 1Gi # You can change the size of the redis volume that
NAMESPACE: default # By changing this, you can adjust the namespace of the installation which allows to install multiple instances on one kubernetes cluster
NAMESPACE_DISABLED: "no" # By setting this to "yes", you can disabled the creation of the namespace so that you can use a pre-created one
NETWORK_POLICY_ENABLED: "no" # By setting this to "yes", you can enable a network policy that limits network access to the same namespace. ⚠️ Attention: this breaks if you use an ingress!!! So it should be disabled if you do so!
NETWORK_POLICY_ENABLED: "no" # By setting this to "yes", you can enable a network policy that limits network access to the same namespace. Except the Web server service which is reachable from all endpoints.
SUBSCRIPTION_KEY: # This allows to set the Nextcloud Enterprise key via ENV
SERVERINFO_TOKEN: # This allows to set the serverinfo app token for monitoring your Nextcloud via the serverinfo app
APPS_ALLOWLIST: # This allows to configure allowed apps that will be shown in Nextcloud's Appstore. You need to enter the app-IDs of the apps here and separate them with spaces. E.g. 'files richdocuments'
@@ -69,7 +69,3 @@ MAIL_FROM_ADDRESS: # (not set by default): Set the local-part for the 'f
MAIL_DOMAIN: # (not set by default): Set a different domain for the emails than the domain where Nextcloud is installed.
TALK_MAX_STREAM_BITRATE: "1048576" # This allows to adjust the max stream bitrate of the talk hpb
TALK_MAX_SCREEN_BITRATE: "2097152" # This allows to adjust the max stream bitrate of the talk hpb
IMAGE_MIRROR_PREFIX: # Setting this allows you to pull Nextcloud images through a mirror registry. It needs a trailing slash!
NEXTCLOUD_IMAGE_ORG: nextcloud # Setting this allows you to change the image's org name in case a different image needs to be used e.g. for compliance reasons.
ALPINE_IMAGE_ORG: # Setting this allows you to change the image's org name in case a different image needs to be used e.g. for compliance reasons. It needs a trailing slash!

View File

@@ -33,6 +33,7 @@ docker run \
--rm \
--name nextcloud-aio-mastercontainer \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock \
nextcloud/all-in-one:latest
```
@@ -55,6 +56,7 @@ Note: You can restart the server by preceding the command with other environment
|-----------------------------------------|----------------------------------------|
| `composer run dev` | Starts the development server |
| `composer run psalm` | Run Psalm static analysis |
| `composer run psalm:strict` | Run Psalm static analysis strict |
| `composer run psalm:update-baseline` | Run Psalm with `--update-baseline` arg |
| `composer run lint` | Run PHP Syntax check |
| `composer run lint:twig` | Run Twig Syntax check |

View File

@@ -1,35 +1,36 @@
{
"autoload": {
"psr-4": {
"AIO\\": ["src/"]
}
},
"require": {
"php": "8.3.*",
"ext-json": "*",
"ext-sodium": "*",
"ext-curl": "*",
"slim/slim": "^4.11",
"php-di/slim-bridge": "^3.3",
"guzzlehttp/guzzle": "^7.5",
"guzzlehttp/psr7": "^2.4",
"http-interop/http-factory-guzzle": "^1.2",
"slim/twig-view": "^3.3",
"slim/csrf": "^1.3",
"ext-apcu": "*"
},
"require-dev": {
"sserbin/twig-linter": "@dev",
"vimeo/psalm": "^5.25",
"wapmorgan/php-deprecation-detector": "dev-master"
},
"scripts": {
"dev": [
"Composer\\Config::disableProcessTimeout",
"php -S localhost:8080 -t public"
],
"autoload": {
"psr-4": {
"AIO\\": ["src/"]
}
},
"require": {
"php": "8.3.*",
"ext-json": "*",
"ext-sodium": "*",
"ext-curl": "*",
"slim/slim": "^4.11",
"php-di/slim-bridge": "^3.3",
"guzzlehttp/guzzle": "^7.5",
"guzzlehttp/psr7": "^2.4",
"http-interop/http-factory-guzzle": "^1.2",
"slim/twig-view": "^3.3",
"slim/csrf": "^1.3",
"ext-apcu": "*"
},
"require-dev": {
"sserbin/twig-linter": "@dev",
"vimeo/psalm": "^5.25",
"wapmorgan/php-deprecation-detector": "dev-master"
},
"scripts": {
"dev": [
"Composer\\Config::disableProcessTimeout",
"php -S localhost:8080 -t public"
],
"psalm": "psalm --threads=1",
"psalm:update-baseline": "psalm --threads=1 --monochrome --no-progress --output-format=text --update-baseline",
"psalm:strict": "psalm --threads=1 --show-info=true",
"lint": "php -l src/*.php src/**/*.php public/index.php",
"lint:twig": "twig-linter lint ./templates",
"php-deprecation-detector": "phpdd scan -n -t 8.3 src/*.php src/**/*.php public/index.php"

182
php/composer.lock generated
View File

@@ -134,16 +134,16 @@
},
{
"name": "guzzlehttp/promises",
"version": "2.0.3",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
"reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": ""
},
"require": {
@@ -197,7 +197,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.3"
"source": "https://github.com/guzzle/promises/tree/2.0.4"
},
"funding": [
{
@@ -213,7 +213,7 @@
"type": "tidelift"
}
],
"time": "2024-07-18T10:29:17+00:00"
"time": "2024-10-17T10:06:22+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -391,16 +391,16 @@
},
{
"name": "laravel/serializable-closure",
"version": "v1.3.4",
"version": "v1.3.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
"reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81"
"reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81",
"reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
"reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
"shasum": ""
},
"require": {
@@ -448,7 +448,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
"time": "2024-08-02T07:48:17+00:00"
"time": "2024-09-23T13:33:08+00:00"
},
{
"name": "nikic/fast-route",
@@ -1265,16 +1265,16 @@
},
{
"name": "slim/twig-view",
"version": "3.4.0",
"version": "3.4.1",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Twig-View.git",
"reference": "1b351536b9a07ed90a3563ee9d71a987c5d74610"
"reference": "b4268d87d0e327feba5f88d32031e9123655b909"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slimphp/Twig-View/zipball/1b351536b9a07ed90a3563ee9d71a987c5d74610",
"reference": "1b351536b9a07ed90a3563ee9d71a987c5d74610",
"url": "https://api.github.com/repos/slimphp/Twig-View/zipball/b4268d87d0e327feba5f88d32031e9123655b909",
"reference": "b4268d87d0e327feba5f88d32031e9123655b909",
"shasum": ""
},
"require": {
@@ -1282,12 +1282,12 @@
"psr/http-message": "^1.1 || ^2.0",
"slim/slim": "^4.12",
"symfony/polyfill-php81": "^1.29",
"twig/twig": "^3.8"
"twig/twig": "^3.11"
},
"require-dev": {
"phpspec/prophecy-phpunit": "^2.0",
"phpstan/phpstan": "^1.10.59",
"phpunit/phpunit": "^9.6",
"phpunit/phpunit": "^9.6 || ^10",
"psr/http-factory": "^1.0",
"squizlabs/php_codesniffer": "^3.9"
},
@@ -1324,9 +1324,9 @@
],
"support": {
"issues": "https://github.com/slimphp/Twig-View/issues",
"source": "https://github.com/slimphp/Twig-View/tree/3.4.0"
"source": "https://github.com/slimphp/Twig-View/tree/3.4.1"
},
"time": "2024-04-28T20:36:39+00:00"
"time": "2024-09-26T05:42:02+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1632,16 +1632,16 @@
},
{
"name": "twig/twig",
"version": "v3.14.0",
"version": "v3.14.2",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72"
"reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a",
"reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a",
"shasum": ""
},
"require": {
@@ -1695,7 +1695,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.14.0"
"source": "https://github.com/twigphp/Twig/tree/v3.14.2"
},
"funding": [
{
@@ -1707,7 +1707,7 @@
"type": "tidelift"
}
],
"time": "2024-09-09T17:55:12+00:00"
"time": "2024-11-07T12:36:22+00:00"
}
],
"packages-dev": [
@@ -2301,16 +2301,16 @@
},
{
"name": "felixfbecker/language-server-protocol",
"version": "v1.5.2",
"version": "v1.5.3",
"source": {
"type": "git",
"url": "https://github.com/felixfbecker/php-language-server-protocol.git",
"reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
"reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
"reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
"url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9",
"reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9",
"shasum": ""
},
"require": {
@@ -2351,9 +2351,9 @@
],
"support": {
"issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
"source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
"source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3"
},
"time": "2022-03-02T22:36:06+00:00"
"time": "2024-04-30T00:40:11+00:00"
},
{
"name": "fidry/cpu-core-counter",
@@ -2469,16 +2469,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.19.2",
"version": "v4.19.4",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "0ed4c8949a32986043e977dbe14776c14d644c45"
"reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45",
"reference": "0ed4c8949a32986043e977dbe14776c14d644c45",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2",
"reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2",
"shasum": ""
},
"require": {
@@ -2487,7 +2487,7 @@
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
@@ -2519,9 +2519,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4"
},
"time": "2024-09-17T19:36:00+00:00"
"time": "2024-09-29T15:01:53+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -2578,16 +2578,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.4.1",
"version": "5.6.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c"
"reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c",
"reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c",
"reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c",
"shasum": ""
},
"require": {
@@ -2596,17 +2596,17 @@
"php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.7",
"phpstan/phpdoc-parser": "^1.7",
"phpstan/phpdoc-parser": "^1.7|^2.0",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.5",
"mockery/mockery": "~1.3.5 || ~1.6.0",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^9.5",
"vimeo/psalm": "^5.13"
"psalm/phar": "^5.26"
},
"type": "library",
"extra": {
@@ -2636,29 +2636,29 @@
"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/5.4.1"
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0"
},
"time": "2024-05-21T05:55:05+00:00"
"time": "2024-11-12T11:25:25+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.8.2",
"version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "153ae662783729388a584b4361f2545e4d841e3c"
"reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c",
"reference": "153ae662783729388a584b4361f2545e4d841e3c",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
"php": "^7.3 || ^8.0",
"phpdocumentor/reflection-common": "^2.0",
"phpstan/phpdoc-parser": "^1.13"
"phpstan/phpdoc-parser": "^1.18|^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
@@ -2694,36 +2694,36 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2"
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
},
"time": "2024-02-23T11:10:43+00:00"
"time": "2024-11-09T15:12:26+00:00"
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.31.0",
"version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "249f15fb843bf240cf058372dad29e100cee6c17"
"reference": "c00d78fb6b29658347f9d37ebe104bffadf36299"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/249f15fb843bf240cf058372dad29e100cee6c17",
"reference": "249f15fb843bf240cf058372dad29e100cee6c17",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299",
"reference": "c00d78fb6b29658347f9d37ebe104bffadf36299",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
"php": "^7.4 || ^8.0"
},
"require-dev": {
"doctrine/annotations": "^2.0",
"nikic/php-parser": "^4.15",
"nikic/php-parser": "^5.3.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.5",
"phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^1.0",
"phpunit/phpunit": "^9.5",
"phpstan/phpstan": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
"phpunit/phpunit": "^9.6",
"symfony/process": "^5.2"
},
"type": "library",
@@ -2741,9 +2741,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.31.0"
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0"
},
"time": "2024-09-22T11:32:18+00:00"
"time": "2024-10-13T11:29:49+00:00"
},
{
"name": "sebastian/diff",
@@ -2940,16 +2940,16 @@
},
{
"name": "symfony/console",
"version": "v6.4.12",
"version": "v6.4.14",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "72d080eb9edf80e36c19be61f72c98ed8273b765"
"reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765",
"reference": "72d080eb9edf80e36c19be61f72c98ed8273b765",
"url": "https://api.github.com/repos/symfony/console/zipball/897c2441ed4eec8a8a2c37b943427d24dba3f26b",
"reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b",
"shasum": ""
},
"require": {
@@ -3014,7 +3014,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.4.12"
"source": "https://github.com/symfony/console/tree/v6.4.14"
},
"funding": [
{
@@ -3030,20 +3030,20 @@
"type": "tidelift"
}
],
"time": "2024-09-20T08:15:52+00:00"
"time": "2024-11-05T15:34:40+00:00"
},
{
"name": "symfony/filesystem",
"version": "v7.1.5",
"version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a"
"reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a",
"reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4",
"reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4",
"shasum": ""
},
"require": {
@@ -3080,7 +3080,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v7.1.5"
"source": "https://github.com/symfony/filesystem/tree/v7.1.6"
},
"funding": [
{
@@ -3096,20 +3096,20 @@
"type": "tidelift"
}
],
"time": "2024-09-17T09:16:35+00:00"
"time": "2024-10-25T15:11:02+00:00"
},
{
"name": "symfony/finder",
"version": "v6.4.11",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453"
"reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
"reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
"url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958",
"reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958",
"shasum": ""
},
"require": {
@@ -3144,7 +3144,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v6.4.11"
"source": "https://github.com/symfony/finder/tree/v6.4.13"
},
"funding": [
{
@@ -3160,7 +3160,7 @@
"type": "tidelift"
}
],
"time": "2024-08-13T14:27:37+00:00"
"time": "2024-10-01T08:30:56+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
@@ -3406,16 +3406,16 @@
},
{
"name": "symfony/string",
"version": "v7.1.5",
"version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "d66f9c343fa894ec2037cc928381df90a7ad4306"
"reference": "61b72d66bf96c360a727ae6232df5ac83c71f626"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306",
"reference": "d66f9c343fa894ec2037cc928381df90a7ad4306",
"url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626",
"reference": "61b72d66bf96c360a727ae6232df5ac83c71f626",
"shasum": ""
},
"require": {
@@ -3473,7 +3473,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.1.5"
"source": "https://github.com/symfony/string/tree/v7.1.6"
},
"funding": [
{
@@ -3489,7 +3489,7 @@
"type": "tidelift"
}
],
"time": "2024-09-20T08:28:38+00:00"
"time": "2024-09-25T14:20:29+00:00"
},
{
"name": "vimeo/psalm",
@@ -3742,6 +3742,6 @@
"ext-curl": "*",
"ext-apcu": "*"
},
"platform-dev": [],
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

View File

@@ -68,6 +68,10 @@
"stop_grace_period": {
"type": "integer"
},
"user": {
"type": "string",
"pattern": "^[0-9]{1,6}$"
},
"ports": {
"type": "array",
"items": {

View File

@@ -13,6 +13,7 @@
],
"display_name": "Apache",
"image": "nextcloud/aio-apache",
"user": "33",
"init": true,
"ports": [
{
@@ -78,6 +79,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Database",
"image": "nextcloud/aio-postgresql",
"user": "999",
"init": true,
"expose": [
"5432"
@@ -251,6 +253,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Notify Push",
"image": "nextcloud/aio-notify-push",
"user": "33",
"init": true,
"expose": [
"7867"
@@ -292,6 +295,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Redis",
"image": "nextcloud/aio-redis",
"user": "999",
"init": true,
"expose": [
"6379"
@@ -325,8 +329,10 @@
{
"container_name": "nextcloud-aio-collabora",
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Collabora",
"image": "nextcloud/aio-collabora",
"user": "100",
"init": true,
"expose": [
"9980"
@@ -362,8 +368,10 @@
{
"container_name": "nextcloud-aio-talk",
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1358",
"display_name": "Talk",
"image": "nextcloud/aio-talk",
"user": "1000",
"init": true,
"ports": [
{
@@ -420,6 +428,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Talk Recording",
"image": "nextcloud/aio-talk-recording",
"user": "122",
"init": true,
"expose": [
"1234"
@@ -431,6 +440,13 @@
"RECORDING_SECRET=%RECORDING_SECRET%",
"INTERNAL_SECRET=%TALK_INTERNAL_SECRET%"
],
"volumes": [
{
"source": "nextcloud_aio_talk_recording",
"destination": "/tmp",
"writeable": true
}
],
"shm_size": 2147483648,
"secrets": [
"RECORDING_SECRET",
@@ -445,7 +461,6 @@
],
"read_only": true,
"tmpfs": [
"/tmp",
"/conf"
],
"cap_drop": [
@@ -458,9 +473,11 @@
"image": "nextcloud/aio-borgbackup",
"init": true,
"environment": [
"BORG_REMOTE_REPO=%BORGBACKUP_REMOTE_REPO%",
"BORG_PASSWORD=%BORGBACKUP_PASSWORD%",
"BORG_MODE=%BORGBACKUP_MODE%",
"SELECTED_RESTORE_TIME=%SELECTED_RESTORE_TIME%",
"RESTORE_EXCLUDE_PREVIEWS=%RESTORE_EXCLUDE_PREVIEWS%",
"BACKUP_RESTORE_PASSWORD=%BACKUP_RESTORE_PASSWORD%",
"ADDITIONAL_DIRECTORIES_BACKUP=%ADDITIONAL_DIRECTORIES_BACKUP%",
"BORGBACKUP_HOST_LOCATION=%BORGBACKUP_HOST_LOCATION%",
@@ -573,6 +590,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "ClamAV",
"image": "nextcloud/aio-clamav",
"user": "100",
"init": false,
"expose": [
"3310"
@@ -653,6 +671,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Imaginary",
"image": "nextcloud/aio-imaginary",
"user": "65534",
"init": true,
"expose": [
"9000"
@@ -686,6 +705,7 @@
{
"container_name": "nextcloud-aio-fulltextsearch",
"image_tag": "%AIO_CHANNEL%",
"documentation": "https://github.com/nextcloud/all-in-one/discussions/1709",
"display_name": "Fulltextsearch",
"image": "nextcloud/aio-fulltextsearch",
"init": false,
@@ -757,6 +777,7 @@
"image_tag": "%AIO_CHANNEL%",
"display_name": "Whiteboard",
"image": "nextcloud/aio-whiteboard",
"user": "65534",
"init": true,
"expose": [
"3002"

View File

@@ -1,17 +1,22 @@
<?xml version="1.0"?>
<psalm
errorLevel="2"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config"
errorBaseline="psalm-baseline.xml"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
errorBaseline="psalm-baseline.xml"
findUnusedBaselineEntry="true"
findUnusedCode="false"
>
<projectFiles>
<directory name="templates"/>
<directory name="src"/>
<file name="public/index.php"/>
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>
<extraFiles>
<directory name="vendor" />
</extraFiles>
<issueHandlers>
</issueHandlers>
</psalm>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1 +0,0 @@
<svg width="256" height="128" version="1.1" viewBox="0 0 256 128" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke-width="22"><circle cx="40" cy="64" r="26" stroke="#ffffff" fill="none"/><circle cx="216" cy="64" r="26" stroke="#ffffff" fill="none"/><circle cx="128" cy="64" r="46" stroke="#ffffff" fill="none"/></g></svg>

Before

Width:  |  Height:  |  Size: 330 B

View File

@@ -0,0 +1,4 @@
<svg id="nextcloud-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 142 100" width="142" height="100">
<g id="logo" stroke="currentColor" fill="none" stroke-width="11" transform="scale(1.109)"><circle cx="20" cy="32" r="13"/><circle cx="64" cy="32" r="23"/><circle cx="108" cy="32" r="13"/></g>
<g id="Nextcloud" fill="currentColor" transform="translate(-3.4, -3.4) scale(1.17)"><path d="M15.4,67.4c-0.4,0-0.5,0.2-0.5,0.6v14.6c0,0.4,0.2,0.5,0.5,0.5h0.4c0.4,0,0.5-0.2,0.5-0.5V70.4 l7.9,12.3c0,0.1,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0.1,0,0.1,0.1c0,0,0,0,0.1,0c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0h0.4 c0.4,0,0.5-0.2,0.5-0.5V68c0-0.4-0.2-0.6-0.5-0.6h-0.4c-0.4,0-0.6,0.2-0.6,0.6v12.1l-7.9-12.3c0,0-0.1-0.1-0.1-0.1 c-0.1-0.1-0.2-0.2-0.4-0.2L15.4,67.4z M110.8,67.6c-0.4,0-0.2,0.2-0.2,0.6v5c0,0.5,0,0.9,0,0.9h0c0,0-1-2.2-3.6-2.2 c-2.9,0-5,2.3-4.9,5.7c0,3.4,1.9,5.8,4.8,5.8c2.9,0,3.8-2.3,3.8-2.3h0.1c0,0-0.1,0.3-0.1,0.7v0.9c0,0.4,0.2,0.5,0.6,0.5h0.4 c0.4,0,0.5-0.2,0.5-0.6V68.2c0-0.4-0.6-0.6-0.9-0.6H110.8z M71.8,67.7c-0.4,0-0.1,0.2-0.1,0.6v12.3c0,2.4,1.6,2.7,2.5,2.7 c0.4,0,0.6-0.2,0.6-0.6v-0.4c0-0.4-0.2-0.5-0.5-0.5c-0.5-0.1-1.2-0.2-1.2-1.6v-12c0-0.4-0.6-0.6-0.9-0.6L71.8,67.7z M53.8,69 c-0.4,0-0.6,0.2-0.6,0.6v2.6v1.3v5.7c0,2.6,1.5,4.1,3.9,4.1c0.5,0,0.6-0.1,0.6-0.5v-0.3c0-0.4-0.1-0.5-0.6-0.6 c-0.9-0.1-2.4-0.4-2.4-2.9v-5.5h2.3c0.4,0,0.6-0.1,0.6-0.5v-0.2c0-0.4-0.2-0.6-0.6-0.6h-2.3v-2.6c0-0.4-0.1-0.6-0.5-0.6L53.8,69z M33.8,71.8c-3,0-5.4,2.2-5.5,5.8c0,3.4,2.5,5.8,5.8,5.8c1.8,0,3.1-0.8,3.7-1.2c0.3-0.2,0.3-0.5,0.2-0.7l-0.2-0.2 c-0.2-0.3-0.4-0.4-0.7-0.2c-0.5,0.4-1.5,1-2.9,1c-2.3,0-4.2-1.6-4.3-4.4h8c0.3,0,0.6-0.3,0.6-0.6C38.4,73.9,36.8,71.8,33.8,71.8z M65,71.8c-3.3,0-5.8,2.4-5.8,5.8c0,3.4,2.5,5.8,5.8,5.8c2,0,3.4-1,3.9-1.4c0.3-0.3,0.3-0.5,0.1-0.8L68.8,81 c-0.2-0.3-0.4-0.4-0.7-0.2C67.6,81.3,66.6,82,65,82c-2.4,0-4.3-1.8-4.3-4.4c0-2.7,1.9-4.5,4.3-4.5c1.3,0,2.3,0.7,2.8,1 c0.3,0.2,0.6,0.2,0.8-0.1l0.2-0.3c0.3-0.3,0.2-0.6-0.1-0.8C68.1,72.6,66.9,71.8,65,71.8L65,71.8z M81.9,71.8 c-3.2,0-5.8,2.5-5.8,5.7c0,3.3,2.6,5.8,5.8,5.8c3.2,0,5.8-2.5,5.8-5.8C87.8,74.3,85.1,71.8,81.9,71.8z M49.5,72 c-0.1,0-0.2,0.1-0.4,0.2l-2,2.4l-1.5,1.8l-2.3-2.7L42,72.2c-0.1-0.1-0.2-0.2-0.4-0.2c-0.1,0-0.3,0-0.4,0.2l-0.3,0.3 c-0.3,0.2-0.3,0.5,0,0.7l2,2.4l1.7,2l-2.5,2.9c0,0,0,0,0,0L40.9,82c-0.2,0.3-0.2,0.6,0.1,0.8l0.3,0.3c0.3,0.2,0.5,0.2,0.7-0.1 l2-2.4l1.5-1.8l2.3,2.7c0,0,0,0,0,0l1.2,1.5c0.2,0.3,0.5,0.3,0.8,0.1l0.3-0.3c0.3-0.2,0.3-0.5,0-0.7l-2-2.4l-1.7-2l2.5-2.9 c0,0,0,0,0,0l1.2-1.5c0.2-0.3,0.2-0.6-0.1-0.8l-0.3-0.3C49.7,72,49.6,71.9,49.5,72L49.5,72z M90.7,72c-0.4,0-0.5,0.2-0.5,0.6v6.5 c0,2.9,2.1,4.3,4.7,4.3c2.6,0,4.7-1.4,4.7-4.3v-6.5c0.1-0.4-0.1-0.6-0.5-0.6h-0.4c-0.4,0-0.6,0.2-0.6,0.6v6.1 c0,1.7-1.1,3.3-3.3,3.3c-2.1,0-3.3-1.6-3.3-3.3v-6.1c0-0.4-0.2-0.6-0.6-0.6L90.7,72z M33.8,73c1.6,0,3,1.2,3.1,3.5h-6.9 C30.3,74.3,31.9,73,33.8,73z M81.9,73.1c2.4,0,4.3,1.9,4.3,4.4c0,2.6-1.9,4.5-4.3,4.5c-2.4,0-4.3-2-4.3-4.5 C77.6,75.1,79.6,73.1,81.9,73.1z M107.1,73.1c2.4,0,3.5,2.2,3.5,4.4c0,3.2-1.7,4.5-3.6,4.5c-2.1,0-3.5-1.8-3.5-4.5 C103.5,74.8,105.1,73.1,107.1,73.1z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -86,6 +86,8 @@ $app->get('/containers', function (Request $request, Response $response, array $
'domain' => $configurationManager->GetDomain(),
'apache_port' => $configurationManager->GetApachePort(),
'borg_backup_host_location' => $configurationManager->GetBorgBackupHostLocation(),
'borg_remote_repo' => $configurationManager->GetBorgRemoteRepo(),
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
'borgbackup_password' => $configurationManager->GetAndGenerateSecret('BORGBACKUP_PASSWORD'),

View File

@@ -1,73 +1,60 @@
function makeOptionsFormSubmitVisible() {
let optionsFormSubmit = document.getElementById("options-form-submit");
optionsFormSubmit.style.display = 'block';
}
function handleTalkVisibility() {
let talk = document.getElementById("talk");
let talkRecording = document.getElementById("talk-recording")
if (talk.checked) {
talkRecording.disabled = false
} else {
talkRecording.checked = false
talkRecording.disabled = true
}
}
function handleDockerSocketProxyWarning() {
let dockerSocketProxy = document.getElementById("docker-socket-proxy");
if (dockerSocketProxy.checked) {
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!')
}
}
document.addEventListener("DOMContentLoaded", function(event) {
// handle submit button for options form
let optionsFormSubmit = document.getElementById("options-form-submit");
document.addEventListener("DOMContentLoaded", function () {
// Hide submit button initially
const optionsFormSubmit = document.getElementById("options-form-submit");
optionsFormSubmit.style.display = 'none';
// Clamav
let clamav = document.getElementById("clamav");
clamav.addEventListener('change', makeOptionsFormSubmitVisible);
// Store initial states for all checkboxes
const initialState = {};
const checkboxes = document.querySelectorAll("#options-form input[type='checkbox']");
// OnlyOffice
let onlyoffice = document.getElementById("onlyoffice");
if (onlyoffice) {
onlyoffice.addEventListener('change', makeOptionsFormSubmitVisible);
checkboxes.forEach(checkbox => {
initialState[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
});
// Function to compare current states to initial states
function checkForChanges() {
let hasChanges = false;
checkboxes.forEach(checkbox => {
if (checkbox.checked !== initialState[checkbox.id]) {
hasChanges = true;
}
});
// Show or hide submit button based on changes
optionsFormSubmit.style.display = hasChanges ? 'block' : 'none';
}
// Collabora
let collabora = document.getElementById("collabora");
collabora.addEventListener('change', makeOptionsFormSubmitVisible);
// Event listener to trigger visibility check on each change
checkboxes.forEach(checkbox => {
checkbox.addEventListener("change", checkForChanges);
});
// Talk
let talk = document.getElementById("talk");
talk.addEventListener('change', makeOptionsFormSubmitVisible);
talk.addEventListener('change', handleTalkVisibility);
// Talk-recording
let talkRecording = document.getElementById("talk-recording");
talkRecording.addEventListener('change', makeOptionsFormSubmitVisible);
if (!talk.checked) {
talkRecording.disabled = true
// Custom behaviors for specific options
function handleTalkVisibility() {
const talkRecording = document.getElementById("talk-recording");
if (document.getElementById("talk").checked) {
talkRecording.disabled = false;
} else {
talkRecording.checked = false;
talkRecording.disabled = true;
}
checkForChanges(); // Check changes after toggling Talk Recording
}
// Imaginary
let imaginary = document.getElementById("imaginary");
imaginary.addEventListener('change', makeOptionsFormSubmitVisible);
// Fulltextsearch
let fulltextsearch = document.getElementById("fulltextsearch");
fulltextsearch.addEventListener('change', makeOptionsFormSubmitVisible);
// Docker socket proxy
let dockerSocketProxy = document.getElementById("docker-socket-proxy");
if (dockerSocketProxy) {
dockerSocketProxy.addEventListener('change', makeOptionsFormSubmitVisible);
// dockerSocketProxy.addEventListener('change', handleDockerSocketProxyWarning);
function handleDockerSocketProxyWarning() {
if (document.getElementById("docker-socket-proxy").checked) {
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!');
}
}
// Whiteboard
let whiteboard = document.getElementById("whiteboard");
whiteboard.addEventListener('change', makeOptionsFormSubmitVisible);
// Initialize event listeners for specific behaviors
document.getElementById("talk").addEventListener('change', handleTalkVisibility);
document.getElementById("docker-socket-proxy").addEventListener('change', handleDockerSocketProxyWarning);
// Initialize talk-recording visibility on page load
handleTalkVisibility(); // Ensure talk-recording is correctly initialized
// Initial call to check for changes
checkForChanges();
});

View File

@@ -1,12 +1,78 @@
:root {
--color-nextcloud-blue: #0082c9;
--color-nextcloud-logo: var(--color-nextcloud-blue);
--color-main-background: white;
--color-input-background: white;
--color-main-text: black;
--color-main-border: black;
--color-main-border-hover: var(--color-main-border);
--color-error: #db0606;
--color-error-hover: #df2525;
--color-error-text: #c20505;
--color-success: #46ba61;
--color-running: #ffd000;
--color-info: #0071ad;
--color-info-hover: #00aaef;
--color-border-maxcontrast: #7d7d7d;
--color-loader: #f3f3f3;
--color-disabled: #d3d3d3; /* light gray background for disabled checkboxes */
--color-border-disabled: #a9a9a9; /* darker gray border for disabled checkboxes */
--color-text-disabled: #a9a9a9; /* matching label text color for disabled checkboxes */
--border: .5px;
--border-hover: 2px;
--border-radius: 7px;
--border-radius-large: 12px;
--default-font-size: 13px;
--checkbox-size: 16px;
--max-width: 500px;
--container-top-margin: 20px;
--container-bottom-margin: 20px;
--container-padding: 2px;
--container-height-calculation-difference: calc(var(--container-top-margin) + var(--container-bottom-margin));
--main-height-calculation-difference: calc(var(--container-height-calculation-difference) + calc(var(--container-padding) * 2));
--main-padding: 50px;
}
/* Breakpoint calculation: 500px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 800px
Note: Unfortunately, it's not possible to calculate this dynamically using CSS variables in media queries */
@media only screen and (max-width: 800px) {
:root {
--container-top-margin: 50px;
--container-bottom-margin: 0px;
}
}
[data-theme="dark"] {
--color-main-background: #171717;
--color-input-background: #ebebeb;
--color-main-text: #ebebeb;
--color-nextcloud-logo: var(--color-main-text);
--color-main-border: var(--color-border-maxcontrast);
--color-main-border-hover: var(--color-main-text);
--color-error: #ff3333;
--color-error-hover: #ff6666;
--color-error-text: #ff8080;
--color-info: #00aeff;
--color-info-hover: #33beff;
--color-loader: var(--color-border-maxcontrast);
--border-hover: var(--border);
}
html, body {
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Cantarell, Ubuntu, Helvetica Neue, Arial, Noto Color Emoji, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;;
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, Oxygen-Sans, Cantarell, Ubuntu, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
background-color: var(--color-main-background);
color: var(--color-main-text);
}
a {
text-decoration: none;
color: #0082c9;
color: var(--color-info);
}
a:hover {
color: var(--color-info-hover);
}
a.button,
@@ -15,19 +81,24 @@ input[type="submit"] {
width: auto;
height: 34px;
cursor: pointer;
background-color: #0082c9;
background-color: var(--color-nextcloud-blue);
font-weight: bold;
border-radius: 8px;
border-radius: var(--border-radius);
margin: 3px 3px 3px 0;
font-size: 14px;
font-size: var(--default-font-size);
color: white;
border: .5px solid black;
border: .5px solid var(--color-main-border);
outline: none;
}
a.button:focus,
input[type="submit"]:focus {
border: 1px solid black;
border: 1px solid var(--color-main-border);
}
a.button:hover,
input[type="submit"]:hover {
background-color: var(--color-info-hover);
}
summary {
@@ -41,38 +112,36 @@ ul {
li {
padding-bottom: 5px;
text-indent: 0;
padding-left: 0;
}
span.error {
background-color: #e9322d;
background-color: var(--color-error);
}
div.toast.error {
border-left-color: #e9322d;
border-left-color: var(--color-error);
}
.status {
display: inline-block;
height: 16px;
width: 16px;
vertical-align: text-bottom
}
.status {
height: var(--checkbox-size);
width: var(--checkbox-size);
vertical-align: text-bottom;
border-radius: 50%
}
span.success {
background-color: #46ba61;
background-color: var(--color-success);
}
span.running {
background-color: rgb(255, 208, 0);
background-color: var(--color-running);
}
div.toast.success {
border-left-color: #46ba61;
border-left-color: var(--color-success);
}
div.toast {
@@ -84,19 +153,36 @@ div.toast {
margin-top: 45px;
position: fixed;
z-index: 1000;
border-radius: 3px;
background: white none;
border-radius: var(--border-radius);
background: var(--color-main-background) none;
color: var(--color-main-text);
}
.nextcloud-logo {
margin-left: auto;
margin-right: auto;
display: block;
color: var(--color-nextcloud-logo);
}
.fallback-text {
display: none;
}
svg:not(:has(use)) .fallback-text {
display: block;
}
.login {
padding: 50px;
background-color: white;
background-color: var(--color-main-background);
color: var(--color-main-text);
width: 500px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 12px;
border-radius: var(--border-radius-large);
}
.login > .monospace {
@@ -104,33 +190,6 @@ div.toast {
font-size: 17px;
}
form {
margin: 0;
}
input[type="text"],
input[type="password"],
select {
padding-left: 8px;
padding-right: 8px;
height: 34px;
margin-bottom: 15px;
border-radius: 8px;
border: .5px solid black;
}
textarea {
border-radius: 8px;
border: .5px solid black;
}
input[type="text"]:focus,
input[type="password"]:focus,
textarea:focus,
select:focus {
border: 1px solid black;
}
.login > form > input[type="password"],
.login > form > input[type="text"],
.login > form > input[type="submit"] {
@@ -153,34 +212,114 @@ select:focus {
align-content: center;
}
.login-wrapper {
.wrapper {
min-height: 100dvh;
min-width: 100vw;
position: fixed;
width: 100vw;
height: auto;
background-image: url("img/Background_Light.jpg");
background-image: url("img/jenna-kim-the-globe.webp");
background-position: center;
background-repeat: no-repeat;
background-size: cover;
box-sizing: border-box;
overflow: hidden;
}
html[data-theme="dark"] .wrapper {
background-image: url("img/jenna-kim-the-globe-dark.webp");
}
form {
margin: 0;
}
input[type="text"],
input[type="password"],
select {
padding-left: 8px;
padding-right: 8px;
height: 34px;
margin-bottom: 15px;
border-radius: var(--border-radius);
border: var(--border) solid var(--color-border-maxcontrast);
background: var(--color-main-background);
color: var(--color-main-text);
}
input[type="text"]:hover,
input[type="password"]:hover,
select:hover {
border: var(--border-hover) solid var(--color-main-border-hover);
}
textarea {
border-radius: var(--border-radius);
border: .5px solid var(--color-main-border);
max-width: 100%;
}
input[type="text"]:focus,
input[type="password"]:focus,
textarea:focus,
select:focus {
border: 1px solid var(--color-main-border);
}
/* Scroll bar for dark mode */
html[data-theme="dark"] ::-webkit-scrollbar {
width: 8px; /* Width of the scroll bar */
}
html[data-theme="dark"] ::-webkit-scrollbar-thumb {
background-color: #444; /* Dark mode scrollbar thumb color */
border-radius: 4px; /* Rounded corners for the thumb */
}
html[data-theme="dark"] ::-webkit-scrollbar-track {
background-color: #333; /* Dark mode scrollbar track color */
}
/* Scroll bar for light mode */
::-webkit-scrollbar {
width: 8px; /* Width of the scroll bar */
}
::-webkit-scrollbar-thumb {
background-color: #888; /* Light mode scrollbar thumb color */
border-radius: 4px; /* Rounded corners for the thumb */
}
::-webkit-scrollbar-track {
background-color: #f0f0f0; /* Light mode scrollbar track color */
}
.container {
margin: var(--container-top-margin) auto var(--container-bottom-margin) auto;
padding: var(--container-padding);
max-width: calc(var(--max-width) + calc(var(--main-padding) * 2) + 8px);
background-color: var(--color-main-background);
border-radius: var(--border-radius-large);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
max-height: calc(100dvh - var(--container-height-calculation-difference));
overflow: hidden;
}
main {
padding: 20px;
max-width: 100%;
padding-left: var(--main-padding);
padding-right: var(--main-padding);
background-color: transparent; /* transparent, since color comes from outer container */
color: var(--color-main-text);
max-height: calc(100dvh - var(--main-height-calculation-difference));
overflow-y: auto;
box-sizing: border-box;
word-break: break-word;
max-width: 500px;
max-width: calc(var(--max-width) + calc(var(--main-padding) * 2));
margin: 0 auto;
}
.logo {
background-image: url('/img/logo.svg');
color: white;
height: 50px;
background-repeat: no-repeat;
display: inline-flex;
background-size: contain;
background-position: center center;
width: 62px;
position: absolute;
left: 12px;
@@ -189,16 +328,93 @@ main {
}
header {
background-color: #0082c9;
background-image: linear-gradient(40deg, #0082c9 0%, #30b6ff 100%);
position: fixed;
top: 0;
width: 100%;
background-color: transparent;
height: 50px;
justify-content: space-between;
align-items: center;
display: flex;
padding: 0 20px;
z-index: 1000;
}
header > form {
margin: 0 8px;
margin-left: auto;
margin-right: 30px;
}
/* Standard styling for enabled checkboxes */
input[type="checkbox"]:not(:disabled) {
width: var(--checkbox-size);
height: var(--checkbox-size);
-webkit-appearance: none; /* remove default styling */
-moz-appearance: none;
appearance: none;
border: 1px solid var(--color-nextcloud-blue);
border-radius: 2px;
cursor: pointer;
position: relative;
vertical-align: middle; /* align checkbox vertically with text */
margin-top: -1px; /* adjust for better alignment */
}
/* Hover effects for enabled checkboxes */
input[type="checkbox"]:not(:disabled):hover {
border-color: var(--color-info-hover);
}
/* Checkmark styling for enabled checkboxes */
input[type="checkbox"]:checked:not(:disabled) {
background-color: var(--color-nextcloud-blue);
border-color: var(--color-border-maxcontrast);
}
input[type="checkbox"]:checked:not(:disabled)::after {
content: ''; /* Creates a pseudo-element for the checkmark */
position: absolute; /* Positions it absolutely */
left: 4px; /* Positioning of the checkmark */
top: 0; /* Positioning of the checkmark */
width: 4px; /* Width of the checkmark */
height: 9px; /* Height of the checkmark */
border: solid white; /* Color of the checkmark */
border-width: 0 2px 3px 0; /* Creates the checkmark shape */
transform: rotate(45deg); /* Rotates to form a checkmark */
}
/* Styling for disabled checkboxes (grayed out, no hover, no pointer) */
input[type="checkbox"]:disabled:not(:checked) {
background-color: var(--color-disabled);
border-color: var(--color-border-disabled);
cursor: default;
opacity: 0.5; /* Makes the checkbox appear faded */
}
/* Styling for disabled checked checkboxes (no pointer) */
input[type="checkbox"]:disabled:checked {
cursor: default;
}
input[type="checkbox"]:disabled:hover {
border-color: var(--color-border-disabled); /* Keeps disabled state without hover effect */
}
/* General Label styling */
label {
cursor: pointer;
margin-left: 4px;
line-height: var(--checkbox-size);
}
/* Label cursor for disabled checkboxes */
input[type="checkbox"]:disabled + label {
cursor: default;
}
/* Label styling for disabled, not checked checkboxes */
input[type="checkbox"]:disabled:not(:checked) + label {
color: var(--color-text-disabled);
}
.loading {
@@ -221,9 +437,9 @@ header > form {
}
.loader {
border: 16px solid #f3f3f3;
border: 16px solid var(--color-loader);
border-radius: 50%;
border-top: 16px solid #0082c9;
border-top: 16px solid var(--color-nextcloud-blue);
width: 120px;
height: 120px;
-webkit-animation: spin 2s linear infinite; /* Safari */
@@ -243,3 +459,58 @@ header > form {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* General theme button styling */
#theme-toggle {
position: fixed; /* Keep the button in the same position */
right: 30px; /* Adjust the distance from the right */
bottom: 30px; /* Adjust the distance from the bottom */
background-color: transparent; /* Make the background transparent */
border: none; /* Remove border */
font-size: 36px; /* Adjust font size */
cursor: pointer; /* Change cursor to pointer */
outline: none;
z-index: 9999; /* Ensures the icon is on top of every layer */
}
/* Icon styling: default state */
#theme-icon {
display: inline-block;
border-radius: 50%; /* Round shape */
position: relative; /* For the pseudo-element positioning */
transition: box-shadow 0.3s, background-color 0.3s; /* Smooth transition for hover effect */
opacity: 0.6; /* Slightly transparent by default */
filter: grayscale(100%); /* Make the icon black and white */
}
/* Create the inner glow effect with ::after */
#theme-icon::after {
content: ''; /* Empty content for the pseudo-element */
position: absolute;
top: 50%;
left: 50%;
width: 0px; /* Invisible dot */
height: 0px; /* Invisible dot */
background-color: transparent; /* Invisible by default */
border-radius: 50%; /* Circle shape */
transform: translate(-50%, -50%); /* Center the dot */
transition: box-shadow 0.3s, background-color 0.3s; /* Smooth transition for hover */
}
/* Hover effect for both light and dark modes */
#theme-toggle:hover #theme-icon {
position: relative; /* Ensures stacking order */
filter: grayscale(0%); /* Restore full color */
opacity: 1; /* Fully visible on hover */
}
/* Inner glow when hovered */
#theme-toggle:hover #theme-icon::after {
box-shadow: 0 0 40px 40px rgba(128, 128, 128, 0.4); /* Blur effect from inside */
background-color: rgba(128, 128, 128, 0.2); /* Light glow inside */
}
/* Remove hover effects when not hovering */
#theme-toggle:not(:hover) #theme-icon {
opacity: 0.6; /* Slightly transparent */
}

View File

@@ -0,0 +1,37 @@
// Function to toggle theme
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = (currentTheme === 'dark') ? '' : 'dark'; // Toggle between no theme and dark theme
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
// Change the icon based on the current theme
const themeIcon = document.getElementById('theme-icon');
themeIcon.textContent = newTheme === 'dark' ? '☀️' : '🌙'; // Switch between moon and sun icons
}
// Function to immediately apply saved theme without icon update
function applySavedThemeImmediately() {
const savedTheme = localStorage.getItem('theme');
if (savedTheme === 'dark') {
document.documentElement.setAttribute('data-theme', 'dark');
} else {
document.documentElement.removeAttribute('data-theme'); // Default to light theme
}
}
// Function to apply theme-icon update
function setThemeIcon() {
const savedTheme = localStorage.getItem('theme');
if (savedTheme === 'dark') {
document.getElementById('theme-icon').textContent = '☀️'; // Sun icon for dark mode
} else {
document.getElementById('theme-icon').textContent = '🌙'; // Moon icon for light mode
}
}
// Immediately apply the saved theme to avoid flickering
applySavedThemeImmediately();
// Apply theme when the page loads
document.addEventListener('DOMContentLoaded', setThemeIcon);

View File

@@ -6,12 +6,12 @@ use AIO\Data\ConfigurationManager;
use AIO\Data\DataConst;
use \DateTime;
class AuthManager {
readonly class AuthManager {
private const string SESSION_KEY = 'aio_authenticated';
private ConfigurationManager $configurationManager;
public function __construct(ConfigurationManager $configurationManager) {
$this->configurationManager = $configurationManager;
public function __construct(
private ConfigurationManager $configurationManager
) {
}
public function CheckCredentials(string $password) : bool {

View File

@@ -2,92 +2,42 @@
namespace AIO\Container;
use AIO\Container\State\IContainerState;
use AIO\Data\ConfigurationManager;
use AIO\Docker\DockerActionManager;
use AIO\ContainerDefinitionFetcher;
class Container {
private string $identifier;
private string $displayName;
private string $containerName;
private string $restartPolicy;
private int $maxShutdownTime;
private ContainerPorts $ports;
private string $internalPorts;
private ContainerVolumes $volumes;
private ContainerEnvironmentVariables $containerEnvironmentVariables;
/** @var string[] */
private array $dependsOn;
/** @var string[] */
private array $secrets;
/** @var string[] */
private array $devices;
/** @var string[] */
private array $capAdd;
private int $shmSize;
private bool $apparmorUnconfined;
/** @var string[] */
private array $backupVolumes;
private array $nextcloudExecCommands;
private bool $readOnlyRootFs;
private array $tmpfs;
private bool $init;
private string $imageTag;
private AioVariables $aioVariables;
private string $documentation;
private DockerActionManager $dockerActionManager;
readonly class Container {
public function __construct(
string $identifier,
string $displayName,
string $containerName,
string $restartPolicy,
int $maxShutdownTime,
ContainerPorts $ports,
string $internalPorts,
ContainerVolumes $volumes,
ContainerEnvironmentVariables $containerEnvironmentVariables,
array $dependsOn,
array $secrets,
array $devices,
array $capAdd,
int $shmSize,
bool $apparmorUnconfined,
array $backupVolumes,
array $nextcloudExecCommands,
bool $readOnlyRootFs,
array $tmpfs,
bool $init,
string $imageTag,
AioVariables $aioVariables,
string $documentation,
DockerActionManager $dockerActionManager
private string $identifier,
private string $displayName,
private string $containerName,
private string $restartPolicy,
private int $maxShutdownTime,
private ContainerPorts $ports,
private string $internalPorts,
private ContainerVolumes $volumes,
private ContainerEnvironmentVariables $containerEnvironmentVariables,
/** @var string[] */
private array $dependsOn,
/** @var string[] */
private array $secrets,
/** @var string[] */
private array $devices,
/** @var string[] */
private array $capAdd,
private int $shmSize,
private bool $apparmorUnconfined,
/** @var string[] */
private array $backupVolumes,
private array $nextcloudExecCommands,
private bool $readOnlyRootFs,
private array $tmpfs,
private bool $init,
private string $imageTag,
private AioVariables $aioVariables,
private string $documentation,
private DockerActionManager $dockerActionManager
) {
$this->identifier = $identifier;
$this->displayName = $displayName;
$this->containerName = $containerName;
$this->restartPolicy = $restartPolicy;
$this->maxShutdownTime = $maxShutdownTime;
$this->ports = $ports;
$this->internalPorts = $internalPorts;
$this->volumes = $volumes;
$this->containerEnvironmentVariables = $containerEnvironmentVariables;
$this->dependsOn = $dependsOn;
$this->secrets = $secrets;
$this->devices = $devices;
$this->capAdd = $capAdd;
$this->shmSize = $shmSize;
$this->apparmorUnconfined = $apparmorUnconfined;
$this->backupVolumes = $backupVolumes;
$this->nextcloudExecCommands = $nextcloudExecCommands;
$this->readOnlyRootFs = $readOnlyRootFs;
$this->tmpfs = $tmpfs;
$this->init = $init;
$this->imageTag = $imageTag;
$this->aioVariables = $aioVariables;
$this->documentation = $documentation;
$this->dockerActionManager = $dockerActionManager;
}
public function GetIdentifier() : string {
@@ -162,19 +112,19 @@ class Container {
return $this->volumes;
}
public function GetRunningState() : IContainerState {
public function GetRunningState() : ContainerState {
return $this->dockerActionManager->GetContainerRunningState($this);
}
public function GetRestartingState() : IContainerState {
public function GetRestartingState() : ContainerState {
return $this->dockerActionManager->GetContainerRestartingState($this);
}
public function GetUpdateState() : IContainerState {
public function GetUpdateState() : VersionState {
return $this->dockerActionManager->GetContainerUpdateState($this);
}
public function GetStartingState() : IContainerState {
public function GetStartingState() : ContainerState {
return $this->dockerActionManager->GetContainerStartingState($this);
}

View File

@@ -3,17 +3,10 @@
namespace AIO\Container;
class ContainerPort {
public string $port;
public string $ipBinding;
public string $protocol;
public function __construct(
string $port,
string $ipBinding,
string $protocol
public string $port,
public string $ipBinding,
public string $protocol
) {
$this->port = $port;
$this->ipBinding = $ipBinding;
$this->protocol = $protocol;
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace AIO\Container;
enum ContainerState: string {
case ImageDoesNotExist = 'image_does_not_exist';
case NotRestarting = 'not_restarting';
case Restarting = 'restarting';
case Running = 'running';
case Starting = 'starting';
case Stopped = 'stopped';
}

View File

@@ -3,17 +3,10 @@
namespace AIO\Container;
class ContainerVolume {
public string $name;
public string $mountPoint;
public bool $isWritable;
public function __construct(
string $name,
string $mountPoint,
bool $isWritable
public string $name,
public string $mountPoint,
public bool $isWritable
) {
$this->name = $name;
$this->mountPoint = $mountPoint;
$this->isWritable = $isWritable;
}
}

View File

@@ -1,5 +0,0 @@
<?php
namespace AIO\Container\State;
interface IContainerState {}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class ImageDoesNotExistState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class NotRestartingState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class RestartingState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class RunningState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class StartingState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class StoppedState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class VersionDifferentState implements IContainerState
{}

View File

@@ -1,6 +0,0 @@
<?php
namespace AIO\Container\State;
class VersionEqualState implements IContainerState
{}

View File

@@ -0,0 +1,8 @@
<?php
namespace AIO\Container;
enum VersionState: string {
case Different = 'different';
case Equal = 'equal';
}

View File

@@ -9,23 +9,15 @@ use AIO\Container\ContainerPort;
use AIO\Container\ContainerPorts;
use AIO\Container\ContainerVolume;
use AIO\Container\ContainerVolumes;
use AIO\Container\State\RunningState;
use AIO\Data\ConfigurationManager;
use AIO\Data\DataConst;
use AIO\Docker\DockerActionManager;
class ContainerDefinitionFetcher
{
private ConfigurationManager $configurationManager;
private \DI\Container $container;
readonly class ContainerDefinitionFetcher {
public function __construct(
ConfigurationManager $configurationManager,
\DI\Container $container
)
{
$this->configurationManager = $configurationManager;
$this->container = $container;
private ConfigurationManager $configurationManager,
private \DI\Container $container
) {
}
public function GetContainerById(string $id): Container
@@ -103,7 +95,7 @@ class ContainerDefinitionFetcher
$ports = new ContainerPorts();
if (isset($entry['ports'])) {
foreach ($entry['ports'] as $value) {
foreach ($entry['ports'] as $value) {
$ports->AddPort(
new ContainerPort(
$value['port_number'],
@@ -212,7 +204,7 @@ class ContainerDefinitionFetcher
$dependsOn[] = $value;
}
}
$variables = new ContainerEnvironmentVariables();
if (isset($entry['environment'])) {
foreach ($entry['environment'] as $value) {

View File

@@ -9,14 +9,10 @@ use AIO\Docker\DockerActionManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class ConfigurationController
{
private ConfigurationManager $configurationManager;
readonly class ConfigurationController {
public function __construct(
ConfigurationManager $configurationManager
private ConfigurationManager $configurationManager
) {
$this->configurationManager = $configurationManager;
}
public function SetConfig(Request $request, Response $response, array $args) : Response {
@@ -32,15 +28,17 @@ class ConfigurationController
$this->configurationManager->ChangeMasterPassword($currentMasterPassword, $newMasterPassword);
}
if (isset($request->getParsedBody()['borg_backup_host_location'])) {
if (isset($request->getParsedBody()['borg_backup_host_location']) || isset($request->getParsedBody()['borg_remote_repo'])) {
$location = $request->getParsedBody()['borg_backup_host_location'] ?? '';
$this->configurationManager->SetBorgBackupHostLocation($location);
$borgRemoteRepo = $request->getParsedBody()['borg_remote_repo'] ?? '';
$this->configurationManager->SetBorgLocationVars($location, $borgRemoteRepo);
}
if (isset($request->getParsedBody()['borg_restore_host_location']) || isset($request->getParsedBody()['borg_restore_password'])) {
if (isset($request->getParsedBody()['borg_restore_host_location']) || isset($request->getParsedBody()['borg_restore_remote_repo']) || isset($request->getParsedBody()['borg_restore_password'])) {
$restoreLocation = $request->getParsedBody()['borg_restore_host_location'] ?? '';
$borgRemoteRepo = $request->getParsedBody()['borg_restore_remote_repo'] ?? '';
$borgPassword = $request->getParsedBody()['borg_restore_password'] ?? '';
$this->configurationManager->SetBorgRestoreHostLocationAndPassword($restoreLocation, $borgPassword);
$this->configurationManager->SetBorgRestoreLocationVarsAndPassword($restoreLocation, $borgRemoteRepo, $borgPassword);
}
if (isset($request->getParsedBody()['daily_backup_time'])) {
@@ -136,8 +134,8 @@ class ConfigurationController
$this->configurationManager->SetCollaboraDictionaries($collaboraDictionaries);
}
if (isset($request->getParsedBody()['delete_borg_backup_host_location'])) {
$this->configurationManager->DeleteBorgBackupHostLocation();
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
$this->configurationManager->DeleteBorgBackupLocationVars();
}
return $response->withStatus(201)->withHeader('Location', '/');

View File

@@ -2,28 +2,21 @@
namespace AIO\Controller;
use AIO\Container\State\RunningState;
use AIO\Container\ContainerState;
use AIO\ContainerDefinitionFetcher;
use AIO\Docker\DockerActionManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use AIO\Data\ConfigurationManager;
class DockerController
{
private DockerActionManager $dockerActionManager;
private ContainerDefinitionFetcher $containerDefinitionFetcher;
readonly class DockerController {
private const string TOP_CONTAINER = 'nextcloud-aio-apache';
private ConfigurationManager $configurationManager;
public function __construct(
DockerActionManager $dockerActionManager,
ContainerDefinitionFetcher $containerDefinitionFetcher,
ConfigurationManager $configurationManager
private DockerActionManager $dockerActionManager,
private ContainerDefinitionFetcher $containerDefinitionFetcher,
private ConfigurationManager $configurationManager
) {
$this->dockerActionManager = $dockerActionManager;
$this->containerDefinitionFetcher = $containerDefinitionFetcher;
$this->configurationManager = $configurationManager;
}
private function PerformRecursiveContainerStart(string $id, bool $pullImage = true) : void {
@@ -35,7 +28,7 @@ class DockerController
// Don't start if container is already running
// This is expected to happen if a container is defined in depends_on of multiple containers
if ($container->GetRunningState() instanceof RunningState) {
if ($container->GetRunningState() === ContainerState::Running) {
error_log('Not starting ' . $id . ' because it was already started.');
return;
}
@@ -48,7 +41,7 @@ class DockerController
}
}
// Check if docker hub is reachable in order to make sure that we do not try to pull an image if it is down
// Check if docker hub is reachable in order to make sure that we do not try to pull an image if it is down
// and try to mitigate issues that are arising due to that
if ($pullImage) {
if (!$this->dockerActionManager->isDockerHubReachable($container)) {
@@ -120,6 +113,11 @@ class DockerController
$config = $this->configurationManager->GetConfig();
$config['backup-mode'] = 'restore';
$config['selected-restore-time'] = $request->getParsedBody()['selected_restore_time'] ?? '';
if (isset($request->getParsedBody()['restore-exclude-previews'])) {
$config['restore-exclude-previews'] = 1;
} else {
$config['restore-exclude-previews'] = '';
}
$this->configurationManager->WriteConfig($config);
$id = self::TOP_CONTAINER;
@@ -261,10 +259,10 @@ class DockerController
$domaincheckContainer = $this->containerDefinitionFetcher->GetContainerById($id);
$apacheContainer = $this->containerDefinitionFetcher->GetContainerById(self::TOP_CONTAINER);
// Don't start if apache is already running
if ($apacheContainer->GetRunningState() instanceof RunningState) {
if ($apacheContainer->GetRunningState() === ContainerState::Running) {
return;
// Don't start if domaincheck is already running
} elseif ($domaincheckContainer->GetRunningState() instanceof RunningState) {
} elseif ($domaincheckContainer->GetRunningState() === ContainerState::Running) {
$domaincheckWasStarted = apcu_fetch($cacheKey);
// Start domaincheck again when 10 minutes are over by not returning here
if($domaincheckWasStarted !== false && is_string($domaincheckWasStarted)) {

View File

@@ -9,14 +9,11 @@ use AIO\Docker\DockerActionManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class LoginController
{
private AuthManager $authManager;
private DockerActionManager $dockerActionManager;
public function __construct(AuthManager $authManager, DockerActionManager $dockerActionManager) {
$this->authManager = $authManager;
$this->dockerActionManager = $dockerActionManager;
readonly class LoginController {
public function __construct(
private AuthManager $authManager,
private DockerActionManager $dockerActionManager,
) {
}
public function TryLogin(Request $request, Response $response, array $args) : Response {

View File

@@ -427,6 +427,15 @@ class ConfigurationManager
return $config['selected-restore-time'];
}
public function GetRestoreExcludePreviews() : string {
$config = $this->GetConfig();
if(!isset($config['restore-exclude-previews'])) {
$config['restore-exclude-previews'] = '';
}
return $config['restore-exclude-previews'];
}
public function GetAIOURL() : string {
$config = $this->GetConfig();
if(!isset($config['AIO_URL'])) {
@@ -439,48 +448,61 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
public function SetBorgBackupHostLocation(string $location) : void {
$isValidPath = false;
if (str_starts_with($location, '/') && !str_ends_with($location, '/')) {
$isValidPath = true;
} elseif ($location === 'nextcloud_aio_backupdir') {
$isValidPath = true;
}
if (!$isValidPath) {
throw new InvalidSettingConfigurationException("The path must start with '/', and must not end with '/'!");
}
public function SetBorgLocationVars(string $location, string $repo) : void {
$this->ValidateBorgLocationVars($location, $repo);
$config = $this->GetConfig();
$config['borg_backup_host_location'] = $location;
$config['borg_remote_repo'] = $repo;
$this->WriteConfig($config);
}
public function DeleteBorgBackupHostLocation() : void {
$config = $this->GetConfig();
$config['borg_backup_host_location'] = '';
$this->WriteConfig($config);
}
/**
* @throws InvalidSettingConfigurationException
*/
public function SetBorgRestoreHostLocationAndPassword(string $location, string $password) : void {
if ($location === '') {
throw new InvalidSettingConfigurationException("Please enter a path!");
private function ValidateBorgLocationVars(string $location, string $repo) : void {
if ($location === '' && $repo === '') {
throw new InvalidSettingConfigurationException("Please enter a path or a remote repo url!");
} elseif ($location !== '' && $repo !== '') {
throw new InvalidSettingConfigurationException("Location and remote repo url are mutually exclusive!");
}
$isValidPath = false;
if (str_starts_with($location, '/') && !str_ends_with($location, '/')) {
$isValidPath = true;
} elseif ($location === 'nextcloud_aio_backupdir') {
$isValidPath = true;
}
if ($location !== '') {
$isValidPath = false;
if (str_starts_with($location, '/') && !str_ends_with($location, '/')) {
$isValidPath = true;
} elseif ($location === 'nextcloud_aio_backupdir') {
$isValidPath = true;
}
if (!$isValidPath) {
throw new InvalidSettingConfigurationException("The path must start with '/', and must not end with '/'!");
if (!$isValidPath) {
throw new InvalidSettingConfigurationException("The path must start with '/', and must not end with '/'!");
}
} else {
$this->ValidateBorgRemoteRepo($repo);
}
}
private function ValidateBorgRemoteRepo(string $repo) : void {
$commonMsg = "For valid urls, see the remote examples at https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls";
if ($repo === "") {
// Ok, remote repo is optional
} elseif (!str_contains($repo, "@")) {
throw new InvalidSettingConfigurationException("The remote repo must contain '@'. $commonMsg");
} elseif (!str_contains($repo, ":")) {
throw new InvalidSettingConfigurationException("The remote repo must contain ':'. $commonMsg");
}
}
public function DeleteBorgBackupLocationVars() : void {
$config = $this->GetConfig();
$config['borg_backup_host_location'] = '';
$config['borg_remote_repo'] = '';
$this->WriteConfig($config);
}
/**
* @throws InvalidSettingConfigurationException
*/
public function SetBorgRestoreLocationVarsAndPassword(string $location, string $repo, string $password) : void {
$this->ValidateBorgLocationVars($location, $repo);
if ($password === '') {
throw new InvalidSettingConfigurationException("Please enter the password!");
@@ -488,6 +510,7 @@ class ConfigurationManager
$config = $this->GetConfig();
$config['borg_backup_host_location'] = $location;
$config['borg_remote_repo'] = $repo;
$config['borg_restore_password'] = $password;
$config['instance_restore_attempt'] = 1;
$this->WriteConfig($config);
@@ -582,6 +605,23 @@ class ConfigurationManager
return $config['borg_backup_host_location'];
}
public function GetBorgRemoteRepo() : string {
$config = $this->GetConfig();
if(!isset($config['borg_remote_repo'])) {
$config['borg_remote_repo'] = '';
}
return $config['borg_remote_repo'];
}
public function GetBorgPublicKey() : string {
if (!file_exists(DataConst::GetBackupPublicKey())) {
return "";
}
return trim(file_get_contents(DataConst::GetBackupPublicKey()));
}
public function GetBorgRestorePassword() : string {
$config = $this->GetConfig();
if(!isset($config['borg_restore_password'])) {
@@ -888,6 +928,13 @@ class ConfigurationManager
$this->WriteConfig($config);
}
public function GetApacheAdditionalNetwork() : string {
$envVariableName = 'APACHE_ADDITIONAL_NETWORK';
$configName = 'apache_additional_network';
$defaultValue = '';
return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
}
public function GetApacheIPBinding() : string {
$envVariableName = 'APACHE_IP_BINDING';
$configName = 'apache_ip_binding';

View File

@@ -23,6 +23,10 @@ class DataConst {
return self::GetDataDirectory() . '/configuration.json';
}
public static function GetBackupPublicKey() : string {
return self::GetDataDirectory() . '/id_borg.pub';
}
public static function GetBackupSecretFile() : string {
return self::GetDataDirectory() . '/backupsecret';
}

View File

@@ -4,16 +4,11 @@ namespace AIO\Data;
use AIO\Auth\PasswordGenerator;
class Setup
{
private PasswordGenerator $passwordGenerator;
private ConfigurationManager $configurationManager;
readonly class Setup {
public function __construct(
PasswordGenerator $passwordGenerator,
ConfigurationManager $configurationManager) {
$this->passwordGenerator = $passwordGenerator;
$this->configurationManager = $configurationManager;
private PasswordGenerator $passwordGenerator,
private ConfigurationManager $configurationManager,
) {
}
public function Setup() : string {

View File

@@ -3,44 +3,24 @@
namespace AIO\Docker;
use AIO\Container\Container;
use AIO\Container\State\IContainerState;
use AIO\Container\State\ImageDoesNotExistState;
use AIO\Container\State\StartingState;
use AIO\Container\State\RunningState;
use AIO\Container\State\RestartingState;
use AIO\Container\State\NotRestartingState;
use AIO\Container\State\VersionDifferentState;
use AIO\Container\State\StoppedState;
use AIO\Container\State\VersionEqualState;
use AIO\Container\VersionState;
use AIO\Container\ContainerState;
use AIO\Data\ConfigurationManager;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use AIO\ContainerDefinitionFetcher;
use http\Env\Response;
class DockerActionManager
{
readonly class DockerActionManager {
private const string API_VERSION = 'v1.41';
private \GuzzleHttp\Client $guzzleClient;
private ConfigurationManager $configurationManager;
private ContainerDefinitionFetcher $containerDefinitionFetcher;
private DockerHubManager $dockerHubManager;
private Client $guzzleClient;
public function __construct(
ConfigurationManager $configurationManager,
ContainerDefinitionFetcher $containerDefinitionFetcher,
DockerHubManager $dockerHubManager
private ConfigurationManager $configurationManager,
private ContainerDefinitionFetcher $containerDefinitionFetcher,
private DockerHubManager $dockerHubManager
) {
$this->configurationManager = $configurationManager;
$this->containerDefinitionFetcher = $containerDefinitionFetcher;
$this->dockerHubManager = $dockerHubManager;
$this->guzzleClient = new \GuzzleHttp\Client(
[
'curl' => [
CURLOPT_UNIX_SOCKET_PATH => '/var/run/docker.sock',
],
]
);
$this->guzzleClient = new Client(['curl' => [CURLOPT_UNIX_SOCKET_PATH => '/var/run/docker.sock']]);
}
private function BuildApiUrl(string $url) : string {
@@ -55,14 +35,14 @@ class DockerActionManager
return $container->GetContainerName() . ':' . $tag;
}
public function GetContainerRunningState(Container $container) : IContainerState
public function GetContainerRunningState(Container $container) : ContainerState
{
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
try {
$response = $this->guzzleClient->get($url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return new ImageDoesNotExistState();
return ContainerState::ImageDoesNotExist;
}
throw $e;
}
@@ -70,20 +50,20 @@ class DockerActionManager
$responseBody = json_decode((string)$response->getBody(), true);
if ($responseBody['State']['Running'] === true) {
return new RunningState();
return ContainerState::Running;
} else {
return new StoppedState();
return ContainerState::Stopped;
}
}
public function GetContainerRestartingState(Container $container) : IContainerState
public function GetContainerRestartingState(Container $container) : ContainerState
{
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
try {
$response = $this->guzzleClient->get($url);
} catch (RequestException $e) {
if ($e->getCode() === 404) {
return new ImageDoesNotExistState();
return ContainerState::ImageDoesNotExist;
}
throw $e;
}
@@ -91,13 +71,13 @@ class DockerActionManager
$responseBody = json_decode((string)$response->getBody(), true);
if ($responseBody['State']['Restarting'] === true) {
return new RestartingState();
return ContainerState::Restarting;
} else {
return new NotRestartingState();
return ContainerState::NotRestarting;
}
}
public function GetContainerUpdateState(Container $container) : IContainerState
public function GetContainerUpdateState(Container $container) : VersionState
{
$tag = $container->GetImageTag();
if ($tag === '%AIO_CHANNEL%') {
@@ -106,28 +86,26 @@ class DockerActionManager
$runningDigests = $this->GetRepoDigestsOfContainer($container->GetIdentifier());
if ($runningDigests === null) {
return new VersionDifferentState();
return VersionState::Different;
}
$remoteDigest = $this->dockerHubManager->GetLatestDigestOfTag($container->GetContainerName(), $tag);
if ($remoteDigest === null) {
return new VersionEqualstate();
return VersionState::Equal;
}
foreach($runningDigests as $runningDigest) {
if ($runningDigest === $remoteDigest) {
return new VersionEqualState();
return VersionState::Equal;
}
}
return new VersionDifferentState();
return VersionState::Different;
}
public function GetContainerStartingState(Container $container) : IContainerState
public function GetContainerStartingState(Container $container) : ContainerState
{
$runningState = $this->GetContainerRunningState($container);
if ($runningState instanceof StoppedState) {
return new StoppedState();
} elseif ($runningState instanceof ImageDoesNotExistState) {
return new ImageDoesNotExistState();
if ($runningState === ContainerState::Stopped || $runningState === ContainerState::ImageDoesNotExist) {
return $runningState;
}
$containerName = $container->GetIdentifier();
@@ -142,12 +120,12 @@ class DockerActionManager
$connection = @fsockopen($containerName, (int)$internalPort, $errno, $errstr, 0.2);
if ($connection) {
fclose($connection);
return new RunningState();
return ContainerState::Running;
} else {
return new StartingState();
return ContainerState::Starting;
}
} else {
return new RunningState();
return ContainerState::Running;
}
}
@@ -287,12 +265,16 @@ class DockerActionManager
$replacements[1] = $this->configurationManager->GetBaseDN();
} elseif ($out[1] === 'AIO_TOKEN') {
$replacements[1] = $this->configurationManager->GetToken();
} elseif ($out[1] === 'BORGBACKUP_REMOTE_REPO') {
$replacements[1] = $this->configurationManager->GetBorgRemoteRepo();
} elseif ($out[1] === 'BORGBACKUP_MODE') {
$replacements[1] = $this->configurationManager->GetBackupMode();
} elseif ($out[1] === 'AIO_URL') {
$replacements[1] = $this->configurationManager->GetAIOURL();
} elseif ($out[1] === 'SELECTED_RESTORE_TIME') {
$replacements[1] = $this->configurationManager->GetSelectedRestoreTime();
} elseif ($out[1] === 'RESTORE_EXCLUDE_PREVIEWS') {
$replacements[1] = $this->configurationManager->GetRestoreExcludePreviews();
} elseif ($out[1] === 'APACHE_PORT') {
$replacements[1] = $this->configurationManager->GetApachePort();
} elseif ($out[1] === 'TALK_PORT') {
@@ -641,7 +623,7 @@ class DockerActionManager
$container = $this->containerDefinitionFetcher->GetContainerById($id);
$updateAvailable = "";
if ($container->GetUpdateState() instanceof VersionDifferentState) {
if ($container->GetUpdateState() === VersionState::Different) {
$updateAvailable = '1';
}
foreach ($container->GetDependsOn() as $dependency) {
@@ -758,16 +740,13 @@ class DockerActionManager
$output = json_decode($this->guzzleClient->get($url)->getBody()->getContents(), true);
$containerChecksum = $output['Image'];
$tagArray = explode(':', $output['Config']['Image']);
$tag = $tagArray[1];
apcu_add($cacheKey, $tag);
/**
* @psalm-suppress TypeDoesNotContainNull
* @psalm-suppress DocblockTypeContradiction
*/
if ($tag === null) {
if (count($tagArray) === 2) {
$tag = $tagArray[1];
} else {
error_log("No tag was found when getting the current channel. You probably did not follow the documentation correctly. Changing the channel to the default 'latest'.");
$tag = 'latest';
}
apcu_add($cacheKey, $tag);
return $tag;
} catch (\Exception $e) {
error_log('Could not get current channel ' . $e->getMessage());
@@ -802,7 +781,7 @@ class DockerActionManager
public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh') : void
{
if ($this->GetContainerStartingState($container) instanceof RunningState) {
if ($this->GetContainerStartingState($container) === ContainerState::Running) {
$containerName = $container->GetIdentifier();
@@ -866,44 +845,49 @@ class DockerActionManager
}
}
private function ConnectContainerIdToNetwork(string $id, string $internalPort, string $network = 'nextcloud-aio') : void
private function ConnectContainerIdToNetwork(string $id, string $internalPort, string $network = 'nextcloud-aio', bool $createNetwork = true, string $alias = '') : void
{
if ($internalPort === 'host') {
return;
}
$url = $this->BuildApiUrl('networks/create');
try {
$this->guzzleClient->request(
'POST',
$url,
[
'json' => [
'Name' => $network,
'CheckDuplicate' => true,
'Driver' => 'bridge',
'Internal' => false,
if ($createNetwork) {
$url = $this->BuildApiUrl('networks/create');
try {
$this->guzzleClient->request(
'POST',
$url,
[
'json' => [
'Name' => $network,
'CheckDuplicate' => true,
'Driver' => 'bridge',
'Internal' => false,
]
]
]
);
} catch (RequestException $e) {
// 409 is undocumented and gets thrown if the network already exists.
if ($e->getCode() !== 409) {
throw new \Exception("Could not create the nextcloud-aio network: " . $e->getMessage());
);
} catch (RequestException $e) {
// 409 is undocumented and gets thrown if the network already exists.
if ($e->getCode() !== 409) {
throw new \Exception("Could not create the nextcloud-aio network: " . $e->getMessage());
}
}
}
$url = $this->BuildApiUrl(
sprintf('networks/%s/connect', $network)
);
$jsonPayload = [ 'Container' => $id ];
if ($alias !== '' ) {
$jsonPayload['EndpointConfig'] = ['Aliases' => [ $alias ]];
}
try {
$this->guzzleClient->request(
'POST',
$url,
[
'json' => [
'container' => $id,
]
'json' => $jsonPayload
]
);
} catch (RequestException $e) {
@@ -923,7 +907,19 @@ class DockerActionManager
public function ConnectContainerToNetwork(Container $container) : void
{
$this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort());
// Add a secondary alias for domaincheck container, to keep it as similar to actual apache controller as possible.
// If a reverse-proxy is relying on container name as hostname this allows it to operate as usual and still validate the domain
// The domaincheck container and apache container are never supposed to be active at the same time because they use the same APACHE_PORT anyway, so this doesn't add any new constraints.
$alias = ($container->GetIdentifier() === 'nextcloud-aio-domaincheck') ? 'nextcloud-aio-apache' : '';
$this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), alias: $alias);
if ($container->GetIdentifier() === 'nextcloud-aio-apache' || $container->GetIdentifier() === 'nextcloud-aio-domaincheck') {
$apacheAdditionalNetwork = $this->configurationManager->GetApacheAdditionalNetwork();
if ($apacheAdditionalNetwork !== '') {
$this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), $apacheAdditionalNetwork, false, $alias);
}
}
}
public function StopContainer(Container $container) : void {
@@ -986,7 +982,7 @@ class DockerActionManager
public function isLoginAllowed() : bool {
$id = 'nextcloud-aio-apache';
$apacheContainer = $this->containerDefinitionFetcher->GetContainerById($id);
if ($this->GetContainerStartingState($apacheContainer) instanceof RunningState) {
if ($this->GetContainerStartingState($apacheContainer) === ContainerState::Running) {
return false;
}
return true;
@@ -995,7 +991,7 @@ class DockerActionManager
public function isBackupContainerRunning() : bool {
$id = 'nextcloud-aio-borgbackup';
$backupContainer = $this->containerDefinitionFetcher->GetContainerById($id);
if ($this->GetContainerRunningState($backupContainer) instanceof RunningState) {
if ($this->GetContainerRunningState($backupContainer) === ContainerState::Running) {
return true;
}
return false;

View File

@@ -6,12 +6,11 @@ use AIO\ContainerDefinitionFetcher;
use AIO\Data\ConfigurationManager;
use GuzzleHttp\Client;
class DockerHubManager
{
readonly class DockerHubManager {
private Client $guzzleClient;
public function __construct()
{
public function __construct(
) {
$this->guzzleClient = new Client();
}
@@ -59,4 +58,4 @@ class DockerHubManager
return null;
}
}
}
}

View File

@@ -8,12 +8,10 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
class AuthMiddleware
{
private AuthManager $authManager;
public function __construct(AuthManager $authManager) {
$this->authManager = $authManager;
readonly class AuthMiddleware {
public function __construct(
private AuthManager $authManager
) {
}
public function __invoke(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface

View File

@@ -3,17 +3,13 @@
namespace AIO\Twig;
use Slim\Csrf\Guard;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
class CsrfExtension extends \Twig\Extension\AbstractExtension implements \Twig\Extension\GlobalsInterface
{
/**
* @var Guard
*/
protected Guard $csrf;
public function __construct(Guard $csrf)
{
$this->csrf = $csrf;
class CsrfExtension extends AbstractExtension implements GlobalsInterface {
public function __construct(
protected Guard $csrf
) {
}
public function getGlobals() : array
@@ -35,4 +31,4 @@ class CsrfExtension extends \Twig\Extension\AbstractExtension implements \Twig\E
]
];
}
}
}

View File

@@ -1,5 +1,13 @@
{% extends "layout.twig" %}
{% block body %}
Already installed.
<div class="login">
<svg class="nextcloud-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 142 100" width="142" height="100">
<use href="/img/nextcloud-logo.svg#logo"></use>
<use href="/img/nextcloud-logo.svg#Nextcloud"></use>
<text x="10" y="50" fill="var(--color-nextcloud-logo)" class="fallback-text">Nextcloud Logo</text>
</svg>
<h2>Nextcloud All-In-One is already installed</h2>
<a href="/" class="button">Open Nextcloud AIO</a>
</div>
{% endblock %}

File diff suppressed because it is too large Load Diff

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