mirror of
https://github.com/nextcloud/all-in-one.git
synced 2026-02-04 04:56:52 +00:00
Compare commits
160 commits
1b50fea309
...
b51943d8a1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b51943d8a1 | ||
|
|
e9108e3660 | ||
|
|
27020e608d | ||
|
|
d813314494 | ||
|
|
0ee76078ad | ||
|
|
5ba678c082 | ||
|
|
5b6e0f30a6 | ||
|
|
d9d4e3680f | ||
|
|
659b1ca383 | ||
|
|
ec66b359e0 | ||
|
|
078f3caf8a | ||
|
|
3cfe307a5c | ||
|
|
5bdcfd67eb | ||
|
|
5fc4951ba0 | ||
|
|
0cb79a387f | ||
|
|
08438aff42 | ||
|
|
dc5dc0215c | ||
|
|
22a26268e0 | ||
|
|
c3477a7eb2 | ||
|
|
d50dc2db1d | ||
|
|
4ad8fcf258 | ||
|
|
63245430ef | ||
|
|
bfa2b64674 | ||
|
|
365e1e34e4 | ||
|
|
0ed83c5258 | ||
|
|
8b8f60f76b | ||
|
|
bbf41cfdd3 | ||
|
|
f5cf7903ad | ||
|
|
f35a0b4367 | ||
|
|
f7c5115c70 | ||
|
|
567f072ee0 | ||
|
|
00ce78d703 | ||
|
|
c4aa148bff | ||
|
|
b499001501 | ||
|
|
5373471ed8 | ||
|
|
efe8317446 | ||
|
|
41c92b814f | ||
|
|
f17db4fac1 | ||
|
|
5cac2dcf12 | ||
|
|
284411c369 | ||
|
|
62856e78bb | ||
|
|
2425a07772 | ||
|
|
68f811b25f | ||
|
|
62a21dd34a | ||
|
|
dd5d51cb2a | ||
|
|
27fd1e82ab | ||
|
|
3bb2ce6e4c | ||
|
|
dac5cfd917 | ||
|
|
76d475f2b2 | ||
|
|
6bf45fb507 | ||
|
|
c65ccd2db0 | ||
|
|
77bec5898f | ||
|
|
662840bc25 | ||
|
|
fd308d4b80 | ||
|
|
844831a899 | ||
|
|
9c9ad02f8a | ||
|
|
c997332e47 | ||
|
|
f1ffd0771c | ||
|
|
367e847cc8 | ||
|
|
c1f8ac6989 | ||
|
|
3e19fa66d0 | ||
|
|
4de73dd75b | ||
|
|
903aed1e34 | ||
|
|
96c9c1a6f9 | ||
|
|
dc28eb6737 | ||
|
|
4e373cb2f8 | ||
|
|
0a22384cd9 | ||
|
|
6c04cd055f | ||
|
|
228440f2a8 | ||
|
|
ca35006a85 | ||
|
|
6e5237cd20 | ||
|
|
6033a4486c | ||
|
|
a361ab9d20 | ||
|
|
b4d198f72b | ||
|
|
5b0b9ef826 | ||
|
|
f737d2f598 | ||
|
|
f16f5b233d | ||
|
|
190d47810b | ||
|
|
e009abdd54 | ||
|
|
cd1c2276e5 | ||
|
|
0c3d919618 | ||
|
|
f8a244bee2 | ||
|
|
bebae7069b | ||
|
|
f235af29e3 | ||
|
|
6576d3c1e9 | ||
|
|
881e77cca5 | ||
|
|
c968e9e310 | ||
|
|
b8130958c5 | ||
|
|
1d11a4682b | ||
|
|
06fdf31c87 | ||
|
|
484ff79943 | ||
|
|
4d8e959608 | ||
|
|
b2f992d955 | ||
|
|
a9b648e18f | ||
|
|
21b14a4a5d | ||
|
|
0b6c0733ab | ||
|
|
3f4eecaa96 | ||
|
|
8939104d10 | ||
|
|
0213d8e548 | ||
|
|
ba899255c1 | ||
|
|
59e0776808 | ||
|
|
9c6bb67542 | ||
|
|
3f85f10bfb | ||
|
|
9cd519b285 | ||
|
|
3e6deb8802 | ||
|
|
6babbf776a | ||
|
|
27eae80466 | ||
|
|
ebe3d7ee83 | ||
|
|
07c20f5daa | ||
|
|
0df6c0a645 | ||
|
|
845fa94afa | ||
|
|
7e2e0d11da | ||
|
|
44f659ad69 | ||
|
|
d2940b0dc8 | ||
|
|
74443aaacc | ||
|
|
33614b276b | ||
|
|
034c6edea9 | ||
|
|
0e868c4570 | ||
|
|
e1718faf0b | ||
|
|
db07c79db1 | ||
|
|
664ca0b26d | ||
|
|
49c9669fe1 | ||
|
|
4d51f11282 | ||
|
|
c47ace7718 | ||
|
|
dd60066644 | ||
|
|
00688a52bd | ||
|
|
8fb3126ce7 | ||
|
|
a7c091a5b2 | ||
|
|
dc09422030 | ||
|
|
b9e35f01ba | ||
|
|
571e07996e | ||
|
|
9b1d468e24 | ||
|
|
2eaa288596 | ||
|
|
be54fa8805 | ||
|
|
f5a06034dd | ||
|
|
47dd8d25ca | ||
|
|
9e3acb9f68 | ||
|
|
3f581a11b3 | ||
|
|
8124554d90 | ||
|
|
74138dd838 | ||
|
|
52f8c97d45 | ||
|
|
10a3b8213f | ||
|
|
8eed705a90 | ||
|
|
f59b2776c7 | ||
|
|
708e542270 | ||
|
|
b12c36f675 | ||
|
|
2c968917eb | ||
|
|
3b3eea7ef0 | ||
|
|
fcdd000731 | ||
|
|
88a45d1a80 | ||
|
|
f117a441fe | ||
|
|
b7d63253db | ||
|
|
f58465f930 | ||
|
|
dbabfe14f0 | ||
|
|
c5b146f84c | ||
|
|
0e22f38d16 | ||
|
|
9822a63c44 | ||
|
|
4a65c04e3d | ||
|
|
59ad7dc98b | ||
|
|
cdd21ae1ff |
104 changed files with 1410 additions and 1235 deletions
2
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
|
|
@ -37,5 +37,3 @@ labels: 0. Needs triage
|
||||||
#### Output of `sudo docker ps -a`
|
#### Output of `sudo docker ps -a`
|
||||||
|
|
||||||
#### Other valuable info <!--- (like additional logs, screenshots & Co.) -->
|
#### Other valuable info <!--- (like additional logs, screenshots & Co.) -->
|
||||||
|
|
||||||
#### A picture of a cute animal <!--- (not mandatory but encouraged) -->
|
|
||||||
|
|
|
||||||
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
|
|
@ -10,6 +10,8 @@ updates:
|
||||||
labels:
|
labels:
|
||||||
- 3. to review
|
- 3. to review
|
||||||
- dependencies
|
- dependencies
|
||||||
|
cooldown:
|
||||||
|
default-days: 7
|
||||||
- package-ecosystem: composer
|
- package-ecosystem: composer
|
||||||
directory: "/php/"
|
directory: "/php/"
|
||||||
schedule:
|
schedule:
|
||||||
|
|
|
||||||
2
.github/workflows/codespell.yml
vendored
2
.github/workflows/codespell.yml
vendored
|
|
@ -12,7 +12,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Check spelling
|
- name: Check spelling
|
||||||
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
|
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
2
.github/workflows/collabora.yml
vendored
2
.github/workflows/collabora.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
name: update collabora
|
name: update collabora
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run collabora-profile-update
|
- name: Run collabora-profile-update
|
||||||
run: |
|
run: |
|
||||||
rm -f php/cool-seccomp-profile.json
|
rm -f php/cool-seccomp-profile.json
|
||||||
|
|
|
||||||
2
.github/workflows/community-containers.yml
vendored
2
.github/workflows/community-containers.yml
vendored
|
|
@ -16,7 +16,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Validate structure
|
- name: Validate structure
|
||||||
run: |
|
run: |
|
||||||
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
|
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
|
||||||
|
|
|
||||||
2
.github/workflows/dependency-updates.yml
vendored
2
.github/workflows/dependency-updates.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
name: Run dependency update script
|
name: Run dependency update script
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
||||||
with:
|
with:
|
||||||
php-version: 8.4
|
php-version: 8.4
|
||||||
|
|
|
||||||
2
.github/workflows/docker-lint.yml
vendored
2
.github/workflows/docker-lint.yml
vendored
|
|
@ -25,7 +25,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- name: Install hadolint
|
- name: Install hadolint
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
2
.github/workflows/helm-release.yml
vendored
2
.github/workflows/helm-release.yml
vendored
|
|
@ -13,7 +13,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- name: Turnstyle
|
- name: Turnstyle
|
||||||
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
|
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
|
||||||
|
|
|
||||||
2
.github/workflows/imaginary-update.yml
vendored
2
.github/workflows/imaginary-update.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
name: update to latest imaginary commit on master branch
|
name: update to latest imaginary commit on master branch
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run imaginary-update
|
- name: Run imaginary-update
|
||||||
run: |
|
run: |
|
||||||
# Imaginary
|
# Imaginary
|
||||||
|
|
|
||||||
2
.github/workflows/json-validator.yml
vendored
2
.github/workflows/json-validator.yml
vendored
|
|
@ -16,7 +16,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Validate Json
|
- name: Validate Json
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
|
|
|
||||||
2
.github/workflows/lint-helm.yml
vendored
2
.github/workflows/lint-helm.yml
vendored
|
|
@ -11,7 +11,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|
|
||||||
2
.github/workflows/lint-php.yml
vendored
2
.github/workflows/lint-php.yml
vendored
|
|
@ -36,7 +36,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|
|
||||||
2
.github/workflows/lint-yaml.yml
vendored
2
.github/workflows/lint-yaml.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|
|
||||||
2
.github/workflows/nextcloud-update.yml
vendored
2
.github/workflows/nextcloud-update.yml
vendored
|
|
@ -11,7 +11,7 @@ jobs:
|
||||||
name: Run nextcloud-update script
|
name: Run nextcloud-update script
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run nextcloud-update script
|
- name: Run nextcloud-update script
|
||||||
run: |
|
run: |
|
||||||
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
|
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ jobs:
|
||||||
name: PHP Deprecation Detector
|
name: PHP Deprecation Detector
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Set up php
|
- name: Set up php
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
6
.github/workflows/playwright-on-push.yml
vendored
6
.github/workflows/playwright-on-push.yml
vendored
|
|
@ -24,9 +24,9 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- uses: actions/setup-node@v6
|
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
|
|
||||||
|
|
@ -114,7 +114,7 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v6
|
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report
|
name: playwright-report
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,9 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- uses: actions/setup-node@v6
|
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
|
|
||||||
|
|
@ -82,7 +82,7 @@ jobs:
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v6
|
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report
|
name: playwright-report
|
||||||
|
|
|
||||||
2
.github/workflows/psalm-update-baseline.yml
vendored
2
.github/workflows/psalm-update-baseline.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- name: Set up php
|
- name: Set up php
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
||||||
|
|
|
||||||
2
.github/workflows/psalm.yml
vendored
2
.github/workflows/psalm.yml
vendored
|
|
@ -32,7 +32,7 @@ jobs:
|
||||||
name: static-psalm-analysis
|
name: static-psalm-analysis
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|
|
||||||
2
.github/workflows/shellcheck.yml
vendored
2
.github/workflows/shellcheck.yml
vendored
|
|
@ -15,7 +15,7 @@ jobs:
|
||||||
name: Check Shell
|
name: Check Shell
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run Shellcheck
|
- name: Run Shellcheck
|
||||||
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
|
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
2
.github/workflows/talk.yml
vendored
2
.github/workflows/talk.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
name: update talk
|
name: update talk
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run talk-container-update
|
- name: Run talk-container-update
|
||||||
run: |
|
run: |
|
||||||
# Recording
|
# Recording
|
||||||
|
|
|
||||||
2
.github/workflows/twig-lint.yml
vendored
2
.github/workflows/twig-lint.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
|
||||||
|
|
|
||||||
2
.github/workflows/update-copyright.yml
vendored
2
.github/workflows/update-copyright.yml
vendored
|
|
@ -8,4 +8,4 @@ jobs:
|
||||||
name: update copyright
|
name: update copyright
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
|
||||||
2
.github/workflows/update-helm.yml
vendored
2
.github/workflows/update-helm.yml
vendored
|
|
@ -11,7 +11,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: update helm chart
|
- name: update helm chart
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
|
|
|
||||||
2
.github/workflows/update-yaml.yml
vendored
2
.github/workflows/update-yaml.yml
vendored
|
|
@ -11,7 +11,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v6.0.1
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: update yaml files
|
- name: update yaml files
|
||||||
run: |
|
run: |
|
||||||
sudo bash manual-install/update-yaml.sh
|
sudo bash manual-install/update-yaml.sh
|
||||||
|
|
|
||||||
2
.github/workflows/watchtower-update.yml
vendored
2
.github/workflows/watchtower-update.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
||||||
name: update watchtower
|
name: update watchtower
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6.0.1
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- name: Run watchtower-container-update
|
- name: Run watchtower-container-update
|
||||||
run: |
|
run: |
|
||||||
# Watchtower
|
# Watchtower
|
||||||
|
|
|
||||||
13
CODE_OF_CONDUCT.md
Normal file
13
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<!--
|
||||||
|
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
|
||||||
|
- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-->
|
||||||
|
In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software.
|
||||||
|
|
||||||
|
Our code of conduct offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
|
||||||
|
|
||||||
|
The Code of Conduct is shared by all contributors and users who engage with the Nextcloud team and its community services. It presents a summary of the shared values and “common sense” thinking in our community.
|
||||||
|
|
||||||
|
You can find our full code of conduct on our website: https://nextcloud.com/code-of-conduct/
|
||||||
|
|
||||||
|
Please, keep our CoC in mind when you contribute! That way, everyone can be a part of our community in a productive, positive, creative and fun way.
|
||||||
|
|
@ -88,4 +88,5 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -24,5 +24,6 @@ ENTRYPOINT ["/start.sh"]
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
ENV BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6"
|
ENV BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6"
|
||||||
|
|
|
||||||
|
|
@ -33,5 +33,6 @@ VOLUME /var/lib/clamav
|
||||||
ENTRYPOINT ["/start.sh"]
|
ENTRYPOINT ["/start.sh"]
|
||||||
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,5 @@ USER 1001
|
||||||
|
|
||||||
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -11,4 +11,5 @@ USER 1001
|
||||||
|
|
||||||
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -19,4 +19,5 @@ COPY --chmod=664 haproxy.cfg /haproxy.cfg
|
||||||
ENTRYPOINT ["/start.sh"]
|
ENTRYPOINT ["/start.sh"]
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -18,4 +18,5 @@ ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
HEALTHCHECK CMD nc -z 127.0.0.1 $APACHE_PORT || exit 1
|
HEALTHCHECK CMD nc -z 127.0.0.1 $APACHE_PORT || exit 1
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -22,5 +22,6 @@ USER 1000:0
|
||||||
|
|
||||||
HEALTHCHECK --interval=10s --timeout=5s --start-period=1m --retries=5 CMD /healthcheck.sh
|
HEALTHCHECK --interval=10s --timeout=5s --start-period=1m --retries=5 CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
ENV ES_JAVA_OPTS="-Xms512M -Xmx512M"
|
ENV ES_JAVA_OPTS="-Xms512M -Xmx512M"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM golang:1.25.5-alpine3.23 AS go
|
FROM golang:1.25.6-alpine3.23 AS go
|
||||||
|
|
||||||
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
|
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
|
||||||
|
|
||||||
|
|
@ -43,4 +43,5 @@ ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# Docker CLI is a requirement
|
# Docker CLI is a requirement
|
||||||
FROM docker:29.1.4-cli AS docker
|
FROM docker:29.2.0-cli AS docker
|
||||||
|
|
||||||
# Caddy is a requirement
|
# Caddy is a requirement
|
||||||
FROM caddy:2.10.2-alpine AS caddy
|
FROM caddy:2.10.2-alpine AS caddy
|
||||||
|
|
||||||
# From https://github.com/docker-library/php/blob/master/8.4/alpine3.23/fpm/Dockerfile
|
# From https://github.com/docker-library/php/blob/master/8.4/alpine3.23/fpm/Dockerfile
|
||||||
FROM php:8.4.16-fpm-alpine3.23
|
FROM php:8.4.17-fpm-alpine3.23
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
@ -127,6 +127,7 @@ RUN set -ex; \
|
||||||
|
|
||||||
# hadolint ignore=DL3048
|
# hadolint ignore=DL3048
|
||||||
LABEL org.label-schema.vendor="Nextcloud" \
|
LABEL org.label-schema.vendor="Nextcloud" \
|
||||||
|
wud.watch="false" \
|
||||||
com.docker.compose.project="nextcloud-aio"
|
com.docker.compose.project="nextcloud-aio"
|
||||||
|
|
||||||
# hadolint ignore=DL3002
|
# hadolint ignore=DL3002
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ elif ! sudo -E -u www-data docker volume ls --format "{{.Name}}" | grep -q "^nex
|
||||||
print_red "It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.)
|
print_red "It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.)
|
||||||
Using a different name is not supported since the built-in backup solution will not work in that case!"
|
Using a different name is not supported since the built-in backup solution will not work in that case!"
|
||||||
exit 1
|
exit 1
|
||||||
elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer | grep -q "nextcloud_aio_mastercontainer"; then
|
elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer --format '{{.Mounts}}' | grep -q " nextcloud_aio_mastercontainer "; then
|
||||||
print_red "It seems like you did not attach the 'nextcloud_aio_mastercontainer' volume to the mastercontainer?
|
print_red "It seems like you did not attach the 'nextcloud_aio_mastercontainer' volume to the mastercontainer?
|
||||||
This is not supported since the built-in backup solution will not work in that case!"
|
This is not supported since the built-in backup solution will not work in that case!"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM php:8.3.29-fpm-alpine3.23
|
FROM php:8.3.30-fpm-alpine3.23
|
||||||
|
|
||||||
ENV PHP_MEMORY_LIMIT=512M
|
ENV PHP_MEMORY_LIMIT=512M
|
||||||
ENV PHP_UPLOAD_LIMIT=16G
|
ENV PHP_UPLOAD_LIMIT=16G
|
||||||
|
|
@ -8,7 +8,7 @@ ENV SOURCE_LOCATION=/usr/src/nextcloud
|
||||||
ENV REDIS_DB_INDEX=0
|
ENV REDIS_DB_INDEX=0
|
||||||
|
|
||||||
# AIO settings start # Do not remove or change this line!
|
# AIO settings start # Do not remove or change this line!
|
||||||
ENV NEXTCLOUD_VERSION=32.0.4
|
ENV NEXTCLOUD_VERSION=32.0.5
|
||||||
ENV AIO_TOKEN=123456
|
ENV AIO_TOKEN=123456
|
||||||
ENV AIO_URL=localhost
|
ENV AIO_URL=localhost
|
||||||
# AIO settings end # Do not remove or change this line!
|
# AIO settings end # Do not remove or change this line!
|
||||||
|
|
@ -264,4 +264,5 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_POSTGRES')) {
|
||||||
if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_MYSQL')) {
|
if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_MYSQL')) {
|
||||||
$CONFIG = array(
|
$CONFIG = array(
|
||||||
'dbdriveroptions' => array(
|
'dbdriveroptions' => array(
|
||||||
'PDO::MYSQL_ATTR_SSL_CA' => '/var/www/html/data/certificates/ca-bundle.crt',
|
PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/data/certificates/ca-bundle.crt',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -894,7 +894,9 @@ if [ -d "/var/www/html/custom_apps/spreed" ]; then
|
||||||
RECORDING_SERVERS_STRING="{\"servers\":[{\"server\":\"http://$TALK_RECORDING_HOST:1234/\",\"verify\":true}],\"secret\":\"$RECORDING_SECRET\"}"
|
RECORDING_SERVERS_STRING="{\"servers\":[{\"server\":\"http://$TALK_RECORDING_HOST:1234/\",\"verify\":true}],\"secret\":\"$RECORDING_SECRET\"}"
|
||||||
php /var/www/html/occ config:app:set spreed recording_servers --value="$RECORDING_SERVERS_STRING"
|
php /var/www/html/occ config:app:set spreed recording_servers --value="$RECORDING_SERVERS_STRING"
|
||||||
else
|
else
|
||||||
php /var/www/html/occ config:app:delete spreed recording_servers
|
if [ "$REMOVE_DISABLED_APPS" = yes ]; then
|
||||||
|
php /var/www/html/occ config:app:delete spreed recording_servers
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,5 @@ ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,5 @@ COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -44,4 +44,5 @@ ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,5 @@ ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -58,4 +58,5 @@ CMD ["python", "-m", "nextcloud.talk.recording", "--config", "/conf/recording.co
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM nats:2.12.3-scratch AS nats
|
FROM nats:2.12.4-scratch AS nats
|
||||||
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
|
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
|
||||||
FROM strukturag/nextcloud-spreed-signaling:2.0.4 AS signaling
|
FROM strukturag/nextcloud-spreed-signaling:2.0.4 AS signaling
|
||||||
FROM alpine:3.23.2 AS janus
|
FROM alpine:3.23.2 AS janus
|
||||||
|
|
@ -107,4 +107,5 @@ CMD ["supervisord", "-c", "/supervisord.conf"]
|
||||||
|
|
||||||
HEALTHCHECK CMD /healthcheck.sh
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM golang:1.25.5-alpine3.23 AS go
|
FROM golang:1.25.6-alpine3.23 AS go
|
||||||
|
|
||||||
ENV WATCHTOWER_COMMIT_HASH=f6a7b29c312bec5f389a4fb52259919f0678800b
|
ENV WATCHTOWER_COMMIT_HASH=f522ce27e1fbe4618da54833025a95be62aa838a
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
apk add --no-cache \
|
apk add --no-cache \
|
||||||
build-base; \
|
build-base; \
|
||||||
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.13.1
|
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.14.0
|
||||||
|
|
||||||
FROM alpine:3.23.2
|
FROM alpine:3.23.2
|
||||||
|
|
||||||
|
|
@ -24,4 +24,5 @@ USER root
|
||||||
|
|
||||||
ENTRYPOINT ["/start.sh"]
|
ENTRYPOINT ["/start.sh"]
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# Probably from this file: https://github.com/nextcloud/whiteboard/blob/main/Dockerfile
|
# Probably from this file: https://github.com/nextcloud/whiteboard/blob/main/Dockerfile
|
||||||
FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.1
|
FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.3
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
|
|
@ -23,4 +23,5 @@ WORKDIR /tmp
|
||||||
ENTRYPOINT ["/start.sh"]
|
ENTRYPOINT ["/start.sh"]
|
||||||
|
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.label-schema.vendor="Nextcloud"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"aio_services_v1": [
|
"aio_services_v1": [
|
||||||
{
|
{
|
||||||
"container_name": "nextcloud-aio-nocodb",
|
"container_name": "nextcloud-aio-nocodb",
|
||||||
"display_name": "NocoDB",
|
"display_name": "NocoDB (deprecated)",
|
||||||
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb",
|
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb",
|
||||||
"image": "nocodb/nocodb",
|
"image": "nocodb/nocodb",
|
||||||
"image_tag": "latest",
|
"image_tag": "latest",
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
> [!CAUTION]
|
||||||
|
> NocoDB is licensed under a non-free license.
|
||||||
|
>
|
||||||
|
> And is no longer maintained.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> This container is there to compensate for the lack of functionality in Nextcloud Tables.
|
> This container is there to compensate for the lack of functionality in Nextcloud Tables.
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
name: nextcloud-aio-helm-chart
|
name: nextcloud-aio-helm-chart
|
||||||
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
|
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
|
||||||
version: 12.4.0
|
version: 12.5.0
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
keywords:
|
keywords:
|
||||||
- latest
|
- latest
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-apache
|
io.kompose.service: nextcloud-aio-apache
|
||||||
name: nextcloud-aio-apache
|
name: nextcloud-aio-apache
|
||||||
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-apache
|
io.kompose.service: nextcloud-aio-apache
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -61,7 +61,7 @@ spec:
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
- name: WHITEBOARD_HOST
|
- name: WHITEBOARD_HOST
|
||||||
value: nextcloud-aio-whiteboard
|
value: nextcloud-aio-whiteboard
|
||||||
image: ghcr.io/nextcloud-releases/aio-apache:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-apache:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-apache
|
io.kompose.service: nextcloud-aio-apache
|
||||||
name: nextcloud-aio-apache
|
name: nextcloud-aio-apache
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-clamav
|
io.kompose.service: nextcloud-aio-clamav
|
||||||
name: nextcloud-aio-clamav
|
name: nextcloud-aio-clamav
|
||||||
|
|
@ -18,7 +18,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-clamav
|
io.kompose.service: nextcloud-aio-clamav
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -36,7 +36,7 @@ spec:
|
||||||
{{- end }}
|
{{- end }}
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-subpath
|
- name: init-subpath
|
||||||
image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
|
||||||
command:
|
command:
|
||||||
- mkdir
|
- mkdir
|
||||||
- "-p"
|
- "-p"
|
||||||
|
|
@ -59,7 +59,7 @@ spec:
|
||||||
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
|
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-clamav:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-clamav:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-clamav
|
io.kompose.service: nextcloud-aio-clamav
|
||||||
name: nextcloud-aio-clamav
|
name: nextcloud-aio-clamav
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-collabora
|
io.kompose.service: nextcloud-aio-collabora
|
||||||
name: nextcloud-aio-collabora
|
name: nextcloud-aio-collabora
|
||||||
|
|
@ -16,7 +16,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-collabora
|
io.kompose.service: nextcloud-aio-collabora
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -36,9 +36,9 @@ spec:
|
||||||
- name: server_name
|
- name: server_name
|
||||||
value: "{{ .Values.NC_DOMAIN }}"
|
value: "{{ .Values.NC_DOMAIN }}"
|
||||||
{{- if contains "--o:support_key=" (join " " (.Values.ADDITIONAL_COLLABORA_OPTIONS | default list)) }}
|
{{- if contains "--o:support_key=" (join " " (.Values.ADDITIONAL_COLLABORA_OPTIONS | default list)) }}
|
||||||
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260122_105751
|
||||||
{{- else }}
|
{{- else }}
|
||||||
image: ghcr.io/nextcloud-releases/aio-collabora:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-collabora:20260122_105751
|
||||||
{{- end }}
|
{{- end }}
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-collabora
|
io.kompose.service: nextcloud-aio-collabora
|
||||||
name: nextcloud-aio-collabora
|
name: nextcloud-aio-collabora
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-database
|
io.kompose.service: nextcloud-aio-database
|
||||||
name: nextcloud-aio-database
|
name: nextcloud-aio-database
|
||||||
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-database
|
io.kompose.service: nextcloud-aio-database
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -35,7 +35,7 @@ spec:
|
||||||
{{- end }}
|
{{- end }}
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-subpath
|
- name: init-subpath
|
||||||
image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
|
||||||
command:
|
command:
|
||||||
- mkdir
|
- mkdir
|
||||||
- "-p"
|
- "-p"
|
||||||
|
|
@ -64,7 +64,7 @@ spec:
|
||||||
value: nextcloud
|
value: nextcloud
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-postgresql:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-postgresql:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-database
|
io.kompose.service: nextcloud-aio-database
|
||||||
name: nextcloud-aio-database
|
name: nextcloud-aio-database
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-fulltextsearch
|
io.kompose.service: nextcloud-aio-fulltextsearch
|
||||||
name: nextcloud-aio-fulltextsearch
|
name: nextcloud-aio-fulltextsearch
|
||||||
|
|
@ -18,13 +18,13 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-fulltextsearch
|
io.kompose.service: nextcloud-aio-fulltextsearch
|
||||||
spec:
|
spec:
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-volumes
|
- name: init-volumes
|
||||||
image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
|
||||||
command:
|
command:
|
||||||
- chmod
|
- chmod
|
||||||
- "777"
|
- "777"
|
||||||
|
|
@ -54,7 +54,7 @@ spec:
|
||||||
value: basic
|
value: basic
|
||||||
- name: xpack.security.enabled
|
- name: xpack.security.enabled
|
||||||
value: "false"
|
value: "false"
|
||||||
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-fulltextsearch
|
io.kompose.service: nextcloud-aio-fulltextsearch
|
||||||
name: nextcloud-aio-fulltextsearch
|
name: nextcloud-aio-fulltextsearch
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-imaginary
|
io.kompose.service: nextcloud-aio-imaginary
|
||||||
name: nextcloud-aio-imaginary
|
name: nextcloud-aio-imaginary
|
||||||
|
|
@ -16,7 +16,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-imaginary
|
io.kompose.service: nextcloud-aio-imaginary
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -38,7 +38,7 @@ spec:
|
||||||
value: "{{ .Values.IMAGINARY_SECRET }}"
|
value: "{{ .Values.IMAGINARY_SECRET }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-imaginary:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-imaginary:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-imaginary
|
io.kompose.service: nextcloud-aio-imaginary
|
||||||
name: nextcloud-aio-imaginary
|
name: nextcloud-aio-imaginary
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-nextcloud
|
io.kompose.service: nextcloud-aio-nextcloud
|
||||||
name: nextcloud-aio-nextcloud
|
name: nextcloud-aio-nextcloud
|
||||||
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-nextcloud
|
io.kompose.service: nextcloud-aio-nextcloud
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -38,7 +38,7 @@ spec:
|
||||||
# AIO settings start # Do not remove or change this line!
|
# AIO settings start # Do not remove or change this line!
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-volumes
|
- name: init-volumes
|
||||||
image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
|
||||||
command:
|
command:
|
||||||
- chmod
|
- chmod
|
||||||
- "777"
|
- "777"
|
||||||
|
|
@ -190,7 +190,7 @@ spec:
|
||||||
value: "{{ .Values.WHITEBOARD_ENABLED }}"
|
value: "{{ .Values.WHITEBOARD_ENABLED }}"
|
||||||
- name: WHITEBOARD_SECRET
|
- name: WHITEBOARD_SECRET
|
||||||
value: "{{ .Values.WHITEBOARD_SECRET }}"
|
value: "{{ .Values.WHITEBOARD_SECRET }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260122_105751
|
||||||
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
|
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
|
||||||
securityContext:
|
securityContext:
|
||||||
# The items below only work in container context
|
# The items below only work in container context
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-nextcloud
|
io.kompose.service: nextcloud-aio-nextcloud
|
||||||
name: nextcloud-aio-nextcloud
|
name: nextcloud-aio-nextcloud
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-notify-push
|
io.kompose.service: nextcloud-aio-notify-push
|
||||||
name: nextcloud-aio-notify-push
|
name: nextcloud-aio-notify-push
|
||||||
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-notify-push
|
io.kompose.service: nextcloud-aio-notify-push
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -57,7 +57,7 @@ spec:
|
||||||
value: "6379"
|
value: "6379"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-notify-push:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-notify-push:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-notify-push
|
io.kompose.service: nextcloud-aio-notify-push
|
||||||
name: nextcloud-aio-notify-push
|
name: nextcloud-aio-notify-push
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-onlyoffice
|
io.kompose.service: nextcloud-aio-onlyoffice
|
||||||
name: nextcloud-aio-onlyoffice
|
name: nextcloud-aio-onlyoffice
|
||||||
|
|
@ -18,13 +18,13 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-onlyoffice
|
io.kompose.service: nextcloud-aio-onlyoffice
|
||||||
spec:
|
spec:
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-volumes
|
- name: init-volumes
|
||||||
image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
|
||||||
command:
|
command:
|
||||||
- chmod
|
- chmod
|
||||||
- "777"
|
- "777"
|
||||||
|
|
@ -42,7 +42,7 @@ spec:
|
||||||
value: "{{ .Values.ONLYOFFICE_SECRET }}"
|
value: "{{ .Values.ONLYOFFICE_SECRET }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-onlyoffice
|
io.kompose.service: nextcloud-aio-onlyoffice
|
||||||
name: nextcloud-aio-onlyoffice
|
name: nextcloud-aio-onlyoffice
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-redis
|
io.kompose.service: nextcloud-aio-redis
|
||||||
name: nextcloud-aio-redis
|
name: nextcloud-aio-redis
|
||||||
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-redis
|
io.kompose.service: nextcloud-aio-redis
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -39,7 +39,7 @@ spec:
|
||||||
value: "{{ .Values.REDIS_PASSWORD }}"
|
value: "{{ .Values.REDIS_PASSWORD }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-redis:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-redis:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-redis
|
io.kompose.service: nextcloud-aio-redis
|
||||||
name: nextcloud-aio-redis
|
name: nextcloud-aio-redis
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk
|
io.kompose.service: nextcloud-aio-talk
|
||||||
name: nextcloud-aio-talk
|
name: nextcloud-aio-talk
|
||||||
|
|
@ -16,7 +16,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk
|
io.kompose.service: nextcloud-aio-talk
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -52,7 +52,7 @@ spec:
|
||||||
value: "{{ .Values.TURN_SECRET }}"
|
value: "{{ .Values.TURN_SECRET }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-talk:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-talk:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk-recording
|
io.kompose.service: nextcloud-aio-talk-recording
|
||||||
name: nextcloud-aio-talk-recording
|
name: nextcloud-aio-talk-recording
|
||||||
|
|
@ -18,7 +18,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk-recording
|
io.kompose.service: nextcloud-aio-talk-recording
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -44,7 +44,7 @@ spec:
|
||||||
value: "{{ .Values.RECORDING_SECRET }}"
|
value: "{{ .Values.RECORDING_SECRET }}"
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk-recording
|
io.kompose.service: nextcloud-aio-talk-recording
|
||||||
name: nextcloud-aio-talk-recording
|
name: nextcloud-aio-talk-recording
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk
|
io.kompose.service: nextcloud-aio-talk
|
||||||
name: nextcloud-aio-talk-public
|
name: nextcloud-aio-talk-public
|
||||||
|
|
@ -27,7 +27,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-talk
|
io.kompose.service: nextcloud-aio-talk
|
||||||
name: nextcloud-aio-talk
|
name: nextcloud-aio-talk
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-whiteboard
|
io.kompose.service: nextcloud-aio-whiteboard
|
||||||
name: nextcloud-aio-whiteboard
|
name: nextcloud-aio-whiteboard
|
||||||
|
|
@ -16,7 +16,7 @@ spec:
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-whiteboard
|
io.kompose.service: nextcloud-aio-whiteboard
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -50,7 +50,7 @@ spec:
|
||||||
value: redis
|
value: redis
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: "{{ .Values.TIMEZONE }}"
|
value: "{{ .Values.TIMEZONE }}"
|
||||||
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260114_114729
|
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260122_105751
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
kompose.version: 1.37.0 (fb0539e64)
|
kompose.version: 1.38.0 (a8f5d1cbd)
|
||||||
labels:
|
labels:
|
||||||
io.kompose.service: nextcloud-aio-whiteboard
|
io.kompose.service: nextcloud-aio-whiteboard
|
||||||
name: nextcloud-aio-whiteboard
|
name: nextcloud-aio-whiteboard
|
||||||
|
|
|
||||||
|
|
@ -407,7 +407,7 @@ rm latest.yml
|
||||||
mv latest.yml.backup latest.yml
|
mv latest.yml.backup latest.yml
|
||||||
|
|
||||||
# Get version of AIO
|
# Get version of AIO
|
||||||
AIO_VERSION="$(grep 'Nextcloud AIO ' ../php/templates/containers.twig | grep -oP '[0-9]+.[0-9]+.[0-9]+')"
|
AIO_VERSION="$(grep 'Nextcloud AIO ' ../php/templates/includes/aio-version.twig | grep -oP '[0-9]+.[0-9]+.[0-9]+')"
|
||||||
sed -i "s|^version:.*|version: $AIO_VERSION|" ../helm-chart/Chart.yaml
|
sed -i "s|^version:.*|version: $AIO_VERSION|" ../helm-chart/Chart.yaml
|
||||||
|
|
||||||
# Conversion of sample.conf
|
# Conversion of sample.conf
|
||||||
|
|
|
||||||
108
php/composer.lock
generated
108
php/composer.lock
generated
|
|
@ -1644,16 +1644,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/twig",
|
"name": "twig/twig",
|
||||||
"version": "v3.22.2",
|
"version": "v3.23.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/Twig.git",
|
"url": "https://github.com/twigphp/Twig.git",
|
||||||
"reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2"
|
"reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/946ddeafa3c9f4ce279d1f34051af041db0e16f2",
|
"url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
|
||||||
"reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2",
|
"reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1707,7 +1707,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/twigphp/Twig/issues",
|
"issues": "https://github.com/twigphp/Twig/issues",
|
||||||
"source": "https://github.com/twigphp/Twig/tree/v3.22.2"
|
"source": "https://github.com/twigphp/Twig/tree/v3.23.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1719,7 +1719,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-14T11:28:47+00:00"
|
"time": "2026-01-23T21:00:41+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
|
|
@ -3111,20 +3111,20 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/uri",
|
"name": "league/uri",
|
||||||
"version": "7.7.0",
|
"version": "7.8.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/uri.git",
|
"url": "https://github.com/thephpleague/uri.git",
|
||||||
"reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807"
|
"reference": "4436c6ec8d458e4244448b069cc572d088230b76"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
|
"url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76",
|
||||||
"reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
|
"reference": "4436c6ec8d458e4244448b069cc572d088230b76",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"league/uri-interfaces": "^7.7",
|
"league/uri-interfaces": "^7.8",
|
||||||
"php": "^8.1",
|
"php": "^8.1",
|
||||||
"psr/http-factory": "^1"
|
"psr/http-factory": "^1"
|
||||||
},
|
},
|
||||||
|
|
@ -3138,11 +3138,11 @@
|
||||||
"ext-gmp": "to improve IPV4 host parsing",
|
"ext-gmp": "to improve IPV4 host parsing",
|
||||||
"ext-intl": "to handle IDN host with the best performance",
|
"ext-intl": "to handle IDN host with the best performance",
|
||||||
"ext-uri": "to use the PHP native URI class",
|
"ext-uri": "to use the PHP native URI class",
|
||||||
"jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
|
"jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain",
|
||||||
"league/uri-components": "Needed to easily manipulate URI objects components",
|
"league/uri-components": "to provide additional tools to manipulate URI objects components",
|
||||||
"league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP",
|
"league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP",
|
||||||
"php-64bit": "to improve IPV4 host parsing",
|
"php-64bit": "to improve IPV4 host parsing",
|
||||||
"rowbot/url": "to handle WHATWG URL",
|
"rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification",
|
||||||
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
|
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
|
|
@ -3197,7 +3197,7 @@
|
||||||
"docs": "https://uri.thephpleague.com",
|
"docs": "https://uri.thephpleague.com",
|
||||||
"forum": "https://thephpleague.slack.com",
|
"forum": "https://thephpleague.slack.com",
|
||||||
"issues": "https://github.com/thephpleague/uri-src/issues",
|
"issues": "https://github.com/thephpleague/uri-src/issues",
|
||||||
"source": "https://github.com/thephpleague/uri/tree/7.7.0"
|
"source": "https://github.com/thephpleague/uri/tree/7.8.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3205,20 +3205,20 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-07T16:02:06+00:00"
|
"time": "2026-01-14T17:24:56+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/uri-interfaces",
|
"name": "league/uri-interfaces",
|
||||||
"version": "7.7.0",
|
"version": "7.8.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/uri-interfaces.git",
|
"url": "https://github.com/thephpleague/uri-interfaces.git",
|
||||||
"reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c"
|
"reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
|
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
|
||||||
"reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
|
"reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -3231,7 +3231,7 @@
|
||||||
"ext-gmp": "to improve IPV4 host parsing",
|
"ext-gmp": "to improve IPV4 host parsing",
|
||||||
"ext-intl": "to handle IDN host with the best performance",
|
"ext-intl": "to handle IDN host with the best performance",
|
||||||
"php-64bit": "to improve IPV4 host parsing",
|
"php-64bit": "to improve IPV4 host parsing",
|
||||||
"rowbot/url": "to handle WHATWG URL",
|
"rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification",
|
||||||
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
|
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
|
|
@ -3281,7 +3281,7 @@
|
||||||
"docs": "https://uri.thephpleague.com",
|
"docs": "https://uri.thephpleague.com",
|
||||||
"forum": "https://thephpleague.slack.com",
|
"forum": "https://thephpleague.slack.com",
|
||||||
"issues": "https://github.com/thephpleague/uri-src/issues",
|
"issues": "https://github.com/thephpleague/uri-src/issues",
|
||||||
"source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0"
|
"source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3289,7 +3289,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-07T16:03:21+00:00"
|
"time": "2026-01-15T06:54:53+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "netresearch/jsonmapper",
|
"name": "netresearch/jsonmapper",
|
||||||
|
|
@ -3455,16 +3455,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpdocumentor/reflection-docblock",
|
"name": "phpdocumentor/reflection-docblock",
|
||||||
"version": "6.0.0",
|
"version": "6.0.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||||
"reference": "02600c041e7d0f4b7d1fe1d260565ec525472fa9"
|
"reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/02600c041e7d0f4b7d1fe1d260565ec525472fa9",
|
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
|
||||||
"reference": "02600c041e7d0f4b7d1fe1d260565ec525472fa9",
|
"reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -3514,9 +3514,9 @@
|
||||||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
|
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
|
||||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.0"
|
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.1"
|
||||||
},
|
},
|
||||||
"time": "2026-01-07T20:22:53+00:00"
|
"time": "2026-01-20T15:30:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpdocumentor/type-resolver",
|
"name": "phpdocumentor/type-resolver",
|
||||||
|
|
@ -3578,16 +3578,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpdoc-parser",
|
"name": "phpstan/phpdoc-parser",
|
||||||
"version": "2.3.1",
|
"version": "2.3.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||||
"reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374"
|
"reference": "a004701b11273a26cd7955a61d67a7f1e525a45a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
|
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a",
|
||||||
"reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
|
"reference": "a004701b11273a26cd7955a61d67a7f1e525a45a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -3619,9 +3619,9 @@
|
||||||
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
||||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1"
|
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2"
|
||||||
},
|
},
|
||||||
"time": "2026-01-12T11:33:04+00:00"
|
"time": "2026-01-25T14:56:51+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "revolt/event-loop",
|
"name": "revolt/event-loop",
|
||||||
|
|
@ -3890,16 +3890,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v6.4.31",
|
"version": "v6.4.32",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997"
|
"reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/console/zipball/f9f8a889f54c264f9abac3fc0f7a371ffca51997",
|
"url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3",
|
||||||
"reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997",
|
"reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -3964,7 +3964,7 @@
|
||||||
"terminal"
|
"terminal"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/console/tree/v6.4.31"
|
"source": "https://github.com/symfony/console/tree/v6.4.32"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3984,7 +3984,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-22T08:30:34+00:00"
|
"time": "2026-01-13T08:45:59+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/filesystem",
|
"name": "symfony/filesystem",
|
||||||
|
|
@ -4058,16 +4058,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
"version": "v6.4.31",
|
"version": "v6.4.33",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/finder.git",
|
"url": "https://github.com/symfony/finder.git",
|
||||||
"reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b"
|
"reference": "24965ca011dac87431729640feef8bcf7b5523e0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/finder/zipball/5547f2e1f0ca8e2e7abe490156b62da778cfbe2b",
|
"url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0",
|
||||||
"reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b",
|
"reference": "24965ca011dac87431729640feef8bcf7b5523e0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -4102,7 +4102,7 @@
|
||||||
"description": "Finds files and directories via an intuitive fluent interface",
|
"description": "Finds files and directories via an intuitive fluent interface",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/finder/tree/v6.4.31"
|
"source": "https://github.com/symfony/finder/tree/v6.4.33"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -4122,7 +4122,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-11T14:52:17+00:00"
|
"time": "2026-01-26T13:03:48+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-grapheme",
|
"name": "symfony/polyfill-intl-grapheme",
|
||||||
|
|
@ -4460,16 +4460,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/string",
|
"name": "symfony/string",
|
||||||
"version": "v7.4.0",
|
"version": "v7.4.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/string.git",
|
"url": "https://github.com/symfony/string.git",
|
||||||
"reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
|
"reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
|
"url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f",
|
||||||
"reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
|
"reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -4527,7 +4527,7 @@
|
||||||
"utf8"
|
"utf8"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/string/tree/v7.4.0"
|
"source": "https://github.com/symfony/string/tree/v7.4.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -4547,7 +4547,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-11-27T13:27:24+00:00"
|
"time": "2026-01-12T10:54:30+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vimeo/psalm",
|
"name": "vimeo/psalm",
|
||||||
|
|
|
||||||
3
php/get-configurable-aio-variables.sh
Executable file
3
php/get-configurable-aio-variables.sh
Executable file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
awk '/^ public [^f][^u][^n]/ { sub(/\$/, "", $3); print $3 }' src/Data/ConfigurationManager.php | sort
|
||||||
|
|
@ -20,5 +20,10 @@
|
||||||
</extraFiles>
|
</extraFiles>
|
||||||
<issueHandlers>
|
<issueHandlers>
|
||||||
<ClassMustBeFinal errorLevel="suppress" />
|
<ClassMustBeFinal errorLevel="suppress" />
|
||||||
|
<MissingConstructor>
|
||||||
|
<errorLevel type="suppress">
|
||||||
|
<file name="src/Data/ConfigurationManager.php" /> <!-- We're using property hooks with virtual properties in that file, which Psalm wrongly complains about. See <https://github.com/vimeo/psalm/issues/11435>. -->
|
||||||
|
</errorLevel>
|
||||||
|
</MissingConstructor>
|
||||||
</issueHandlers>
|
</issueHandlers>
|
||||||
</psalm>
|
</psalm>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
// Hide submit button initially
|
// Hide submit button initially
|
||||||
const optionsFormSubmit = document.getElementById("options-form-submit");
|
const optionsFormSubmit = document.querySelectorAll(".options-form-submit");
|
||||||
optionsFormSubmit.style.display = 'none';
|
optionsFormSubmit.forEach(element => {
|
||||||
|
element.style.display = 'none';
|
||||||
|
});
|
||||||
|
|
||||||
const communityFormSubmit = document.getElementById("community-form-submit");
|
const communityFormSubmit = document.getElementById("community-form-submit");
|
||||||
communityFormSubmit.style.display = 'none';
|
communityFormSubmit.style.display = 'none';
|
||||||
|
|
@ -12,6 +14,14 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
const optionsContainersCheckboxes = document.querySelectorAll("#options-form input[type='checkbox']");
|
const optionsContainersCheckboxes = document.querySelectorAll("#options-form input[type='checkbox']");
|
||||||
const communityContainersCheckboxes = document.querySelectorAll("#community-form input[type='checkbox']");
|
const communityContainersCheckboxes = document.querySelectorAll("#community-form input[type='checkbox']");
|
||||||
|
|
||||||
|
// Office suite radio buttons
|
||||||
|
const collaboraRadio = document.getElementById('office-collabora');
|
||||||
|
const onlyofficeRadio = document.getElementById('office-onlyoffice');
|
||||||
|
const noneRadio = document.getElementById('office-none');
|
||||||
|
const collaboraHidden = document.getElementById('collabora');
|
||||||
|
const onlyofficeHidden = document.getElementById('onlyoffice');
|
||||||
|
let initialOfficeSelection = null;
|
||||||
|
|
||||||
optionsContainersCheckboxes.forEach(checkbox => {
|
optionsContainersCheckboxes.forEach(checkbox => {
|
||||||
initialStateOptionsContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
|
initialStateOptionsContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
|
||||||
});
|
});
|
||||||
|
|
@ -20,6 +30,17 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
initialStateCommunityContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
|
initialStateCommunityContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Store initial office suite selection
|
||||||
|
if (collaboraRadio && onlyofficeRadio && noneRadio) {
|
||||||
|
if (collaboraRadio.checked) {
|
||||||
|
initialOfficeSelection = 'collabora';
|
||||||
|
} else if (onlyofficeRadio.checked) {
|
||||||
|
initialOfficeSelection = 'onlyoffice';
|
||||||
|
} else {
|
||||||
|
initialOfficeSelection = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Function to compare current states to initial states
|
// Function to compare current states to initial states
|
||||||
function checkForOptionContainerChanges() {
|
function checkForOptionContainerChanges() {
|
||||||
let hasChanges = false;
|
let hasChanges = false;
|
||||||
|
|
@ -30,8 +51,32 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Check office suite changes and sync to hidden inputs
|
||||||
|
if (collaboraRadio && onlyofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden) {
|
||||||
|
let currentOfficeSelection = null;
|
||||||
|
if (collaboraRadio.checked) {
|
||||||
|
currentOfficeSelection = 'collabora';
|
||||||
|
collaboraHidden.value = 'on';
|
||||||
|
onlyofficeHidden.value = '';
|
||||||
|
} else if (onlyofficeRadio.checked) {
|
||||||
|
currentOfficeSelection = 'onlyoffice';
|
||||||
|
collaboraHidden.value = '';
|
||||||
|
onlyofficeHidden.value = 'on';
|
||||||
|
} else {
|
||||||
|
currentOfficeSelection = 'none';
|
||||||
|
collaboraHidden.value = '';
|
||||||
|
onlyofficeHidden.value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentOfficeSelection !== initialOfficeSelection) {
|
||||||
|
hasChanges = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Show or hide submit button based on changes
|
// Show or hide submit button based on changes
|
||||||
optionsFormSubmit.style.display = hasChanges ? 'block' : 'none';
|
optionsFormSubmit.forEach(element => {
|
||||||
|
element.style.display = hasChanges ? 'block' : 'none';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to compare current states to initial states
|
// Function to compare current states to initial states
|
||||||
|
|
@ -82,6 +127,13 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
// Initialize talk-recording visibility on page load
|
// Initialize talk-recording visibility on page load
|
||||||
handleTalkVisibility(); // Ensure talk-recording is correctly initialized
|
handleTalkVisibility(); // Ensure talk-recording is correctly initialized
|
||||||
|
|
||||||
|
// Add event listeners for office suite radio buttons
|
||||||
|
if (collaboraRadio && onlyofficeRadio && noneRadio) {
|
||||||
|
collaboraRadio.addEventListener('change', checkForOptionContainerChanges);
|
||||||
|
onlyofficeRadio.addEventListener('change', checkForOptionContainerChanges);
|
||||||
|
noneRadio.addEventListener('change', checkForOptionContainerChanges);
|
||||||
|
}
|
||||||
|
|
||||||
// Initial call to check for changes
|
// Initial call to check for changes
|
||||||
checkForOptionContainerChanges();
|
checkForOptionContainerChanges();
|
||||||
checkForCommunityContainerChanges();
|
checkForCommunityContainerChanges();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
document.addEventListener("DOMContentLoaded", function(event) {
|
document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
// Collabora
|
// Collabora
|
||||||
let collabora = document.getElementById("collabora");
|
const collabora = document.getElementById("office-collabora");
|
||||||
collabora.disabled = true;
|
collabora.disabled = true;
|
||||||
});
|
});
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
document.addEventListener("DOMContentLoaded", function(event) {
|
document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
// OnlyOffice
|
// OnlyOffice
|
||||||
let onlyoffice = document.getElementById("onlyoffice");
|
const onlyoffice = document.getElementById("office-onlyoffice");
|
||||||
if (onlyoffice) {
|
onlyoffice.disabled = true;
|
||||||
onlyoffice.disabled = true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
@ -91,10 +91,10 @@ $app->get('/containers', function (Request $request, Response $response, array $
|
||||||
$skip_domain_validation = isset($params['skip_domain_validation']);
|
$skip_domain_validation = isset($params['skip_domain_validation']);
|
||||||
|
|
||||||
return $view->render($response, 'containers.twig', [
|
return $view->render($response, 'containers.twig', [
|
||||||
'domain' => $configurationManager->GetDomain(),
|
'domain' => $configurationManager->domain,
|
||||||
'apache_port' => $configurationManager->GetApachePort(),
|
'apache_port' => $configurationManager->apachePort,
|
||||||
'borg_backup_host_location' => $configurationManager->GetBorgBackupHostLocation(),
|
'borg_backup_host_location' => $configurationManager->borgBackupHostLocation,
|
||||||
'borg_remote_repo' => $configurationManager->GetBorgRemoteRepo(),
|
'borg_remote_repo' => $configurationManager->borgRemoteRepo,
|
||||||
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
|
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
|
||||||
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
|
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
|
||||||
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
|
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
|
||||||
|
|
@ -103,45 +103,59 @@ $app->get('/containers', function (Request $request, Response $response, array $
|
||||||
'has_backup_run_once' => $configurationManager->hasBackupRunOnce(),
|
'has_backup_run_once' => $configurationManager->hasBackupRunOnce(),
|
||||||
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
|
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
|
||||||
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
|
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
|
||||||
'is_instance_restore_attempt' => $configurationManager->isInstanceRestoreAttempt(),
|
'is_instance_restore_attempt' => $configurationManager->instanceRestoreAttempt,
|
||||||
'borg_backup_mode' => $configurationManager->GetBackupMode(),
|
'borg_backup_mode' => $configurationManager->backupMode,
|
||||||
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked(),
|
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
|
||||||
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
|
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
|
||||||
'last_backup_time' => $configurationManager->GetLastBackupTime(),
|
'last_backup_time' => $configurationManager->GetLastBackupTime(),
|
||||||
'backup_times' => $configurationManager->GetBackupTimes(),
|
'backup_times' => $configurationManager->GetBackupTimes(),
|
||||||
'current_channel' => $dockerActionManager->GetCurrentChannel(),
|
'current_channel' => $dockerActionManager->GetCurrentChannel(),
|
||||||
'is_clamav_enabled' => $configurationManager->isClamavEnabled(),
|
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
|
||||||
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled(),
|
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
|
||||||
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled(),
|
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
|
||||||
'is_talk_enabled' => $configurationManager->isTalkEnabled(),
|
'is_talk_enabled' => $configurationManager->isTalkEnabled,
|
||||||
'borg_restore_password' => $configurationManager->GetBorgRestorePassword(),
|
'borg_restore_password' => $configurationManager->borgRestorePassword,
|
||||||
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
|
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
|
||||||
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
|
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
|
||||||
'timezone' => $configurationManager->GetTimezone(),
|
'timezone' => $configurationManager->timezone,
|
||||||
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
|
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
|
||||||
'talk_port' => $configurationManager->GetTalkPort(),
|
'talk_port' => $configurationManager->talkPort,
|
||||||
'collabora_dictionaries' => $configurationManager->GetCollaboraDictionaries(),
|
'collabora_dictionaries' => $configurationManager->collaboraDictionaries,
|
||||||
'collabora_additional_options' => $configurationManager->GetAdditionalCollaboraOptions(),
|
'collabora_additional_options' => $configurationManager->collaboraAdditionalOptions,
|
||||||
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
|
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
|
||||||
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
|
'is_backup_section_enabled' => !$configurationManager->disableBackupSection,
|
||||||
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled(),
|
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
|
||||||
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled(),
|
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
|
||||||
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
|
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
|
||||||
'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
|
'nextcloud_datadir' => $configurationManager->nextcloudDatadirMount,
|
||||||
'nextcloud_mount' => $configurationManager->GetNextcloudMount(),
|
'nextcloud_mount' => $configurationManager->nextcloudMount,
|
||||||
'nextcloud_upload_limit' => $configurationManager->GetNextcloudUploadLimit(),
|
'nextcloud_upload_limit' => $configurationManager->nextcloudUploadLimit,
|
||||||
'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
|
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
|
||||||
'nextcloud_memory_limit' => $configurationManager->GetNextcloudMemoryLimit(),
|
'nextcloud_memory_limit' => $configurationManager->nextcloudMemoryLimit,
|
||||||
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
|
'is_dri_device_enabled' => $configurationManager->nextcloudEnableDriDevice,
|
||||||
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
|
'is_nvidia_gpu_enabled' => $configurationManager->enableNvidiaGpu,
|
||||||
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled(),
|
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
|
||||||
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled(),
|
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
|
||||||
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled(),
|
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
|
||||||
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
|
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
|
||||||
'community_containers_enabled' => $configurationManager->GetEnabledCommunityContainers(),
|
'community_containers_enabled' => $configurationManager->aioCommunityContainers,
|
||||||
'bypass_container_update' => $bypass_container_update,
|
'bypass_container_update' => $bypass_container_update,
|
||||||
]);
|
]);
|
||||||
})->setName('profile');
|
})->setName('profile');
|
||||||
|
|
||||||
|
// Server-Sent Events endpoint for container events (container-start)
|
||||||
|
$app->get('/events/containers', function (Request $request, Response $response, array $args) use ($container) {
|
||||||
|
// Only allow authenticated sessions to access SSE
|
||||||
|
$authManager = $container->get(\AIO\Auth\AuthManager::class);
|
||||||
|
if (!$authManager->IsAuthenticated()) {
|
||||||
|
return $response->withStatus(401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delegate streaming logic to the DockerController
|
||||||
|
$dockerController = $container->get(\AIO\Controller\DockerController::class);
|
||||||
|
return $dockerController->StreamContainerEvents($response);
|
||||||
|
});
|
||||||
|
|
||||||
$app->get('/login', function (Request $request, Response $response, array $args) use ($container) {
|
$app->get('/login', function (Request $request, Response $response, array $args) use ($container) {
|
||||||
$view = Twig::fromRequest($request);
|
$view = Twig::fromRequest($request);
|
||||||
/** @var \AIO\Docker\DockerActionManager $dockerActionManager */
|
/** @var \AIO\Docker\DockerActionManager $dockerActionManager */
|
||||||
|
|
|
||||||
27
php/public/overlay-log.js
Normal file
27
php/public/overlay-log.js
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
|
function displayOverlayLogMessage(message) {
|
||||||
|
const overlayLogElement = document.getElementById('overlay-log');
|
||||||
|
if (!overlayLogElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
overlayLogElement.textContent = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to connect to Server-Sent Events at /events/containers and listen for 'container-start' events
|
||||||
|
if (typeof EventSource !== 'undefined') {
|
||||||
|
try {
|
||||||
|
const serverSentEventSource = new EventSource('events/containers');
|
||||||
|
serverSentEventSource.addEventListener('container-start', function(serverSentEvent) {
|
||||||
|
try {
|
||||||
|
let parsedPayload = JSON.parse(serverSentEvent.data);
|
||||||
|
displayOverlayLogMessage(parsedPayload.name || serverSentEvent.data);
|
||||||
|
} catch (parseError) {
|
||||||
|
displayOverlayLogMessage(serverSentEvent.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
serverSentEventSource.onerror = function() { serverSentEventSource.close(); };
|
||||||
|
} catch (connectionError) {
|
||||||
|
/* ignore if Server-Sent Events are not available */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
--border-radius-large: 12px;
|
--border-radius-large: 12px;
|
||||||
--default-font-size: 13px;
|
--default-font-size: 13px;
|
||||||
--checkbox-size: 16px;
|
--checkbox-size: 16px;
|
||||||
--max-width: 500px;
|
--max-width: 580px;
|
||||||
--container-top-margin: 20px;
|
--container-top-margin: 20px;
|
||||||
--container-bottom-margin: 20px;
|
--container-bottom-margin: 20px;
|
||||||
--container-padding: 2px;
|
--container-padding: 2px;
|
||||||
|
|
@ -37,9 +37,9 @@
|
||||||
--main-padding: 50px;
|
--main-padding: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Breakpoint calculation: 500px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 800px
|
/* Breakpoint calculation: 580px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 880px
|
||||||
Note: Unfortunately, it's not possible to calculate this dynamically using CSS variables in media queries */
|
Note: Unfortunately, it's not possible to calculate this dynamically using CSS variables in media queries */
|
||||||
@media only screen and (max-width: 800px) {
|
@media only screen and (max-width: 880px) {
|
||||||
:root {
|
:root {
|
||||||
--container-top-margin: 50px;
|
--container-top-margin: 50px;
|
||||||
--container-bottom-margin: 0px;
|
--container-bottom-margin: 0px;
|
||||||
|
|
@ -549,3 +549,160 @@ input[type="checkbox"]:disabled:not(:checked) + label {
|
||||||
#theme-toggle:not(:hover) #theme-icon {
|
#theme-toggle:not(:hover) #theme-icon {
|
||||||
opacity: 0.6; /* Slightly transparent */
|
opacity: 0.6; /* Slightly transparent */
|
||||||
}
|
}
|
||||||
|
/* Office Suite Feature Cards */
|
||||||
|
.office-suite-cards {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||||
|
gap: 16px;
|
||||||
|
margin: 20px 0;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-radio {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-card {
|
||||||
|
position: relative;
|
||||||
|
border: 2px solid var(--color-border-maxcontrast);
|
||||||
|
border-radius: var(--border-radius-large);
|
||||||
|
padding: 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
background-color: var(--color-main-background);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-card-disabled {
|
||||||
|
opacity: 50%;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-card:hover {
|
||||||
|
border-color: var(--color-primary-element);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 130, 201, 0.15);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#office-collabora:checked + .office-card,
|
||||||
|
#office-onlyoffice:checked + .office-card {
|
||||||
|
border-color: var(--color-nextcloud-blue);
|
||||||
|
background: linear-gradient(135deg, rgba(0, 130, 201, 0.08) 0%, rgba(0, 130, 201, 0.02) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="dark"] #office-collabora:checked + .office-card,
|
||||||
|
[data-theme="dark"] #office-onlyoffice:checked + .office-card {
|
||||||
|
background: linear-gradient(135deg, rgba(0, 145, 242, 0.15) 0%, rgba(0, 145, 242, 0.03) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-card-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-card h4 {
|
||||||
|
margin: 0;
|
||||||
|
height: 24px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--color-main-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-checkmark {
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#office-collabora:checked + .office-card .office-checkmark,
|
||||||
|
#office-onlyoffice:checked + .office-card .office-checkmark {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-features {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-features li {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 20px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
font-size: var(--default-font-size);
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--color-main-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-features li::before {
|
||||||
|
content: '•';
|
||||||
|
position: absolute;
|
||||||
|
left: 6px;
|
||||||
|
color: var(--color-nextcloud-blue);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-checkbox {
|
||||||
|
position: absolute;
|
||||||
|
opacity: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-learn-more {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 12px;
|
||||||
|
color: var(--color-primary-element);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: var(--default-font-size);
|
||||||
|
font-weight: 500;
|
||||||
|
transition: color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-learn-more:hover {
|
||||||
|
color: var(--color-primary-element-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-learn-more svg {
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-learn-more:hover svg {
|
||||||
|
transform: translateX(3px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-none-card {
|
||||||
|
text-align: center;
|
||||||
|
margin: 12px 0 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-none-label {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 13px;
|
||||||
|
color: var(--color-primary-element);
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: 0.7;
|
||||||
|
transition: opacity 0.2s ease;
|
||||||
|
padding: 8px 12px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.office-none-label:hover {
|
||||||
|
opacity: 1;
|
||||||
|
background-color: var(--color-primary-element-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
#office-none:checked + .office-none-label {
|
||||||
|
opacity: 1;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive adjustments for mobile */
|
||||||
|
@media only screen and (max-width: 800px) {
|
||||||
|
.office-suite-cards {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,11 @@ readonly class AuthManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function CheckCredentials(string $password) : bool {
|
public function CheckCredentials(string $password) : bool {
|
||||||
return hash_equals($this->configurationManager->GetPassword(), $password);
|
return hash_equals($this->configurationManager->password, $password);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function CheckToken(string $token) : bool {
|
public function CheckToken(string $token) : bool {
|
||||||
return hash_equals($this->configurationManager->GetToken(), $token);
|
return hash_equals($this->configurationManager->aioToken, $token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetAuthState(bool $isLoggedIn) : void {
|
public function SetAuthState(bool $isLoggedIn) : void {
|
||||||
|
|
|
||||||
|
|
@ -5,121 +5,56 @@ namespace AIO\Container;
|
||||||
use AIO\Data\ConfigurationManager;
|
use AIO\Data\ConfigurationManager;
|
||||||
use AIO\Docker\DockerActionManager;
|
use AIO\Docker\DockerActionManager;
|
||||||
use AIO\ContainerDefinitionFetcher;
|
use AIO\ContainerDefinitionFetcher;
|
||||||
|
use JsonException;
|
||||||
|
|
||||||
readonly class Container {
|
readonly class Container {
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private string $identifier,
|
public string $identifier,
|
||||||
private string $displayName,
|
public string $displayName,
|
||||||
private string $containerName,
|
public string $containerName,
|
||||||
private string $restartPolicy,
|
public string $restartPolicy,
|
||||||
private int $maxShutdownTime,
|
public int $maxShutdownTime,
|
||||||
private ContainerPorts $ports,
|
public ContainerPorts $ports,
|
||||||
private string $internalPorts,
|
public string $internalPorts,
|
||||||
private ContainerVolumes $volumes,
|
public ContainerVolumes $volumes,
|
||||||
private ContainerEnvironmentVariables $containerEnvironmentVariables,
|
public ContainerEnvironmentVariables $containerEnvironmentVariables,
|
||||||
/** @var string[] */
|
/** @var string[] */
|
||||||
private array $dependsOn,
|
public array $dependsOn,
|
||||||
private string $uiSecret,
|
private string $uiSecret,
|
||||||
/** @var string[] */
|
/** @var string[] */
|
||||||
private array $devices,
|
public array $devices,
|
||||||
private bool $enableNvidiaGpu,
|
public bool $enableNvidiaGpu,
|
||||||
/** @var string[] */
|
/** @var string[] */
|
||||||
private array $capAdd,
|
public array $capAdd,
|
||||||
private int $shmSize,
|
public int $shmSize,
|
||||||
private bool $apparmorUnconfined,
|
public bool $apparmorUnconfined,
|
||||||
/** @var string[] */
|
/** @var string[] */
|
||||||
private array $backupVolumes,
|
public array $backupVolumes,
|
||||||
private array $nextcloudExecCommands,
|
public array $nextcloudExecCommands,
|
||||||
private bool $readOnlyRootFs,
|
public bool $readOnlyRootFs,
|
||||||
private array $tmpfs,
|
public array $tmpfs,
|
||||||
private bool $init,
|
public bool $init,
|
||||||
private string $imageTag,
|
public string $imageTag,
|
||||||
private AioVariables $aioVariables,
|
public AioVariables $aioVariables,
|
||||||
private string $documentation,
|
public string $documentation,
|
||||||
private DockerActionManager $dockerActionManager
|
private DockerActionManager $dockerActionManager
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetIdentifier() : string {
|
|
||||||
return $this->identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetDisplayName() : string {
|
|
||||||
return $this->displayName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetContainerName() : string {
|
|
||||||
return $this->containerName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetRestartPolicy() : string {
|
|
||||||
return $this->restartPolicy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetImageTag() : string {
|
|
||||||
return $this->imageTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetReadOnlySetting() : bool {
|
|
||||||
return $this->readOnlyRootFs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetInit() : bool {
|
|
||||||
return $this->init;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetShmSize() : int {
|
|
||||||
return $this->shmSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function isApparmorUnconfined() : bool {
|
|
||||||
return $this->apparmorUnconfined;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetMaxShutdownTime() : int {
|
|
||||||
return $this->maxShutdownTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetUiSecret() : string {
|
public function GetUiSecret() : string {
|
||||||
return $this->dockerActionManager->GetAndGenerateSecretWrapper($this->uiSecret);
|
return $this->dockerActionManager->GetAndGenerateSecretWrapper($this->uiSecret);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetTmpfs() : array {
|
/**
|
||||||
return $this->tmpfs;
|
* @throws JsonException
|
||||||
}
|
*/
|
||||||
|
|
||||||
public function GetDevices() : array {
|
|
||||||
return $this->devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function isNvidiaGpuEnabled() : bool {
|
|
||||||
return $this->enableNvidiaGpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetCapAdds() : array {
|
|
||||||
return $this->capAdd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetBackupVolumes() : array {
|
|
||||||
return $this->backupVolumes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetPorts() : ContainerPorts {
|
|
||||||
return $this->ports;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetInternalPort() : string {
|
|
||||||
return $this->internalPorts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetVolumes() : ContainerVolumes {
|
|
||||||
return $this->volumes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetRunningState() : ContainerState {
|
public function GetRunningState() : ContainerState {
|
||||||
return $this->dockerActionManager->GetContainerRunningState($this);
|
return $this->dockerActionManager->GetContainerRunningState($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws JsonException
|
||||||
|
*/
|
||||||
public function GetRestartingState() : ContainerState {
|
public function GetRestartingState() : ContainerState {
|
||||||
return $this->dockerActionManager->GetContainerRestartingState($this);
|
return $this->dockerActionManager->GetContainerRestartingState($this);
|
||||||
}
|
}
|
||||||
|
|
@ -131,27 +66,4 @@ readonly class Container {
|
||||||
public function GetStartingState() : ContainerState {
|
public function GetStartingState() : ContainerState {
|
||||||
return $this->dockerActionManager->GetContainerStartingState($this);
|
return $this->dockerActionManager->GetContainerStartingState($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function GetDependsOn() : array {
|
|
||||||
return $this->dependsOn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetNextcloudExecCommands() : array {
|
|
||||||
return $this->nextcloudExecCommands;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetEnvironmentVariables() : ContainerEnvironmentVariables {
|
|
||||||
return $this->containerEnvironmentVariables;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetAioVariables() : AioVariables {
|
|
||||||
return $this->aioVariables;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetDocumentation() : string {
|
|
||||||
return $this->documentation;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ readonly class ContainerDefinitionFetcher {
|
||||||
$containers = $this->FetchDefinition();
|
$containers = $this->FetchDefinition();
|
||||||
|
|
||||||
foreach ($containers as $container) {
|
foreach ($containers as $container) {
|
||||||
if ($container->GetIdentifier() === $id) {
|
if ($container->identifier === $id) {
|
||||||
return $container;
|
return $container;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -41,7 +41,7 @@ readonly class ContainerDefinitionFetcher {
|
||||||
$data = json_decode((string)file_get_contents(DataConst::GetContainersDefinitionPath()), true, 512, JSON_THROW_ON_ERROR);
|
$data = json_decode((string)file_get_contents(DataConst::GetContainersDefinitionPath()), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
|
||||||
$additionalContainerNames = [];
|
$additionalContainerNames = [];
|
||||||
foreach ($this->configurationManager->GetEnabledCommunityContainers() as $communityContainer) {
|
foreach ($this->configurationManager->aioCommunityContainers as $communityContainer) {
|
||||||
if ($communityContainer !== '') {
|
if ($communityContainer !== '') {
|
||||||
$path = DataConst::GetCommunityContainersDirectory() . '/' . $communityContainer . '/' . $communityContainer . '.json';
|
$path = DataConst::GetCommunityContainersDirectory() . '/' . $communityContainer . '/' . $communityContainer . '.json';
|
||||||
$additionalData = json_decode((string)file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
|
$additionalData = json_decode((string)file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
|
@ -56,42 +56,42 @@ readonly class ContainerDefinitionFetcher {
|
||||||
$containers = [];
|
$containers = [];
|
||||||
foreach ($data['aio_services_v1'] as $entry) {
|
foreach ($data['aio_services_v1'] as $entry) {
|
||||||
if ($entry['container_name'] === 'nextcloud-aio-clamav') {
|
if ($entry['container_name'] === 'nextcloud-aio-clamav') {
|
||||||
if (!$this->configurationManager->isClamavEnabled()) {
|
if (!$this->configurationManager->isClamavEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-onlyoffice') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-onlyoffice') {
|
||||||
if (!$this->configurationManager->isOnlyofficeEnabled()) {
|
if (!$this->configurationManager->isOnlyofficeEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-collabora') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-collabora') {
|
||||||
if (!$this->configurationManager->isCollaboraEnabled()) {
|
if (!$this->configurationManager->isCollaboraEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($this->configurationManager->isCollaboraSubscriptionEnabled()) {
|
if ($this->configurationManager->isCollaboraSubscriptionEnabled()) {
|
||||||
$entry['image'] = 'ghcr.io/nextcloud-releases/aio-collabora-online';
|
$entry['image'] = 'ghcr.io/nextcloud-releases/aio-collabora-online';
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-talk') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-talk') {
|
||||||
if (!$this->configurationManager->isTalkEnabled()) {
|
if (!$this->configurationManager->isTalkEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-talk-recording') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-talk-recording') {
|
||||||
if (!$this->configurationManager->isTalkRecordingEnabled()) {
|
if (!$this->configurationManager->isTalkRecordingEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-imaginary') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-imaginary') {
|
||||||
if (!$this->configurationManager->isImaginaryEnabled()) {
|
if (!$this->configurationManager->isImaginaryEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-fulltextsearch') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-fulltextsearch') {
|
||||||
if (!$this->configurationManager->isFulltextsearchEnabled()) {
|
if (!$this->configurationManager->isFulltextsearchEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-docker-socket-proxy') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-docker-socket-proxy') {
|
||||||
if (!$this->configurationManager->isDockerSocketProxyEnabled()) {
|
if (!$this->configurationManager->isDockerSocketProxyEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') {
|
} elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') {
|
||||||
if (!$this->configurationManager->isWhiteboardEnabled()) {
|
if (!$this->configurationManager->isWhiteboardEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -113,34 +113,34 @@ readonly class ContainerDefinitionFetcher {
|
||||||
if (isset($entry['volumes'])) {
|
if (isset($entry['volumes'])) {
|
||||||
foreach ($entry['volumes'] as $value) {
|
foreach ($entry['volumes'] as $value) {
|
||||||
if($value['source'] === '%BORGBACKUP_HOST_LOCATION%') {
|
if($value['source'] === '%BORGBACKUP_HOST_LOCATION%') {
|
||||||
$value['source'] = $this->configurationManager->GetBorgBackupHostLocation();
|
$value['source'] = $this->configurationManager->borgBackupHostLocation;
|
||||||
if($value['source'] === '') {
|
if($value['source'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if($value['source'] === '%NEXTCLOUD_MOUNT%') {
|
if($value['source'] === '%NEXTCLOUD_MOUNT%') {
|
||||||
$value['source'] = $this->configurationManager->GetNextcloudMount();
|
$value['source'] = $this->configurationManager->nextcloudMount;
|
||||||
if($value['source'] === '') {
|
if($value['source'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value['source'] === '%NEXTCLOUD_DATADIR%') {
|
} elseif ($value['source'] === '%NEXTCLOUD_DATADIR%') {
|
||||||
$value['source'] = $this->configurationManager->GetNextcloudDatadirMount();
|
$value['source'] = $this->configurationManager->nextcloudDatadirMount;
|
||||||
if ($value['source'] === '') {
|
if ($value['source'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value['source'] === '%WATCHTOWER_DOCKER_SOCKET_PATH%') {
|
} elseif ($value['source'] === '%WATCHTOWER_DOCKER_SOCKET_PATH%') {
|
||||||
$value['source'] = $this->configurationManager->GetDockerSocketPath();
|
$value['source'] = $this->configurationManager->dockerSocketPath;
|
||||||
if($value['source'] === '') {
|
if($value['source'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value['source'] === '%NEXTCLOUD_TRUSTED_CACERTS_DIR%') {
|
} elseif ($value['source'] === '%NEXTCLOUD_TRUSTED_CACERTS_DIR%') {
|
||||||
$value['source'] = $this->configurationManager->GetTrustedCacertsDir();
|
$value['source'] = $this->configurationManager->trustedCacertsDir;
|
||||||
if($value['source'] === '') {
|
if($value['source'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($value['destination'] === '%NEXTCLOUD_MOUNT%') {
|
if ($value['destination'] === '%NEXTCLOUD_MOUNT%') {
|
||||||
$value['destination'] = $this->configurationManager->GetNextcloudMount();
|
$value['destination'] = $this->configurationManager->nextcloudMount;
|
||||||
if($value['destination'] === '') {
|
if($value['destination'] === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -168,39 +168,39 @@ readonly class ContainerDefinitionFetcher {
|
||||||
}
|
}
|
||||||
foreach ($valueDependsOn as $value) {
|
foreach ($valueDependsOn as $value) {
|
||||||
if ($value === 'nextcloud-aio-clamav') {
|
if ($value === 'nextcloud-aio-clamav') {
|
||||||
if (!$this->configurationManager->isClamavEnabled()) {
|
if (!$this->configurationManager->isClamavEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-onlyoffice') {
|
} elseif ($value === 'nextcloud-aio-onlyoffice') {
|
||||||
if (!$this->configurationManager->isOnlyofficeEnabled()) {
|
if (!$this->configurationManager->isOnlyofficeEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-collabora') {
|
} elseif ($value === 'nextcloud-aio-collabora') {
|
||||||
if (!$this->configurationManager->isCollaboraEnabled()) {
|
if (!$this->configurationManager->isCollaboraEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-talk') {
|
} elseif ($value === 'nextcloud-aio-talk') {
|
||||||
if (!$this->configurationManager->isTalkEnabled()) {
|
if (!$this->configurationManager->isTalkEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-talk-recording') {
|
} elseif ($value === 'nextcloud-aio-talk-recording') {
|
||||||
if (!$this->configurationManager->isTalkRecordingEnabled()) {
|
if (!$this->configurationManager->isTalkRecordingEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-imaginary') {
|
} elseif ($value === 'nextcloud-aio-imaginary') {
|
||||||
if (!$this->configurationManager->isImaginaryEnabled()) {
|
if (!$this->configurationManager->isImaginaryEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-fulltextsearch') {
|
} elseif ($value === 'nextcloud-aio-fulltextsearch') {
|
||||||
if (!$this->configurationManager->isFulltextsearchEnabled()) {
|
if (!$this->configurationManager->isFulltextsearchEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-docker-socket-proxy') {
|
} elseif ($value === 'nextcloud-aio-docker-socket-proxy') {
|
||||||
if (!$this->configurationManager->isDockerSocketProxyEnabled()) {
|
if (!$this->configurationManager->isDockerSocketProxyEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} elseif ($value === 'nextcloud-aio-whiteboard') {
|
} elseif ($value === 'nextcloud-aio-whiteboard') {
|
||||||
if (!$this->configurationManager->isWhiteboardEnabled()) {
|
if (!$this->configurationManager->isWhiteboardEnabled) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,63 +67,34 @@ readonly class ConfigurationController {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['delete_timezone'])) {
|
if (isset($request->getParsedBody()['delete_timezone'])) {
|
||||||
$this->configurationManager->DeleteTimezone();
|
$this->configurationManager->deleteTimezone();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['timezone'])) {
|
if (isset($request->getParsedBody()['timezone'])) {
|
||||||
$timezone = $request->getParsedBody()['timezone'] ?? '';
|
$timezone = $request->getParsedBody()['timezone'] ?? '';
|
||||||
$this->configurationManager->SetTimezone($timezone);
|
$this->configurationManager->timezone = $timezone;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['options-form'])) {
|
if (isset($request->getParsedBody()['options-form'])) {
|
||||||
if (isset($request->getParsedBody()['collabora']) && isset($request->getParsedBody()['onlyoffice'])) {
|
$officeSuiteChoice = $request->getParsedBody()['office_suite_choice'] ?? '';
|
||||||
throw new InvalidSettingConfigurationException("Collabora and Onlyoffice are not allowed to be enabled at the same time!");
|
|
||||||
}
|
if ($officeSuiteChoice === 'collabora') {
|
||||||
if (isset($request->getParsedBody()['clamav'])) {
|
$this->configurationManager->isCollaboraEnabled = true;
|
||||||
$this->configurationManager->SetClamavEnabledState(1);
|
$this->configurationManager->isOnlyofficeEnabled = false;
|
||||||
|
} elseif ($officeSuiteChoice === 'onlyoffice') {
|
||||||
|
$this->configurationManager->isCollaboraEnabled = false;
|
||||||
|
$this->configurationManager->isOnlyofficeEnabled = true;
|
||||||
} else {
|
} else {
|
||||||
$this->configurationManager->SetClamavEnabledState(0);
|
$this->configurationManager->isCollaboraEnabled = false;
|
||||||
}
|
$this->configurationManager->isOnlyofficeEnabled = false;
|
||||||
if (isset($request->getParsedBody()['onlyoffice'])) {
|
|
||||||
$this->configurationManager->SetOnlyofficeEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetOnlyofficeEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['collabora'])) {
|
|
||||||
$this->configurationManager->SetCollaboraEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetCollaboraEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['talk'])) {
|
|
||||||
$this->configurationManager->SetTalkEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetTalkEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['talk-recording'])) {
|
|
||||||
$this->configurationManager->SetTalkRecordingEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetTalkRecordingEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['imaginary'])) {
|
|
||||||
$this->configurationManager->SetImaginaryEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetImaginaryEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['fulltextsearch'])) {
|
|
||||||
$this->configurationManager->SetFulltextsearchEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetFulltextsearchEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['docker-socket-proxy'])) {
|
|
||||||
$this->configurationManager->SetDockerSocketProxyEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetDockerSocketProxyEnabledState(0);
|
|
||||||
}
|
|
||||||
if (isset($request->getParsedBody()['whiteboard'])) {
|
|
||||||
$this->configurationManager->SetWhiteboardEnabledState(1);
|
|
||||||
} else {
|
|
||||||
$this->configurationManager->SetWhiteboardEnabledState(0);
|
|
||||||
}
|
}
|
||||||
|
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
|
||||||
|
$this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
|
||||||
|
$this->configurationManager->isTalkRecordingEnabled = isset($request->getParsedBody()['talk-recording']);
|
||||||
|
$this->configurationManager->isImaginaryEnabled = isset($request->getParsedBody()['imaginary']);
|
||||||
|
$this->configurationManager->isFulltextsearchEnabled = isset($request->getParsedBody()['fulltextsearch']);
|
||||||
|
$this->configurationManager->isDockerSocketProxyEnabled = isset($request->getParsedBody()['docker-socket-proxy']);
|
||||||
|
$this->configurationManager->isWhiteboardEnabled = isset($request->getParsedBody()['whiteboard']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['community-form'])) {
|
if (isset($request->getParsedBody()['community-form'])) {
|
||||||
|
|
@ -137,7 +108,7 @@ readonly class ConfigurationController {
|
||||||
$enabledCC[] = $item;
|
$enabledCC[] = $item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->configurationManager->SetEnabledCommunityContainers($enabledCC);
|
$this->configurationManager->aioCommunityContainers = $enabledCC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) {
|
if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) {
|
||||||
|
|
@ -146,16 +117,16 @@ readonly class ConfigurationController {
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['collabora_dictionaries'])) {
|
if (isset($request->getParsedBody()['collabora_dictionaries'])) {
|
||||||
$collaboraDictionaries = $request->getParsedBody()['collabora_dictionaries'] ?? '';
|
$collaboraDictionaries = $request->getParsedBody()['collabora_dictionaries'] ?? '';
|
||||||
$this->configurationManager->SetCollaboraDictionaries($collaboraDictionaries);
|
$this->configurationManager->collaboraDictionaries = $collaboraDictionaries;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['delete_collabora_additional_options'])) {
|
if (isset($request->getParsedBody()['delete_collabora_additional_options'])) {
|
||||||
$this->configurationManager->DeleteAdditionalCollaboraOptions();
|
$this->configurationManager->deleteAdditionalCollaboraOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['collabora_additional_options'])) {
|
if (isset($request->getParsedBody()['collabora_additional_options'])) {
|
||||||
$additionalCollaboraOptions = $request->getParsedBody()['collabora_additional_options'] ?? '';
|
$additionalCollaboraOptions = $request->getParsedBody()['collabora_additional_options'] ?? '';
|
||||||
$this->configurationManager->SetAdditionalCollaboraOptions($additionalCollaboraOptions);
|
$this->configurationManager->collaboraAdditionalOptions = $additionalCollaboraOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
|
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use AIO\Docker\DockerActionManager;
|
||||||
use Psr\Http\Message\ResponseInterface as Response;
|
use Psr\Http\Message\ResponseInterface as Response;
|
||||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
use AIO\Data\ConfigurationManager;
|
use AIO\Data\ConfigurationManager;
|
||||||
|
use AIO\Data\DataConst;
|
||||||
|
|
||||||
readonly class DockerController {
|
readonly class DockerController {
|
||||||
private const string TOP_CONTAINER = 'nextcloud-aio-apache';
|
private const string TOP_CONTAINER = 'nextcloud-aio-apache';
|
||||||
|
|
@ -23,7 +24,7 @@ readonly class DockerController {
|
||||||
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
||||||
|
|
||||||
// Start all dependencies first and then itself
|
// Start all dependencies first and then itself
|
||||||
foreach($container->GetDependsOn() as $dependency) {
|
foreach($container->dependsOn as $dependency) {
|
||||||
$this->PerformRecursiveContainerStart($dependency, $pullImage);
|
$this->PerformRecursiveContainerStart($dependency, $pullImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -34,6 +35,15 @@ readonly class DockerController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Emit a container-start event for frontend clients (one JSON line per event)
|
||||||
|
try {
|
||||||
|
$this->pruneEventsFileIfTooLarge();
|
||||||
|
$this->writeEventsToFile(['event' => 'Starting container', 'name' => $id, 'time' => time()]);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// non-fatal, just log
|
||||||
|
error_log('Could not write container-start event: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
$this->dockerActionManager->DeleteContainer($container);
|
$this->dockerActionManager->DeleteContainer($container);
|
||||||
$this->dockerActionManager->CreateVolumes($container);
|
$this->dockerActionManager->CreateVolumes($container);
|
||||||
$this->dockerActionManager->PullImage($container, $pullImage);
|
$this->dockerActionManager->PullImage($container, $pullImage);
|
||||||
|
|
@ -46,7 +56,7 @@ readonly class DockerController {
|
||||||
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
||||||
|
|
||||||
// Pull all dependencies first and then itself
|
// Pull all dependencies first and then itself
|
||||||
foreach($container->GetDependsOn() as $dependency) {
|
foreach($container->dependsOn as $dependency) {
|
||||||
$this->PerformRecursiveImagePull($dependency);
|
$this->PerformRecursiveImagePull($dependency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,7 +99,7 @@ readonly class DockerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function startBackup(bool $forceStopNextcloud = false) : void {
|
public function startBackup(bool $forceStopNextcloud = false) : void {
|
||||||
$this->configurationManager->SetBackupMode('backup');
|
$this->configurationManager->backupMode = 'backup';
|
||||||
|
|
||||||
$id = self::TOP_CONTAINER;
|
$id = self::TOP_CONTAINER;
|
||||||
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud);
|
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud);
|
||||||
|
|
@ -109,29 +119,25 @@ readonly class DockerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checkBackup() : void {
|
public function checkBackup() : void {
|
||||||
$this->configurationManager->SetBackupMode('check');
|
$this->configurationManager->backupMode = 'check';
|
||||||
|
|
||||||
$id = 'nextcloud-aio-borgbackup';
|
$id = 'nextcloud-aio-borgbackup';
|
||||||
$this->PerformRecursiveContainerStart($id);
|
$this->PerformRecursiveContainerStart($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function listBackup() : void {
|
private function listBackup() : void {
|
||||||
$this->configurationManager->SetBackupMode('list');
|
$this->configurationManager->backupMode = 'list';
|
||||||
|
|
||||||
$id = 'nextcloud-aio-borgbackup';
|
$id = 'nextcloud-aio-borgbackup';
|
||||||
$this->PerformRecursiveContainerStart($id);
|
$this->PerformRecursiveContainerStart($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
|
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
|
||||||
$this->configurationManager->SetBackupMode('restore');
|
$this->configurationManager->startTransaction();
|
||||||
$config = $this->configurationManager->GetConfig();
|
$this->configurationManager->backupMode = 'restore';
|
||||||
$config['selected-restore-time'] = $request->getParsedBody()['selected_restore_time'] ?? '';
|
$this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
|
||||||
if (isset($request->getParsedBody()['restore-exclude-previews'])) {
|
$this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
|
||||||
$config['restore-exclude-previews'] = 1;
|
$this->configurationManager->commitTransaction();
|
||||||
} else {
|
|
||||||
$config['restore-exclude-previews'] = '';
|
|
||||||
}
|
|
||||||
$this->configurationManager->WriteConfig($config);
|
|
||||||
|
|
||||||
$id = self::TOP_CONTAINER;
|
$id = self::TOP_CONTAINER;
|
||||||
$forceStopNextcloud = true;
|
$forceStopNextcloud = true;
|
||||||
|
|
@ -144,22 +150,22 @@ readonly class DockerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function StartBackupContainerCheckRepair(Request $request, Response $response, array $args) : Response {
|
public function StartBackupContainerCheckRepair(Request $request, Response $response, array $args) : Response {
|
||||||
$this->configurationManager->SetBackupMode('check-repair');
|
$this->configurationManager->backupMode = 'check-repair';
|
||||||
|
|
||||||
$id = 'nextcloud-aio-borgbackup';
|
$id = 'nextcloud-aio-borgbackup';
|
||||||
$this->PerformRecursiveContainerStart($id);
|
$this->PerformRecursiveContainerStart($id);
|
||||||
|
|
||||||
// Restore to backup check which is needed to make the UI logic work correctly
|
// Restore to backup check which is needed to make the UI logic work correctly
|
||||||
$this->configurationManager->SetBackupMode('check');
|
$this->configurationManager->backupMode = 'check';
|
||||||
|
|
||||||
return $response->withStatus(201)->withHeader('Location', '.');
|
return $response->withStatus(201)->withHeader('Location', '.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
|
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
|
||||||
$this->configurationManager->SetBackupMode('test');
|
$this->configurationManager->startTransaction();
|
||||||
$config = $this->configurationManager->GetConfig();
|
$this->configurationManager->backupMode = 'test';
|
||||||
$config['instance_restore_attempt'] = 0;
|
$this->configurationManager->instanceRestoreAttempt = false;
|
||||||
$this->configurationManager->WriteConfig($config);
|
$this->configurationManager->commitTransaction();
|
||||||
|
|
||||||
$id = self::TOP_CONTAINER;
|
$id = self::TOP_CONTAINER;
|
||||||
$this->PerformRecursiveContainerStop($id);
|
$this->PerformRecursiveContainerStop($id);
|
||||||
|
|
@ -182,20 +188,19 @@ readonly class DockerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->getParsedBody()['install_latest_major'])) {
|
if (isset($request->getParsedBody()['install_latest_major'])) {
|
||||||
$installLatestMajor = 32;
|
$installLatestMajor = '32';
|
||||||
} else {
|
} else {
|
||||||
$installLatestMajor = "";
|
$installLatestMajor = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$config = $this->configurationManager->GetConfig();
|
$this->configurationManager->startTransaction();
|
||||||
|
$this->configurationManager->installLatestMajor = $installLatestMajor;
|
||||||
// set AIO_URL
|
// set AIO_URL
|
||||||
$config['AIO_URL'] = $host . ':' . (string)$port . $path;
|
$this->configurationManager->aioUrl = $host . ':' . (string)$port . $path;
|
||||||
// set wasStartButtonClicked
|
// set wasStartButtonClicked
|
||||||
$config['wasStartButtonClicked'] = 1;
|
$this->configurationManager->wasStartButtonClicked = true;
|
||||||
// set install_latest_major
|
$this->configurationManager->commitTransaction();
|
||||||
$config['install_latest_major'] = $installLatestMajor;
|
|
||||||
$this->configurationManager->WriteConfig($config);
|
|
||||||
|
|
||||||
// Do not pull container images in case 'bypass_container_update' is set via url params
|
// Do not pull container images in case 'bypass_container_update' is set via url params
|
||||||
// Needed for local testing
|
// Needed for local testing
|
||||||
$pullImage = !isset($request->getParsedBody()['bypass_container_update']);
|
$pullImage = !isset($request->getParsedBody()['bypass_container_update']);
|
||||||
|
|
@ -213,10 +218,7 @@ readonly class DockerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function startTopContainer(bool $pullImage) : void {
|
public function startTopContainer(bool $pullImage) : void {
|
||||||
$config = $this->configurationManager->GetConfig();
|
$this->configurationManager->aioToken = bin2hex(random_bytes(24));
|
||||||
// set AIO_TOKEN
|
|
||||||
$config['AIO_TOKEN'] = bin2hex(random_bytes(24));
|
|
||||||
$this->configurationManager->WriteConfig($config);
|
|
||||||
|
|
||||||
// Stop domaincheck since apache would not be able to start otherwise
|
// Stop domaincheck since apache would not be able to start otherwise
|
||||||
$this->StopDomaincheckContainer();
|
$this->StopDomaincheckContainer();
|
||||||
|
|
@ -244,7 +246,7 @@ readonly class DockerController {
|
||||||
// This is a hack but no better solution was found for the meantime
|
// This is a hack but no better solution was found for the meantime
|
||||||
// Stop Collabora first to make sure it force-saves
|
// Stop Collabora first to make sure it force-saves
|
||||||
// See https://github.com/nextcloud/richdocuments/issues/3799
|
// See https://github.com/nextcloud/richdocuments/issues/3799
|
||||||
if ($id === self::TOP_CONTAINER && $this->configurationManager->isCollaboraEnabled()) {
|
if ($id === self::TOP_CONTAINER && $this->configurationManager->isCollaboraEnabled) {
|
||||||
$this->PerformRecursiveContainerStop('nextcloud-aio-collabora');
|
$this->PerformRecursiveContainerStop('nextcloud-aio-collabora');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -255,7 +257,7 @@ readonly class DockerController {
|
||||||
// We want to stop the Nextcloud container after 10s and not wait for the configured stop_grace_period
|
// We want to stop the Nextcloud container after 10s and not wait for the configured stop_grace_period
|
||||||
$this->dockerActionManager->StopContainer($container, $forceStopNextcloud);
|
$this->dockerActionManager->StopContainer($container, $forceStopNextcloud);
|
||||||
}
|
}
|
||||||
foreach($container->GetDependsOn() as $dependency) {
|
foreach($container->dependsOn as $dependency) {
|
||||||
$this->PerformRecursiveContainerStop($dependency, $forceStopNextcloud);
|
$this->PerformRecursiveContainerStop($dependency, $forceStopNextcloud);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -269,6 +271,48 @@ readonly class DockerController {
|
||||||
return $response->withStatus(201)->withHeader('Location', '.');
|
return $response->withStatus(201)->withHeader('Location', '.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function StreamContainerEvents(Response $response): Response {
|
||||||
|
$eventsFile = \AIO\Data\DataConst::GetContainerEventsFile();
|
||||||
|
if (!file_exists($eventsFile)) {
|
||||||
|
@touch($eventsFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
$body = $response->getBody();
|
||||||
|
$response = $response
|
||||||
|
->withHeader('Content-Type', 'text/event-stream')
|
||||||
|
->withHeader('Cache-Control', 'no-cache')
|
||||||
|
->withHeader('Connection', 'keep-alive');
|
||||||
|
|
||||||
|
$fileHandle = fopen($eventsFile, 'r');
|
||||||
|
if ($fileHandle === false) {
|
||||||
|
$body->write('');
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start at end of file so only new events are streamed
|
||||||
|
fseek($fileHandle, 0, SEEK_END);
|
||||||
|
|
||||||
|
while (!connection_aborted()) {
|
||||||
|
clearstatcache(false, $eventsFile);
|
||||||
|
$line = fgets($fileHandle);
|
||||||
|
if ($line !== false) {
|
||||||
|
$data = trim($line);
|
||||||
|
// Write SSE event
|
||||||
|
$body->write("event: container-start\n");
|
||||||
|
$body->write("data: $data\n\n");
|
||||||
|
$body->flush();
|
||||||
|
// Small pause to avoid tight loop
|
||||||
|
usleep(100000);
|
||||||
|
} else {
|
||||||
|
// No new data, wait a moment
|
||||||
|
usleep(200000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fileHandle);
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
public function stopTopContainer() : void {
|
public function stopTopContainer() : void {
|
||||||
$id = self::TOP_CONTAINER;
|
$id = self::TOP_CONTAINER;
|
||||||
$this->PerformRecursiveContainerStop($id);
|
$this->PerformRecursiveContainerStop($id);
|
||||||
|
|
@ -277,7 +321,7 @@ readonly class DockerController {
|
||||||
public function StartDomaincheckContainer() : void
|
public function StartDomaincheckContainer() : void
|
||||||
{
|
{
|
||||||
# Don't start if domain is already set
|
# Don't start if domain is already set
|
||||||
if ($this->configurationManager->GetDomain() !== '' || $this->configurationManager->wasStartButtonClicked()) {
|
if ($this->configurationManager->domain !== '' || $this->configurationManager->wasStartButtonClicked) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -315,4 +359,32 @@ readonly class DockerController {
|
||||||
$id = 'nextcloud-aio-domaincheck';
|
$id = 'nextcloud-aio-domaincheck';
|
||||||
$this->PerformRecursiveContainerStop($id);
|
$this->PerformRecursiveContainerStop($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write container event to events file and prune old events
|
||||||
|
private function writeEventsToFile(array $payload): void {
|
||||||
|
$eventJson = json_encode($payload);
|
||||||
|
|
||||||
|
// Append new event (atomic via LOCK_EX)
|
||||||
|
file_put_contents($eventsFile, $eventJson . PHP_EOL, FILE_APPEND | LOCK_EX);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate the events file to keep only the last $maxBytes bytes, aligned to a newline boundary.
|
||||||
|
private function pruneEventsFileIfTooLarge(): void {
|
||||||
|
$eventsFile = DataConst::GetContainerEventsFile();
|
||||||
|
$maxBytes = 512 * 1024; // 512 KB
|
||||||
|
$maxLines = 1000; // keep last 1000 events
|
||||||
|
|
||||||
|
if (!file_exists($eventsFile) || filesize($eventsFile) <= $maxBytes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lines = file($eventsFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||||
|
if ($lines !== false) {
|
||||||
|
$total = count($lines);
|
||||||
|
$start = max(0, $total - $maxLines);
|
||||||
|
$keep = array_slice($lines, $start);
|
||||||
|
// rewrite file with kept lines
|
||||||
|
file_put_contents($eventsFile, implode(PHP_EOL, $keep) . PHP_EOL, LOCK_EX);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -66,4 +66,8 @@ class DataConst {
|
||||||
public static function GetContainersDefinitionPath() : string {
|
public static function GetContainersDefinitionPath() : string {
|
||||||
return (string)realpath(__DIR__ . '/../../containers.json');
|
return (string)realpath(__DIR__ . '/../../containers.json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function GetContainerEventsFile() : string {
|
||||||
|
return self::GetDataDirectory() . '/container_events.log';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ readonly class Setup {
|
||||||
}
|
}
|
||||||
|
|
||||||
$password = $this->passwordGenerator->GeneratePassword(8);
|
$password = $this->passwordGenerator->GeneratePassword(8);
|
||||||
$this->configurationManager->SetPassword($password);
|
$this->configurationManager->password = $password;
|
||||||
return $password;
|
return $password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,15 +36,15 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function BuildImageName(Container $container): string {
|
private function BuildImageName(Container $container): string {
|
||||||
$tag = $container->GetImageTag();
|
$tag = $container->imageTag;
|
||||||
if ($tag === '%AIO_CHANNEL%') {
|
if ($tag === '%AIO_CHANNEL%') {
|
||||||
$tag = $this->GetCurrentChannel();
|
$tag = $this->GetCurrentChannel();
|
||||||
}
|
}
|
||||||
return $container->GetContainerName() . ':' . $tag;
|
return $container->containerName . ':' . $tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetContainerRunningState(Container $container): ContainerState {
|
public function GetContainerRunningState(Container $container): ContainerState {
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
|
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
|
||||||
try {
|
try {
|
||||||
$response = $this->guzzleClient->get($url);
|
$response = $this->guzzleClient->get($url);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
|
|
@ -64,7 +64,7 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetContainerRestartingState(Container $container): ContainerState {
|
public function GetContainerRestartingState(Container $container): ContainerState {
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
|
$url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
|
||||||
try {
|
try {
|
||||||
$response = $this->guzzleClient->get($url);
|
$response = $this->guzzleClient->get($url);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
|
|
@ -84,16 +84,16 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetContainerUpdateState(Container $container): VersionState {
|
public function GetContainerUpdateState(Container $container): VersionState {
|
||||||
$tag = $container->GetImageTag();
|
$tag = $container->imageTag;
|
||||||
if ($tag === '%AIO_CHANNEL%') {
|
if ($tag === '%AIO_CHANNEL%') {
|
||||||
$tag = $this->GetCurrentChannel();
|
$tag = $this->GetCurrentChannel();
|
||||||
}
|
}
|
||||||
|
|
||||||
$runningDigests = $this->GetRepoDigestsOfContainer($container->GetIdentifier());
|
$runningDigests = $this->GetRepoDigestsOfContainer($container->identifier);
|
||||||
if ($runningDigests === null) {
|
if ($runningDigests === null) {
|
||||||
return VersionState::Different;
|
return VersionState::Different;
|
||||||
}
|
}
|
||||||
$remoteDigest = $this->GetLatestDigestOfTag($container->GetContainerName(), $tag);
|
$remoteDigest = $this->GetLatestDigestOfTag($container->containerName, $tag);
|
||||||
if ($remoteDigest === null) {
|
if ($remoteDigest === null) {
|
||||||
return VersionState::Equal;
|
return VersionState::Equal;
|
||||||
}
|
}
|
||||||
|
|
@ -112,12 +112,12 @@ readonly class DockerActionManager {
|
||||||
return $runningState;
|
return $runningState;
|
||||||
}
|
}
|
||||||
|
|
||||||
$containerName = $container->GetIdentifier();
|
$containerName = $container->identifier;
|
||||||
$internalPort = $container->GetInternalPort();
|
$internalPort = $container->internalPorts;
|
||||||
if ($internalPort === '%APACHE_PORT%') {
|
if ($internalPort === '%APACHE_PORT%') {
|
||||||
$internalPort = $this->configurationManager->GetApachePort();
|
$internalPort = $this->configurationManager->apachePort;
|
||||||
} elseif ($internalPort === '%TALK_PORT%') {
|
} elseif ($internalPort === '%TALK_PORT%') {
|
||||||
$internalPort = $this->configurationManager->GetTalkPort();
|
$internalPort = $this->configurationManager->talkPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($internalPort !== "" && $internalPort !== 'host') {
|
if ($internalPort !== "" && $internalPort !== 'host') {
|
||||||
|
|
@ -134,7 +134,7 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DeleteContainer(Container $container): void {
|
public function DeleteContainer(Container $container): void {
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s?v=true', urlencode($container->GetIdentifier())));
|
$url = $this->BuildApiUrl(sprintf('containers/%s?v=true', urlencode($container->identifier)));
|
||||||
try {
|
try {
|
||||||
$this->guzzleClient->delete($url);
|
$this->guzzleClient->delete($url);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
|
|
@ -166,17 +166,17 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function StartContainer(Container $container): void {
|
public function StartContainer(Container $container): void {
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->GetIdentifier())));
|
$url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->identifier)));
|
||||||
try {
|
try {
|
||||||
$this->guzzleClient->post($url);
|
$this->guzzleClient->post($url);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
throw new \Exception("Could not start container " . $container->GetIdentifier() . ": " . $e->getResponse()?->getBody()->getContents());
|
throw new \Exception("Could not start container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function CreateVolumes(Container $container): void {
|
public function CreateVolumes(Container $container): void {
|
||||||
$url = $this->BuildApiUrl('volumes/create');
|
$url = $this->BuildApiUrl('volumes/create');
|
||||||
foreach ($container->GetVolumes()->GetVolumes() as $volume) {
|
foreach ($container->volumes->GetVolumes() as $volume) {
|
||||||
$forbiddenChars = [
|
$forbiddenChars = [
|
||||||
'/',
|
'/',
|
||||||
];
|
];
|
||||||
|
|
@ -202,10 +202,10 @@ readonly class DockerActionManager {
|
||||||
|
|
||||||
public function CreateContainer(Container $container): void {
|
public function CreateContainer(Container $container): void {
|
||||||
$volumes = [];
|
$volumes = [];
|
||||||
foreach ($container->GetVolumes()->GetVolumes() as $volume) {
|
foreach ($container->volumes->GetVolumes() as $volume) {
|
||||||
// // NEXTCLOUD_MOUNT gets added via bind-mount later on
|
// // NEXTCLOUD_MOUNT gets added via bind-mount later on
|
||||||
// if ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
|
// if ($container->identifier === 'nextcloud-aio-nextcloud') {
|
||||||
// if ($volume->name === $this->configurationManager->GetNextcloudMount()) {
|
// if ($volume->name === $this->configurationManager->nextcloudMount) {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
@ -228,46 +228,38 @@ readonly class DockerActionManager {
|
||||||
$requestBody['HostConfig']['Binds'] = $volumes;
|
$requestBody['HostConfig']['Binds'] = $volumes;
|
||||||
}
|
}
|
||||||
|
|
||||||
$aioVariables = $container->GetAioVariables()->GetVariables();
|
$this->configurationManager->setAioVariables($container->aioVariables->GetVariables());
|
||||||
foreach ($aioVariables as $variable) {
|
|
||||||
$config = $this->configurationManager->GetConfig();
|
|
||||||
$variable = $this->replaceEnvPlaceholders($variable);
|
|
||||||
$variableArray = explode('=', $variable);
|
|
||||||
$config[$variableArray[0]] = $variableArray[1];
|
|
||||||
$this->configurationManager->WriteConfig($config);
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$envs = $container->GetEnvironmentVariables()->GetVariables();
|
$envs = $container->containerEnvironmentVariables->GetVariables();
|
||||||
// Special thing for the nextcloud container
|
// Special thing for the nextcloud container
|
||||||
if ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
|
if ($container->identifier === 'nextcloud-aio-nextcloud') {
|
||||||
$envs[] = $this->GetAllNextcloudExecCommands();
|
$envs[] = $this->GetAllNextcloudExecCommands();
|
||||||
}
|
}
|
||||||
foreach ($envs as $key => $env) {
|
foreach ($envs as $key => $env) {
|
||||||
$envs[$key] = $this->replaceEnvPlaceholders($env);
|
$envs[$key] = $this->configurationManager->replaceEnvPlaceholders($env);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($envs) > 0) {
|
if (count($envs) > 0) {
|
||||||
$requestBody['Env'] = $envs;
|
$requestBody['Env'] = $envs;
|
||||||
}
|
}
|
||||||
|
|
||||||
$requestBody['HostConfig']['RestartPolicy']['Name'] = $container->GetRestartPolicy();
|
$requestBody['HostConfig']['RestartPolicy']['Name'] = $container->restartPolicy;
|
||||||
|
|
||||||
$requestBody['HostConfig']['ReadonlyRootfs'] = $container->GetReadOnlySetting();
|
$requestBody['HostConfig']['ReadonlyRootfs'] = $container->readOnlyRootFs;
|
||||||
|
|
||||||
$exposedPorts = [];
|
$exposedPorts = [];
|
||||||
if ($container->GetInternalPort() !== 'host') {
|
if ($container->internalPorts !== 'host') {
|
||||||
foreach ($container->GetPorts()->GetPorts() as $value) {
|
foreach ($container->ports->GetPorts() as $value) {
|
||||||
$port = $value->port;
|
$port = $value->port;
|
||||||
$protocol = $value->protocol;
|
$protocol = $value->protocol;
|
||||||
if ($port === '%APACHE_PORT%') {
|
if ($port === '%APACHE_PORT%') {
|
||||||
$port = $this->configurationManager->GetApachePort();
|
$port = $this->configurationManager->apachePort;
|
||||||
// Do not expose udp if AIO is in reverse proxy mode
|
// Do not expose udp if AIO is in reverse proxy mode
|
||||||
if ($port !== '443' && $protocol === 'udp') {
|
if ($port !== '443' && $protocol === 'udp') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if ($port === '%TALK_PORT%') {
|
} else if ($port === '%TALK_PORT%') {
|
||||||
$port = $this->configurationManager->GetTalkPort();
|
$port = $this->configurationManager->talkPort;
|
||||||
}
|
}
|
||||||
$portWithProtocol = $port . '/' . $protocol;
|
$portWithProtocol = $port . '/' . $protocol;
|
||||||
$exposedPorts[$portWithProtocol] = null;
|
$exposedPorts[$portWithProtocol] = null;
|
||||||
|
|
@ -279,17 +271,17 @@ readonly class DockerActionManager {
|
||||||
|
|
||||||
if (count($exposedPorts) > 0) {
|
if (count($exposedPorts) > 0) {
|
||||||
$requestBody['ExposedPorts'] = $exposedPorts;
|
$requestBody['ExposedPorts'] = $exposedPorts;
|
||||||
foreach ($container->GetPorts()->GetPorts() as $value) {
|
foreach ($container->ports->GetPorts() as $value) {
|
||||||
$port = $value->port;
|
$port = $value->port;
|
||||||
$protocol = $value->protocol;
|
$protocol = $value->protocol;
|
||||||
if ($port === '%APACHE_PORT%') {
|
if ($port === '%APACHE_PORT%') {
|
||||||
$port = $this->configurationManager->GetApachePort();
|
$port = $this->configurationManager->apachePort;
|
||||||
// Do not expose udp if AIO is in reverse proxy mode
|
// Do not expose udp if AIO is in reverse proxy mode
|
||||||
if ($port !== '443' && $protocol === 'udp') {
|
if ($port !== '443' && $protocol === 'udp') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if ($port === '%TALK_PORT%') {
|
} else if ($port === '%TALK_PORT%') {
|
||||||
$port = $this->configurationManager->GetTalkPort();
|
$port = $this->configurationManager->talkPort;
|
||||||
// Skip publishing talk tcp port if it is set to 443
|
// Skip publishing talk tcp port if it is set to 443
|
||||||
if ($port === '443' && $protocol === 'tcp') {
|
if ($port === '443' && $protocol === 'tcp') {
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -297,7 +289,7 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
$ipBinding = $value->ipBinding;
|
$ipBinding = $value->ipBinding;
|
||||||
if ($ipBinding === '%APACHE_IP_BINDING%') {
|
if ($ipBinding === '%APACHE_IP_BINDING%') {
|
||||||
$ipBinding = $this->configurationManager->GetApacheIPBinding();
|
$ipBinding = $this->configurationManager->apacheIpBinding;
|
||||||
// Do not expose if AIO is in internal network mode
|
// Do not expose if AIO is in internal network mode
|
||||||
if ($ipBinding === '@INTERNAL') {
|
if ($ipBinding === '@INTERNAL') {
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -314,8 +306,8 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
$devices = [];
|
$devices = [];
|
||||||
foreach ($container->GetDevices() as $device) {
|
foreach ($container->devices as $device) {
|
||||||
if ($device === '/dev/dri' && !$this->configurationManager->isDriDeviceEnabled()) {
|
if ($device === '/dev/dri' && !$this->configurationManager->nextcloudEnableDriDevice) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$devices[] = ["PathOnHost" => $device, "PathInContainer" => $device, "CgroupPermissions" => "rwm"];
|
$devices[] = ["PathOnHost" => $device, "PathInContainer" => $device, "CgroupPermissions" => "rwm"];
|
||||||
|
|
@ -325,7 +317,7 @@ readonly class DockerActionManager {
|
||||||
$requestBody['HostConfig']['Devices'] = $devices;
|
$requestBody['HostConfig']['Devices'] = $devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($container->isNvidiaGpuEnabled() && $this->configurationManager->isNvidiaGpuEnabled()) {
|
if ($container->enableNvidiaGpu && $this->configurationManager->enableNvidiaGpu) {
|
||||||
$requestBody['HostConfig']['Runtime'] = 'nvidia';
|
$requestBody['HostConfig']['Runtime'] = 'nvidia';
|
||||||
$requestBody['HostConfig']['DeviceRequests'] = [
|
$requestBody['HostConfig']['DeviceRequests'] = [
|
||||||
[
|
[
|
||||||
|
|
@ -336,13 +328,13 @@ readonly class DockerActionManager {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$shmSize = $container->GetShmSize();
|
$shmSize = $container->shmSize;
|
||||||
if ($shmSize > 0) {
|
if ($shmSize > 0) {
|
||||||
$requestBody['HostConfig']['ShmSize'] = $shmSize;
|
$requestBody['HostConfig']['ShmSize'] = $shmSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmpfs = [];
|
$tmpfs = [];
|
||||||
foreach ($container->GetTmpfs() as $tmp) {
|
foreach ($container->tmpfs as $tmp) {
|
||||||
$mode = "";
|
$mode = "";
|
||||||
if (str_contains($tmp, ':')) {
|
if (str_contains($tmp, ':')) {
|
||||||
$mode = explode(':', $tmp)[1];
|
$mode = explode(':', $tmp)[1];
|
||||||
|
|
@ -354,9 +346,14 @@ readonly class DockerActionManager {
|
||||||
$requestBody['HostConfig']['Tmpfs'] = $tmpfs;
|
$requestBody['HostConfig']['Tmpfs'] = $tmpfs;
|
||||||
}
|
}
|
||||||
|
|
||||||
$requestBody['HostConfig']['Init'] = $container->GetInit();
|
$requestBody['HostConfig']['Init'] = $container->init;
|
||||||
|
|
||||||
$capAdds = $container->GetCapAdds();
|
$maxShutDownTime = $container->maxShutdownTime;
|
||||||
|
if ($maxShutDownTime > 0) {
|
||||||
|
$requestBody['StopTimeout'] = $maxShutDownTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
$capAdds = $container->capAdd;
|
||||||
if (count($capAdds) > 0) {
|
if (count($capAdds) > 0) {
|
||||||
$requestBody['HostConfig']['CapAdd'] = $capAdds;
|
$requestBody['HostConfig']['CapAdd'] = $capAdds;
|
||||||
}
|
}
|
||||||
|
|
@ -368,14 +365,14 @@ readonly class DockerActionManager {
|
||||||
|
|
||||||
// Disable SELinux for AIO containers so that it does not break them
|
// Disable SELinux for AIO containers so that it does not break them
|
||||||
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable"];
|
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable"];
|
||||||
if ($container->isApparmorUnconfined()) {
|
if ($container->apparmorUnconfined) {
|
||||||
$requestBody['HostConfig']['SecurityOpt'] = ["apparmor:unconfined", "label:disable"];
|
$requestBody['HostConfig']['SecurityOpt'] = ["apparmor:unconfined", "label:disable"];
|
||||||
}
|
}
|
||||||
|
|
||||||
$mounts = [];
|
$mounts = [];
|
||||||
|
|
||||||
// Special things for the backup container which should not be exposed in the containers.json
|
// Special things for the backup container which should not be exposed in the containers.json
|
||||||
if (str_starts_with($container->GetIdentifier(), 'nextcloud-aio-borgbackup')) {
|
if (str_starts_with($container->identifier, 'nextcloud-aio-borgbackup')) {
|
||||||
// Additional backup directories
|
// Additional backup directories
|
||||||
foreach ($this->getAllBackupVolumes() as $additionalBackupVolumes) {
|
foreach ($this->getAllBackupVolumes() as $additionalBackupVolumes) {
|
||||||
if ($additionalBackupVolumes !== '') {
|
if ($additionalBackupVolumes !== '') {
|
||||||
|
|
@ -384,7 +381,7 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make volumes read only in case of borgbackup container. The viewer makes them writeable
|
// Make volumes read only in case of borgbackup container. The viewer makes them writeable
|
||||||
$isReadOnly = $container->GetIdentifier() === 'nextcloud-aio-borgbackup';
|
$isReadOnly = $container->identifier === 'nextcloud-aio-borgbackup';
|
||||||
|
|
||||||
foreach ($this->configurationManager->GetAdditionalBackupDirectoriesArray() as $additionalBackupDirectories) {
|
foreach ($this->configurationManager->GetAdditionalBackupDirectoriesArray() as $additionalBackupDirectories) {
|
||||||
if ($additionalBackupDirectories !== '') {
|
if ($additionalBackupDirectories !== '') {
|
||||||
|
|
@ -397,33 +394,33 @@ readonly class DockerActionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special things for the talk container which should not be exposed in the containers.json
|
// Special things for the talk container which should not be exposed in the containers.json
|
||||||
} elseif ($container->GetIdentifier() === 'nextcloud-aio-talk') {
|
} elseif ($container->identifier === 'nextcloud-aio-talk') {
|
||||||
// This is needed due to a bug in libwebsockets used in Janus which cannot handle unlimited ulimits
|
// This is needed due to a bug in libwebsockets used in Janus which cannot handle unlimited ulimits
|
||||||
$requestBody['HostConfig']['Ulimits'] = [["Name" => "nofile", "Hard" => 200000, "Soft" => 200000]];
|
$requestBody['HostConfig']['Ulimits'] = [["Name" => "nofile", "Hard" => 200000, "Soft" => 200000]];
|
||||||
// // Special things for the nextcloud container which should not be exposed in the containers.json
|
// // Special things for the nextcloud container which should not be exposed in the containers.json
|
||||||
// } elseif ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
|
// } elseif ($container->identifier === 'nextcloud-aio-nextcloud') {
|
||||||
// foreach ($container->GetVolumes()->GetVolumes() as $volume) {
|
// foreach ($container->volumes->GetVolumes() as $volume) {
|
||||||
// if ($volume->name !== $this->configurationManager->GetNextcloudMount()) {
|
// if ($volume->name !== $this->configurationManager->nextcloudMount) {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
// $mounts[] = ["Type" => "bind", "Source" => $volume->name, "Target" => $volume->mountPoint, "ReadOnly" => !$volume->isWritable, "BindOptions" => [ "Propagation" => "rshared"]];
|
// $mounts[] = ["Type" => "bind", "Source" => $volume->name, "Target" => $volume->mountPoint, "ReadOnly" => !$volume->isWritable, "BindOptions" => [ "Propagation" => "rshared"]];
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// Special things for the caddy community container
|
// Special things for the caddy community container
|
||||||
} elseif ($container->GetIdentifier() === 'nextcloud-aio-caddy') {
|
} elseif ($container->identifier === 'nextcloud-aio-caddy') {
|
||||||
$requestBody['HostConfig']['ExtraHosts'] = ['host.docker.internal:host-gateway'];
|
$requestBody['HostConfig']['ExtraHosts'] = ['host.docker.internal:host-gateway'];
|
||||||
|
|
||||||
// Special things for the collabora container which should not be exposed in the containers.json
|
// Special things for the collabora container which should not be exposed in the containers.json
|
||||||
} elseif ($container->GetIdentifier() === 'nextcloud-aio-collabora') {
|
} elseif ($container->identifier === 'nextcloud-aio-collabora') {
|
||||||
if (!$this->configurationManager->isSeccompDisabled()) {
|
if (!$this->configurationManager->collaboraSeccompDisabled) {
|
||||||
// Load reference seccomp profile for collabora
|
// Load reference seccomp profile for collabora
|
||||||
$seccompProfile = (string)file_get_contents(DataConst::GetCollaboraSeccompProfilePath());
|
$seccompProfile = (string)file_get_contents(DataConst::GetCollaboraSeccompProfilePath());
|
||||||
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable", "seccomp=$seccompProfile"];
|
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable", "seccomp=$seccompProfile"];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Additional Collabora options
|
// Additional Collabora options
|
||||||
if ($this->configurationManager->GetAdditionalCollaboraOptions() !== '') {
|
if ($this->configurationManager->collaboraAdditionalOptions !== '') {
|
||||||
$requestBody['Cmd'] = [$this->configurationManager->GetAdditionalCollaboraOptions()];
|
$requestBody['Cmd'] = [$this->configurationManager->collaboraAdditionalOptions];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -434,12 +431,12 @@ readonly class DockerActionManager {
|
||||||
// All AIO-managed containers should not be updated externally via watchtower but gracefully by AIO's backup and update feature.
|
// All AIO-managed containers should not be updated externally via watchtower but gracefully by AIO's backup and update feature.
|
||||||
// Also DIUN should not send update notifications. See https://crazymax.dev/diun/providers/docker/#docker-labels
|
// Also DIUN should not send update notifications. See https://crazymax.dev/diun/providers/docker/#docker-labels
|
||||||
// Additionally set a default org.label-schema.vendor and com.docker.compose.project
|
// Additionally set a default org.label-schema.vendor and com.docker.compose.project
|
||||||
$requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "diun.enable" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
|
$requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "wud.watch" => "false", "diun.enable" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
|
||||||
|
|
||||||
// Containers should have a fixed host name. See https://github.com/nextcloud/all-in-one/discussions/6589
|
// Containers should have a fixed host name. See https://github.com/nextcloud/all-in-one/discussions/6589
|
||||||
$requestBody['Hostname'] = $container->GetIdentifier();
|
$requestBody['Hostname'] = $container->identifier;
|
||||||
|
|
||||||
$url = $this->BuildApiUrl('containers/create?name=' . $container->GetIdentifier());
|
$url = $this->BuildApiUrl('containers/create?name=' . $container->identifier);
|
||||||
try {
|
try {
|
||||||
$this->guzzleClient->request(
|
$this->guzzleClient->request(
|
||||||
'POST',
|
'POST',
|
||||||
|
|
@ -449,18 +446,18 @@ readonly class DockerActionManager {
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
throw new \Exception("Could not create container " . $container->GetIdentifier() . ": " . $e->getResponse()?->getBody()->getContents());
|
throw new \Exception("Could not create container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isRegistryReachable(Container $container): bool {
|
public function isRegistryReachable(Container $container): bool {
|
||||||
$tag = $container->GetImageTag();
|
$tag = $container->imageTag;
|
||||||
if ($tag === '%AIO_CHANNEL%') {
|
if ($tag === '%AIO_CHANNEL%') {
|
||||||
$tag = $this->GetCurrentChannel();
|
$tag = $this->GetCurrentChannel();
|
||||||
}
|
}
|
||||||
|
|
||||||
$remoteDigest = $this->GetLatestDigestOfTag($container->GetContainerName(), $tag);
|
$remoteDigest = $this->GetLatestDigestOfTag($container->containerName, $tag);
|
||||||
|
|
||||||
if ($remoteDigest === null) {
|
if ($remoteDigest === null) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -472,7 +469,7 @@ readonly class DockerActionManager {
|
||||||
public function PullImage(Container $container, bool $pullImage = true): void {
|
public function PullImage(Container $container, bool $pullImage = true): void {
|
||||||
|
|
||||||
// Skip database image pull if the last shutdown was not clean
|
// Skip database image pull if the last shutdown was not clean
|
||||||
if ($container->GetIdentifier() === 'nextcloud-aio-database') {
|
if ($container->identifier === 'nextcloud-aio-database') {
|
||||||
if ($this->GetDatabasecontainerExitCode() > 0) {
|
if ($this->GetDatabasecontainerExitCode() > 0) {
|
||||||
$pullImage = false;
|
$pullImage = false;
|
||||||
error_log('Not pulling the latest database image because the container was not correctly shut down.');
|
error_log('Not pulling the latest database image because the container was not correctly shut down.');
|
||||||
|
|
@ -484,7 +481,7 @@ readonly class DockerActionManager {
|
||||||
if ($pullImage) {
|
if ($pullImage) {
|
||||||
if (!$this->isRegistryReachable($container)) {
|
if (!$this->isRegistryReachable($container)) {
|
||||||
$pullImage = false;
|
$pullImage = false;
|
||||||
error_log('Not pulling the ' . $container->GetContainerName() . ' image for the ' . $container->GetIdentifier() . ' container because the registry does not seem to be reachable.');
|
error_log('Not pulling the ' . $container->containerName . ' image for the ' . $container->identifier . ' container because the registry does not seem to be reachable.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -503,94 +500,28 @@ readonly class DockerActionManager {
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$imageIsThere = false;
|
$imageIsThere = false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$this->guzzleClient->post($url);
|
$maxRetries = 3;
|
||||||
} catch (RequestException $e) {
|
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
|
||||||
$message = "Could not pull image " . $imageName . ": " . $e->getResponse()?->getBody()->getContents();
|
try {
|
||||||
if ($imageIsThere === false) {
|
$this->guzzleClient->post($url);
|
||||||
throw new \Exception($message);
|
break;
|
||||||
} else {
|
} catch (RequestException $e) {
|
||||||
error_log($message);
|
$message = "Could not pull image " . $imageName . " (attempt $attempt/$maxRetries): " . $e->getResponse()?->getBody()->getContents();
|
||||||
|
if ($attempt === $maxRetries) {
|
||||||
|
if ($imageIsThere === false) {
|
||||||
|
throw new \Exception($message);
|
||||||
|
} else {
|
||||||
|
error_log($message);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error_log($message . ' Retrying...');
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replaces placeholders in $envValue with their values.
|
|
||||||
// E.g. "%NC_DOMAIN%:%APACHE_PORT" becomes "my.nextcloud.com:11000"
|
|
||||||
private function replaceEnvPlaceholders(string $envValue): string {
|
|
||||||
// $pattern breaks down as:
|
|
||||||
// % - matches a literal percent sign
|
|
||||||
// ([^%]+) - capture group that matches one or more characters that are NOT percent signs
|
|
||||||
// % - matches the closing percent sign
|
|
||||||
//
|
|
||||||
// Assumes literal percent signs are always matched and there is no
|
|
||||||
// escaping.
|
|
||||||
$pattern = '/%([^%]+)%/';
|
|
||||||
$matchCount = preg_match_all($pattern, $envValue, $matches);
|
|
||||||
|
|
||||||
if ($matchCount === 0) {
|
|
||||||
return $envValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$placeholders = $matches[0]; // ["%PLACEHOLDER1%", "%PLACEHOLDER2%", ...]
|
|
||||||
$placeholderNames = $matches[1]; // ["PLACEHOLDER1", "PLACEHOLDER2", ...]
|
|
||||||
$placeholderPatterns = array_map(static fn(string $p) => '/' . preg_quote($p) . '/', $placeholders); // ["/%PLACEHOLDER1%/", ...]
|
|
||||||
$placeholderValues = array_map($this->getPlaceholderValue(...), $placeholderNames); // ["val1", "val2"]
|
|
||||||
// Guaranteed to be non-null because we found the placeholders in the preg_match_all.
|
|
||||||
return (string) preg_replace($placeholderPatterns, $placeholderValues, $envValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getPlaceholderValue(string $placeholder) : string {
|
|
||||||
return match ($placeholder) {
|
|
||||||
'NC_DOMAIN' => $this->configurationManager->GetDomain(),
|
|
||||||
'NC_BASE_DN' => $this->configurationManager->GetBaseDN(),
|
|
||||||
'AIO_TOKEN' => $this->configurationManager->GetToken(),
|
|
||||||
'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->GetBorgRemoteRepo(),
|
|
||||||
'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
|
|
||||||
'AIO_URL' => $this->configurationManager->GetAIOURL(),
|
|
||||||
'SELECTED_RESTORE_TIME' => $this->configurationManager->GetSelectedRestoreTime(),
|
|
||||||
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->GetRestoreExcludePreviews(),
|
|
||||||
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
|
|
||||||
'APACHE_IP_BINDING' => $this->configurationManager->GetApacheIPBinding(),
|
|
||||||
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
|
|
||||||
'TURN_DOMAIN' => $this->configurationManager->GetTurnDomain(),
|
|
||||||
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
|
|
||||||
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->GetBorgRestorePassword(),
|
|
||||||
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled() ? 'yes' : '',
|
|
||||||
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
|
|
||||||
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled() ? 'yes' : '',
|
|
||||||
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled() ? 'yes' : '',
|
|
||||||
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled() ? 'yes' : '',
|
|
||||||
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
|
|
||||||
'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
|
|
||||||
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
|
|
||||||
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled() ? 'yes' : '',
|
|
||||||
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled() ? 'yes' : '',
|
|
||||||
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled() ? 'yes' : '',
|
|
||||||
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->GetNextcloudUploadLimit(),
|
|
||||||
'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->GetNextcloudMemoryLimit(),
|
|
||||||
'NEXTCLOUD_MAX_TIME' => $this->configurationManager->GetNextcloudMaxTime(),
|
|
||||||
'BORG_RETENTION_POLICY' => $this->configurationManager->GetBorgRetentionPolicy(),
|
|
||||||
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->configurationManager->GetFulltextsearchJavaOptions(),
|
|
||||||
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->configurationManager->GetTrustedCacertsDir(),
|
|
||||||
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->configurationManager->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
|
|
||||||
'BORGBACKUP_HOST_LOCATION' => $this->configurationManager->GetBorgBackupHostLocation(),
|
|
||||||
'APACHE_MAX_SIZE' => (string)($this->configurationManager->GetApacheMaxSize()),
|
|
||||||
'COLLABORA_SECCOMP_POLICY' => $this->configurationManager->GetCollaboraSeccompPolicy(),
|
|
||||||
'NEXTCLOUD_STARTUP_APPS' => $this->configurationManager->GetNextcloudStartupApps(),
|
|
||||||
'NEXTCLOUD_ADDITIONAL_APKS' => $this->configurationManager->GetNextcloudAdditionalApks(),
|
|
||||||
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->configurationManager->GetNextcloudAdditionalPhpExtensions(),
|
|
||||||
'INSTALL_LATEST_MAJOR' => $this->configurationManager->shouldLatestMajorGetInstalled() ? 'yes' : '',
|
|
||||||
'REMOVE_DISABLED_APPS' => $this->configurationManager->shouldDisabledAppsGetRemoved() ? 'yes' : '',
|
|
||||||
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
|
|
||||||
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
|
|
||||||
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
|
|
||||||
'CADDY_IP_ADDRESS' => in_array('caddy', $this->configurationManager->GetEnabledCommunityContainers(), true) ? gethostbyname('nextcloud-aio-caddy') : '',
|
|
||||||
'WHITEBOARD_ENABLED' => $this->configurationManager->isWhiteboardEnabled() ? 'yes' : '',
|
|
||||||
default => $this->configurationManager->GetRegisteredSecret($placeholder),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private function isContainerUpdateAvailable(string $id): string {
|
private function isContainerUpdateAvailable(string $id): string {
|
||||||
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
||||||
|
|
||||||
|
|
@ -598,7 +529,7 @@ readonly class DockerActionManager {
|
||||||
if ($container->GetUpdateState() === VersionState::Different) {
|
if ($container->GetUpdateState() === VersionState::Different) {
|
||||||
$updateAvailable = '1';
|
$updateAvailable = '1';
|
||||||
}
|
}
|
||||||
foreach ($container->GetDependsOn() as $dependency) {
|
foreach ($container->dependsOn as $dependency) {
|
||||||
$updateAvailable .= $this->isContainerUpdateAvailable($dependency);
|
$updateAvailable .= $this->isContainerUpdateAvailable($dependency);
|
||||||
}
|
}
|
||||||
return $updateAvailable;
|
return $updateAvailable;
|
||||||
|
|
@ -606,7 +537,7 @@ readonly class DockerActionManager {
|
||||||
|
|
||||||
public function isAnyUpdateAvailable(): bool {
|
public function isAnyUpdateAvailable(): bool {
|
||||||
// return early if instance is not installed
|
// return early if instance is not installed
|
||||||
if (!$this->configurationManager->wasStartButtonClicked()) {
|
if (!$this->configurationManager->wasStartButtonClicked) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$id = 'nextcloud-aio-apache';
|
$id = 'nextcloud-aio-apache';
|
||||||
|
|
@ -622,10 +553,10 @@ readonly class DockerActionManager {
|
||||||
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
||||||
|
|
||||||
$backupVolumes = '';
|
$backupVolumes = '';
|
||||||
foreach ($container->GetBackupVolumes() as $backupVolume) {
|
foreach ($container->backupVolumes as $backupVolume) {
|
||||||
$backupVolumes .= $backupVolume . ' ';
|
$backupVolumes .= $backupVolume . ' ';
|
||||||
}
|
}
|
||||||
foreach ($container->GetDependsOn() as $dependency) {
|
foreach ($container->dependsOn as $dependency) {
|
||||||
$backupVolumes .= $this->getBackupVolumes($dependency);
|
$backupVolumes .= $this->getBackupVolumes($dependency);
|
||||||
}
|
}
|
||||||
return $backupVolumes;
|
return $backupVolumes;
|
||||||
|
|
@ -641,10 +572,10 @@ readonly class DockerActionManager {
|
||||||
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
$container = $this->containerDefinitionFetcher->GetContainerById($id);
|
||||||
|
|
||||||
$nextcloudExecCommands = '';
|
$nextcloudExecCommands = '';
|
||||||
foreach ($container->GetNextcloudExecCommands() as $execCommand) {
|
foreach ($container->nextcloudExecCommands as $execCommand) {
|
||||||
$nextcloudExecCommands .= $execCommand . PHP_EOL;
|
$nextcloudExecCommands .= $execCommand . PHP_EOL;
|
||||||
}
|
}
|
||||||
foreach ($container->GetDependsOn() as $dependency) {
|
foreach ($container->dependsOn as $dependency) {
|
||||||
$nextcloudExecCommands .= $this->GetNextcloudExecCommands($dependency);
|
$nextcloudExecCommands .= $this->GetNextcloudExecCommands($dependency);
|
||||||
}
|
}
|
||||||
return $nextcloudExecCommands;
|
return $nextcloudExecCommands;
|
||||||
|
|
@ -776,7 +707,7 @@ readonly class DockerActionManager {
|
||||||
public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh'): void {
|
public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh'): void {
|
||||||
if ($this->GetContainerStartingState($container) === ContainerState::Running) {
|
if ($this->GetContainerStartingState($container) === ContainerState::Running) {
|
||||||
|
|
||||||
$containerName = $container->GetIdentifier();
|
$containerName = $container->identifier;
|
||||||
|
|
||||||
// schedule the exec
|
// schedule the exec
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s/exec', urlencode($containerName)));
|
$url = $this->BuildApiUrl(sprintf('containers/%s/exec', urlencode($containerName)));
|
||||||
|
|
@ -901,14 +832,14 @@ readonly class DockerActionManager {
|
||||||
// Add a secondary alias for domaincheck container, to keep it as similar to actual apache controller as possible.
|
// 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
|
// 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.
|
// 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' : '';
|
$alias = ($container->identifier === 'nextcloud-aio-domaincheck') ? 'nextcloud-aio-apache' : '';
|
||||||
|
|
||||||
$this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), alias: $alias);
|
$this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, alias: $alias);
|
||||||
|
|
||||||
if ($container->GetIdentifier() === 'nextcloud-aio-apache' || $container->GetIdentifier() === 'nextcloud-aio-domaincheck') {
|
if ($container->identifier === 'nextcloud-aio-apache' || $container->identifier === 'nextcloud-aio-domaincheck') {
|
||||||
$apacheAdditionalNetwork = $this->configurationManager->GetApacheAdditionalNetwork();
|
$apacheAdditionalNetwork = $this->configurationManager->apacheAdditionalNetwork;
|
||||||
if ($apacheAdditionalNetwork !== '') {
|
if ($apacheAdditionalNetwork !== '') {
|
||||||
$this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), $apacheAdditionalNetwork, false, $alias);
|
$this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, $apacheAdditionalNetwork, false, $alias);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -917,9 +848,9 @@ readonly class DockerActionManager {
|
||||||
if ($forceStopContainer) {
|
if ($forceStopContainer) {
|
||||||
$maxShutDownTime = 10;
|
$maxShutDownTime = 10;
|
||||||
} else {
|
} else {
|
||||||
$maxShutDownTime = $container->GetMaxShutdownTime();
|
$maxShutDownTime = $container->maxShutdownTime;
|
||||||
}
|
}
|
||||||
$url = $this->BuildApiUrl(sprintf('containers/%s/stop?t=%s', urlencode($container->GetIdentifier()), $maxShutDownTime));
|
$url = $this->BuildApiUrl(sprintf('containers/%s/stop?t=%s', urlencode($container->identifier), $maxShutDownTime));
|
||||||
try {
|
try {
|
||||||
$this->guzzleClient->post($url);
|
$this->guzzleClient->post($url);
|
||||||
} catch (RequestException $e) {
|
} catch (RequestException $e) {
|
||||||
|
|
|
||||||
|
|
@ -3,24 +3,24 @@
|
||||||
<span>
|
<span>
|
||||||
{% if c.GetStartingState().value == 'starting' %}
|
{% if c.GetStartingState().value == 'starting' %}
|
||||||
<span class="status running"></span>
|
<span class="status running"></span>
|
||||||
{{ c.GetDisplayName() }}
|
{{ c.displayName }}
|
||||||
(<a href="api/docker/logs?id={{ c.GetIdentifier() }}" target="_blank">Starting</a>)
|
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Starting</a>)
|
||||||
{% elseif c.GetRunningState().value == 'running' %}
|
{% elseif c.GetRunningState().value == 'running' %}
|
||||||
<span class="status success"></span>
|
<span class="status success"></span>
|
||||||
{{ c.GetDisplayName() }}
|
{{ c.displayName }}
|
||||||
(<a href="api/docker/logs?id={{ c.GetIdentifier() }}" target="_blank">Running</a>)
|
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Running</a>)
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="status error"></span>
|
<span class="status error"></span>
|
||||||
{{ c.GetDisplayName() }}
|
{{ c.displayName }}
|
||||||
(<a href="api/docker/logs?id={{ c.GetIdentifier() }}" target="_blank">Stopped</a>)
|
(<a href="api/docker/logs?id={{ c.identifier }}" target="_blank">Stopped</a>)
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if c.GetDocumentation() != '' %}
|
{% if c.documentation != '' %}
|
||||||
(<a target="_blank" href="{{ c.GetDocumentation() }}">docs</a>)
|
(<a target="_blank" href="{{ c.documentation }}">docs</a>)
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
{% if c.GetUiSecret() != '' %}
|
{% if c.GetUiSecret() != '' %}
|
||||||
<details>
|
<details>
|
||||||
<summary>Show password for {{ c.GetDisplayName() }}</summary>
|
<summary>Show password for {{ c.displayName }}</summary>
|
||||||
<input type="text" value="{{ c.GetUiSecret() }}" readonly>
|
<input type="text" value="{{ c.GetUiSecret() }}" readonly>
|
||||||
</details>
|
</details>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<main>
|
<main>
|
||||||
<h1>Nextcloud AIO v12.5.0</h1>
|
{% set aio_version = include('includes/aio-version.twig') %}
|
||||||
|
<h1>Nextcloud AIO v{{ aio_version }}</h1>
|
||||||
|
|
||||||
{# Add 2nd tab warning #}
|
{# Add 2nd tab warning #}
|
||||||
<script type="text/javascript" src="second-tab-warning.js"></script>
|
<script type="text/javascript" src="second-tab-warning.js"></script>
|
||||||
|
|
@ -26,7 +27,7 @@
|
||||||
<script type="text/javascript" src="timezone.js"></script>
|
<script type="text/javascript" src="timezone.js"></script>
|
||||||
|
|
||||||
{# js for optional containers and additional containers forms #}
|
{# js for optional containers and additional containers forms #}
|
||||||
<script type="text/javascript" src="containers-form-submit.js?v4"></script>
|
<script type="text/javascript" src="containers-form-submit.js?v5"></script>
|
||||||
|
|
||||||
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
|
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
|
||||||
{% set isAnyRunning = false %}
|
{% set isAnyRunning = false %}
|
||||||
|
|
@ -45,19 +46,19 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% for container in containers %}
|
{% for container in containers %}
|
||||||
{% if container.GetDisplayName() != '' and container.GetRunningState().value == 'running' %}
|
{% if container.displayName != '' and container.GetRunningState().value == 'running' %}
|
||||||
{% set isAnyRunning = true %}
|
{% set isAnyRunning = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if container.GetDisplayName() != '' and container.GetRestartingState().value == 'restarting' %}
|
{% if container.displayName != '' and container.GetRestartingState().value == 'restarting' %}
|
||||||
{% set isAnyRestarting = true %}
|
{% set isAnyRestarting = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if container.GetIdentifier() == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %}
|
{% if container.identifier == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %}
|
||||||
{% set isWatchtowerRunning = true %}
|
{% set isWatchtowerRunning = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if container.GetIdentifier() == 'nextcloud-aio-domaincheck' and container.GetRunningState().value == 'running' %}
|
{% if container.identifier == 'nextcloud-aio-domaincheck' and container.GetRunningState().value == 'running' %}
|
||||||
{% set isDomaincheckRunning = true %}
|
{% set isDomaincheckRunning = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if container.GetIdentifier() == 'nextcloud-aio-apache' and container.GetStartingState().value == 'starting' %}
|
{% if container.identifier == 'nextcloud-aio-apache' and container.GetStartingState().value == 'starting' %}
|
||||||
{% set isApacheStarting = true %}
|
{% set isApacheStarting = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -280,7 +281,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
{# @var containers \AIO\Container\Container[] #}
|
{# @var containers \AIO\Container\Container[] #}
|
||||||
{% for container in containers %}
|
{% for container in containers %}
|
||||||
{% if container.GetDisplayName() != '' %}
|
{% if container.displayName != '' %}
|
||||||
{% include 'components/container-state.twig' with {'c': container} only %}
|
{% include 'components/container-state.twig' with {'c': container} only %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
1
php/templates/includes/aio-version.twig
Normal file
1
php/templates/includes/aio-version.twig
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
12.6.0
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue