mirror of
https://github.com/nextcloud/all-in-one.git
synced 2026-05-21 10:50:10 +00:00
Compare commits
254 Commits
v9.7.0
...
helm-chart
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
920379213a | ||
|
|
421dc6ca5e | ||
|
|
b1353d309e | ||
|
|
e74436c3c1 | ||
|
|
21b5842813 | ||
|
|
be08b618b9 | ||
|
|
007efa0849 | ||
|
|
2d15a4f142 | ||
|
|
39cf8f7c99 | ||
|
|
dfdc7295f9 | ||
|
|
879114d215 | ||
|
|
a89765b641 | ||
|
|
ce7b5fd57a | ||
|
|
960e4a8ecf | ||
|
|
082dcc5553 | ||
|
|
0a9a0a8885 | ||
|
|
6855b4e073 | ||
|
|
0b2572c3f7 | ||
|
|
1c8503765c | ||
|
|
c7ce27b5aa | ||
|
|
ecd22e9074 | ||
|
|
e48c724259 | ||
|
|
96b822d5a0 | ||
|
|
6e8e0a4476 | ||
|
|
e800ed48f9 | ||
|
|
8cce894fee | ||
|
|
20ef99cbc5 | ||
|
|
9370d8c6e4 | ||
|
|
5485fc71a2 | ||
|
|
d866b542ed | ||
|
|
39b09cc80c | ||
|
|
6e1984c780 | ||
|
|
ef76cadb08 | ||
|
|
5a1a64ebec | ||
|
|
f436a224df | ||
|
|
069b414d81 | ||
|
|
cf6adc1075 | ||
|
|
f588b85f0a | ||
|
|
cad80a0ba3 | ||
|
|
e3019164d8 | ||
|
|
ed04fd8cbd | ||
|
|
fa39a08914 | ||
|
|
744e087192 | ||
|
|
f1e7868368 | ||
|
|
41e30b7c46 | ||
|
|
92488b1412 | ||
|
|
8dbe597ac0 | ||
|
|
5bdfa2466d | ||
|
|
f7de6f6704 | ||
|
|
ed28174020 | ||
|
|
36c0041305 | ||
|
|
2a3438fd56 | ||
|
|
c9c55be87b | ||
|
|
16e4f41ca7 | ||
|
|
057924f17f | ||
|
|
96f3dc7ab3 | ||
|
|
dc5a540ab7 | ||
|
|
af3f00c3cc | ||
|
|
47e0ac7b4d | ||
|
|
41c29b90a2 | ||
|
|
816921e2e2 | ||
|
|
aff6aecff6 | ||
|
|
875281e48d | ||
|
|
9b3b153d13 | ||
|
|
ce5287d4e2 | ||
|
|
596a4669fd | ||
|
|
6d51b673fc | ||
|
|
c0a5248e0e | ||
|
|
46343a958e | ||
|
|
24e2feb16a | ||
|
|
1697f43db3 | ||
|
|
b53e3ebaa6 | ||
|
|
6431e4dee8 | ||
|
|
45973ef12e | ||
|
|
267aebf941 | ||
|
|
ccf445a5d1 | ||
|
|
ada09ed674 | ||
|
|
0b3f63bf74 | ||
|
|
019664afc1 | ||
|
|
d32190660a | ||
|
|
fc33a7c7fd | ||
|
|
ceda2d694b | ||
|
|
b39354ac38 | ||
|
|
91913145d9 | ||
|
|
8fb7a21a72 | ||
|
|
2225fc589e | ||
|
|
6625813b8c | ||
|
|
5bc3cab1af | ||
|
|
a70fbd2137 | ||
|
|
135a42c36d | ||
|
|
ec226d7943 | ||
|
|
4302e37779 | ||
|
|
144df87b74 | ||
|
|
8e105857ab | ||
|
|
d904aff3ec | ||
|
|
76ae1fbbe9 | ||
|
|
3eeda1ea91 | ||
|
|
34a264d945 | ||
|
|
16a3c32ec3 | ||
|
|
30614ad9b6 | ||
|
|
b7355b12b7 | ||
|
|
d5b6e6653d | ||
|
|
7d286edc5f | ||
|
|
d6bd5b407a | ||
|
|
56864dde66 | ||
|
|
adc9c1ea44 | ||
|
|
4e2bb8f1a7 | ||
|
|
74e5a58a4c | ||
|
|
bcd3fd80ec | ||
|
|
01e10aa3f2 | ||
|
|
cd3a33a800 | ||
|
|
4a8e0c8415 | ||
|
|
e30b4562b2 | ||
|
|
798c250db2 | ||
|
|
57884a1c79 | ||
|
|
5125ec934f | ||
|
|
9deb2e0356 | ||
|
|
45a0350b16 | ||
|
|
72d1c2c14e | ||
|
|
4f808d2d67 | ||
|
|
d50ec29cf0 | ||
|
|
5c4d0b7a4a | ||
|
|
4c83aac666 | ||
|
|
ad32d0af9c | ||
|
|
b498f557cf | ||
|
|
8d81f56a9f | ||
|
|
bc36ce9aab | ||
|
|
f617a94af5 | ||
|
|
1632e14380 | ||
|
|
2f4acc52ad | ||
|
|
c686afb6da | ||
|
|
faecc028fe | ||
|
|
0d9a22346e | ||
|
|
5499bc8a5d | ||
|
|
f6cfa071a0 | ||
|
|
24a249be05 | ||
|
|
bb3236d3e5 | ||
|
|
9e2b86232f | ||
|
|
e9e444efbe | ||
|
|
096de1af7f | ||
|
|
7795bda828 | ||
|
|
a26dbfc0b1 | ||
|
|
b81ae86e8a | ||
|
|
89739b26ed | ||
|
|
347e83c08a | ||
|
|
5131a2f34a | ||
|
|
a625570c31 | ||
|
|
974ad1ef9b | ||
|
|
f5990cc0ef | ||
|
|
75c2407afa | ||
|
|
9df3a171da | ||
|
|
e73e272e31 | ||
|
|
4ad749a265 | ||
|
|
f644e83935 | ||
|
|
b5492f28ae | ||
|
|
9af90f00f8 | ||
|
|
d748134533 | ||
|
|
c823816a79 | ||
|
|
013306fff7 | ||
|
|
44ecde5d64 | ||
|
|
0ff08f00f1 | ||
|
|
315c29c81e | ||
|
|
329e2e7805 | ||
|
|
c78bffbff9 | ||
|
|
0f91f39dbe | ||
|
|
3ede76af8f | ||
|
|
bd799bd753 | ||
|
|
476d80ca54 | ||
|
|
4b51f85d98 | ||
|
|
d133e285d5 | ||
|
|
ccf21e065c | ||
|
|
9316555ecb | ||
|
|
95c20fdfff | ||
|
|
cf8ba936c9 | ||
|
|
af975f6fde | ||
|
|
1d96efe07c | ||
|
|
a02d1644f7 | ||
|
|
6a74ab6363 | ||
|
|
335ed24469 | ||
|
|
40ab0f9f9e | ||
|
|
eac7d4fd88 | ||
|
|
d2adea5fe4 | ||
|
|
d2f00b44d4 | ||
|
|
017ed64f6b | ||
|
|
b814a51d0b | ||
|
|
37d4366392 | ||
|
|
4ff189fce1 | ||
|
|
dc9d10d4e6 | ||
|
|
55b5469260 | ||
|
|
3f3ae167e9 | ||
|
|
d35d97b316 | ||
|
|
a0ce2c1bec | ||
|
|
67944aa009 | ||
|
|
c183fe3d4c | ||
|
|
0066ad6a37 | ||
|
|
459edf573c | ||
|
|
bdc782e74c | ||
|
|
997b986dfe | ||
|
|
68d75dc01a | ||
|
|
d9142871f6 | ||
|
|
680310c3e8 | ||
|
|
026b1b87fa | ||
|
|
5849a1fce9 | ||
|
|
3dfbf3d9ab | ||
|
|
bff1d6138b | ||
|
|
5100bcddda | ||
|
|
86e2d559d2 | ||
|
|
a1bc150612 | ||
|
|
70e31a40b4 | ||
|
|
5b4edc2c34 | ||
|
|
4be6d492ea | ||
|
|
42a39397e4 | ||
|
|
8fae9b669f | ||
|
|
9bf38d2795 | ||
|
|
0e960b8ca4 | ||
|
|
327c91d0b7 | ||
|
|
2d78730f75 | ||
|
|
9da4094ff8 | ||
|
|
0067ec3bca | ||
|
|
a530cee7e4 | ||
|
|
737decb114 | ||
|
|
7da2f3da65 | ||
|
|
fa9ae2bc53 | ||
|
|
99caab3625 | ||
|
|
de372c11f3 | ||
|
|
a5b25ab56b | ||
|
|
2b6e81c074 | ||
|
|
97dcab58d8 | ||
|
|
814a1eca53 | ||
|
|
7ac2d60e51 | ||
|
|
80e7f45748 | ||
|
|
fb3c8ec4de | ||
|
|
6e26dfccaf | ||
|
|
45317e3304 | ||
|
|
d9f8bfebfa | ||
|
|
908ebe0b97 | ||
|
|
e6c6b170e5 | ||
|
|
3ffc511c10 | ||
|
|
5cf711399f | ||
|
|
266526557d | ||
|
|
6e0c76a23b | ||
|
|
9130cff804 | ||
|
|
e2f76b8685 | ||
|
|
2c81cb0a0a | ||
|
|
83ac2a0c99 | ||
|
|
17362bc234 | ||
|
|
1f144b9ee7 | ||
|
|
10495fd56e | ||
|
|
9b25f8b061 | ||
|
|
e45bd1ef2d | ||
|
|
e4528678b1 | ||
|
|
6b30744fc3 | ||
|
|
0051b04683 | ||
|
|
e52e5df09b |
4
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
4
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: 🐛 Bug report
|
||||
about: Help us improving by reporting a bug
|
||||
name: 🐛 Bug report - no questions and no support!
|
||||
about: Help us improving by reporting a bug - this category is not for questions and also not for support! Please use one of the options below for questions and support
|
||||
labels: 0. Needs triage
|
||||
---
|
||||
|
||||
|
||||
10
.github/ISSUE_TEMPLATE/config.yml
vendored
10
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,14 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: ⛑️ General questions and support
|
||||
url: https://help.nextcloud.com/tag/aio
|
||||
about: For general questions, support and help
|
||||
- name: 💡 Suggest a new feature or discuss one
|
||||
url: https://github.com/nextcloud/all-in-one/discussions/categories/ideas
|
||||
about: For new feature requests and discussion of existing ones
|
||||
- name: ❓ Questions on AIO
|
||||
- name: ❓ Questions about Nextcloud AIO
|
||||
url: https://github.com/nextcloud/all-in-one/discussions/categories/questions
|
||||
about: For questions regarding AIO
|
||||
- name: ⛑️ Community Support and Help
|
||||
url: https://help.nextcloud.com/tag/aio
|
||||
about: For other types of questions
|
||||
about: For questions specifically about AIO
|
||||
- name: 💼 Nextcloud Enterprise
|
||||
url: https://portal.nextcloud.com/
|
||||
about: If you are a Nextcloud Enterprise customer, or need Professional support, so it can be resolved directly by our dedicated engineers more quickly
|
||||
72
.github/workflows/json-validator.yml
vendored
72
.github/workflows/json-validator.yml
vendored
@@ -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
|
||||
|
||||
8
.github/workflows/nextcloud-update.yml
vendored
8
.github/workflows/nextcloud-update.yml
vendored
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
# Imagick
|
||||
imagick_version="$(
|
||||
git ls-remote --tags https://github.com/Imagick/imagick.git \
|
||||
git ls-remote --tags https://github.com/imagick/imagick.git \
|
||||
| cut -d/ -f3 \
|
||||
| grep -viE '[a-z]' \
|
||||
| tr -d '^{}' \
|
||||
@@ -60,6 +60,12 @@ jobs:
|
||||
)"
|
||||
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="$(
|
||||
git ls-remote --tags https://github.com/igbinary/igbinary.git \
|
||||
|
||||
11
.github/workflows/update-copyright.yml
vendored
Normal file
11
.github/workflows/update-copyright.yml
vendored
Normal 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
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,24 +550,40 @@ 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 >/dev/null; 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
|
||||
else
|
||||
echo "Everything looks fine so feel free to continue!"
|
||||
exit 0
|
||||
if ! borg list | grep "nextcloud-aio"; then
|
||||
echo "The backup archive does not contain a valid Nextcloud AIO backup."
|
||||
echo "Most likely was the archive not created via Nextcloud AIO."
|
||||
exit 1
|
||||
else
|
||||
echo "Everything looks fine so feel free to continue!"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
11
Containers/borgbackup/borg_excludes
Normal file
11
Containers/borgbackup/borg_excludes
Normal 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*
|
||||
@@ -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
|
||||
|
||||
@@ -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-7
|
||||
FROM clamav/clamav:1.4.1-14
|
||||
|
||||
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"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# AIO settings
|
||||
MaxDirectoryRecursion 30
|
||||
MaxFileSize 10G
|
||||
PCREMaxFileSize 10G
|
||||
StreamMaxLength 10G
|
||||
MaxFileSize 16G
|
||||
PCREMaxFileSize 16G
|
||||
StreamMaxLength 16G
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Adjust settings
|
||||
cat /etc/clamav/clamd.conf > /tmp/clamd.conf
|
||||
CLAMAV_FILE="$(sed "s|10G|$MAX_SIZE|" /clamav.conf)"
|
||||
CLAMAV_FILE="$(sed "s|16G|$MAX_SIZE|" /clamav.conf)"
|
||||
echo "$CLAMAV_FILE" >> /tmp/clamd.conf
|
||||
|
||||
@@ -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.8.1.1
|
||||
FROM collabora/code:24.04.10.1.1
|
||||
|
||||
USER root
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -22,7 +22,12 @@ frontend http
|
||||
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/nc_app_[a-zA-Z0-9_.-]+/((start)|(stop)) } METH_POST
|
||||
# container rm: DELETE containers/%s
|
||||
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/nc_app_[a-zA-Z0-9_.-]+ } METH_DELETE
|
||||
|
||||
# container update/exec: POST containers/%s/update containers/%s/exec
|
||||
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/nc_app_[a-zA-Z0-9_.-]+/((update)|(exec)) } METH_POST
|
||||
# container put: PUT containers/%s/archive
|
||||
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers/nc_app_[a-zA-Z0-9_.-]+/archive } METH_PUT
|
||||
# run exec instance: POST exec/%s
|
||||
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/exec/[a-zA-Z0-9_.-]+/start } METH_POST
|
||||
|
||||
# container create: POST containers/create?name=%s
|
||||
# ACL to restrict container name to nc_app_[a-zA-Z0-9_.-]+
|
||||
|
||||
@@ -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.2
|
||||
FROM elasticsearch:8.16.1
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# syntax=docker/dockerfile:latest
|
||||
FROM golang:1.23.2-alpine3.20 AS go
|
||||
FROM golang:1.23.3-alpine3.20 AS go
|
||||
|
||||
ENV IMAGINARY_HASH=8f36a26c448be8c151a3878404b75fcd1cd3cf0c
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.12-fpm-alpine3.20
|
||||
FROM php:8.3.14-fpm-alpine3.20
|
||||
|
||||
EXPOSE 80
|
||||
EXPOSE 8080
|
||||
|
||||
@@ -137,7 +137,7 @@ It is set to '$NEXTCLOUD_DATADIR'."
|
||||
fi
|
||||
if [ -n "$NEXTCLOUD_MOUNT" ]; then
|
||||
if ! echo "$NEXTCLOUD_MOUNT" | grep -q "^/" || [ "$NEXTCLOUD_MOUNT" = "/" ]; then
|
||||
print_red "You've set NEXCLOUD_MOUNT but not to an allowed value.
|
||||
print_red "You've set NEXTCLOUD_MOUNT but not to an allowed value.
|
||||
The string must start with '/' and must not be equal to '/'.
|
||||
It is set to '$NEXTCLOUD_MOUNT'."
|
||||
exit 1
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
# syntax=docker/dockerfile:latest
|
||||
FROM php:8.2.24-fpm-alpine3.20
|
||||
FROM php:8.3.14-fpm-alpine3.20
|
||||
|
||||
ENV PHP_MEMORY_LIMIT=512M
|
||||
ENV PHP_UPLOAD_LIMIT=10G
|
||||
ENV PHP_UPLOAD_LIMIT=16G
|
||||
ENV PHP_MAX_TIME=3600
|
||||
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.8
|
||||
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,11 +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 -D 'enable-memcached-igbinary="yes"' memcached-3.2.0; \
|
||||
pecl install -D 'enable-redis-igbinary="yes" enable-redis-zstd="yes" enable-redis-lz4="yes"' redis-6.1.0; \
|
||||
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 \
|
||||
@@ -134,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; \
|
||||
@@ -221,6 +238,7 @@ RUN set -ex; \
|
||||
sudo \
|
||||
grep \
|
||||
nodejs \
|
||||
libreoffice \
|
||||
bind-tools \
|
||||
imagemagick \
|
||||
imagemagick-svg \
|
||||
@@ -254,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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.1.1
|
||||
|
||||
# USER root is probably used
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# syntax=docker/dockerfile:latest
|
||||
# From https://github.com/docker-library/postgres/blob/master/16/alpine3.20/Dockerfile
|
||||
FROM postgres:16.4-alpine
|
||||
FROM postgres:16.6-alpine
|
||||
|
||||
COPY --chmod=775 start.sh /start.sh
|
||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||
@@ -39,7 +39,7 @@ RUN set -ex; \
|
||||
|
||||
VOLUME /mnt/data
|
||||
|
||||
USER postgres
|
||||
USER 999
|
||||
ENTRYPOINT ["/start.sh"]
|
||||
|
||||
HEALTHCHECK CMD /healthcheck.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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# syntax=docker/dockerfile:latest
|
||||
FROM nats:2.10.21-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
|
||||
ARG JANUS_VERSION=v0.15.0
|
||||
WORKDIR /src
|
||||
RUN set -ex; \
|
||||
apk add --no-cache \
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# syntax=docker/dockerfile:latest
|
||||
FROM ghcr.io/nextcloud-releases/whiteboard:v1.0.3
|
||||
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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -3,22 +3,15 @@ This container bundles Local AI and auto-configures it for you.
|
||||
|
||||
### Notes
|
||||
- Make sure to have enough storage space available. This container alone needs ~7GB storage. Every model that you add to `models.yaml` will of course use additional space which adds up quite fast.
|
||||
- After the container was started the first time, you should see a new `nextcloud-aio-local-ai` folder when you open the files app with the default `admin` user. In there you should see a `models.yaml` config file. You can now add models in there. Please refer [here](https://github.com/go-skynet/model-gallery/blob/main/index.yaml) where you can get further urls that you can put in there. Afterwards restart all containers from the AIO interface and the models should automatically get downloaded by the local-ai container and activated.
|
||||
- After the container was started the first time, you should see a new `nextcloud-aio-local-ai` folder when you open the files app with the default `admin` user. In there you should see a `models.yaml` config file. You can now add models in there. Please refer [here](https://github.com/mudler/LocalAI/blob/master/gallery/index.yaml) where you can get further urls that you can put in there. Afterwards restart all containers from the AIO interface and the models should automatically get downloaded by the local-ai container and activated.
|
||||
- Example for content of `models.yaml` (if you add all of them, it takes around 10GB additional space):
|
||||
```yaml
|
||||
# Stable Diffusion in NCNN with c++, supported txt2img and img2img
|
||||
- url: github:go-skynet/model-gallery/stablediffusion.yaml
|
||||
- url: github:mudler/LocalAI/gallery/stablediffusion.yaml
|
||||
name: Stable_diffusion
|
||||
|
||||
# Port of OpenAI's Whisper model in C/C++
|
||||
- url: github:go-skynet/model-gallery/whisper-base.yaml
|
||||
name: whisper-1
|
||||
|
||||
# A commercially licensable model based on GPT-J and trained by Nomic AI on the v0 GPT4All dataset.
|
||||
- url: github:go-skynet/model-gallery/gpt4all-j.yaml
|
||||
name: gpt4all-j
|
||||
```
|
||||
- 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
|
||||
|
||||
@@ -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!
|
||||
|
||||
48
compose.yaml
48
compose.yaml
@@ -14,40 +14,56 @@ 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
|
||||
# NEXTCLOUD_MOUNT: /mnt/ # Allows the Nextcloud container to access the chosen directory on the host. See https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host
|
||||
# NEXTCLOUD_UPLOAD_LIMIT: 10G # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud
|
||||
# NEXTCLOUD_UPLOAD_LIMIT: 16G # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud
|
||||
# NEXTCLOUD_MAX_TIME: 3600 # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud
|
||||
# NEXTCLOUD_MEMORY_LIMIT: 512M # Can be adjusted if you need more. See https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud
|
||||
# NEXTCLOUD_TRUSTED_CACERTS_DIR: /path/to/my/cacerts # CA certificates in this directory will be trusted by the OS of the nexcloud container (Useful e.g. for LDAPS) See See https://github.com/nextcloud/all-in-one#how-to-trust-user-defined-certification-authorities-ca
|
||||
# NEXTCLOUD_TRUSTED_CACERTS_DIR: /path/to/my/cacerts # CA certificates in this directory will be trusted by the OS of the nextcloud container (Useful e.g. for LDAPS) See See https://github.com/nextcloud/all-in-one#how-to-trust-user-defined-certification-authorities-ca
|
||||
# NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # Allows to modify the Nextcloud apps that are installed on starting AIO the first time. See https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup
|
||||
# NEXTCLOUD_ADDITIONAL_APKS: imagemagick # This allows to add additional packages to the Nextcloud container permanently. Default is imagemagick but can be overwritten by modifying this value. See https://github.com/nextcloud/all-in-one#how-to-add-os-packages-permanently-to-the-nextcloud-container
|
||||
# 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:
|
||||
|
||||
@@ -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
|
||||
```
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,8 +196,6 @@ services:
|
||||
volumes:
|
||||
- nextcloud_aio_redis:/data:rw
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- nextcloud-aio
|
||||
read_only: true
|
||||
cap_drop:
|
||||
- NET_RAW
|
||||
@@ -221,8 +215,6 @@ services:
|
||||
restart: unless-stopped
|
||||
profiles:
|
||||
- collabora
|
||||
networks:
|
||||
- nextcloud-aio
|
||||
cap_add:
|
||||
- MKNOD
|
||||
- SYS_ADMIN
|
||||
@@ -231,6 +223,7 @@ services:
|
||||
|
||||
nextcloud-aio-talk:
|
||||
image: nextcloud/aio-talk:latest
|
||||
user: "1000"
|
||||
init: true
|
||||
ports:
|
||||
- ${TALK_PORT}:${TALK_PORT}/tcp
|
||||
@@ -238,19 +231,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,29 +254,30 @@ 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}
|
||||
volumes:
|
||||
- nextcloud_aio_talk_recording:/tmp:rw
|
||||
shm_size: 2147483648
|
||||
restart: unless-stopped
|
||||
profiles:
|
||||
- talk-recording
|
||||
networks:
|
||||
- nextcloud-aio
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /tmp
|
||||
- /conf
|
||||
cap_drop:
|
||||
- NET_RAW
|
||||
|
||||
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
|
||||
|
||||
@@ -413,9 +397,11 @@ volumes:
|
||||
name: nextcloud_aio_onlyoffice
|
||||
nextcloud_aio_redis:
|
||||
name: nextcloud_aio_redis
|
||||
nextcloud_aio_talk_recording:
|
||||
name: nextcloud_aio_talk_recording
|
||||
nextcloud_aio_nextcloud_data:
|
||||
name: nextcloud_aio_nextcloud_data
|
||||
|
||||
networks:
|
||||
nextcloud-aio:
|
||||
name: nextcloud-aio
|
||||
default:
|
||||
driver: bridge
|
||||
|
||||
@@ -22,7 +22,7 @@ TALK_RECORDING_ENABLED="no" # Setting this to "yes" (with quotes) enabl
|
||||
WHITEBOARD_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
|
||||
|
||||
APACHE_IP_BINDING=0.0.0.0 # This can be changed to e.g. 127.0.0.1 if you want to run AIO behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) and if that is running on the same host and using localhost to connect
|
||||
APACHE_MAX_SIZE=10737418240 # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT
|
||||
APACHE_MAX_SIZE=17179869184 # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT
|
||||
APACHE_PORT=443 # Changing this to a different value than 443 will allow you to run it behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else).
|
||||
COLLABORA_DICTIONARIES="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru" # You can change this in order to enable other dictionaries for collabora
|
||||
COLLABORA_SECCOMP_POLICY=--o:security.seccomp=true # Changing the value to false allows to disable the seccomp feature of the Collabora container.
|
||||
@@ -35,7 +35,7 @@ NEXTCLOUD_MEMORY_LIMIT=512M # This allows to change the PHP memory limi
|
||||
NEXTCLOUD_MOUNT=/mnt/ # This allows the Nextcloud container to access directories on the host. It must never be equal to the value of NEXTCLOUD_DATADIR!
|
||||
NEXTCLOUD_STARTUP_APPS="deck twofactor_totp tasks calendar contacts notes" # Allows to modify the Nextcloud apps that are installed on starting AIO the first time
|
||||
NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates/my-custom-ca # Nextcloud container will trust all the Certification Authorities, whose certificates are included in the given directory.
|
||||
NEXTCLOUD_UPLOAD_LIMIT=10G # This allows to change the upload limit of the Nextcloud container
|
||||
NEXTCLOUD_UPLOAD_LIMIT=16G # This allows to change the upload limit of the Nextcloud container
|
||||
REMOVE_DISABLED_APPS=yes # Setting this to no keep Nextcloud apps that are disabled via their switch and not uninstall them if they should be installed in Nextcloud.
|
||||
TALK_PORT=3478 # This allows to adjust the port that the talk container is using.
|
||||
UPDATE_NEXTCLOUD_APPS="no" # When setting to "yes" (with quotes), it will automatically update all installed Nextcloud apps upon container startup on saturdays.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -76,9 +78,9 @@ sed -i 's|COLLABORA_ENABLED=no|COLLABORA_ENABLED="yes"|' sample.conf
|
||||
sed -i 's|COLLABORA_DICTIONARIES=|COLLABORA_DICTIONARIES="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru" # You can change this in order to enable other dictionaries for collabora|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_DATADIR=|NEXTCLOUD_DATADIR=nextcloud_aio_nextcloud_data # You can change this to e.g. "/mnt/ncdata" to map it to a location on your host. It needs to be adjusted before the first startup and never afterwards!|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_MOUNT=|NEXTCLOUD_MOUNT=/mnt/ # This allows the Nextcloud container to access directories on the host. It must never be equal to the value of NEXTCLOUD_DATADIR!|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_UPLOAD_LIMIT=|NEXTCLOUD_UPLOAD_LIMIT=10G # This allows to change the upload limit of the Nextcloud container|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_UPLOAD_LIMIT=|NEXTCLOUD_UPLOAD_LIMIT=16G # This allows to change the upload limit of the Nextcloud container|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_MEMORY_LIMIT=|NEXTCLOUD_MEMORY_LIMIT=512M # This allows to change the PHP memory limit of the Nextcloud container|' sample.conf
|
||||
sed -i 's|APACHE_MAX_SIZE=|APACHE_MAX_SIZE=10737418240 # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT|' sample.conf
|
||||
sed -i 's|APACHE_MAX_SIZE=|APACHE_MAX_SIZE=17179869184 # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_MAX_TIME=|NEXTCLOUD_MAX_TIME=3600 # This allows to change the upload time limit of the Nextcloud container|' sample.conf
|
||||
sed -i 's|NEXTCLOUD_TRUSTED_CACERTS_DIR=|NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates/my-custom-ca # Nextcloud container will trust all the Certification Authorities, whose certificates are included in the given directory.|' sample.conf
|
||||
sed -i 's|UPDATE_NEXTCLOUD_APPS=|UPDATE_NEXTCLOUD_APPS="no" # When setting to "yes" (with quotes), it will automatically update all installed Nextcloud apps upon container startup on saturdays.|' sample.conf
|
||||
@@ -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
|
||||
|
||||
@@ -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: 10.0.0-beta
|
||||
apiVersion: v2
|
||||
keywords:
|
||||
- latest
|
||||
|
||||
@@ -23,19 +23,18 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-apache
|
||||
spec:
|
||||
initContainers:
|
||||
- name: init-volumes
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- chmod
|
||||
- "777"
|
||||
- /nextcloud-aio-nextcloud
|
||||
- /nextcloud-aio-apache
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-apache
|
||||
mountPath: /nextcloud-aio-apache
|
||||
- name: nextcloud-aio-nextcloud
|
||||
mountPath: /nextcloud-aio-nextcloud
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 33
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 33
|
||||
runAsGroup: 33
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: ADDITIONAL_TRUSTED_DOMAIN
|
||||
@@ -64,7 +63,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:20241125_091756
|
||||
name: nextcloud-aio-apache
|
||||
ports:
|
||||
- containerPort: {{ .Values.APACHE_PORT }}
|
||||
@@ -72,9 +71,15 @@ spec:
|
||||
- containerPort: {{ .Values.APACHE_PORT }}
|
||||
protocol: UDP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /var/www/html
|
||||
name: nextcloud-aio-nextcloud
|
||||
|
||||
@@ -24,27 +24,38 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-clamav
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 100
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 100
|
||||
runAsGroup: 100
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
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
|
||||
- /nextcloud-aio-clamav
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-clamav
|
||||
mountPath: /nextcloud-aio-clamav
|
||||
- name: init-volumes
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- chown
|
||||
- 100:100
|
||||
- "-R"
|
||||
- /nextcloud-aio-clamav
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-clamav
|
||||
mountPath: /nextcloud-aio-clamav
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
containers:
|
||||
- env:
|
||||
- name: CLAMD_STARTUP_TIMEOUT
|
||||
@@ -53,15 +64,21 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-clamav
|
||||
ports:
|
||||
- containerPort: 3310
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /var/lib/clamav
|
||||
subPath: data
|
||||
|
||||
@@ -36,7 +36,7 @@ spec:
|
||||
value: --o:ssl.enable=false --o:ssl.termination=true --o:mount_jail_tree=false --o:logging.level=warning --o:home_mode.enable=true {{ .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:20241125_091756
|
||||
name: nextcloud-aio-collabora
|
||||
ports:
|
||||
- containerPort: 9980
|
||||
@@ -45,7 +45,5 @@ spec:
|
||||
capabilities:
|
||||
add:
|
||||
- MKNOD
|
||||
- SYS_ADMIN
|
||||
drop:
|
||||
- NET_RAW
|
||||
- CAP_SYS_ADMIN
|
||||
{{- end }}
|
||||
|
||||
@@ -23,33 +23,38 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-database
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 999
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 999
|
||||
runAsGroup: 999
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
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
|
||||
- /nextcloud-aio-database
|
||||
- /nextcloud-aio-database-dump
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-database-dump
|
||||
mountPath: /nextcloud-aio-database-dump
|
||||
- name: nextcloud-aio-database
|
||||
mountPath: /nextcloud-aio-database
|
||||
- name: init-volumes
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- chown
|
||||
- 999:999
|
||||
- "-R"
|
||||
- /nextcloud-aio-database
|
||||
- /nextcloud-aio-database-dump
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-database-dump
|
||||
mountPath: /nextcloud-aio-database-dump
|
||||
- name: nextcloud-aio-database
|
||||
mountPath: /nextcloud-aio-database
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
containers:
|
||||
- env:
|
||||
- name: PGTZ
|
||||
@@ -62,15 +67,21 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-database
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /var/lib/postgresql/data
|
||||
subPath: data
|
||||
|
||||
@@ -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,15 +56,11 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-fulltextsearch
|
||||
ports:
|
||||
- containerPort: 9200
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
volumeMounts:
|
||||
- mountPath: /usr/share/elasticsearch/data
|
||||
name: nextcloud-aio-elasticsearch
|
||||
|
||||
@@ -22,21 +22,38 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-imaginary
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 65534
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 65534
|
||||
runAsGroup: 65534
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: IMAGINARY_SECRET
|
||||
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:20241125_091756
|
||||
name: nextcloud-aio-imaginary
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add:
|
||||
- SYS_NICE
|
||||
drop:
|
||||
- NET_RAW
|
||||
- NET_BIND_SERVICE
|
||||
{{- end }}
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -23,20 +23,24 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-nextcloud
|
||||
spec:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 33
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 33
|
||||
runAsGroup: 33
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
{{- end }} # AIO-config - do not change this comment!
|
||||
# AIO settings start # Do not remove or change this line!
|
||||
initContainers:
|
||||
- name: "delete-lost-found"
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- rm
|
||||
- "-rf"
|
||||
- "/nextcloud-aio-nextcloud/lost+found"
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-nextcloud-trusted-cacerts
|
||||
mountPath: /nextcloud-aio-nextcloud-trusted-cacerts
|
||||
- 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"
|
||||
@@ -47,6 +51,7 @@ spec:
|
||||
mountPath: /nextcloud-aio-nextcloud-trusted-cacerts
|
||||
- name: nextcloud-aio-nextcloud
|
||||
mountPath: /nextcloud-aio-nextcloud
|
||||
# AIO settings end # Do not remove or change this line!
|
||||
containers:
|
||||
- env:
|
||||
- name: SMTP_HOST
|
||||
@@ -173,17 +178,25 @@ 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:20241125_091756
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
{{- end }} # AIO-config - do not change this comment!
|
||||
name: nextcloud-aio-nextcloud
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
protocol: TCP
|
||||
- containerPort: 9001
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
volumeMounts:
|
||||
- mountPath: /var/www/html
|
||||
name: nextcloud-aio-nextcloud
|
||||
|
||||
@@ -23,16 +23,18 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-notify-push
|
||||
spec:
|
||||
initContainers:
|
||||
- name: init-volumes
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- chmod
|
||||
- "777"
|
||||
- /nextcloud-aio-nextcloud
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-nextcloud
|
||||
mountPath: /nextcloud-aio-nextcloud
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 33
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 33
|
||||
runAsGroup: 33
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: NC_DOMAIN
|
||||
@@ -53,15 +55,21 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-notify-push
|
||||
ports:
|
||||
- containerPort: 7867
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /nextcloud
|
||||
name: nextcloud-aio-nextcloud
|
||||
|
||||
@@ -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,15 +44,11 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-onlyoffice
|
||||
ports:
|
||||
- containerPort: 80
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
volumeMounts:
|
||||
- mountPath: /var/lib/onlyoffice
|
||||
name: nextcloud-aio-onlyoffice
|
||||
|
||||
@@ -23,31 +23,39 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-redis
|
||||
spec:
|
||||
initContainers:
|
||||
- name: init-volumes
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
command:
|
||||
- chmod
|
||||
- "777"
|
||||
- /nextcloud-aio-redis
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-redis
|
||||
mountPath: /nextcloud-aio-redis
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 999
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 999
|
||||
runAsGroup: 999
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: REDIS_HOST_PASSWORD
|
||||
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:20241125_091756
|
||||
name: nextcloud-aio-redis
|
||||
ports:
|
||||
- containerPort: 6379
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /data
|
||||
name: nextcloud-aio-redis
|
||||
|
||||
@@ -22,6 +22,18 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-talk
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 1000
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 1000
|
||||
runAsGroup: 1000
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: TALK_MAX_STREAM_BITRATE
|
||||
@@ -42,7 +54,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:20241125_091756
|
||||
name: nextcloud-aio-talk
|
||||
ports:
|
||||
- containerPort: {{ .Values.TALK_PORT }}
|
||||
@@ -52,7 +64,13 @@ spec:
|
||||
- containerPort: 8081
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
{{- end }}
|
||||
|
||||
@@ -14,6 +14,8 @@ spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
io.kompose.service: nextcloud-aio-talk-recording
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
@@ -22,6 +24,18 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-talk-recording
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 122
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 122
|
||||
runAsGroup: 122
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: INTERNAL_SECRET
|
||||
@@ -32,13 +46,26 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-talk-recording
|
||||
ports:
|
||||
- containerPort: 1234
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
volumeMounts:
|
||||
- mountPath: /tmp
|
||||
name: nextcloud-aio-talk-recording
|
||||
volumes:
|
||||
- name: nextcloud-aio-talk-recording
|
||||
persistentVolumeClaim:
|
||||
claimName: nextcloud-aio-talk-recording
|
||||
{{- end }}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
{{- if eq .Values.TALK_RECORDING_ENABLED "yes" }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-talk-recording
|
||||
name: nextcloud-aio-talk-recording
|
||||
namespace: "{{ .Values.NAMESPACE }}"
|
||||
spec:
|
||||
{{- if .Values.STORAGE_CLASS }}
|
||||
storageClassName: {{ .Values.STORAGE_CLASS }}
|
||||
{{- end }}
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.TALK_RECORDING_STORAGE_SIZE }}
|
||||
{{- end }}
|
||||
@@ -22,6 +22,18 @@ spec:
|
||||
labels:
|
||||
io.kompose.service: nextcloud-aio-whiteboard
|
||||
spec:
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: 65534
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: 65534
|
||||
runAsGroup: 65534
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
containers:
|
||||
- env:
|
||||
- name: JWT_SECRET_KEY
|
||||
@@ -36,13 +48,19 @@ 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:20241125_091756
|
||||
name: nextcloud-aio-whiteboard
|
||||
ports:
|
||||
- containerPort: 3002
|
||||
protocol: TCP
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- NET_RAW
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
{{- end }}
|
||||
|
||||
@@ -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,12 +45,18 @@ 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
|
||||
yq -i 'del(.services.[].tmpfs)' latest.yml
|
||||
# Remove cap_drop in order to add it later again easier
|
||||
yq -i 'del(.services.[].cap_drop)' latest.yml
|
||||
# Remove SYS_NICE for imaginary as it is not supported with RPSS
|
||||
sed -i "s|- SYS_NICE$|- NET_BIND_SERVICE|" latest.yml
|
||||
# cap SYS_ADMIN is called CAP_SYS_ADMIN in k8s
|
||||
sed -i "s|- SYS_ADMIN$|- CAP_SYS_ADMIN|" latest.yml
|
||||
|
||||
cat latest.yml
|
||||
kompose convert -c -f latest.yml --namespace nextcloud-aio-namespace
|
||||
cd latest
|
||||
@@ -59,7 +69,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,53 +78,41 @@ 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"
|
||||
command:
|
||||
- chown
|
||||
- 999:999
|
||||
- "-R"
|
||||
volumeMountsInitContainer:
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-database
|
||||
mountPath: /nextcloud-aio-database
|
||||
securityContext:
|
||||
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"
|
||||
command:
|
||||
- chown
|
||||
- 100:100
|
||||
- "-R"
|
||||
volumeMountsInitContainer:
|
||||
volumeMounts:
|
||||
- name: nextcloud-aio-clamav
|
||||
mountPath: /nextcloud-aio-clamav
|
||||
securityContext:
|
||||
EOL
|
||||
cat << EOL > /tmp/initcontainers.nextcloud
|
||||
# AIO settings start # Do not remove or change this line!
|
||||
initContainers:
|
||||
- name: "delete-lost-found"
|
||||
image: "{{ .Values.IMAGE_MIRROR_PREFIX }}{{ .Values.ALPINE_IMAGE_ORG }}alpine"
|
||||
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"
|
||||
volumeMountsInitContainer:
|
||||
# AIO settings end # Do not remove or change this line!
|
||||
EOL
|
||||
|
||||
# shellcheck disable=SC1083
|
||||
DEPLOYMENTS="$(find ./ -name '*deployment.yaml')"
|
||||
mapfile -t DEPLOYMENTS <<< "$DEPLOYMENTS"
|
||||
@@ -126,7 +124,7 @@ for variable in "${DEPLOYMENTS[@]}"; do
|
||||
sed -i "/^ spec:/r /tmp/initcontainers.clamav" "$variable"
|
||||
elif echo "$variable" | grep -q "nextcloud-deployment.yaml"; then
|
||||
sed -i "/^ spec:/r /tmp/initcontainers.nextcloud" "$variable"
|
||||
else
|
||||
elif echo "$variable" | grep -q "fulltextsearch" || echo "$variable" | grep -q "onlyoffice" || echo "$variable" | grep -q "collabora"; then
|
||||
sed -i "/^ spec:/r /tmp/initcontainers" "$variable"
|
||||
fi
|
||||
volumeNames="$(grep -A1 mountPath "$variable" | grep -v mountPath | sed 's|.*name: ||' | sed '/^--$/d')"
|
||||
@@ -136,7 +134,6 @@ for variable in "${DEPLOYMENTS[@]}"; do
|
||||
if [ "$volumeName" != "nextcloud-aio-nextcloud-data" ]; then
|
||||
sed -i "/^.*volumeMountsInitContainer:/i\ \ \ \ \ \ \ \ \ \ \ \ - /$volumeName" "$variable"
|
||||
sed -i "/volumeMountsInitContainer:/a\ \ \ \ \ \ \ \ \ \ \ \ - name: $volumeName\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ mountPath: /$volumeName" "$variable"
|
||||
sed -i "/volumeMountsInitRmLostFound:/a\ \ \ \ \ \ \ \ \ \ \ \ - name: $volumeName\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ mountPath: /$volumeName" "$variable"
|
||||
# Workaround for the database volume
|
||||
if [ "$volumeName" = nextcloud-aio-database ]; then
|
||||
sed -i "/mountPath: \/var\/lib\/postgresql\/data/a\ \ \ \ \ \ \ \ \ \ \ \ \ \ subPath: data" "$variable"
|
||||
@@ -147,7 +144,6 @@ for variable in "${DEPLOYMENTS[@]}"; do
|
||||
fi
|
||||
done
|
||||
sed -i "s|volumeMountsInitContainer:|volumeMounts:|" "$variable"
|
||||
sed -i "s|volumeMountsInitRmLostFound:|volumeMounts:|" "$variable"
|
||||
if grep -q claimName "$variable"; then
|
||||
claimNames="$(grep claimName "$variable")"
|
||||
mapfile -t claimNames <<< "$claimNames"
|
||||
@@ -158,6 +154,39 @@ for variable in "${DEPLOYMENTS[@]}"; do
|
||||
done
|
||||
fi
|
||||
fi
|
||||
if grep -q runAsUser "$variable" || echo "$variable" | grep -q "nextcloud-deployment.yaml"; then
|
||||
if echo "$variable" | grep -q "nextcloud-deployment.yaml"; then
|
||||
USER=33
|
||||
GROUP=33
|
||||
echo ' {{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!' > /tmp/pod.securityContext
|
||||
else
|
||||
USER="$(grep runAsUser "$variable" | grep -oP '[0-9]+')"
|
||||
GROUP="$USER"
|
||||
rm -f /tmp/pod.securityContext
|
||||
fi
|
||||
sed -i "/runAsUser:/d" "$variable"
|
||||
sed -i "/capabilities:/d" "$variable"
|
||||
if [ -n "$USER" ]; then
|
||||
cat << EOL >> /tmp/pod.securityContext
|
||||
securityContext:
|
||||
# The items below only work in pod context
|
||||
fsGroup: $USER
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
# The items below work in both contexts
|
||||
runAsUser: $USER
|
||||
runAsGroup: $GROUP
|
||||
runAsNonRoot: true
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
{{- end }}
|
||||
EOL
|
||||
if echo "$variable" | grep -q "nextcloud-deployment.yaml"; then
|
||||
echo " {{- end }} # AIO-config - do not change this comment!" >> /tmp/pod.securityContext
|
||||
fi
|
||||
sed -i "/^ spec:$/r /tmp/pod.securityContext" "$variable"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
# shellcheck disable=SC1083
|
||||
find ./ -name '*.yaml' -exec sed -i 's|nextcloud-aio-namespace|"\{\{ .Values.NAMESPACE \}\}"|' \{} \;
|
||||
@@ -286,9 +315,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 +333,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
|
||||
|
||||
@@ -336,7 +378,7 @@ sed -i '/^NEXTCLOUD_MOUNT/d' /tmp/sample.conf
|
||||
sed -i '/_ENABLED.*/s/ yes / "yes" /' /tmp/sample.conf
|
||||
sed -i '/_ENABLED.*/s/ no / "no" /' /tmp/sample.conf
|
||||
sed -i 's|^NEXTCLOUD_TRUSTED_CACERTS_DIR: .*|NEXTCLOUD_TRUSTED_CACERTS_DIR: # Setting this to any value allows to automatically import root certificates into the Nextcloud container|' /tmp/sample.conf
|
||||
sed -i 's|10737418240|"10737418240"|' /tmp/sample.conf
|
||||
sed -i 's|17179869184|"17179869184"|' /tmp/sample.conf
|
||||
# shellcheck disable=SC2129
|
||||
echo "" >> /tmp/sample.conf
|
||||
# shellcheck disable=SC2129
|
||||
@@ -352,7 +394,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 +412,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 +442,50 @@ 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
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
EOL
|
||||
# shellcheck disable=SC1083
|
||||
find ./ \( -not -name '*collabora-deployment.yaml*' -not -name '*imaginary-deployment.yaml*' -not -name '*onlyoffice-deployment.yaml*' -name "*deployment.yaml" \) -exec sed -i "/^ securityContext:$/r /tmp/security.conf" \{} \;
|
||||
|
||||
cat << EOL > /tmp/security.conf
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
EOL
|
||||
# shellcheck disable=SC1083
|
||||
find ./ -name '*imaginary-deployment.yaml*' -exec sed -i "/^ securityContext:$/r /tmp/security.conf" \{} \;
|
||||
|
||||
cat << EOL > /tmp/security.conf
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
|
||||
securityContext:
|
||||
# The items below only work in container context
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }}
|
||||
drop: ["ALL"]
|
||||
{{- else }}
|
||||
drop: ["NET_RAW"]
|
||||
{{- end }}
|
||||
add: ["NET_BIND_SERVICE"]
|
||||
{{- end }} # AIO-config - do not change this comment!
|
||||
EOL
|
||||
# shellcheck disable=SC1083
|
||||
find ./ -name '*nextcloud-deployment.yaml*' -exec sed -i "/nextcloud\/aio-nextcloud:.*/r /tmp/security.conf" \{} \;
|
||||
|
||||
chmod 777 -R ./
|
||||
|
||||
# Seems like the dir needs to match the name of the chart
|
||||
|
||||
@@ -21,7 +21,7 @@ TALK_ENABLED: "no" # Setting this to "yes" (with quotes) enables the op
|
||||
TALK_RECORDING_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
|
||||
WHITEBOARD_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically.
|
||||
|
||||
APACHE_MAX_SIZE: "10737418240" # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT
|
||||
APACHE_MAX_SIZE: "17179869184" # This needs to be an integer and in sync with NEXTCLOUD_UPLOAD_LIMIT
|
||||
APACHE_PORT: 443 # Changing this to a different value than 443 will allow you to run it behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else).
|
||||
COLLABORA_DICTIONARIES: de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru # You can change this in order to enable other dictionaries for collabora
|
||||
COLLABORA_SECCOMP_POLICY: --o:security.seccomp=true # Changing the value to false allows to disable the seccomp feature of the Collabora container.
|
||||
@@ -32,7 +32,7 @@ NEXTCLOUD_MAX_TIME: 3600 # This allows to change the upload time limit
|
||||
NEXTCLOUD_MEMORY_LIMIT: 512M # This allows to change the PHP memory limit of the Nextcloud container
|
||||
NEXTCLOUD_STARTUP_APPS: deck twofactor_totp tasks calendar contacts notes # Allows to modify the Nextcloud apps that are installed on starting AIO the first time
|
||||
NEXTCLOUD_TRUSTED_CACERTS_DIR: # Setting this to any value allows to automatically import root certificates into the Nextcloud container
|
||||
NEXTCLOUD_UPLOAD_LIMIT: 10G # This allows to change the upload limit of the Nextcloud container
|
||||
NEXTCLOUD_UPLOAD_LIMIT: 16G # This allows to change the upload limit of the Nextcloud container
|
||||
REMOVE_DISABLED_APPS: yes # Setting this to no keep Nextcloud apps that are disabled via their switch and not uninstall them if they should be installed in Nextcloud.
|
||||
TALK_PORT: 3478 # This allows to adjust the port that the talk container is using.
|
||||
UPDATE_NEXTCLOUD_APPS: no # When setting to yes (with quotes), it will automatically update all installed Nextcloud apps upon container startup on saturdays.
|
||||
@@ -48,10 +48,11 @@ NEXTCLOUD_DATA_STORAGE_SIZE: 5Gi # You can change the size of the nextclou
|
||||
NEXTCLOUD_TRUSTED_CACERTS_STORAGE_SIZE: 1Gi # You can change the size of the nextcloud-trusted-cacerts volume that default to 1Gi with this value
|
||||
ONLYOFFICE_STORAGE_SIZE: 1Gi # You can change the size of the onlyoffice volume that default to 1Gi with this value
|
||||
REDIS_STORAGE_SIZE: 1Gi # You can change the size of the redis volume that default to 1Gi with this value
|
||||
TALK_RECORDING_STORAGE_SIZE: 1Gi # You can change the size of the talk-recording volume that default to 1Gi with this value
|
||||
|
||||
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 +70,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!
|
||||
|
||||
154
php/composer.lock
generated
154
php/composer.lock
generated
@@ -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.5",
|
||||
"version": "v1.3.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/serializable-closure.git",
|
||||
"reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c"
|
||||
"reference": "4f48ade902b94323ca3be7646db16209ec76be3d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
|
||||
"reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
|
||||
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d",
|
||||
"reference": "4f48ade902b94323ca3be7646db16209ec76be3d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -448,7 +448,7 @@
|
||||
"issues": "https://github.com/laravel/serializable-closure/issues",
|
||||
"source": "https://github.com/laravel/serializable-closure"
|
||||
},
|
||||
"time": "2024-09-23T13:33:08+00:00"
|
||||
"time": "2024-11-14T18:34:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/fast-route",
|
||||
@@ -1632,16 +1632,16 @@
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v3.14.0",
|
||||
"version": "v3.15.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72"
|
||||
"reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
|
||||
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/2d5b3964cc21d0188633d7ddce732dc8e874db02",
|
||||
"reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02",
|
||||
"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.15.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1707,7 +1707,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-09T17:55:12+00:00"
|
||||
"time": "2024-11-17T15:59:19+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
@@ -1946,16 +1946,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/pcre",
|
||||
"version": "3.3.1",
|
||||
"version": "3.3.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/pcre.git",
|
||||
"reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4"
|
||||
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4",
|
||||
"reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4",
|
||||
"url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
|
||||
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1965,8 +1965,8 @@
|
||||
"phpstan/phpstan": "<1.11.10"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1.11.10",
|
||||
"phpstan/phpstan-strict-rules": "^1.1",
|
||||
"phpstan/phpstan": "^1.12 || ^2",
|
||||
"phpstan/phpstan-strict-rules": "^1 || ^2",
|
||||
"phpunit/phpunit": "^8 || ^9"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -2005,7 +2005,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/pcre/issues",
|
||||
"source": "https://github.com/composer/pcre/tree/3.3.1"
|
||||
"source": "https://github.com/composer/pcre/tree/3.3.2"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2021,7 +2021,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-08-27T18:44:43+00:00"
|
||||
"time": "2024-11-12T16:29:46+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/semver",
|
||||
@@ -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.32.0",
|
||||
"version": "2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||
"reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4"
|
||||
"reference": "c00d78fb6b29658347f9d37ebe104bffadf36299"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
|
||||
"reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
|
||||
"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.32.0"
|
||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0"
|
||||
},
|
||||
"time": "2024-09-26T07:23:32+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.15",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "72d080eb9edf80e36c19be61f72c98ed8273b765"
|
||||
"reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765",
|
||||
"reference": "72d080eb9edf80e36c19be61f72c98ed8273b765",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd",
|
||||
"reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd",
|
||||
"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.15"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3030,20 +3030,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-20T08:15:52+00:00"
|
||||
"time": "2024-11-06T14:19:14+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.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/string.git",
|
||||
"reference": "d66f9c343fa894ec2037cc928381df90a7ad4306"
|
||||
"reference": "591ebd41565f356fcd8b090fe64dbb5878f50281"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306",
|
||||
"reference": "d66f9c343fa894ec2037cc928381df90a7ad4306",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281",
|
||||
"reference": "591ebd41565f356fcd8b090fe64dbb5878f50281",
|
||||
"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.8"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3489,7 +3489,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-20T08:28:38+00:00"
|
||||
"time": "2024-11-13T13:31:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vimeo/psalm",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"stop_grace_period": {
|
||||
"type": "integer"
|
||||
},
|
||||
"user": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]{1,6}$"
|
||||
},
|
||||
"ports": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
||||
@@ -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,6 +329,7 @@
|
||||
{
|
||||
"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",
|
||||
"init": true,
|
||||
@@ -362,8 +367,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 +427,7 @@
|
||||
"image_tag": "%AIO_CHANNEL%",
|
||||
"display_name": "Talk Recording",
|
||||
"image": "nextcloud/aio-talk-recording",
|
||||
"user": "122",
|
||||
"init": true,
|
||||
"expose": [
|
||||
"1234"
|
||||
@@ -431,6 +439,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 +460,6 @@
|
||||
],
|
||||
"read_only": true,
|
||||
"tmpfs": [
|
||||
"/tmp",
|
||||
"/conf"
|
||||
],
|
||||
"cap_drop": [
|
||||
@@ -458,9 +472,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 +589,7 @@
|
||||
"image_tag": "%AIO_CHANNEL%",
|
||||
"display_name": "ClamAV",
|
||||
"image": "nextcloud/aio-clamav",
|
||||
"user": "100",
|
||||
"init": false,
|
||||
"expose": [
|
||||
"3310"
|
||||
@@ -653,6 +670,7 @@
|
||||
"image_tag": "%AIO_CHANNEL%",
|
||||
"display_name": "Imaginary",
|
||||
"image": "nextcloud/aio-imaginary",
|
||||
"user": "65534",
|
||||
"init": true,
|
||||
"expose": [
|
||||
"9000"
|
||||
@@ -686,6 +704,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 +776,7 @@
|
||||
"image_tag": "%AIO_CHANNEL%",
|
||||
"display_name": "Whiteboard",
|
||||
"image": "nextcloud/aio-whiteboard",
|
||||
"user": "65534",
|
||||
"init": true,
|
||||
"expose": [
|
||||
"3002"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 661 KiB |
BIN
php/public/img/jenna-kim-the-globe-dark.webp
Normal file
BIN
php/public/img/jenna-kim-the-globe-dark.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
BIN
php/public/img/jenna-kim-the-globe.webp
Normal file
BIN
php/public/img/jenna-kim-the-globe.webp
Normal file
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 |
@@ -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 |
4
php/public/img/nextcloud-logo.svg
Normal file
4
php/public/img/nextcloud-logo.svg
Normal 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 |
@@ -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'),
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
|
||||
37
php/public/toggle-dark-mode.js
Normal file
37
php/public/toggle-dark-mode.js
Normal 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);
|
||||
@@ -28,15 +28,17 @@ readonly 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'])) {
|
||||
@@ -132,8 +134,8 @@ readonly 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', '/');
|
||||
|
||||
@@ -113,6 +113,11 @@ readonly 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;
|
||||
|
||||
@@ -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'])) {
|
||||
@@ -629,7 +669,7 @@ class ConfigurationManager
|
||||
public function GetNextcloudUploadLimit() : string {
|
||||
$envVariableName = 'NEXTCLOUD_UPLOAD_LIMIT';
|
||||
$configName = 'nextcloud_upload_limit';
|
||||
$defaultValue = '10G';
|
||||
$defaultValue = '16G';
|
||||
return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
}
|
||||
|
||||
@@ -265,12 +265,16 @@ readonly 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') {
|
||||
@@ -736,16 +740,13 @@ readonly 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());
|
||||
@@ -844,44 +845,49 @@ readonly 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) {
|
||||
@@ -901,7 +907,19 @@ readonly 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 {
|
||||
|
||||
@@ -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
@@ -1,7 +1,7 @@
|
||||
<details>
|
||||
<summary>Click here to view the current AIO config and documentation links</summary>
|
||||
{% if was_start_button_clicked == true %}
|
||||
<p>Nextclouds config.php file is stored in the nextcloud_aio_nextcloud Docker volume and can be edited by following the <a href="https://github.com/nextcloud/all-in-one#how-to-edit-nextclouds-configphp-file-with-a-texteditor">config.php documentation</a>.</p>
|
||||
<p>Nextcloud's config.php file is stored in the nextcloud_aio_nextcloud Docker volume and can be edited by following the <a href="https://github.com/nextcloud/all-in-one#how-to-edit-nextclouds-configphp-file-with-a-texteditor">config.php documentation</a>.</p>
|
||||
<p>You can run Nextcloud's usual occ commands by following the <a href="https://github.com/nextcloud/all-in-one#how-to-run-occ-commands">occ documentation</a></strong>.</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
{% if nextcloud_mount == '' %}
|
||||
The Nextcloud container is confied and local external storage in Nextcloud is disabled.
|
||||
{% else %}
|
||||
The Nextcloud container is getting gets access to the {{ nextcloud_mount }} directory and local external storage in Nextcloud is enabled.
|
||||
The Nextcloud container is getting access to the {{ nextcloud_mount }} directory and local external storage in Nextcloud is enabled.
|
||||
{% endif %}
|
||||
See the <a href="https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host">NEXTCLOUD_MOUNT documentation</a> on how to change this.</p>
|
||||
|
||||
|
||||
182
php/templates/includes/optional-containers.twig
Normal file
182
php/templates/includes/optional-containers.twig
Normal file
@@ -0,0 +1,182 @@
|
||||
<h2>Optional containers</h2>
|
||||
<p>In this section you can enable or disable optional containers. There are further community containers available that are not listed below. See <strong><a href="https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers">this documentation</a></strong> how to add them.</p>
|
||||
{% if isAnyRunning == true %}
|
||||
<p><strong>Please note:</strong> You can enable or disable the options below only when your containers are stopped.</p>
|
||||
{% else %}
|
||||
<p><strong>Please note:</strong> Make sure to save your changes by clicking <strong>Save changes</strong> below the list of optional containers. The changes will not be auto-saved.</p>
|
||||
{% endif %}
|
||||
<form id="options-form" method="POST" action="/api/configuration" class="xhr">
|
||||
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
|
||||
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
|
||||
<input type="hidden" name="options-form" value="options-form">
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="clamav"
|
||||
name="clamav"
|
||||
{% if is_clamav_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="clamav">ClamAV (Antivirus backend for Nextcloud, only supported on x64, needs ~1GB additional RAM)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="collabora"
|
||||
name="collabora"
|
||||
{% if is_collabora_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="collabora">Collabora (Nextcloud Office)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="fulltextsearch"
|
||||
name="fulltextsearch"
|
||||
{% if is_fulltextsearch_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="fulltextsearch">
|
||||
Fulltextsearch (needs ~1GB additional RAM)
|
||||
{% if is_fulltextsearch_enabled == false %}
|
||||
. <strong>Please note:</strong> the initial indexing can take a long time during which Nextcloud will be unavailable
|
||||
{% endif %}
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="imaginary"
|
||||
name="imaginary"
|
||||
{% if is_imaginary_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="imaginary">Imaginary (for previews of heic, heif, illustrator, pdf, svg, tiff and webp. Imaginary is currently <a href="https://github.com/nextcloud/server/issues/34262">incompatible with server-side-encryption</a>)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="talk"
|
||||
name="talk"
|
||||
{% if is_talk_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="talk">Nextcloud Talk (needs ports {{ talk_port }}/TCP and {{ talk_port }}/UDP open/forwarded in your firewall/router)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="talk-recording"
|
||||
name="talk-recording"
|
||||
{% if is_talk_recording_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="talk-recording">Nextcloud Talk Recording-server (needs Nextcloud Talk being enabled and ~1GB additional RAM and ~2 additional vCPUs)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="onlyoffice"
|
||||
name="onlyoffice"
|
||||
{% if is_onlyoffice_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="onlyoffice">OnlyOffice</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="docker-socket-proxy"
|
||||
name="docker-socket-proxy"
|
||||
{% if is_docker_socket_proxy_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="docker-socket-proxy">Docker Socket Proxy (needed for <a href="https://github.com/cloud-py-api/app_api#nextcloud-appapi">Nextcloud App API</a>)</label>
|
||||
</p>
|
||||
<p>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="whiteboard"
|
||||
name="whiteboard"
|
||||
{% if is_whiteboard_enabled == true %}
|
||||
checked="checked"
|
||||
data-initial-state="true"
|
||||
{% else %}
|
||||
data-initial-state="false"
|
||||
{% endif %}
|
||||
>
|
||||
<label for="whiteboard">Whiteboard</label>
|
||||
</p>
|
||||
<input id="options-form-submit" type="submit" value="Save changes" />
|
||||
<script type="text/javascript" src="options-form-submit.js?v3"></script>
|
||||
</form>
|
||||
<p><strong>Minimal system requirements:</strong> When any optional container is enabled, at least 2GB RAM, a dual-core CPU and 40GB system storage are required. When enabling ClamAV, Nextcloud Talk Recording-server or Fulltextsearch, at least 3GB RAM are required. For Talk Recording-server additional 2 vCPUs are required. When enabling everything, at least 5GB RAM and a quad-core CPU are required. Recommended are at least 1GB more RAM than the minimal requirement. For further advices and recommendations see <strong><a href="https://github.com/nextcloud/all-in-one/discussions/1335">this documentation</a></strong></p>
|
||||
{% if isAnyRunning == true or is_x64_platform == false %}
|
||||
<script type="text/javascript" src="disable-clamav.js"></script>
|
||||
{% endif %}
|
||||
{% if isAnyRunning == true %}
|
||||
<script type="text/javascript" src="disable-docker-socket-proxy.js"></script>
|
||||
<script type="text/javascript" src="disable-talk.js"></script>
|
||||
<script type="text/javascript" src="disable-collabora.js"></script>
|
||||
<script type="text/javascript" src="disable-onlyoffice.js"></script>
|
||||
<script type="text/javascript" src="disable-imaginary.js"></script>
|
||||
<script type="text/javascript" src="disable-fulltextsearch.js"></script>
|
||||
<script type="text/javascript" src="disable-talk-recording.js"></script>
|
||||
<script type="text/javascript" src="disable-whiteboard.js"></script>
|
||||
{% endif %}
|
||||
|
||||
{% if is_collabora_enabled == true and isAnyRunning == false and was_start_button_clicked == true %}
|
||||
<h3>Collabora dictionaries</h3>
|
||||
|
||||
{% if collabora_dictionaries == "" %}
|
||||
<p>In order to get the correct dictionaries in Collabora, you may configure the dictionaries below:</p>
|
||||
<form method="POST" action="/api/configuration" class="xhr">
|
||||
<input type="text" name="collabora_dictionaries" placeholder="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru" />
|
||||
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
|
||||
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
|
||||
<input type="submit" value="Submit collabora dictionaries" />
|
||||
</form>
|
||||
<p>You need to make sure that the dictionaries that you enter are valid. An example is <strong>de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</strong>.</p>
|
||||
{% else %}
|
||||
<p>The dictionaries for Collabora are currently set to <strong>{{ collabora_dictionaries }}</strong>. You can reset them again by clicking on the button below.</p>
|
||||
<form method="POST" action="/api/configuration" class="xhr">
|
||||
<input type="hidden" name="delete_collabora_dictionaries" value="yes"/>
|
||||
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
|
||||
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
|
||||
<input type="submit" value="Reset collabora dictionaries" />
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
@@ -1,12 +1,21 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>AIO</title>
|
||||
<link rel="stylesheet" href="/style.css?v2" media="all" />
|
||||
<link rel="stylesheet" href="/style.css?v3" media="all" />
|
||||
<link rel="icon" href="/img/favicon.png">
|
||||
<script type="text/javascript" src="forms.js"></script>
|
||||
<script type="text/javascript" src="toggle-dark-mode.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
{% block body %}{% endblock %}
|
||||
</div>
|
||||
<div id="overlay">
|
||||
<div class="loader"></div>
|
||||
</div>
|
||||
<button id="theme-toggle" onclick="toggleTheme()">
|
||||
<span id="theme-icon"></span>
|
||||
</button>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,28 +1,25 @@
|
||||
{% extends "layout.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<div class="login-wrapper">
|
||||
<div class="login">
|
||||
<img alt="Nextcloud logo" src="/img/logo-blue.svg" style="margin-left: auto;margin-right: auto;display: block;">
|
||||
<h1>Nextcloud AIO Login</h1>
|
||||
{% if is_login_allowed == true %}
|
||||
<p>Log in using your Nextcloud AIO passphrase:</p>
|
||||
<form method="POST" action="/api/auth/login" class="xhr">
|
||||
<input type="password" autocomplete="current-password" name="password" placeholder="Password" id="master-password" oninput="showPassword('master-password')">
|
||||
|
||||
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
|
||||
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
|
||||
<input type="submit" class="button" value="Log in" />
|
||||
</form>
|
||||
{% else %}
|
||||
<p>The login is blocked since Nextcloud is running.<br>Please use the <a href="https://github.com/nextcloud/all-in-one#how-to-easily-log-in-to-the-aio-interface"><strong>automatic login</strong></a> from your Nextcloud.<br><br>
|
||||
If that is not possible, you can unblock the login by running<br><strong>sudo docker stop nextcloud-aio-apache</strong></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="before-unload.js"></script>
|
||||
<div id="overlay">
|
||||
<div class="loader"></div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% extends "layout.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<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>
|
||||
<h1>Nextcloud AIO Login</h1>
|
||||
{% if is_login_allowed == true %}
|
||||
<p>Log in using your Nextcloud AIO passphrase:</p>
|
||||
<form method="POST" action="/api/auth/login" class="xhr">
|
||||
<input type="password" autocomplete="current-password" name="password" placeholder="Password" id="master-password" oninput="showPassword('master-password')">
|
||||
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
|
||||
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
|
||||
<input type="submit" class="button" value="Log in" />
|
||||
</form>
|
||||
{% else %}
|
||||
<p>The login is blocked since Nextcloud is running.<br>Please use the <a href="https://github.com/nextcloud/all-in-one#how-to-easily-log-in-to-the-aio-interface"><strong>automatic login</strong></a> from your Nextcloud.<br><br>
|
||||
If that is not possible, you can unblock the login by running<br><strong>sudo docker stop nextcloud-aio-apache</strong></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<script type="text/javascript" src="before-unload.js"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
{% extends "layout.twig" %}
|
||||
|
||||
{% block body %}
|
||||
<div class="login-wrapper">
|
||||
<div class="login">
|
||||
<img alt="Nextcloud logo" src="/img/logo-blue.svg" style="margin-left: auto;margin-right: auto;display: block;">
|
||||
<h1>All-in-One setup</h1>
|
||||
<p>The official Nextcloud installation method. Nextcloud All-in-One provides easy deployment and maintenance with most features included in this one Nextcloud instance.</p>
|
||||
<p>⚠️ <strong>Please note down the passphrase to access the AIO interface and don't lose it!</strong></p>
|
||||
<strong>Passphrase</strong><br/><span class="monospace">{{ password }}</span><br>
|
||||
<a href="/" class="button" target="_blank" rel="noopener">Open Nextcloud AIO login ↗</a>
|
||||
</div>
|
||||
<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>
|
||||
<h1>All-in-One setup</h1>
|
||||
<p>The official Nextcloud installation method. Nextcloud All-in-One provides easy deployment and maintenance with most features included in this one Nextcloud instance.</p>
|
||||
<p>⚠️ <strong>Please note down the passphrase to access the AIO interface and don't lose it!</strong></p>
|
||||
<strong>Passphrase</strong><br/><span class="monospace">{{ password }}</span><br>
|
||||
<a href="/" class="button" target="_blank" rel="noopener">Open Nextcloud AIO login ↗</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
91
readme.md
91
readme.md
@@ -27,6 +27,7 @@ Included are:
|
||||
- A+ security in Nextcloud security scan
|
||||
- Ready to be used behind existing [Reverse proxies](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md)
|
||||
- Can be used behind [Cloudflare Tunnel](https://github.com/nextcloud/all-in-one#how-to-run-nextcloud-behind-a-cloudflare-tunnel)
|
||||
- Can be used inside [Tailscale network](https://github.com/nextcloud/all-in-one/discussions/5439)
|
||||
- Ready for big file uploads up to 10 GB on public links, [adjustable](https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud) (logged in users can upload much bigger files using the webinterface or the mobile/desktop clients since chunking is used in that case)
|
||||
- PHP and web server timeouts set to 3600s, [adjustable](https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud) (important for big file uploads)
|
||||
- Defaults to a max of 512 MB RAM per PHP process, [adjustable](https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud)
|
||||
@@ -40,7 +41,7 @@ Included are:
|
||||
- By default confined (good for security) but can [allow access to additional storages](https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host) in order to enable the usage of the local external storage feature
|
||||
- Possibility included to [adjust default installed Nextcloud apps](https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup)
|
||||
- Nextcloud installation is not read only - that means you can apply patches if you should need them (instead of having to wait for the next release for them getting applied)
|
||||
- `ffmpeg`, `smbclient` and `nodejs` are included by default
|
||||
- `ffmpeg`, `smbclient`, `libreoffice` and `nodejs` are included by default
|
||||
- Possibility included to [permanently add additional OS packages into the Nextcloud container](https://github.com/nextcloud/all-in-one#how-to-change-the-nextcloud-apps-that-are-installed-on-the-first-startup) without having to build your own Docker image
|
||||
- Possibility included to [permanently add additional PHP extensions into the Nextcloud container](https://github.com/nextcloud/all-in-one#how-to-add-php-extensions-permanently-to-the-nextcloud-container) without having to build your own Docker image
|
||||
- Possibility included to [pass the needed device for hardware transcoding](https://github.com/nextcloud/all-in-one#how-to-enable-hardware-transcoding-for-nextcloud) to the Nextcloud container
|
||||
@@ -66,10 +67,10 @@ Included are:
|
||||
- Many of the included containers have a read-only root-FS (good for security)
|
||||
- Included containers run in its own docker network (good for security) and only really necessary ports are exposed on the host
|
||||
- [Multiple instances on one server](https://github.com/nextcloud/all-in-one/blob/main/multiple-instances.md) are doable without having to deal with VMs
|
||||
- Adjustable backup path from the AIO interface (good to put the backups e.g. on a different drive)
|
||||
- Adjustable backup path or remote borg repository from the AIO interface (good to put the backups e.g. on a different drive if using a local backup path)
|
||||
- Possibility included to also back up external Docker Volumes or Host paths (can be used for host backups)
|
||||
- Borg backup can be completely managed from the AIO interface, including backup creation, backup restore, backup integrity check and integrity-repair
|
||||
- [Remote backups](https://github.com/nextcloud/all-in-one#are-remote-borg-backups-supported) are indirectly possible
|
||||
- Other forms of [remote backup](https://github.com/nextcloud/all-in-one#are-remote-borg-backups-supported) are indirectly possible
|
||||
- Updates and backups can be [run from an external script](https://github.com/nextcloud/all-in-one#how-to-stopstartupdate-containers-or-trigger-the-daily-backup-from-a-script-externally). See [this documentation](https://github.com/nextcloud/all-in-one#how-to-enable-automatic-updates-without-creating-a-backup-beforehand) for a complete example.
|
||||
|
||||
</details>
|
||||
@@ -77,7 +78,7 @@ Included are:
|
||||
## Screenshots
|
||||
| First setup | After installation |
|
||||
|---|---|
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
## How to use this?
|
||||
The following instructions are meant for installations without a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) already being in place. If you want to run AIO behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else), see the [reverse proxy documentation](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md). Also, the instructions below are especially meant for Linux. For macOS see [this](#how-to-run-aio-on-macos), for Windows see [this](#how-to-run-aio-on-windows) and for Synology see [this](#how-to-run-aio-on-synology-dsm).
|
||||
@@ -218,7 +219,12 @@ If you have the NAS setup on your local network (which is most often the case) y
|
||||
The easiest way to run it with Portainer on Linux is to use Portainer's stacks feature and use [this docker-compose file](./compose.yaml) in order to start AIO correctly.
|
||||
|
||||
### Can I run AIO on TrueNAS SCALE?
|
||||
On TrueNAS SCALE, there are two ways to run AIO. The preferred one is to run AIO inside a VM. This is necessary since they do not expose the docker socket for containers on the host, you also cannot use docker-compose on it thus and it is also not possible to run custom helm-charts that are not explicitly written for TrueNAS SCALE.
|
||||
|
||||
With the Truenas Scale Release 24.10.0 (which was officially released on October 29th 2024 as a stable release) IX Systems ditched the Kubernetes integration and implemented a fully working docker environment.
|
||||
|
||||
For a more complete guide, see this guide by @zybster: https://github.com/nextcloud/all-in-one/discussions/5506
|
||||
|
||||
On older TrueNAS SCALE releases with Kubernetes environment, there are two ways to run AIO. The preferred one is to run AIO inside a VM. This is necessary since they do not expose the docker socket for containers on the host, you also cannot use docker-compose on it thus and it is also not possible to run custom helm-charts that are not explicitly written for TrueNAS SCALE.
|
||||
|
||||
Another but untested way is to install Portainer on your TrueNAS SCALE from here https://truecharts.org/charts/stable/portainer/installation-notes and add the Helm-chart repository https://nextcloud.github.io/all-in-one/ into Portainer by following https://docs.portainer.io/user/kubernetes/helm. More docs on AIOs Helm Chart are available here: https://github.com/nextcloud/all-in-one/tree/main/nextcloud-aio-helm-chart#nextcloud-aio-helm-chart.
|
||||
|
||||
@@ -239,6 +245,9 @@ Another but untested way is to install Portainer on your TrueNAS SCALE from here
|
||||
### How to run Nextcloud behind a Cloudflare Tunnel?
|
||||
Although it does not seems like it is the case but from AIO perspective a Cloudflare Tunnel works like a reverse proxy. So please follow the [reverse proxy documentation](./reverse-proxy.md) where is documented how to make it run behind a Cloudflare Tunnel. However please see the [caveats](https://github.com/nextcloud/all-in-one#notes-on-cloudflare-proxytunnel) before proceeding.
|
||||
|
||||
### How to run Nextcloud inside a Tailscale network?
|
||||
For a reverse proxy example guide for Tailscale, see this guide by @flll: https://github.com/nextcloud/all-in-one/discussions/5439
|
||||
|
||||
### Disrecommended VPS providers
|
||||
- *Older* Strato VPS using Virtuozzo caused problems though ones from Q3 2023 and later should work.
|
||||
If your VPS has a `/proc/user_beancounters` file and a low `numproc` limit set in it
|
||||
@@ -257,8 +266,11 @@ In general recommended VPS are those that are KVM/non-virtualized as Docker shou
|
||||
### How to get Nextcloud running using the ACME DNS-challenge?
|
||||
You can install AIO in reverse proxy mode where is also documented how to get it running using the ACME DNS-challenge for getting a valid certificate for AIO. See the [reverse proxy documentation](./reverse-proxy.md). (Meant is the `Caddy with ACME DNS-challenge` section). Also see https://github.com/dani-garcia/vaultwarden/wiki/Running-a-private-vaultwarden-instance-with-Let%27s-Encrypt-certs#getting-a-custom-caddy-build for additional docs on this topic.
|
||||
|
||||
### How to run Nextcloud locally?
|
||||
If you do not want to open Nextcloud to the public internet, you may have a look at the following documentation how to set it up locally: [local-instance.md](./local-instance.md)
|
||||
### How to run Nextcloud locally? No domain wanted, or wanting intranet access within your LAN.
|
||||
If you do not want to open Nextcloud to the public internet, you may have a look at the following documentation on how to set it up locally: [local-instance.md](./local-instance.md), but keep in mind you're still required to have https working properly.
|
||||
|
||||
### Can I use an ip-address for Nextcloud instead of a domain?
|
||||
No and it will not be added. If you only want to run it locally, you may have a look at the following documentation: [local-instance.md](./local-instance.md) for configuration without a traditional domain. Or, [consider using NextcloudPi](nextcloudpi.com) for ip-address access locally (it bundles fewer features than AIO).
|
||||
|
||||
### Can I run AIO offline or in an airgapped system?
|
||||
No. This is not possible and will not be added due to multiple reasons: update checks, app installs via app-store, downloading additional docker images on demand and more.
|
||||
@@ -266,9 +278,6 @@ No. This is not possible and will not be added due to multiple reasons: update c
|
||||
### Are self-signed certificates supported for Nextcloud?
|
||||
No and they will not be. If you want to run it locally, without opening Nextcloud to the public internet, please have a look at the [local instance documentation](./local-instance.md).
|
||||
|
||||
### Can I use an ip-address for Nextcloud instead of a domain?
|
||||
No and it will not be added. If you only want to run it locally, you may have a look at the following documentation: [local-instance.md](./local-instance.md)
|
||||
|
||||
### Can I use AIO with multiple domains?
|
||||
No and it will not be added. However you can use [this feature](https://github.com/nextcloud/all-in-one/blob/main/multiple-instances.md) in order to create multiple AIO instances, one for each domain.
|
||||
|
||||
@@ -276,7 +285,7 @@ No and it will not be added. However you can use [this feature](https://github.c
|
||||
No and they will not be. Please use a dedicated domain for Nextcloud and set it up correctly by following the [reverse proxy documentation](./reverse-proxy.md). If port 443 and/or 80 is blocked for you, you may use the a Cloudflare Tunnel if you want to publish it online. You could also use the ACME DNS-challenge to get a valid certificate. However in all cases the Nextcloud interface will redirect you to port 443.
|
||||
|
||||
### Can I run Nextcloud in a subdirectory on my domain?
|
||||
No and it will not be added. Please use a dedicated domain for Nextcloud and set it up correctly by following the [reverse proxy documentation](./reverse-proxy.md).
|
||||
No and it will not be added. Please use a dedicated (sub-)domain for Nextcloud and set it up correctly by following the [reverse proxy documentation](./reverse-proxy.md).
|
||||
|
||||
### How can I access Nextcloud locally?
|
||||
Please note that local access is not possible if you are running AIO behind Cloudflare Tunnel since TLS proxying is in that case offloaded to Cloudflares infrastructure. You can fix this by setting up your own reverse proxy that handles TLS proxying locally and will make the steps below work.
|
||||
@@ -335,7 +344,10 @@ Additionally, there is a cronjob that runs once a day that checks for container
|
||||
AIO ships its own update notifications implementation. It checks if container updates are available. If so, it sends a notification with the title `Container updates available!` on saturdays to Nextcloud users that are part of the `admin` group. If the Nextcloud container image should be older than 90 days (~3 months) and thus badly outdated, AIO sends a notification to all Nextcloud users with the title `AIO is outdated!`. Thus admins should make sure to update the container images at least once every 3 months in order to make sure that the instance gets all security bugfixes as soon as possible.
|
||||
|
||||
### How to easily log in to the AIO interface?
|
||||
If your Nextcloud is running and you are logged in as admin in your Nextcloud, you can easily log in to the AIO interface by opening `https://yourdomain.tld/settings/admin/overview` which will show a button on top that enables you to log in to the AIO interface by just clicking on this button. **Note:** You can change the domain/ip-address/port of the button by simply stopping the containers, visiting the AIO interface from the correct and desired domain/ip-address/port and clicking once on `Start containers`.
|
||||
If your Nextcloud is running and you are logged in as admin in your Nextcloud, you can easily log in to the AIO interface by opening `https://yourdomain.tld/settings/admin/overview` which will show a button on top that enables you to log in to the AIO interface by just clicking on this button.
|
||||
|
||||
> [!Note]
|
||||
> You can change the domain/ip-address/port of the button by simply stopping the containers, visiting the AIO interface from the correct and desired domain/ip-address/port and clicking once on `Start containers`.
|
||||
|
||||
### How to change the domain?
|
||||
> [!NOTE]
|
||||
@@ -366,24 +378,22 @@ Here is how to reset the AIO instance properly:
|
||||
1. Check which volumes are dangling with `sudo docker volume ls --filter "dangling=true"`
|
||||
1. Now remove all these dangling volumes: `sudo docker volume prune --filter all=1` (on Windows you might need to remove some volumes afterwards manually with `docker volume rm nextcloud_aio_backupdir`, `docker volume rm nextcloud_aio_nextcloud_datadir`).
|
||||
1. If you've configured `NEXTCLOUD_DATADIR` to a path on your host instead of the default volume, you need to clean that up as well. (E.g. by simply deleting the directory).
|
||||
1. Make sure that no volumes are remaining with `sudo docker volume ls --format {{.Name}}`. If no `nextcloud-aio` volumes are listed, you can proceed with the steps below. If there should be some, you will need to stop them with `sudo docker volume rm <volume_name>` until no one is listed anymore.
|
||||
1. Make sure that no volumes are remaining with `sudo docker volume ls --format {{.Name}}`. If no `nextcloud-aio` volumes are listed, you can proceed with the steps below. If there should be some, you will need to remove them with `sudo docker volume rm <volume_name>` until no one is listed anymore.
|
||||
1. Optional: You can remove all docker images with `sudo docker image prune -a`.
|
||||
1. And you are done! Now feel free to start over with the recommended docker run command!
|
||||
|
||||
### Backup solution
|
||||
Nextcloud AIO provides a local backup solution based on [BorgBackup](https://github.com/borgbackup/borg#what-is-borgbackup). These backups act as a local restore point in case the installation gets corrupted. By using this tool, backups are incremental, differential, compressed and encrypted – so only the first backup will take a while. Further backups should be fast as only changes are taken into account.
|
||||
Nextcloud AIO provides a backup solution based on [BorgBackup](https://github.com/borgbackup/borg#what-is-borgbackup). These backups act as a restore point in case the installation gets corrupted. By using this tool, backups are incremental, differential, compressed and encrypted – so only the first backup will take a while. Further backups should be fast as only changes are taken into account.
|
||||
|
||||
It is recommended to create a backup before any container update. By doing this, you will be safe regarding any possible complication during updates because you will be able to restore the whole instance with basically one click.
|
||||
|
||||
The restore process should be pretty fast as rsync is used to restore the chosen backup which only transfers changed files and deletes additional ones.
|
||||
For local backups, the restore process should be pretty fast as rsync is used to restore the chosen backup which only transfers changed files and deletes additional ones. For remote borg backups, the whole backup archive is extracted from the remote, which depending on how clever `borg extract` is, may require downloading the whole archive.
|
||||
|
||||
If you connect an external drive to your host, and choose the backup directory to be on that drive, you are also kind of safe against drive failures of the drive where the docker volumes are stored on.
|
||||
|
||||
<details>
|
||||
<summary>How to do the above step for step</summary>
|
||||
|
||||
<br>
|
||||
|
||||
1. Mount an external/backup HDD to the host OS using the built-in functionality or udev rules or whatever way you prefer. (E.g. follow this video: https://www.youtube.com/watch?v=2lSyX4D3v_s) and mount the drive in best case in `/mnt/backup`.
|
||||
2. If not already done, fire up the docker container and set up Nextcloud as per the guide.
|
||||
3. Now open the AIO interface.
|
||||
@@ -392,6 +402,19 @@ If you connect an external drive to your host, and choose the backup directory t
|
||||
|
||||
</details>
|
||||
|
||||
If you want to back up directly to a remote borg repository:
|
||||
|
||||
<details>
|
||||
<summary>How to do the above step for step</summary>
|
||||
|
||||
1. Create your borg repository at the remote. Note down the repository URL for later.
|
||||
2. Open the AIO interface
|
||||
3. Under backup section, leave the local path blank and fill in the url to your borg repository that you noted down earlier.
|
||||
4. Click on `Create backup`, this will create an ssh key pair and fail because the remote doesn't trust this key yet. Copy the public key shown in AIO and add it to your authorized keys on the remote.
|
||||
5. Try again to create a backup, this time it should succeed.
|
||||
|
||||
</details>
|
||||
|
||||
Backups can be created and restored in the AIO interface using the buttons `Create Backup` and `Restore selected backup`. Additionally, a backup check is provided that checks the integrity of your backups but it shouldn't be needed in most situations.
|
||||
|
||||
The backups themselves get encrypted with an encryption key that gets shown to you in the AIO interface. Please save that at a safe place as you will not be able to restore from backup without this key.
|
||||
@@ -409,8 +432,10 @@ Backed up will get all important data of your Nextcloud AIO instance like the da
|
||||
The built-in borg-based backup solution has by default a retention policy of `--keep-within=7d --keep-weekly=4 --keep-monthly=6`. See https://borgbackup.readthedocs.io/en/stable/usage/prune.html for what these values mean. You can adjust the retention policy by providing `--env BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6"` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used) and customize the value to your fitting. ⚠️ Please make sure that this value is valid, otherwise backup pruning will bug out!
|
||||
|
||||
#### Are remote borg backups supported?
|
||||
Backing up directly to a remote borg repository is supported. This avoids having to store a local copy of your backups, supports append-only borg keys to counter ransomware and allows using the AIO interface to manage your backups.
|
||||
|
||||
Some alternatives, which do not have all the above benefits:
|
||||
|
||||
Not directly but you have multiple options to achieve this:
|
||||
- Mount a network FS like SSHFS, SMB or NFS in the directory that you enter in AIO as backup directory
|
||||
- Use rsync or rclone for syncing the borg backup archive that AIO creates locally to a remote target (make sure to lock the backup archive correctly before starting the sync; search for "aio-lockfile"; you can find a local example script here: https://github.com/nextcloud/all-in-one#sync-the-backup-regularly-to-another-drive)
|
||||
- You can find a well written guide that uses rclone and e.g. BorgBase for remote backups here: https://github.com/nextcloud/all-in-one/discussions/2247
|
||||
@@ -445,8 +470,14 @@ You can open the BorgBackup archives on your host by following these steps:<br>
|
||||
# Install borgbackup on the host
|
||||
sudo apt update && sudo apt install borgbackup
|
||||
|
||||
# Mount the archives to /tmp/borg (if you are using the default backup location /mnt/backup/borg)
|
||||
sudo mkdir -p /tmp/borg && sudo borg mount "/mnt/backup/borg" /tmp/borg
|
||||
# In any shell where you use borg, you must first export this variable
|
||||
# If you are using the default backup location /mnt/backup/borg
|
||||
export BORG_REPO='/mnt/backup/borg'
|
||||
# or if you are using a remote repository
|
||||
export BORG_REPO='user@host:/path/to/repo'
|
||||
|
||||
# Mount the archives to /tmp/borg
|
||||
sudo mkdir -p /tmp/borg && sudo borg mount "$BORG_REPO" /tmp/borg
|
||||
|
||||
# After entering your repository key successfully, you should be able to access all archives in /tmp/borg
|
||||
# You can now do whatever you want by syncing them to a different place using rsync or doing other things
|
||||
@@ -466,18 +497,24 @@ You can delete BorgBackup archives on your host manually by following these step
|
||||
# Install borgbackup on the host
|
||||
sudo apt update && sudo apt install borgbackup
|
||||
|
||||
# In any shell where you use borg, you must first export this variable
|
||||
# If you are using the default backup location /mnt/backup/borg
|
||||
export BORG_REPO='/mnt/backup/borg'
|
||||
# or if you are using a remote repository
|
||||
export BORG_REPO='user@host:/path/to/repo'
|
||||
|
||||
# List all archives (if you are using the default backup location /mnt/backup/borg)
|
||||
sudo borg list "/mnt/backup/borg"
|
||||
sudo borg list
|
||||
|
||||
# After entering your repository key successfully, you should now see a list of all backup archives
|
||||
# An example backup archive might be called 20220223_174237-nextcloud-aio
|
||||
# Then you can simply delete the archive with:
|
||||
sudo borg delete --stats --progress "/mnt/backup/borg::20220223_174237-nextcloud-aio"
|
||||
sudo borg delete --stats --progress "::20220223_174237-nextcloud-aio"
|
||||
|
||||
# If borg 1.2.0 or higher is installed, you then need to run borg compact in order to clean up the freed space
|
||||
sudo borg --version
|
||||
# If version number of the command above is higher than 1.2.0 you need to run the command below:
|
||||
sudo borg compact "/mnt/backup/borg"
|
||||
sudo borg compact
|
||||
|
||||
```
|
||||
|
||||
@@ -486,8 +523,8 @@ You can do so by clicking on the `Check backup integrity` button or `Create back
|
||||
|
||||
---
|
||||
|
||||
#### Sync the backup regularly to another drive
|
||||
For increased backup security, you might consider syncing the backup repository regularly to another drive.
|
||||
#### Sync local backups regularly to another drive
|
||||
For increased backup security, you might consider syncing the local backup repository regularly to another drive.
|
||||
|
||||
To do that, first add the drive to `/etc/fstab` so that it is able to get automatically mounted and then create a script that does all the things automatically. Here is an example for such a script:
|
||||
|
||||
@@ -588,7 +625,7 @@ Afterwards apply the correct permissions with `sudo chown root:root /root/backup
|
||||
> [!WARNING]
|
||||
> The below script will only work after the initial setup of AIO. So you will always need to first visit the AIO interface, type in your domain and start the containers the first time or restore an older AIO instance from its borg backup before you can use the script.
|
||||
|
||||
You can do so by running the `/daily-backup.sh` script that is stored in the mastercontainer. It accepts the following environmental varilables:
|
||||
You can do so by running the `/daily-backup.sh` script that is stored in the mastercontainer. It accepts the following environment variables:
|
||||
- `AUTOMATIC_UPDATES` if set to `1`, it will automatically stop the containers, update them and start them including the mastercontainer. If the mastercontainer gets updated, this script's execution will stop as soon as the mastercontainer gets stopped. You can then wait until it is started again and run the script with this flag again in order to update all containers correctly afterwards.
|
||||
- `DAILY_BACKUP` if set to `1`, it will automatically stop the containers and create a backup. If you want to start them again afterwards, you may have a look at the `START_CONTAINERS` option.
|
||||
- `START_CONTAINERS` if set to `1`, it will automatically start the containers without updating them.
|
||||
@@ -662,7 +699,7 @@ Be aware though that these locations will not be covered by the built-in backup
|
||||
By default will the talk container use port `3478/UDP` and `3478/TCP` for connections. You can adjust the port by adding e.g. `--env TALK_PORT=3478` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used) and adjusting the port to your desired value. Best is to use a port over 1024, so e.g. 3479 to not run into this: https://github.com/nextcloud/all-in-one/discussions/2517
|
||||
|
||||
### How to adjust the upload limit for Nextcloud?
|
||||
By default, public uploads to Nextcloud are limited to a max of 10G (logged in users can upload much bigger files using the webinterface or the mobile/desktop clients, since chunking is used in that case). You can adjust the upload limit by providing `--env NEXTCLOUD_UPLOAD_LIMIT=10G` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used) and customize the value to your fitting. It must start with a number and end with `G` e.g. `10G`.
|
||||
By default, public uploads to Nextcloud are limited to a max of 16G (logged in users can upload much bigger files using the webinterface or the mobile/desktop clients, since chunking is used in that case). You can adjust the upload limit by providing `--env NEXTCLOUD_UPLOAD_LIMIT=16G` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used) and customize the value to your fitting. It must start with a number and end with `G` e.g. `16G`.
|
||||
|
||||
### How to adjust the max execution time for Nextcloud?
|
||||
By default, uploads to Nextcloud are limited to a max of 3600s. You can adjust the upload time limit by providing `--env NEXTCLOUD_MAX_TIME=3600` to the docker run command of the mastercontainer (but before the last line `nextcloud/all-in-one:latest`! If it was started already, you will need to stop the mastercontainer, remove it (no data will be lost) and recreate it using the docker run command that you initially used) and customize the value to your fitting. It must be a number e.g. `3600`.
|
||||
|
||||
124
reverse-proxy.md
124
reverse-proxy.md
@@ -1,22 +1,29 @@
|
||||
# Reverse Proxy Documentation
|
||||
|
||||
**Note:** The maintainers of AIO noticed that this documentation could be improved to make it easier to follow. All contributions that improve this are very welcome!
|
||||
> [!NOTE]
|
||||
> The maintainers of AIO noticed that this documentation could be improved to make it easier to follow. All contributions that improve this are very welcome!
|
||||
|
||||
A [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) is basically a web server that enables computers on the internet to access a service in a [private subnet](https://en.wikipedia.org/wiki/Private_network).
|
||||
A [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) is a software service that acts as a gateway between services and a client. It is commonly used to allow a client connected to the Internet to access a website located in the [private subnet](https://en.wikipedia.org/wiki/Private_network) of that web server.
|
||||
|
||||
**Please note:** Publishing the AIO interface with a valid certificate to the public internet is **not** the goal of this documentation! Instead, the main goal is to publish Nextcloud with a valid certificate to the public internet which is **not** running inside the mastercontainer but in a different container! If you need a valid certificate for the AIO interface, see [point 5](#5-optional-get-a-valid-certificate-for-the-aio-interface).
|
||||
**Please note:** Publishing the AIO interface with a valid certificate to the public internet is **not** the goal of this documentation! If you need a valid certificate for the AIO interface, see [point 5](#5-optional-get-a-valid-certificate-for-the-aio-interface).
|
||||
|
||||
In order to run Nextcloud behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else), you need to specify the port that AIO's Apache container shall use, add a specific config to your web server or reverse proxy and modify the startup command a bit. All examples below will use port `11000` as example `APACHE_PORT` which will be exposed on the host to receive unencrypted HTTP traffic from the reverse proxy. **Advice:** If you need https between Nextcloud and the reverse proxy because it is running on a different server in the same network, simply add another reverse proxy to the chain that runs on the same server like AIO and takes care of https proxying (most likely via self-signed cert). Another option is to create a VPN between the server that runs AIO and the server that runs the reverse proxy which takes care of encrypting the connection.
|
||||
In order to run Nextcloud behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else), you need to:
|
||||
1. specify the port that AIO's integrated Apache container shall use
|
||||
2. add a specific config to your web server or reverse proxy
|
||||
3. modify the startup command a bit.
|
||||
All examples below will use port `11000` as `APACHE_PORT`. This port will be exposed in the private network to receive unencrypted HTTP traffic from the reverse proxy.
|
||||
> [!IMPORTANT]
|
||||
> If you need HTTPS between Nextcloud and the reverse proxy because it is running on a different server in the same network, simply add another reverse proxy to the chain that runs on the same server like AIO and takes care of HTTPS proxying (most likely via self-signed certificates). Another option would be to create a VPN between the server that runs AIO and the server that runs the reverse proxy which takes care of encrypting the connection.
|
||||
|
||||
**Attention:** The process to run Nextcloud behind a reverse proxy consists of at least steps 1, 2 and 4:
|
||||
1. **Configure the reverse proxy! See [point 1](#1-configure-the-reverse-proxy)**
|
||||
1. **Use this startup command! See [point 2](#2-use-this-startup-command)**
|
||||
1. Optional: If the reverse proxy is installed on the same host and in the host network, you should limit the apache container to only listen on localhost. See [point 3](#3-limit-the-access-to-the-apache-container)
|
||||
1. Optional: if the reverse proxy is installed on the same host and in the host network, you should limit the apache container to only listen on localhost. See [point 3](#3-limit-the-access-to-the-apache-container)
|
||||
1. **Open the AIO interface. See [point 4](#4-open-the-aio-interface)**
|
||||
1. Optional: Get a valid certificate for the AIO interface! See [point 5](#5-optional-get-a-valid-certificate-for-the-aio-interface)
|
||||
1. Optional: How to debug things? See [point 6](#6-how-to-debug-things)
|
||||
1. Optional: get a valid certificate for the AIO interface! See [point 5](#5-optional-get-a-valid-certificate-for-the-aio-interface)
|
||||
1. Optional: how to debug things? See [point 6](#6-how-to-debug-things)
|
||||
|
||||
**Please note:** Since the Apache container gets created by the mastercontainer, there is **NO** way to provide custom docker labels or custom environmental variables for the Apache container. So please do not attempt to do this because you will fail! Only the documented way will work!
|
||||
**Please note:** Since the Apache container gets created by the mastercontainer, there is **NO** way to provide custom docker labels or custom environmental variables for the Apache container. So please do not attempt to do this because it will fail!
|
||||
|
||||
## 1. Configure the reverse proxy
|
||||
|
||||
@@ -37,9 +44,10 @@ In order to run Nextcloud behind a web server or reverse proxy (like Apache, Ngi
|
||||
|
||||
<summary>On the same server in a Docker container</summary>
|
||||
|
||||
For this setup, you can use as target `host.docker.internal:$APACHE_PORT` instead of `localhost:$APACHE_PORT`. **⚠️ Important:** In order to make this work on Docker for Linux, you need to add `--add-host=host.docker.internal:host-gateway` to the docker run command of your reverse proxy container or `extra_hosts: ["host.docker.internal:host-gateway"]` in docker compose (it works on Docker Desktop by default).
|
||||
|
||||
Another option and actually the recommended way in this case is to use `--network host` option (or `network_mode: host` for docker-compose) as setting for the reverse proxy container to connect it to the host network. If you are using a firewall on the server, you need to open ports 80 and 443 for the reverse proxy manually. By doing so, the default sample configurations that point at `localhost:$APACHE_PORT` should work without having to modify them.
|
||||
The reverse-proxy container needs to be connected to the nextcloud containers. This can be achieved one of these 3 ways:
|
||||
1. Utilize host networking instead of docker bridge networking: Specify `--network host` option (or `network_mode: host` for docker-compose) as setting for the reverse proxy container to connect it to the host network. If you are using a firewall on the server, you need to open ports 80 and 443 for the reverse proxy manually. With this setup, the default sample configurations with reverse-proxy pointing to `localhost:$APACHE_PORT` should work directly.
|
||||
1. Connect nextcloud's external-facing containers to the reverse-proxy's docker network by specifying env variable APACHE_ADDITIONAL_NETWORK. With this setup, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache:$APACHE_PORT`. ⚠️⚠️⚠️ Note, the specified network must already exist before Nextcloud AIO is started. Otherwise it will fail to start the container because the network is not existing.
|
||||
1. Connect the reverse-proxy container to the `nextcloud-aio` network by specifying it as a secondary (external) network for the reverse proxy container. With this setup also, the reverse proxy can utilize Docker bridge network's DNS name resolution to access nextcloud at `http://nextcloud-aio-apache:$APACHE_PORT` .
|
||||
|
||||
</details>
|
||||
|
||||
@@ -132,12 +140,14 @@ To make the config work you can run the following command:
|
||||
|
||||
</details>
|
||||
|
||||
### Caddy (Recommended)
|
||||
### Caddy (recommended)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
**Hint:** You may have a look at [this guide](https://github.com/nextcloud/all-in-one/discussions/575#discussion-4055615) for a more complete but possibly outdated example.
|
||||
|
||||
Add this to your Caddyfile:
|
||||
|
||||
```
|
||||
@@ -147,7 +157,7 @@ https://<your-nc-domain>:443 {
|
||||
```
|
||||
The Caddyfile is a text file called `Caddyfile` (no extension) which – if you should be running Caddy inside a container – should usually be created in the same location as your `compose.yaml` file prior to starting the container.
|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
**Advice:** You may have a look at [this](https://github.com/nextcloud/all-in-one/discussions/575#discussion-4055615) for a more complete example.
|
||||
|
||||
@@ -181,7 +191,7 @@ You can get AIO running using the ACME DNS-challenge. Here is how to do it.
|
||||
|
||||
</details>
|
||||
|
||||
### Citrix ADC VPX / Citrix Netscaler
|
||||
### Citrix ADC VPX / Citrix Netscaler
|
||||
|
||||
<details>
|
||||
|
||||
@@ -197,11 +207,14 @@ For a reverse proxy example guide for Citrix ADC VPX / Citrix Netscaler, see thi
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
|
||||
**Hint:** You may have a look at [this guide](https://github.com/nextcloud/all-in-one/discussions/2845#discussioncomment-6423237) for a more complete but possibly outdated example.
|
||||
|
||||
Although it does not seem like it is the case but from AIO perspective a Cloudflare Tunnel works like a reverse proxy. Please see the [caveats](https://github.com/nextcloud/all-in-one#notes-on-cloudflare-proxytunnel) before proceeding. Here is then how to make it work:
|
||||
|
||||
1. Install the Cloudflare Tunnel on the same machine where AIO will be running on and point the Tunnel with the domain that you want to use for AIO to `http://localhost:11000`.<br>
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
1. Now continue with [point 2](#2-use-this-startup-command) but additionally, add `--env SKIP_DOMAIN_VALIDATION=true` to the docker run command which will disable the domain validation (because it is known that the domain validation will not work behind a Cloudflare Tunnel). So you need to ensure yourself that you've configured everything correctly.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
1. Now continue with [point 2](#2-use-this-startup-command) but add `--env SKIP_DOMAIN_VALIDATION=true` to the docker run command - which will disable the domain validation (because it is known that the domain validation will not work behind a Cloudflare Tunnel).
|
||||
|
||||
**Advice:** Make sure to [disable Cloudflares Rocket Loader feature](https://help.nextcloud.com/t/login-page-not-working-solved/149417/8) as otherwise Nextcloud's login prompt will not be shown.
|
||||
|
||||
@@ -310,11 +323,13 @@ backend Nextcloud
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
**Disclaimer:** This config was tested and should normally work on all modern nginx version if you configure it correctly. Improvements to the config are very welcome!
|
||||
**Hint:** You may have a look at [this guide](https://github.com/nextcloud/all-in-one/discussions/588#discussioncomment-2811152) for a more complete but possibly outdated example.
|
||||
|
||||
Add the below template to your nginx config.
|
||||
**Disclaimer:** This config was tested and should normally work on all modern Nginx versions. Improvements to the config are very welcome!
|
||||
|
||||
**Note:** please check your nginx version by running: `nginx -v` and adjust it the lines marked with version notes, so that they fit your nginx version.
|
||||
Add the below template to your Nginx config.
|
||||
|
||||
**Note:** please check your Nginx version by running: `nginx -v` and adjust the lines marked with version notes to fit your version.
|
||||
|
||||
```
|
||||
map $http_upgrade $connection_upgrade {
|
||||
@@ -392,19 +407,19 @@ server {
|
||||
|
||||
```
|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
**Advice:** You may have a look at [this](https://github.com/nextcloud/all-in-one/discussions/588#discussioncomment-2811152) for a more complete example.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
</details>
|
||||
|
||||
### Nginx-Proxy-Manager
|
||||
### Nginx-Proxy-Manager - NPM
|
||||
|
||||
<details>
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
First, please make sure that the environmental variables `PUID` and `PGID` in the compose.yaml file for NPM are either unset or set to `0`.
|
||||
**Hint:** You may have a look at [this guide](https://github.com/nextcloud/all-in-one/discussions/588#discussioncomment-3040493) for a more complete but possibly oudated example.
|
||||
|
||||
First, make sure the environmental variables `PUID` and `PGID` in the `compose.yaml` file for NPM are either unset or set to `0`.
|
||||
If you need to change the GID/PID then please add `net.ipv4.ip_unprivileged_port_start=0` at the end of `/etc/sysctl.conf`. Note: this will cause that non root users can bind privileged ports.
|
||||
|
||||
Second, see these screenshots for a working config:
|
||||
@@ -423,8 +438,7 @@ proxy_read_timeout 86400s;
|
||||
client_max_body_size 0;
|
||||
```
|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
Also change `<you>@<your-mail-provider-domain>` to a mail address of yours.
|
||||
|
||||
</details>
|
||||
@@ -435,12 +449,11 @@ Also change `<you>@<your-mail-provider-domain>` to a mail address of yours.
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
Unfortunately it is not possible to configure nginx-proxy in a way that works because it completely relies on environmental variables of the docker containers itself. Providing these variables does not work as stated above.
|
||||
Unfortunately, it is not possible to configure Nginx-proxy in a way that works because it completely relies on environmental variables of the docker containers itself. Providing these variables does not work as stated above.
|
||||
|
||||
If you really want to use AIO, we recommend you to switch to caddy. It is simply amazing!<br>
|
||||
Of course understandable if that is not possible for you.
|
||||
|
||||
Apart from that, there is this: [manual-install](https://github.com/nextcloud/all-in-one/tree/main/manual-install)
|
||||
Apart from that, there is a [manual-install](https://github.com/nextcloud/all-in-one/tree/main/manual-install).
|
||||
|
||||
</details>
|
||||
|
||||
@@ -450,7 +463,7 @@ Apart from that, there is this: [manual-install](https://github.com/nextcloud/al
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
**Disclaimer:** It might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
**Disclaimer:** it might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
|
||||
For Node.js, we will use the npm package `http-proxy`. WebSockets must be handled separately.
|
||||
|
||||
@@ -527,7 +540,7 @@ httpServer.on('upgrade', (req, socket, head) => {
|
||||
});
|
||||
```
|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -537,7 +550,7 @@ httpServer.on('upgrade', (req, socket, head) => {
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
**Disclaimer:** It might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
**Disclaimer:** it might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
|
||||
See these screenshots for a working config:
|
||||
|
||||
@@ -545,7 +558,7 @@ See these screenshots for a working config:
|
||||
|
||||

|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -555,7 +568,9 @@ See these screenshots for a working config:
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
**Disclaimer:** It might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
**Hint:** You may have a look at [this video](https://www.youtube.com/watch?v=VLPSRrLMDmA) for a more complete but possibly outdated example.
|
||||
|
||||
**Disclaimer:** it might be possible that the config below is not working 100% correctly, yet. Improvements to it are very welcome!
|
||||
|
||||
Traefik's building blocks (router, service, middlewares) need to be defined using dynamic configuration similar to [this](https://doc.traefik.io/traefik/providers/file/#configuration-examples) official Traefik configuration example. Using **docker labels _won't work_** because of the nature of the project.
|
||||
|
||||
@@ -632,9 +647,7 @@ The examples below define the dynamic configuration in YAML files. If you rather
|
||||
|
||||
---
|
||||
|
||||
⚠️ **Please note:** Look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
**Hint**: see https://www.youtube.com/watch?v=VLPSRrLMDmA for a video on configuring Traefik.
|
||||
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -706,6 +719,17 @@ Add the following `web.config` file to the root of the site you created as the r
|
||||
|
||||
</details>
|
||||
|
||||
### Tailscale
|
||||
|
||||
<details>
|
||||
|
||||
<summary>click here to expand</summary>
|
||||
|
||||
For a reverse proxy example guide for Tailscale, see this guide by @flll: https://github.com/nextcloud/all-in-one/discussions/5439
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### Others
|
||||
|
||||
<details>
|
||||
@@ -720,7 +744,7 @@ Config examples for other reverse proxies are currently not documented. Pull req
|
||||
|
||||
After adjusting your reverse proxy config, use the following command to start AIO:<br>
|
||||
|
||||
(For a docker-compose example, see the example further [below](#inspiration-for-a-docker-compose-file).)
|
||||
(For a `compose.yaml` example, see the example further [below](#inspiration-for-a-docker-compose-file).)
|
||||
|
||||
```
|
||||
# For Linux:
|
||||
@@ -737,9 +761,9 @@ sudo docker run \
|
||||
nextcloud/all-in-one:latest
|
||||
```
|
||||
|
||||
Note: You may be interested in adjusting Nextcloud’s datadir to store the files in a different location than the default docker volume. See [this documentation](https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir) on how to do it.
|
||||
Note: you may be interested in adjusting Nextcloud’s datadir to store the files in a different location than the default docker volume. See [this documentation](https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir) on how to do it.
|
||||
|
||||
You should also think about limiting the apache container to listen only on localhost in case the reverse proxy is running on the same host and in the host network, by providing an additional environmental variable to this docker run command. See [point 3](#3-limit-the-access-to-the-apache-container).
|
||||
You should also think about limiting the Apache container to listen only on localhost in case the reverse proxy is running on the same host and in the host network, by providing an additional environmental variable to this docker run command. See [point 3](#3-limit-the-access-to-the-apache-container).
|
||||
|
||||
On macOS see https://github.com/nextcloud/all-in-one#how-to-run-aio-on-macos.
|
||||
|
||||
@@ -773,11 +797,12 @@ On Synology DSM see https://github.com/nextcloud/all-in-one#how-to-run-aio-on-sy
|
||||
|
||||
Simply translate the docker run command into a docker-compose file. You can have a look at [this file](https://github.com/nextcloud/all-in-one/blob/main/compose.yaml) for some inspiration but you will need to modify it either way. You can find further examples here: https://github.com/nextcloud/all-in-one/discussions/588
|
||||
|
||||
## 3. Limit the access to the apache container
|
||||
## 3. Limit the access to the Apache container
|
||||
|
||||
Use this environment variable during the initial startup of the mastercontainer to make the apache container only listen on localhost: `--env APACHE_IP_BINDING=127.0.0.1`. **Attention:** This is only recommended to be set if you use `localhost` in your reverse proxy config to connect to your AIO instance. If you use an ip-address instead of localhost, you should set it to `0.0.0.0`.
|
||||
|
||||
## 4. Open the AIO interface.
|
||||
## 4. Open the AIO interface
|
||||
|
||||
After starting AIO, you should be able to access the AIO Interface via `https://ip.address.of.the.host:8080`.<br>
|
||||
⚠️ **Important:** do always use an ip-address if you access this port and not a domain as HSTS might block access to it later! (It is also expected that this port uses a self-signed certificate due to security concerns which you need to accept in your browser)<br>
|
||||
Enter your domain in the AIO interface that you've used in the reverse proxy config and you should be done. Please do not forget to open/forward port `3478/TCP` and `3478/UDP` in your firewall/router for the Talk container!
|
||||
@@ -800,17 +825,18 @@ https://<your-nc-domain>:8443 {
|
||||
Afterwards should the AIO interface be accessible via `https://ip.address.of.the.host:8443`. You can alternatively change the domain to a different subdomain by using `https://<your-alternative-domain>:443` instead of `https://<your-nc-domain>:8443` in the Caddyfile and use that to access the AIO interface.
|
||||
|
||||
## 6. How to debug things?
|
||||
|
||||
If something does not work, follow the steps below:
|
||||
1. Make sure to exactly follow the whole reverse proxy documentation step-for-step from top to bottom!
|
||||
1. Make sure that you used the docker run command that is described in this reverse proxy documentation. **Hint:** make sure that you have set the `APACHE_PORT` via e.g. `--env APACHE_PORT=11000` during the docker run command!
|
||||
1. Make sure that you used the `docker run` command that is described in this reverse proxy documentation. **Hint:** make sure that you have set the `APACHE_PORT` via e.g. `--env APACHE_PORT=11000` during the docker run command!
|
||||
1. Make sure to set the `APACHE_IP_BINDING` variable correctly. If in doubt, set it to `--env APACHE_IP_BINDING=0.0.0.0`
|
||||
1. Make sure that all ports to which your reverse proxy is pointing match the chosen `APACHE_PORT`.
|
||||
1. Make sure to follow [this](#adapting-the-sample-web-server-configurations-below) to adapt the example configurations to your specific setup
|
||||
1. Make sure to follow [this](#adapting-the-sample-web-server-configurations-below) to adapt the example configurations to your specific setup!
|
||||
1. Make sure that the mastercontainer is able to spawn other containers. You can do so by checking that the mastercontainer indeed has access to the Docker socket which might not be positioned in one of the suggested directories like `/var/run/docker.sock` but in a different directory, based on your OS and the way how you installed Docker. The mastercontainer logs should help figuring this out. You can have a look at them by running `sudo docker logs nextcloud-aio-mastercontainer` after the container is started the first time.
|
||||
1. Check if after the mastercontainer was started, the reverse proxy if running inside a container, can reach the provided apache port. You can test this by running `nc -z localhost 11000; echo $?` from inside the reverse proxy container. If the output is `0`, everything works. Alternatively you can of course use instead of `localhost` the ip-address of the host here for the test.
|
||||
1. Make sure that you are not behind CGNAT. If that is the case, you will not be able to open ports properly. In that case you might use a Cloudflare Tunnel.
|
||||
1. If you use Cloudflare, you might need to skip the domain validation anyways since it is known that Cloudflare might block the validation attempts. In that case, see the last option below.
|
||||
1. If your reverse proxy is configured to use the host network (as recommended in the above docs) or running on the host, make sure that you've configured your firewall to open port 443 and 80.
|
||||
1. Check if you have a public IPv4- and public IPv6-address. If you only have a public IPv6-address (e.g. due to DS-Lite), make sure to enable IPv6 in Docker and your whole networking infrastructure (e.g. also by adding an AAAA DNS-entry to your domain).
|
||||
1. Try to configure everything from scratch if it still does not work by following https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance.
|
||||
1. Make sure that you are not behind CGNAT. If that is the case, you will not be able to open ports properly. In that case you might use a Cloudflare Tunnel!
|
||||
1. If you use Cloudflare, you might need to skip the domain validation anyways since it is known that Cloudflare might block the validation attempts. In that case, see the last option below!
|
||||
1. If your reverse proxy is configured to use the host network (as recommended in the above docs) or running on the host, make sure that you've configured your firewall to open port 443 (and 80)!
|
||||
1. Check if you have a public IPv4- and public IPv6-address. If you only have a public IPv6-address (e.g. due to DS-Lite), make sure to enable IPv6 in Docker and your whole networking infrastructure (e.g. also by adding an AAAA DNS-entry to your domain)!
|
||||
1. Try to configure everything from scratch - if it still does not work by following https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance.
|
||||
1. As last resort, you may disable the domain validation by adding `--env SKIP_DOMAIN_VALIDATION=true` to the docker run command. But only use this if you are completely sure that you've correctly configured everything!
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# Environmental variables
|
||||
|
||||
- [ ] When starting the mastercontainer with `--env APACHE_PORT=11000` on a clean instance, the domaincheck container should be started with that same port published. That makes sure that also the Apache container will use that port later on. Using a value here that is not a port will not allow the mastercontainer to start correctly.
|
||||
- [ ] When starting the mastercontainer with `--env APACHE_PORT=11000` on a clean instance, the domaincheck container should be started with that same port published. That makes sure that also the Apache container will use that port later on. Using a value here that is not a port will not allow the mastercontainer to start correctly. However `@INTERNAL` is also an allowed value which skips publishing the port on the host for internal usage inside a bridged network for example.
|
||||
- [ ] When starting the mastercontainer with `--env APACHE_IP_BINDING=127.0.0.1` on a clean instance, the domaincheck container's apache port should only listen on localhost on the host. Using a value here that is not a number or dot will not allow the mastercontainer to start correctly.
|
||||
- [ ] When starting the mastercontainer with `--env APACHE_ADDITIONAL_NETWORK=frontend_net` on a clean instance, the domaincheck and subsequently the apache containers should be connected to the specified `frontend_net` docker network, in addition to the default `nextcloud-aio` network. Specifying the network that doesn't already exist will not allow the mastercontainer to start correctly.
|
||||
- [ ] When starting the mastercontainer with `--env TALK_PORT=3479` on a clean instance, the talk container should use this port later on. Using a value here that is not a port will not allow the mastercontainer to start correctly. Also it should stop if apache_port and talk_port are set to the same value.
|
||||
- [ ] Make also sure that reverse proxies work by following https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#reverse-proxy-documentation and following [001-initial-setup.md](./001-initial-setup.md) and [002-new-instance.md](./002-new-instance.md)
|
||||
- [ ] When starting the mastercontainer with `--env SKIP_DOMAIN_VALIDATION=true` on a clean instance, it should skip the domain verification. So it should accept any domain that you type in then.
|
||||
|
||||
Reference in New Issue
Block a user