mirror of
https://github.com/nextcloud/all-in-one.git
synced 2026-05-22 03:10:16 +00:00
Compare commits
345 Commits
alan/dev-s
...
copilot/de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1928b0a3f3 | ||
|
|
0a553459ab | ||
|
|
f42e669704 | ||
|
|
483d562b20 | ||
|
|
5a77d4e842 | ||
|
|
c5b853e50b | ||
|
|
2a757d3d66 | ||
|
|
19b94f40d5 | ||
|
|
33f40632dd | ||
|
|
574a408d10 | ||
|
|
79dd1286e9 | ||
|
|
96002b185d | ||
|
|
3828b1ae3d | ||
|
|
cdad9614cd | ||
|
|
c55ae87002 | ||
|
|
3021f256ce | ||
|
|
124a6d295b | ||
|
|
0c6c1caa90 | ||
|
|
889096ab2b | ||
|
|
cf2fb5f58d | ||
|
|
76c03d11f0 | ||
|
|
1bc3896314 | ||
|
|
d86ff57d2f | ||
|
|
a93e9ff0c6 | ||
|
|
b25b0e1075 | ||
|
|
e4d92bdea6 | ||
|
|
d9332ef966 | ||
|
|
9d53188df3 | ||
|
|
acb18004de | ||
|
|
70a0a4a361 | ||
|
|
aa7ff451b8 | ||
|
|
5eb6850d92 | ||
|
|
78b4bea957 | ||
|
|
0af08104f5 | ||
|
|
df14efa1ef | ||
|
|
f5d35f0197 | ||
|
|
901cd8ccef | ||
|
|
9ed2b32d3e | ||
|
|
5c1d85b27d | ||
|
|
55a4ffab63 | ||
|
|
846bc06bc5 | ||
|
|
441a2a28e3 | ||
|
|
df9971b249 | ||
|
|
15ae285d9f | ||
|
|
1fa4f3b6a3 | ||
|
|
654c39ff1e | ||
|
|
91d59af4dc | ||
|
|
5091f27e87 | ||
|
|
c74d08902e | ||
|
|
216c73d3aa | ||
|
|
6c1c33e069 | ||
|
|
f0949a8746 | ||
|
|
79eccd576d | ||
|
|
323a34a437 | ||
|
|
f2076fa56b | ||
|
|
99ea91c5ef | ||
|
|
7b2de0683e | ||
|
|
f7b677fb51 | ||
|
|
ee8a5a185c | ||
|
|
2b0cb13f35 | ||
|
|
1e064fed8a | ||
|
|
a1eaea85ed | ||
|
|
bc2105d668 | ||
|
|
c545bffc53 | ||
|
|
dc27f8078f | ||
|
|
9f9846461e | ||
|
|
8e3141ab75 | ||
|
|
f060a334d3 | ||
|
|
4417d1ca7a | ||
|
|
cdc617d0b7 | ||
|
|
71dbf98d48 | ||
|
|
42e2d88b3e | ||
|
|
4682355bfe | ||
|
|
13ac536b68 | ||
|
|
9b9b3b638d | ||
|
|
7b6bda1f60 | ||
|
|
764314524d | ||
|
|
4910c3f012 | ||
|
|
55790da3eb | ||
|
|
4e8292b922 | ||
|
|
50643afd6a | ||
|
|
4f4ef8f1d6 | ||
|
|
4acc5b87e3 | ||
|
|
753ea8d3fd | ||
|
|
dbda18b67d | ||
|
|
461f9e14c1 | ||
|
|
457a0d9fef | ||
|
|
ffd9dd2da8 | ||
|
|
2bc3c4e7ec | ||
|
|
46eb2dfc7d | ||
|
|
0dd6ab3f2c | ||
|
|
119f68b6ee | ||
|
|
cd2d06fca6 | ||
|
|
6c3403d95d | ||
|
|
8b40127b0e | ||
|
|
8d77f3340a | ||
|
|
dac2ccd195 | ||
|
|
c7d980e7bc | ||
|
|
024e404c8d | ||
|
|
aa831bc8a5 | ||
|
|
8727df147d | ||
|
|
a747ab1c5e | ||
|
|
f28d94c30c | ||
|
|
6dc1cd6ebd | ||
|
|
1f813aacc3 | ||
|
|
670e38969c | ||
|
|
ae5a21eadf | ||
|
|
d772c14f55 | ||
|
|
172c72f735 | ||
|
|
39f30a6609 | ||
|
|
5cf4580a86 | ||
|
|
47307b37f8 | ||
|
|
da88c7d25b | ||
|
|
f113f2c155 | ||
|
|
f1dacad6b3 | ||
|
|
30cb79bb62 | ||
|
|
f80f888d6c | ||
|
|
95f70d2082 | ||
|
|
d69939f010 | ||
|
|
ab167fe665 | ||
|
|
02eae0f5ed | ||
|
|
60231f09eb | ||
|
|
38996ddb29 | ||
|
|
e30742904e | ||
|
|
6185478b21 | ||
|
|
d1a677909e | ||
|
|
14c4ff7809 | ||
|
|
d837898ade | ||
|
|
2c0461d223 | ||
|
|
498c4bda12 | ||
|
|
81878f669e | ||
|
|
49234b77fe | ||
|
|
07bd520b77 | ||
|
|
995b5cc27a | ||
|
|
d8aa83f4e0 | ||
|
|
74ec1b6baa | ||
|
|
c20bae5a0f | ||
|
|
e76ccf4f3c | ||
|
|
14dc5b7729 | ||
|
|
d46b222c4e | ||
|
|
5e0ee16b9e | ||
|
|
fadbdc5c78 | ||
|
|
f8274028ea | ||
|
|
e05bdaeca0 | ||
|
|
7699ac9c12 | ||
|
|
84d8d78106 | ||
|
|
546474346f | ||
|
|
54ca36ec46 | ||
|
|
8a5440134b | ||
|
|
177c093dd9 | ||
|
|
2eee2eac53 | ||
|
|
7bf5b18d5e | ||
|
|
9d33eb29d2 | ||
|
|
b2e02da46b | ||
|
|
954f250ac8 | ||
|
|
0cea791a64 | ||
|
|
49afd85adc | ||
|
|
9f6b0c2fe9 | ||
|
|
8de44cf6aa | ||
|
|
45a1cd73b6 | ||
|
|
304dc97ad6 | ||
|
|
0af87295a6 | ||
|
|
b71408af98 | ||
|
|
d6e4b83c51 | ||
|
|
563a047a9a | ||
|
|
7c40f57f36 | ||
|
|
f91d26115b | ||
|
|
180ea67cbb | ||
|
|
ce2b4c6b87 | ||
|
|
953a5fdf1e | ||
|
|
bce78168e4 | ||
|
|
7031310257 | ||
|
|
301f42d2a0 | ||
|
|
5fe6adc62a | ||
|
|
5c016d5d35 | ||
|
|
d7030396cb | ||
|
|
8a9c3c4512 | ||
|
|
49a24272f6 | ||
|
|
7bae058dbe | ||
|
|
66236c1a2e | ||
|
|
091fb8e814 | ||
|
|
ee4088744c | ||
|
|
ac38ea38b7 | ||
|
|
ada407751a | ||
|
|
845d08ba09 | ||
|
|
65a3244a2f | ||
|
|
7c8433d07a | ||
|
|
7e628b1200 | ||
|
|
8ebd624aa8 | ||
|
|
fceec6f23e | ||
|
|
ff86c6d066 | ||
|
|
ed672fb99c | ||
|
|
ef87e82f13 | ||
|
|
144c91ae02 | ||
|
|
5ead361c04 | ||
|
|
2b5998e57d | ||
|
|
3c17a6af36 | ||
|
|
a465baa259 | ||
|
|
457f7bfee9 | ||
|
|
aade77437c | ||
|
|
ccda322888 | ||
|
|
c428bc3b71 | ||
|
|
479f68d69e | ||
|
|
e1ae6444e5 | ||
|
|
47ee453719 | ||
|
|
e378f7faca | ||
|
|
4679c6c38d | ||
|
|
91e9e58c39 | ||
|
|
5624dde376 | ||
|
|
d0b0bde4c8 | ||
|
|
310429c5fd | ||
|
|
98a8861690 | ||
|
|
d2ecff2e06 | ||
|
|
29bac9dbf9 | ||
|
|
7cd0450dae | ||
|
|
b5dad7927a | ||
|
|
fcc4d9502d | ||
|
|
ebca410220 | ||
|
|
80ea0c1151 | ||
|
|
56462e7945 | ||
|
|
8dea787518 | ||
|
|
60c3515870 | ||
|
|
fed426b635 | ||
|
|
f15b32c758 | ||
|
|
f25f588295 | ||
|
|
cbdd75d668 | ||
|
|
45fa1a0721 | ||
|
|
2e3c951afb | ||
|
|
e942f8fe39 | ||
|
|
558b53b2de | ||
|
|
2ad25415ed | ||
|
|
cd589abd3e | ||
|
|
1da363ea8c | ||
|
|
52c3192f26 | ||
|
|
e46f4a7e19 | ||
|
|
1a22272441 | ||
|
|
74899f8c61 | ||
|
|
4f929a8141 | ||
|
|
0baf2132a9 | ||
|
|
2e4e144086 | ||
|
|
61024ddf9d | ||
|
|
24bc70fce6 | ||
|
|
72d6326508 | ||
|
|
21a140890a | ||
|
|
6f28dfc5e3 | ||
|
|
12e129f1f6 | ||
|
|
82959585a8 | ||
|
|
5e92b7d743 | ||
|
|
c9182aea4e | ||
|
|
e8dd1733d7 | ||
|
|
fed44e0010 | ||
|
|
3871179a57 | ||
|
|
8722cc83f4 | ||
|
|
1e5eb87582 | ||
|
|
489fc3e761 | ||
|
|
f5b125aba5 | ||
|
|
27bcf3494f | ||
|
|
201e2f303d | ||
|
|
4f68cb5fb4 | ||
|
|
c976683a9e | ||
|
|
4b3292d3df | ||
|
|
cde4438612 | ||
|
|
79f8302d82 | ||
|
|
37d4c265e3 | ||
|
|
22fd3e5c64 | ||
|
|
acb00be975 | ||
|
|
3b1eb6d5e3 | ||
|
|
6cc5754f7e | ||
|
|
68f529c2bc | ||
|
|
fc8d657ec0 | ||
|
|
e4263d6dac | ||
|
|
8799c1c53f | ||
|
|
3678e073a1 | ||
|
|
32f728e7b1 | ||
|
|
ec1beb2fff | ||
|
|
02327200e0 | ||
|
|
049f828095 | ||
|
|
eba5e11303 | ||
|
|
4d8360d426 | ||
|
|
24d90d7c70 | ||
|
|
6d372ab37f | ||
|
|
1f3a2fd537 | ||
|
|
25da8cd524 | ||
|
|
2371cbc9b5 | ||
|
|
fcddabbd8e | ||
|
|
c3d8e80b7c | ||
|
|
6d47317d1e | ||
|
|
2b9a5cc979 | ||
|
|
19e6c1d2c4 | ||
|
|
bb25273269 | ||
|
|
e1439a37ac | ||
|
|
b4286b31cd | ||
|
|
47733776b9 | ||
|
|
fc03f1b62f | ||
|
|
44148ba4a3 | ||
|
|
c104b179b7 | ||
|
|
02c9f7971b | ||
|
|
a28e96076c | ||
|
|
d8d54fb9b5 | ||
|
|
04eeca91cc | ||
|
|
3f11a48657 | ||
|
|
0a96759c72 | ||
|
|
13c194716d | ||
|
|
0b4e9ab520 | ||
|
|
c2fd040d06 | ||
|
|
0b8eecd9e5 | ||
|
|
d67a6da456 | ||
|
|
ed18c93b22 | ||
|
|
5079acfa21 | ||
|
|
e563102339 | ||
|
|
96fd30b556 | ||
|
|
99c862c2c1 | ||
|
|
3f9287f3e5 | ||
|
|
e9e22cd3c5 | ||
|
|
e66259cb31 | ||
|
|
9fdc6eeaa7 | ||
|
|
11fcb7d25e | ||
|
|
8a1c9b7369 | ||
|
|
12ad9b8c4d | ||
|
|
228a2a2372 | ||
|
|
dd53793f13 | ||
|
|
a26a3235d7 | ||
|
|
dd707478d0 | ||
|
|
784cb111d1 | ||
|
|
e73e5abb4c | ||
|
|
85c28415eb | ||
|
|
088cfce5f3 | ||
|
|
ccd94dfaf7 | ||
|
|
7256f96dcd | ||
|
|
fc9a7769b4 | ||
|
|
af57ffc29d | ||
|
|
a2531182d1 | ||
|
|
83a77ae625 | ||
|
|
67515899e2 | ||
|
|
f57d0becd0 | ||
|
|
f99a59fb58 | ||
|
|
b67b3bbe15 | ||
|
|
bc968d18e6 | ||
|
|
b9b622755b | ||
|
|
b7bf642ad8 | ||
|
|
a79f637251 | ||
|
|
0bad0849c1 | ||
|
|
640b5b7d6d | ||
|
|
b578322d16 | ||
|
|
4ac496b89c |
2
.github/workflows/collabora.yml
vendored
2
.github/workflows/collabora.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
mv cool-seccomp-profile.json php/
|
mv cool-seccomp-profile.json php/
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: collabora-seccomp-update automated change
|
commit-message: collabora-seccomp-update automated change
|
||||||
|
|||||||
2
.github/workflows/dependency-updates.yml
vendored
2
.github/workflows/dependency-updates.yml
vendored
@@ -53,7 +53,7 @@ jobs:
|
|||||||
sed -i "s|^ARG CADDY_REMOTE_HOST_HASH.*$|ARG CADDY_REMOTE_HOST_HASH=$CADDY_REMOTE_HOST_HASH|" ./Containers/mastercontainer/Dockerfile
|
sed -i "s|^ARG CADDY_REMOTE_HOST_HASH.*$|ARG CADDY_REMOTE_HOST_HASH=$CADDY_REMOTE_HOST_HASH|" ./Containers/mastercontainer/Dockerfile
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: php dependency updates
|
commit-message: php dependency updates
|
||||||
|
|||||||
2
.github/workflows/fail-on-prerelease.yml
vendored
2
.github/workflows/fail-on-prerelease.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: "Check latest published release isn't a prerelease"
|
- name: "Check latest published release isn't a prerelease"
|
||||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v6
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v6
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const tags = await github.rest.repos.listTags({
|
const tags = await github.rest.repos.listTags({
|
||||||
|
|||||||
4
.github/workflows/helm-release.yml
vendored
4
.github/workflows/helm-release.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- name: Turnstyle
|
- name: Turnstyle
|
||||||
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
|
uses: softprops/turnstyle@e15e934b3f69ee283ba389ea05c8886baa656d93 # v2
|
||||||
with:
|
with:
|
||||||
continue-after-seconds: 180
|
continue-after-seconds: 180
|
||||||
env:
|
env:
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
|
|
||||||
# See https://github.com/helm/chart-releaser-action/issues/6
|
# See https://github.com/helm/chart-releaser-action/issues/6
|
||||||
- name: Set up Helm
|
- name: Set up Helm
|
||||||
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4
|
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5.0.0
|
||||||
with:
|
with:
|
||||||
version: v3.6.3
|
version: v3.6.3
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/imaginary-update.yml
vendored
2
.github/workflows/imaginary-update.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
sed -i "s|^ENV IMAGINARY_HASH.*$|ENV IMAGINARY_HASH=$imaginary_version|" ./Containers/imaginary/Dockerfile
|
sed -i "s|^ENV IMAGINARY_HASH.*$|ENV IMAGINARY_HASH=$imaginary_version|" ./Containers/imaginary/Dockerfile
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: imaginary-update automated change
|
commit-message: imaginary-update automated change
|
||||||
|
|||||||
2
.github/workflows/lint-helm.yml
vendored
2
.github/workflows/lint-helm.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Install Helm
|
- name: Install Helm
|
||||||
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4
|
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5.0.0
|
||||||
with:
|
with:
|
||||||
version: v3.11.1
|
version: v3.11.1
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/lint-php.yml
vendored
2
.github/workflows/lint-php.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2.36.0
|
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
coverage: none
|
coverage: none
|
||||||
|
|||||||
2
.github/workflows/lint-yaml.yml
vendored
2
.github/workflows/lint-yaml.yml
vendored
@@ -36,7 +36,7 @@ jobs:
|
|||||||
line-length: warning
|
line-length: warning
|
||||||
|
|
||||||
- name: Install the latest version of uv
|
- name: Install the latest version of uv
|
||||||
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||||
|
|
||||||
- name: Check GitHub actions
|
- name: Check GitHub actions
|
||||||
run: uvx zizmor --min-severity medium .github/workflows/*.yml
|
run: uvx zizmor --min-severity medium .github/workflows/*.yml
|
||||||
|
|||||||
2
.github/workflows/nextcloud-update.yml
vendored
2
.github/workflows/nextcloud-update.yml
vendored
@@ -79,7 +79,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: nextcloud-update automated change
|
commit-message: nextcloud-update automated change
|
||||||
|
|||||||
18
.github/workflows/playwright-on-push.yml
vendored
18
.github/workflows/playwright-on-push.yml
vendored
@@ -4,11 +4,15 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'php/**'
|
- 'php/**'
|
||||||
|
- 'Containers/mastercontainer/*.Caddyfile'
|
||||||
|
- 'Containers/mastercontainer/start.sh'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'php/**'
|
- 'php/**'
|
||||||
|
- 'Containers/mastercontainer/*.Caddyfile'
|
||||||
|
- 'Containers/mastercontainer/start.sh'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: playwright-${{ github.head_ref || github.run_id }}
|
group: playwright-${{ github.head_ref || github.run_id }}
|
||||||
@@ -26,7 +30,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
|
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
|
|
||||||
@@ -37,7 +41,7 @@ jobs:
|
|||||||
run: cd php/tests && npx playwright install --with-deps chromium
|
run: cd php/tests && npx playwright install --with-deps chromium
|
||||||
|
|
||||||
- name: Set up php 8.5
|
- name: Set up php 8.5
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2.36.0
|
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
|
||||||
with:
|
with:
|
||||||
extensions: apcu
|
extensions: apcu
|
||||||
php-version: 8.5
|
php-version: 8.5
|
||||||
@@ -53,7 +57,7 @@ jobs:
|
|||||||
rm -r ./session
|
rm -r ./session
|
||||||
composer install --no-dev
|
composer install --no-dev
|
||||||
composer clear-cache
|
composer clear-cache
|
||||||
sudo chmod 777 -R ./
|
sudo chmod 777 -R ../
|
||||||
|
|
||||||
- name: Start fresh development server
|
- name: Start fresh development server
|
||||||
run: |
|
run: |
|
||||||
@@ -68,6 +72,9 @@ jobs:
|
|||||||
--publish 8080:8080 \
|
--publish 8080:8080 \
|
||||||
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
|
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
|
||||||
--volume ./php:/var/www/docker-aio/php \
|
--volume ./php:/var/www/docker-aio/php \
|
||||||
|
--volume ./Containers/mastercontainer/internal.Caddyfile:/internal.Caddyfile \
|
||||||
|
--volume ./Containers/mastercontainer/headers.Caddyfile:/headers.Caddyfile \
|
||||||
|
--volume ./Containers/mastercontainer/start.sh:/start.sh \
|
||||||
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
|
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||||
--env SKIP_DOMAIN_VALIDATION=true \
|
--env SKIP_DOMAIN_VALIDATION=true \
|
||||||
--env APACHE_PORT=11000 \
|
--env APACHE_PORT=11000 \
|
||||||
@@ -97,6 +104,9 @@ jobs:
|
|||||||
--publish 8080:8080 \
|
--publish 8080:8080 \
|
||||||
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
|
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
|
||||||
--volume ./php:/var/www/docker-aio/php \
|
--volume ./php:/var/www/docker-aio/php \
|
||||||
|
--volume ./Containers/mastercontainer/internal.Caddyfile:/internal.Caddyfile \
|
||||||
|
--volume ./Containers/mastercontainer/headers.Caddyfile:/headers.Caddyfile \
|
||||||
|
--volume ./Containers/mastercontainer/start.sh:/start.sh \
|
||||||
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
|
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||||
--env SKIP_DOMAIN_VALIDATION=false \
|
--env SKIP_DOMAIN_VALIDATION=false \
|
||||||
--env APACHE_PORT=11000 \
|
--env APACHE_PORT=11000 \
|
||||||
@@ -114,7 +124,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report
|
name: playwright-report
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
|
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
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
@@ -31,7 +31,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: Update psalm baseline
|
commit-message: Update psalm baseline
|
||||||
|
|||||||
2
.github/workflows/psalm.yml
vendored
2
.github/workflows/psalm.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Set up php
|
- name: Set up php
|
||||||
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2.36.0
|
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
|
||||||
with:
|
with:
|
||||||
php-version: 8.5
|
php-version: 8.5
|
||||||
extensions: apcu
|
extensions: apcu
|
||||||
|
|||||||
140
.github/workflows/sync-workflow-templates.yml
vendored
Normal file
140
.github/workflows/sync-workflow-templates.yml
vendored
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# This workflow is provided via the organization template repository
|
||||||
|
#
|
||||||
|
# https://github.com/nextcloud/.github
|
||||||
|
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||||
|
#
|
||||||
|
# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
# This workflow will update all workflow templates
|
||||||
|
# Additionally it will reapply `workflow.yml.patch` files after syncing and only then commit the result
|
||||||
|
name: Update workflows
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: "5 2 * * 0"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dispatch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
branches:
|
||||||
|
- ${{ github.event.repository.default_branch }}
|
||||||
|
- 'stable33'
|
||||||
|
- 'stable32'
|
||||||
|
|
||||||
|
name: Update workflows in ${{ matrix.branches }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check actor permission
|
||||||
|
uses: skjnldsv/check-actor-permission@69e92a3c4711150929bca9fcf34448c5bf5526e7 # v3.0
|
||||||
|
with:
|
||||||
|
require: admin
|
||||||
|
|
||||||
|
- name: Checkout workflow repository
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
path: source
|
||||||
|
repository: nextcloud/.github
|
||||||
|
|
||||||
|
- name: Checkout app
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
path: target
|
||||||
|
ref: ${{ matrix.branches }}
|
||||||
|
|
||||||
|
- name: Copy all workflow templates
|
||||||
|
run: |
|
||||||
|
echo 'SUMMARY<<EOF' >> $GITHUB_ENV
|
||||||
|
draft_only=0
|
||||||
|
for workflow in ./source/workflow-templates/*.yml; do
|
||||||
|
echo "❓ Looking for $workflow"
|
||||||
|
if [ -f "$workflow" ]; then
|
||||||
|
filename=$(basename "$workflow")
|
||||||
|
target_file="./target/.github/workflows/$filename"
|
||||||
|
|
||||||
|
# Only copy if the file exists in the target repository
|
||||||
|
if [ -f "$target_file" ]; then
|
||||||
|
if [ -f "./target/.github/actions-lock.txt" ]; then
|
||||||
|
locked_version=$(grep " $filename" ./target/.github/actions-lock.txt | cat)
|
||||||
|
else
|
||||||
|
echo "# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors" >> ./target/.github/actions-lock.txt
|
||||||
|
echo "# SPDX-License""-Identifier: MIT" >> ./target/.github/actions-lock.txt
|
||||||
|
locked_version=""
|
||||||
|
fi
|
||||||
|
locked_version=$(echo $locked_version | cut -f 1 -d " ")
|
||||||
|
new_version=$(md5sum $workflow | cut -f 1 -d " ")
|
||||||
|
|
||||||
|
# Only update if the action changes
|
||||||
|
if [[ "$locked_version" != "$new_version" ]]; then
|
||||||
|
echo "ℹ️ Locked version: $locked_version"
|
||||||
|
echo "ℹ️ Current version: $new_version"
|
||||||
|
echo "🆙 Updating existing workflow: $filename"
|
||||||
|
echo "- 🆙 Updated [$filename](https://github.com/nextcloud/.github/commits/master/workflow-templates/$filename)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
cp "$workflow" "$target_file"
|
||||||
|
|
||||||
|
# Apply patch if one exists
|
||||||
|
if [ -f "$target_file.patch" ]; then
|
||||||
|
echo "🩹 Applying patch"
|
||||||
|
cd ./target
|
||||||
|
set +e
|
||||||
|
patch -p1 < ".github/workflows/$filename.patch"
|
||||||
|
patch_worked=$?
|
||||||
|
set -e
|
||||||
|
cd -
|
||||||
|
if [[ "$patch_worked" == "0" ]]; then
|
||||||
|
echo " - Patch applied" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo " - [ ] ❌ Patch failed" >> $GITHUB_ENV
|
||||||
|
draft_only=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$locked_version" != "" ]]; then
|
||||||
|
sed -i "s/$locked_version $filename/$new_version $filename/" ./target/.github/actions-lock.txt
|
||||||
|
else
|
||||||
|
echo "$new_version $filename" >> ./target/.github/actions-lock.txt
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✅ Skipping $filename: already up to date"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⏭️ Skipping $filename: does not exist in target repository"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo 'EOF' >> $GITHUB_ENV
|
||||||
|
echo "DRAFT_ONLY=${draft_only}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.COMMAND_BOT_WORKFLOWS }} # zizmor: ignore[secrets-outside-env]
|
||||||
|
commit-message: 'ci(actions): Update workflow templates from organization template repository'
|
||||||
|
committer: GitHub <noreply@github.com>
|
||||||
|
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
|
||||||
|
path: target
|
||||||
|
signoff: true
|
||||||
|
branch: 'automated/noid/${{ matrix.branches }}-update-workflows'
|
||||||
|
title: '[${{ matrix.branches }}] ci(actions): Update workflow templates from organization template repository'
|
||||||
|
draft: ${{ env.DRAFT_ONLY == 1 }}
|
||||||
|
add-paths: .github/workflows/*.yml,.github/actions-lock.txt
|
||||||
|
body: |
|
||||||
|
Automated update of all workflow templates from [nextcloud/.github](https://github.com/nextcloud/.github)
|
||||||
|
${{ env.SUMMARY }}
|
||||||
|
labels: |
|
||||||
|
dependencies
|
||||||
|
3. to review
|
||||||
2
.github/workflows/talk.yml
vendored
2
.github/workflows/talk.yml
vendored
@@ -45,7 +45,7 @@ jobs:
|
|||||||
sed -i "s|^ARG JANUS_VERSION=.*$|ARG JANUS_VERSION=$janus_version|" ./Containers/talk/Dockerfile
|
sed -i "s|^ARG JANUS_VERSION=.*$|ARG JANUS_VERSION=$janus_version|" ./Containers/talk/Dockerfile
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: talk-update automated change
|
commit-message: talk-update automated change
|
||||||
|
|||||||
2
.github/workflows/update-helm.yml
vendored
2
.github/workflows/update-helm.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
sudo bash nextcloud-aio-helm-chart/update-helm.sh "$DOCKER_TAG"
|
sudo bash nextcloud-aio-helm-chart/update-helm.sh "$DOCKER_TAG"
|
||||||
fi
|
fi
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
commit-message: Helm Chart updates
|
commit-message: Helm Chart updates
|
||||||
signoff: true
|
signoff: true
|
||||||
|
|||||||
2
.github/workflows/update-yaml.yml
vendored
2
.github/workflows/update-yaml.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sudo bash manual-install/update-yaml.sh
|
sudo bash manual-install/update-yaml.sh
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
commit-message: Yaml updates
|
commit-message: Yaml updates
|
||||||
signoff: true
|
signoff: true
|
||||||
|
|||||||
2
.github/workflows/watchtower-update.yml
vendored
2
.github/workflows/watchtower-update.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
sed -i "s|\$WATCHTOWER_COMMIT_HASH.*$|\$WATCHTOWER_COMMIT_HASH # $watchtower_version|" ./Containers/watchtower/Dockerfile
|
sed -i "s|\$WATCHTOWER_COMMIT_HASH.*$|\$WATCHTOWER_COMMIT_HASH # $watchtower_version|" ./Containers/watchtower/Dockerfile
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: watchtower-update automated change
|
commit-message: watchtower-update automated change
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a
|
apk upgrade --no-cache -a
|
||||||
|
|
||||||
LABEL org.label-schema.vendor="Nextcloud"
|
LABEL org.opencontainers.image.title="Alpine for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Minimal Alpine Linux image for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -17,8 +17,13 @@
|
|||||||
https://{$ADDITIONAL_TRUSTED_DOMAIN}:443,
|
https://{$ADDITIONAL_TRUSTED_DOMAIN}:443,
|
||||||
http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI requests, see containers.json
|
http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI requests, see containers.json
|
||||||
{$PROTOCOL}://{$NC_DOMAIN}:{$APACHE_PORT} {
|
{$PROTOCOL}://{$NC_DOMAIN}:{$APACHE_PORT} {
|
||||||
header -Server
|
header {
|
||||||
header -X-Powered-By
|
Strict-Transport-Security max-age=31536000;
|
||||||
|
|
||||||
|
-Server
|
||||||
|
-X-Powered-By
|
||||||
|
-Via
|
||||||
|
}
|
||||||
|
|
||||||
# Collabora
|
# Collabora
|
||||||
route /browser/* {
|
route /browser/* {
|
||||||
@@ -65,7 +70,6 @@ http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI req
|
|||||||
|
|
||||||
# Nextcloud
|
# Nextcloud
|
||||||
route {
|
route {
|
||||||
header Strict-Transport-Security max-age=31536000;
|
|
||||||
reverse_proxy 127.0.0.1:8000
|
reverse_proxy 127.0.0.1:8000
|
||||||
}
|
}
|
||||||
redir /.well-known/carddav /remote.php/dav/ 301
|
redir /.well-known/carddav /remote.php/dav/ 301
|
||||||
@@ -74,6 +78,9 @@ http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI req
|
|||||||
# TLS options
|
# TLS options
|
||||||
tls {
|
tls {
|
||||||
issuer acme {
|
issuer acme {
|
||||||
|
profile shortlived
|
||||||
|
# Disable HTTP challenge because that would require port 80, which we don't get (it's exposed to the mastercontainer).
|
||||||
|
# This container by default only exposes port 443 if not configured otherwise via APACHE_PORT.
|
||||||
disable_http_challenge
|
disable_http_challenge
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM caddy:2.11.2-alpine AS caddy
|
FROM caddy:2.11.3-alpine AS caddy
|
||||||
|
|
||||||
# From https://github.com/docker-library/httpd/blob/master/2.4/alpine/Dockerfile
|
# From https://github.com/docker-library/httpd/blob/master/2.4/alpine/Dockerfile
|
||||||
FROM httpd:2.4.66-alpine3.23
|
FROM httpd:2.4.67-alpine3.23
|
||||||
|
|
||||||
COPY --from=caddy /usr/bin/caddy /usr/bin/caddy
|
COPY --from=caddy /usr/bin/caddy /usr/bin/caddy
|
||||||
|
|
||||||
@@ -60,6 +60,19 @@ RUN set -ex; \
|
|||||||
grep -q '<IfModule mpm_event_module>' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
grep -q '<IfModule mpm_event_module>' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
# ServerLimit needs to be set to MaxRequestWorkers divided by ThreadsPerChild which is set to 25 by default
|
# ServerLimit needs to be set to MaxRequestWorkers divided by ThreadsPerChild which is set to 25 by default
|
||||||
sed -i '/<IfModule mpm_event_module>/a\ \ \ \ ServerLimit 200' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
sed -i '/<IfModule mpm_event_module>/a\ \ \ \ ServerLimit 200' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
|
# Pin ThreadsPerChild so the value is deterministic regardless of the httpd base-image
|
||||||
|
# defaults; 25 threads per process balances concurrency against per-process memory use.
|
||||||
|
sed -i 's|ThreadsPerChild.*|ThreadsPerChild 25|' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
|
# Start two server processes on boot to absorb the first requests without spawning
|
||||||
|
# new processes on the critical path, while avoiding unnecessary memory overhead.
|
||||||
|
sed -i 's|StartServers.*|StartServers 2|' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
|
# Keep at least 25 idle threads (one full process worth) so traffic bursts can be
|
||||||
|
# absorbed immediately without triggering new process creation.
|
||||||
|
sed -i 's|MinSpareThreads.*|MinSpareThreads 25|' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
|
# Retire idle threads above 50 to reclaim memory during quiet periods. 50 is the
|
||||||
|
# minimum valid value (MinSpareThreads + ThreadsPerChild = 25 + 25) and is enough
|
||||||
|
# to absorb typical bursts without respawning a new process.
|
||||||
|
sed -i 's|MaxSpareThreads.*|MaxSpareThreads 50|' /usr/local/apache2/conf/extra/httpd-mpm.conf; \
|
||||||
\
|
\
|
||||||
rm -rf /usr/local/apache2/conf/original /var/www; \
|
rm -rf /usr/local/apache2/conf/original /var/www; \
|
||||||
mkdir -p /var/www; \
|
mkdir -p /var/www; \
|
||||||
@@ -90,4 +103,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Apache and Caddy for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Apache HTTP server with Caddy for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z "$NEXTCLOUD_HOST" 9000 || exit 0
|
nc -z "$NEXTCLOUD_HOST" 9000 || exit 0
|
||||||
nc -z 127.0.0.1 8000 || exit 1
|
nc -z 127.0.0.1 8000 || exit 1
|
||||||
nc -z 127.0.0.1 "$APACHE_PORT" || exit 1
|
nc -z 127.0.0.1 "$APACHE_PORT" || exit 1
|
||||||
|
|||||||
@@ -7,7 +7,35 @@ Listen 8000
|
|||||||
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
|
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
|
||||||
ErrorLog /proc/self/fd/2
|
ErrorLog /proc/self/fd/2
|
||||||
ErrorLogFormat "[%t] [%l] [%E] [client: %{X-Forwarded-For}i] [%M] [%{User-Agent}i]"
|
ErrorLogFormat "[%t] [%l] [%E] [client: %{X-Forwarded-For}i] [%M] [%{User-Agent}i]"
|
||||||
LogLevel warn
|
LogLevel ${AIO_LOG_LEVEL}
|
||||||
|
|
||||||
|
# KeepAlive On: allow the same TCP connection to carry multiple HTTP requests.
|
||||||
|
# Without this each asset (JS, CSS, image) would require a full TCP handshake,
|
||||||
|
# which is especially expensive on TLS connections and noticeably slows down
|
||||||
|
# Nextcloud's login page and file manager that load dozens of resources at once.
|
||||||
|
KeepAlive On
|
||||||
|
# KeepAliveTimeout: close an idle keep-alive connection after 5 seconds.
|
||||||
|
# A short timeout frees Apache worker threads quickly so they are available
|
||||||
|
# for new requests; 5 s is long enough to cover the gap between requests
|
||||||
|
# that a browser issues while rendering a page (typically < 1 s), yet short
|
||||||
|
# enough to avoid holding threads open for idle or slow clients.
|
||||||
|
KeepAliveTimeout 5
|
||||||
|
# MaxKeepAliveRequests: allow at most 500 requests per persistent connection.
|
||||||
|
# 100 (the Apache default) is too low for Nextcloud: the desktop and mobile
|
||||||
|
# sync clients issue many small API calls (PROPFIND, GET, PUT, checksums …)
|
||||||
|
# per sync cycle and routinely exceed 100 requests on a single connection.
|
||||||
|
# Hitting the limit forces a new TCP/TLS handshake, adding latency and CPU
|
||||||
|
# overhead. 500 gives sync clients enough headroom while still periodically
|
||||||
|
# recycling threads to contain per-process memory growth.
|
||||||
|
MaxKeepAliveRequests 500
|
||||||
|
|
||||||
|
# sendfile(2) is disabled because it bypasses Apache's output-filter chain: with
|
||||||
|
# it enabled, mod_brotli is silently skipped for static files (JS, CSS, SVG),
|
||||||
|
# negating the compression configured below. MMAP is also
|
||||||
|
# disabled because files can be replaced by Nextcloud at any time and mmap'd
|
||||||
|
# pages could serve stale data.
|
||||||
|
EnableSendfile Off
|
||||||
|
EnableMMAP Off
|
||||||
|
|
||||||
# PHP match
|
# PHP match
|
||||||
<FilesMatch "\.php$">
|
<FilesMatch "\.php$">
|
||||||
@@ -17,20 +45,25 @@ Listen 8000
|
|||||||
<Proxy "fcgi://${NEXTCLOUD_HOST}:9000" flushpackets=on>
|
<Proxy "fcgi://${NEXTCLOUD_HOST}:9000" flushpackets=on>
|
||||||
</Proxy>
|
</Proxy>
|
||||||
|
|
||||||
# Enable Brotli compression for js, css and svg files - other plain files are compressed by Nextcloud by default
|
# Compress JS, CSS and SVG responses with Brotli (quality 4 gives good
|
||||||
|
# compression with reasonable CPU cost; the default of 0 barely compresses).
|
||||||
|
# Other plain-text files are already compressed by Nextcloud itself.
|
||||||
|
# No deflate fallback is needed: every browser that Nextcloud supports
|
||||||
|
# (Chrome 49+, Firefox 44+, Safari 11+, Edge 15+ — all from 2016-2017)
|
||||||
|
# supports Brotli. Internet Explorer, the only browser that never gained
|
||||||
|
# Brotli support, was dropped by Nextcloud with NC15 (2019).
|
||||||
|
# Desktop and mobile sync clients never request JS/CSS/SVG assets.
|
||||||
<IfModule mod_brotli.c>
|
<IfModule mod_brotli.c>
|
||||||
AddOutputFilterByType BROTLI_COMPRESS text/javascript application/javascript application/x-javascript text/css image/svg+xml
|
AddOutputFilterByType BROTLI_COMPRESS text/javascript application/javascript application/x-javascript text/css image/svg+xml
|
||||||
BrotliCompressionQuality 0
|
BrotliCompressionQuality 4
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
# Nextcloud dir
|
# Nextcloud dir
|
||||||
DocumentRoot /var/www/html/
|
DocumentRoot /var/www/html/
|
||||||
<Directory /var/www/html/>
|
<Directory /var/www/html/>
|
||||||
Options Indexes FollowSymLinks
|
Options FollowSymLinks MultiViews
|
||||||
Require all granted
|
Require all granted
|
||||||
AllowOverride All
|
AllowOverride All
|
||||||
Options FollowSymLinks MultiViews
|
|
||||||
Satisfy Any
|
|
||||||
<IfModule mod_dav.c>
|
<IfModule mod_dav.c>
|
||||||
Dav off
|
Dav off
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|||||||
@@ -1,10 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$NC_DOMAIN" ]; then
|
if [ -z "$NC_DOMAIN" ]; then
|
||||||
echo "NC_DOMAIN and NEXTCLOUD_HOST need to be provided. Exiting!"
|
echo "NC_DOMAIN and NEXTCLOUD_HOST need to be provided. Exiting!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
export SUPERVISORD_STDOUT=/dev/stdout
|
||||||
|
else
|
||||||
|
export SUPERVISORD_STDOUT=NONE
|
||||||
|
fi
|
||||||
|
|
||||||
# Need write access to /mnt/data
|
# Need write access to /mnt/data
|
||||||
if ! [ -w /mnt/data ]; then
|
if ! [ -w /mnt/data ]; then
|
||||||
echo "Cannot write to /mnt/data"
|
echo "Cannot write to /mnt/data"
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
nodaemon=true
|
|
||||||
logfile=/var/log/supervisord/supervisord.log
|
logfile=/var/log/supervisord/supervisord.log
|
||||||
pidfile=/var/run/supervisord/supervisord.pid
|
pidfile=/var/run/supervisord/supervisord.pid
|
||||||
childlogdir=/var/log/supervisord/
|
childlogdir=/var/log/supervisord/
|
||||||
logfile_maxbytes=50MB
|
logfile_maxbytes=50MB
|
||||||
logfile_backups=10
|
logfile_backups=10
|
||||||
loglevel=error
|
loglevel=%(ENV_AIO_LOG_LEVEL)s
|
||||||
|
|
||||||
[program:apache]
|
[program:apache]
|
||||||
# Stdout logging is disabled as otherwise the logs are spammed
|
# Stdout logging is disabled as otherwise the logs are spammed
|
||||||
stdout_logfile=NONE
|
stdout_logfile=%(ENV_SUPERVISORD_STDOUT)s
|
||||||
stderr_logfile=/dev/stderr
|
stderr_logfile=/dev/stderr
|
||||||
stderr_logfile_maxbytes=0
|
stderr_logfile_maxbytes=0
|
||||||
command=apachectl -DFOREGROUND
|
command=apachectl -DFOREGROUND
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
\
|
\
|
||||||
@@ -25,5 +25,10 @@ USER root
|
|||||||
|
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
wud.watch="false" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Borgbackup for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="BorgBackup-based backup service for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
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"
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
get_start_time(){
|
get_start_time(){
|
||||||
START_TIME=$(date +%s)
|
START_TIME=$(date +%s)
|
||||||
@@ -40,7 +44,7 @@ if [ -z "$BORG_REMOTE_REPO" ] && ! mountpoint -q "$MOUNT_DIR"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if repo is uninitialized
|
# Check if repo is uninitialized
|
||||||
if [ "$BORG_MODE" != backup ] && [ "$BORG_MODE" != test ] && ! borg info > /dev/null; then
|
if [ "$BORG_MODE" != backup ] && [ "$BORG_MODE" != test ] && ! borg "$BORG_LOG_LEVEL_FLAG" info > /dev/null; then
|
||||||
if [ -n "$BORG_REMOTE_REPO" ]; then
|
if [ -n "$BORG_REMOTE_REPO" ]; then
|
||||||
echo "The repository is uninitialized or cannot connect to remote. Cannot perform check or restore."
|
echo "The repository is uninitialized or cannot connect to remote. Cannot perform check or restore."
|
||||||
else
|
else
|
||||||
@@ -123,7 +127,7 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Initialize the repository if can't get info from target
|
# Initialize the repository if can't get info from target
|
||||||
if ! borg info > /dev/null; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" info > /dev/null; then
|
||||||
# Don't initialize if already initialized
|
# Don't initialize if already initialized
|
||||||
if [ -f "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config" ]; then
|
if [ -f "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/borg.config" ]; then
|
||||||
if [ -n "$BORG_REMOTE_REPO" ]; then
|
if [ -n "$BORG_REMOTE_REPO" ]; then
|
||||||
@@ -140,14 +144,14 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
|
|
||||||
echo "Initializing repository..."
|
echo "Initializing repository..."
|
||||||
NEW_REPOSITORY=1
|
NEW_REPOSITORY=1
|
||||||
if ! borg init --debug --encryption=repokey-blake2; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" init --encryption=repokey-blake2; then
|
||||||
echo "Could not initialize borg repository."
|
echo "Could not initialize borg repository."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$BORG_REMOTE_REPO" ]; then
|
if [ -z "$BORG_REMOTE_REPO" ]; then
|
||||||
# borg config only works for local repos; it's up to the remote to ensure the disk isn't full
|
# borg config only works for local repos; it's up to the remote to ensure the disk isn't full
|
||||||
borg config :: additional_free_space 2G
|
borg "$BORG_LOG_LEVEL_FLAG" config :: additional_free_space 2G
|
||||||
|
|
||||||
# Fix too large Borg cache
|
# Fix too large Borg cache
|
||||||
# https://borgbackup.readthedocs.io/en/stable/faq.html#the-borg-cache-eats-way-too-much-disk-space-what-can-i-do
|
# https://borgbackup.readthedocs.io/en/stable/faq.html#the-borg-cache-eats-way-too-much-disk-space-what-can-i-do
|
||||||
@@ -156,7 +160,7 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
touch "/root/.cache/borg/$BORG_ID/chunks.archive.d"
|
touch "/root/.cache/borg/$BORG_ID/chunks.archive.d"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! borg info > /dev/null; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" info > /dev/null; then
|
||||||
echo "Borg can't get info from the repo it created. Something is wrong."
|
echo "Borg can't get info from the repo it created. Something is wrong."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -216,9 +220,9 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
# Create the backup
|
# Create the backup
|
||||||
echo "Starting the backup..."
|
echo "Starting the backup..."
|
||||||
get_start_time
|
get_start_time
|
||||||
if ! borg create "${BORG_OPTS[@]}" "${BORG_INCLUDE[@]}" "${BORG_EXCLUDE[@]}" "::$CURRENT_DATE-nextcloud-aio" "/nextcloud_aio_volumes/" --exclude-from /borg_excludes; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" create "${BORG_OPTS[@]}" "${BORG_INCLUDE[@]}" "${BORG_EXCLUDE[@]}" "::$CURRENT_DATE-nextcloud-aio" "/nextcloud_aio_volumes/" --exclude-from /borg_excludes; then
|
||||||
echo "Deleting the failed backup archive..."
|
echo "Deleting the failed backup archive..."
|
||||||
borg delete --stats "::$CURRENT_DATE-nextcloud-aio"
|
borg "$BORG_LOG_LEVEL_FLAG" delete --stats "::$CURRENT_DATE-nextcloud-aio"
|
||||||
echo "Backup failed!"
|
echo "Backup failed!"
|
||||||
echo "You might want to check the backup integrity via the AIO interface."
|
echo "You might want to check the backup integrity via the AIO interface."
|
||||||
if [ "$NEW_REPOSITORY" = 1 ]; then
|
if [ "$NEW_REPOSITORY" = 1 ]; then
|
||||||
@@ -237,14 +241,14 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
|
|
||||||
# Prune archives
|
# Prune archives
|
||||||
echo "Pruning the archives..."
|
echo "Pruning the archives..."
|
||||||
if ! borg prune --stats --glob-archives '*_*-nextcloud-aio' "${BORG_PRUNE_OPTS[@]}"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" prune --stats --glob-archives '*_*-nextcloud-aio' "${BORG_PRUNE_OPTS[@]}"; then
|
||||||
echo "Failed to prune archives!"
|
echo "Failed to prune archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Compact archives
|
# Compact archives
|
||||||
echo "Compacting the archives..."
|
echo "Compacting the archives..."
|
||||||
if ! borg compact; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" compact; then
|
||||||
echo "Failed to compact archives!"
|
echo "Failed to compact archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -261,19 +265,19 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Starting the backup for additional volumes..."
|
echo "Starting the backup for additional volumes..."
|
||||||
if ! borg create "${BORG_OPTS[@]}" "::$CURRENT_DATE-additional-docker-volumes" "/docker_volumes/"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" create "${BORG_OPTS[@]}" "::$CURRENT_DATE-additional-docker-volumes" "/docker_volumes/"; then
|
||||||
echo "Deleting the failed backup archive..."
|
echo "Deleting the failed backup archive..."
|
||||||
borg delete --stats "::$CURRENT_DATE-additional-docker-volumes"
|
borg "$BORG_LOG_LEVEL_FLAG" delete --stats "::$CURRENT_DATE-additional-docker-volumes"
|
||||||
echo "Backup of additional docker-volumes failed!"
|
echo "Backup of additional docker-volumes failed!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Pruning additional volumes..."
|
echo "Pruning additional volumes..."
|
||||||
if ! borg prune --stats --glob-archives '*_*-additional-docker-volumes' "${BORG_PRUNE_OPTS[@]}"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" prune --stats --glob-archives '*_*-additional-docker-volumes' "${BORG_PRUNE_OPTS[@]}"; then
|
||||||
echo "Failed to prune additional docker-volumes archives!"
|
echo "Failed to prune additional docker-volumes archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Compacting additional volumes..."
|
echo "Compacting additional volumes..."
|
||||||
if ! borg compact; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" compact; then
|
||||||
echo "Failed to compact additional docker-volume archives!"
|
echo "Failed to compact additional docker-volume archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -291,19 +295,19 @@ if [ "$BORG_MODE" = backup ]; then
|
|||||||
EXCLUDE_DIRS+=(--exclude "/host_mounts/$directory/")
|
EXCLUDE_DIRS+=(--exclude "/host_mounts/$directory/")
|
||||||
done
|
done
|
||||||
echo "Starting the backup for additional host mounts..."
|
echo "Starting the backup for additional host mounts..."
|
||||||
if ! borg create "${BORG_OPTS[@]}" "${EXCLUDE_DIRS[@]}" "::$CURRENT_DATE-additional-host-mounts" "/host_mounts/"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" create "${BORG_OPTS[@]}" "${EXCLUDE_DIRS[@]}" "::$CURRENT_DATE-additional-host-mounts" "/host_mounts/"; then
|
||||||
echo "Deleting the failed backup archive..."
|
echo "Deleting the failed backup archive..."
|
||||||
borg delete --stats "::$CURRENT_DATE-additional-host-mounts"
|
borg "$BORG_LOG_LEVEL_FLAG" delete --stats "::$CURRENT_DATE-additional-host-mounts"
|
||||||
echo "Backup of additional host-mounts failed!"
|
echo "Backup of additional host-mounts failed!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Pruning additional host mounts..."
|
echo "Pruning additional host mounts..."
|
||||||
if ! borg prune --stats --glob-archives '*_*-additional-host-mounts' "${BORG_PRUNE_OPTS[@]}"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" prune --stats --glob-archives '*_*-additional-host-mounts' "${BORG_PRUNE_OPTS[@]}"; then
|
||||||
echo "Failed to prune additional host-mount archives!"
|
echo "Failed to prune additional host-mount archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Compacting additional host mounts..."
|
echo "Compacting additional host mounts..."
|
||||||
if ! borg compact; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" compact; then
|
||||||
echo "Failed to compact additional host-mount archives!"
|
echo "Failed to compact additional host-mount archives!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -385,7 +389,7 @@ if [ "$BORG_MODE" = restore ]; then
|
|||||||
|
|
||||||
if [ -z "$BORG_REMOTE_REPO" ]; then
|
if [ -z "$BORG_REMOTE_REPO" ]; then
|
||||||
mkdir -p /tmp/borg
|
mkdir -p /tmp/borg
|
||||||
if ! borg mount "::$SELECTED_ARCHIVE" /tmp/borg; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" mount "::$SELECTED_ARCHIVE" /tmp/borg; then
|
||||||
echo "Could not mount the backup!"
|
echo "Could not mount the backup!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -432,7 +436,7 @@ if [ "$BORG_MODE" = restore ]; then
|
|||||||
#
|
#
|
||||||
# Older backups may still contain files we've since excluded, so we have to exclude on extract as well.
|
# Older backups may still contain files we've since excluded, so we have to exclude on extract as well.
|
||||||
cd / # borg extract has no destination arg and extracts to CWD
|
cd / # borg extract has no destination arg and extracts to CWD
|
||||||
if ! borg extract "::$SELECTED_ARCHIVE" --progress --exclude-from /borg_excludes "${ADDITIONAL_BORG_EXCLUDES[@]}" --pattern '+nextcloud_aio_volumes/**'
|
if ! borg "$BORG_LOG_LEVEL_FLAG" extract "::$SELECTED_ARCHIVE" --progress --exclude-from /borg_excludes "${ADDITIONAL_BORG_EXCLUDES[@]}" --pattern '+nextcloud_aio_volumes/**'
|
||||||
then
|
then
|
||||||
RESTORE_FAILED=1
|
RESTORE_FAILED=1
|
||||||
echo "Failed to extract backup archive."
|
echo "Failed to extract backup archive."
|
||||||
@@ -464,7 +468,7 @@ if [ "$BORG_MODE" = restore ]; then
|
|||||||
\) \
|
\) \
|
||||||
| LC_ALL=C sort \
|
| LC_ALL=C sort \
|
||||||
| LC_ALL=C comm -23 - \
|
| LC_ALL=C comm -23 - \
|
||||||
<(borg list "::$SELECTED_ARCHIVE" --short --exclude-from /borg_excludes --pattern '+nextcloud_aio_volumes/**' | LC_ALL=C sort) \
|
<(borg "$BORG_LOG_LEVEL_FLAG" list "::$SELECTED_ARCHIVE" --short --exclude-from /borg_excludes --pattern '+nextcloud_aio_volumes/**' | LC_ALL=C sort) \
|
||||||
> /tmp/local_files_not_in_backup
|
> /tmp/local_files_not_in_backup
|
||||||
then
|
then
|
||||||
RESTORE_FAILED=1
|
RESTORE_FAILED=1
|
||||||
@@ -552,7 +556,7 @@ if [ "$BORG_MODE" = check ]; then
|
|||||||
echo "Checking the backup integrity..."
|
echo "Checking the backup integrity..."
|
||||||
|
|
||||||
# Perform the check
|
# Perform the check
|
||||||
if ! borg check -v --verify-data; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" check -v --verify-data; then
|
||||||
echo "Some errors were found while checking the backup integrity!"
|
echo "Some errors were found while checking the backup integrity!"
|
||||||
echo "Check the AIO interface for advice on how to proceed now!"
|
echo "Check the AIO interface for advice on how to proceed now!"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -570,7 +574,7 @@ if [ "$BORG_MODE" = "check-repair" ]; then
|
|||||||
echo "Checking the backup integrity and repairing it..."
|
echo "Checking the backup integrity and repairing it..."
|
||||||
|
|
||||||
# Perform the check-repair
|
# Perform the check-repair
|
||||||
if ! echo YES | borg check -v --repair; then
|
if ! echo YES | borg "$BORG_LOG_LEVEL_FLAG" check -v --repair; then
|
||||||
echo "Some errors were found while checking and repairing the backup integrity!"
|
echo "Some errors were found while checking and repairing the backup integrity!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -584,7 +588,7 @@ fi
|
|||||||
# Do the backup test
|
# Do the backup test
|
||||||
if [ "$BORG_MODE" = test ]; then
|
if [ "$BORG_MODE" = test ]; then
|
||||||
if [ -n "$BORG_REMOTE_REPO" ]; then
|
if [ -n "$BORG_REMOTE_REPO" ]; then
|
||||||
if ! borg info > /dev/null; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" info > /dev/null; then
|
||||||
echo "Borg could not get info from the remote repo."
|
echo "Borg could not get info from the remote repo."
|
||||||
echo "See the above borg info output for details."
|
echo "See the above borg info output for details."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -605,12 +609,12 @@ if [ "$BORG_MODE" = test ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! borg list >/dev/null; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" list >/dev/null; then
|
||||||
echo "The entered path seems to be valid but could not open the backup archive."
|
echo "The entered path seems to be valid but could not open the backup archive."
|
||||||
echo "Most likely the entered password was wrong so please adjust it accordingly!"
|
echo "Most likely the entered password was wrong so please adjust it accordingly!"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
if ! borg list | grep "nextcloud-aio"; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" list | grep "nextcloud-aio"; then
|
||||||
echo "The backup archive does not contain a valid Nextcloud AIO backup."
|
echo "The backup archive does not contain a valid Nextcloud AIO backup."
|
||||||
echo "Most likely was the archive not created via Nextcloud AIO."
|
echo "Most likely was the archive not created via Nextcloud AIO."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -623,7 +627,7 @@ fi
|
|||||||
|
|
||||||
if [ "$BORG_MODE" = list ]; then
|
if [ "$BORG_MODE" = list ]; then
|
||||||
echo "Updating backup list..."
|
echo "Updating backup list..."
|
||||||
if ! borg info > /dev/null; then
|
if ! borg "$BORG_LOG_LEVEL_FLAG" info > /dev/null; then
|
||||||
echo "Could not update the backup list."
|
echo "Could not update the backup list."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = "warn" ]; then
|
||||||
|
BORG_LOG_LEVEL_FLAG="--warning"
|
||||||
|
else
|
||||||
|
BORG_LOG_LEVEL_FLAG="--$AIO_LOG_LEVEL"
|
||||||
|
fi
|
||||||
|
export BORG_LOG_LEVEL_FLAG
|
||||||
|
|
||||||
# Variables
|
# Variables
|
||||||
export MOUNT_DIR="/mnt/borgbackup"
|
export MOUNT_DIR="/mnt/borgbackup"
|
||||||
export BORG_BACKUP_DIRECTORY="$MOUNT_DIR/borg" # necessary even when remote to store the aio-lockfile
|
export BORG_BACKUP_DIRECTORY="$MOUNT_DIR/borg" # necessary even when remote to store the aio-lockfile
|
||||||
@@ -48,7 +59,7 @@ fi
|
|||||||
rm -f "/nextcloud_aio_volumes/nextcloud_aio_database_dump/backup-is-running"
|
rm -f "/nextcloud_aio_volumes/nextcloud_aio_database_dump/backup-is-running"
|
||||||
|
|
||||||
# Get a list of all available borg archives
|
# Get a list of all available borg archives
|
||||||
if borg list &>/dev/null; then
|
if borg "$BORG_LOG_LEVEL_FLAG" list &>/dev/null; then
|
||||||
borg list | grep "nextcloud-aio" | awk -F " " '{print $1","$3,$4}' > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
|
borg list | grep "nextcloud-aio" | awk -F " " '{print $1","$3,$4}' > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
|
||||||
else
|
else
|
||||||
echo "" > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
|
echo "" > "/nextcloud_aio_volumes/nextcloud_aio_mastercontainer/data/backup_archives.list"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
@@ -13,6 +13,15 @@ RUN set -ex; \
|
|||||||
sed -i "s|#\?PCREMaxFileSize.*|PCREMaxFileSize 2000M|g" /etc/clamav/clamd.conf; \
|
sed -i "s|#\?PCREMaxFileSize.*|PCREMaxFileSize 2000M|g" /etc/clamav/clamd.conf; \
|
||||||
# StreamMaxLength must be synced with av_stream_max_length inside the Nextcloud files_antivirus plugin
|
# StreamMaxLength must be synced with av_stream_max_length inside the Nextcloud files_antivirus plugin
|
||||||
sed -i "s|#\?StreamMaxLength.*|StreamMaxLength 2000M|g" /etc/clamav/clamd.conf; \
|
sed -i "s|#\?StreamMaxLength.*|StreamMaxLength 2000M|g" /etc/clamav/clamd.conf; \
|
||||||
|
# By default clamd keeps the old signature database in RAM while loading the new one,
|
||||||
|
# briefly doubling memory usage (~1 GB extra) during each freshclam update cycle.
|
||||||
|
# Setting ConcurrentDatabaseReload to "no" makes clamd unload the old database first,
|
||||||
|
# eliminating that transient peak and significantly reducing maximum RAM consumption.
|
||||||
|
sed -i "s|#\?ConcurrentDatabaseReload.*|ConcurrentDatabaseReload no|g" /etc/clamav/clamd.conf; \
|
||||||
|
# The default thread pool is 10-12 threads, each reserving its own stack and scan buffers.
|
||||||
|
# The Nextcloud antivirus plugin sends one file at a time, so 2 threads are sufficient
|
||||||
|
# and avoids the idle per-thread memory overhead of the larger default pool.
|
||||||
|
sed -i "s|#\?MaxThreads.*|MaxThreads 2|g" /etc/clamav/clamd.conf; \
|
||||||
sed -i "s|#\?TCPSocket|TCPSocket|g" /etc/clamav/clamd.conf; \
|
sed -i "s|#\?TCPSocket|TCPSocket|g" /etc/clamav/clamd.conf; \
|
||||||
sed -i "s|^LocalSocket .*|LocalSocket /tmp/clamd.sock|g" /etc/clamav/clamd.conf; \
|
sed -i "s|^LocalSocket .*|LocalSocket /tmp/clamd.sock|g" /etc/clamav/clamd.conf; \
|
||||||
sed -i "s|Example| |g" /etc/clamav/clamav-milter.conf; \
|
sed -i "s|Example| |g" /etc/clamav/clamav-milter.conf; \
|
||||||
@@ -34,5 +43,10 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="ClamAV for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="ClamAV antivirus scanner for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$(echo "PING" | nc 127.0.0.1 3310)" != "PONG" ]; then
|
if [ "$(echo "PING" | nc 127.0.0.1 3310)" != "PONG" ]; then
|
||||||
echo "ERROR: Unable to contact server"
|
echo "ERROR: Unable to contact server"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Print out clamav version for compliance reasons
|
# Print out clamav version for compliance reasons
|
||||||
clamscan --version
|
clamscan --version
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
nodaemon=true
|
|
||||||
logfile=/var/log/supervisord/supervisord.log
|
logfile=/var/log/supervisord/supervisord.log
|
||||||
pidfile=/var/run/supervisord/supervisord.pid
|
pidfile=/var/run/supervisord/supervisord.pid
|
||||||
childlogdir=/var/log/supervisord/
|
childlogdir=/var/log/supervisord/
|
||||||
logfile_maxbytes=50MB
|
logfile_maxbytes=50MB
|
||||||
logfile_backups=10
|
logfile_backups=10
|
||||||
loglevel=error
|
loglevel=%(ENV_AIO_LOG_LEVEL)s
|
||||||
|
|
||||||
[program:freshclam]
|
[program:freshclam]
|
||||||
stdout_logfile=/dev/stdout
|
stdout_logfile=/dev/stdout
|
||||||
|
|||||||
@@ -13,4 +13,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Collabora Online for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Collabora Online document editor from upstream for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ FROM collabora/code:25.04.9.4.1
|
|||||||
USER root
|
USER root
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
USER 1001
|
USER 1001
|
||||||
@@ -12,4 +13,11 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Collabora for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Collabora CODE document editor for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|
||||||
|
ENTRYPOINT ["/start.sh"]
|
||||||
|
|||||||
19
Containers/collabora/start.sh
Normal file
19
Containers/collabora/start.sh
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = "warn" ]; then
|
||||||
|
COLLABORA_LOG_LEVEL="warning"
|
||||||
|
elif [ "$AIO_LOG_LEVEL" = "info" ]; then
|
||||||
|
COLLABORA_LOG_LEVEL="notice"
|
||||||
|
else
|
||||||
|
COLLABORA_LOG_LEVEL="$AIO_LOG_LEVEL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Replace the hardcoded log level in extra_params with the translated one
|
||||||
|
extra_params+=" --o:logging.level=$COLLABORA_LOG_LEVEL --o:logging.level_startup=$COLLABORA_LOG_LEVEL"
|
||||||
|
export extra_params
|
||||||
|
|
||||||
|
exec /start-collabora-online.sh "$@"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM haproxy:3.3.6-alpine
|
FROM haproxy:3.3.10-alpine
|
||||||
|
|
||||||
# hadolint ignore=DL3002
|
# hadolint ignore=DL3002
|
||||||
USER root
|
USER root
|
||||||
@@ -20,4 +20,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Docker Socket Proxy for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="HAProxy-based Docker socket proxy for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z "$NEXTCLOUD_HOST" 9001 || exit 0
|
nc -z "$NEXTCLOUD_HOST" 9001 || exit 0
|
||||||
nc -z 127.0.0.1 2375 || exit 1
|
nc -z 127.0.0.1 2375 || exit 1
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Only start container if nextcloud is accessible
|
# Only start container if nextcloud is accessible
|
||||||
while ! nc -z "$NEXTCLOUD_HOST" 9001; do
|
while ! nc -z "$NEXTCLOUD_HOST" 9001; do
|
||||||
echo "Waiting for Nextcloud to start..."
|
echo "Waiting for Nextcloud to start..."
|
||||||
@@ -18,6 +22,8 @@ else
|
|||||||
HAPROXYFILE="$(sed "s# || { src NC_IPV6_PLACEHOLDER }##g" /tmp/haproxy.cfg)"
|
HAPROXYFILE="$(sed "s# || { src NC_IPV6_PLACEHOLDER }##g" /tmp/haproxy.cfg)"
|
||||||
fi
|
fi
|
||||||
echo "$HAPROXYFILE" > /tmp/haproxy.cfg
|
echo "$HAPROXYFILE" > /tmp/haproxy.cfg
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
|
||||||
haproxy -f /tmp/haproxy.cfg -db
|
haproxy -f /tmp/haproxy.cfg -db
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
apk add --no-cache bash lighttpd netcat-openbsd; \
|
apk add --no-cache bash lighttpd netcat-openbsd; \
|
||||||
@@ -19,4 +19,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Domain Check for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Domain validation service for Nextcloud All-in-One setup" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$INSTANCE_ID" ]; then
|
if [ -z "$INSTANCE_ID" ]; then
|
||||||
echo "You need to provide an instance id."
|
echo "You need to provide an instance id."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -14,6 +18,20 @@ fi
|
|||||||
CONF_FILE="$(sed "s|ipv6-placeholder|\[::\]:$APACHE_PORT|" /lighttpd.conf)"
|
CONF_FILE="$(sed "s|ipv6-placeholder|\[::\]:$APACHE_PORT|" /lighttpd.conf)"
|
||||||
echo "$CONF_FILE" > /etc/lighttpd/lighttpd.conf
|
echo "$CONF_FILE" > /etc/lighttpd/lighttpd.conf
|
||||||
|
|
||||||
|
# shellcheck disable=SC2235
|
||||||
|
if ([ "$AIO_LOG_LEVEL" = 'debug' ] || [ "$AIO_LOG_LEVEL" = 'info' ]) && ! grep -q debug.log-request-handling /etc/lighttpd/lighttpd.conf; then
|
||||||
|
cat << CONF_FILE >> /etc/lighttpd/lighttpd.conf
|
||||||
|
debug.log-request-handling = "enable"
|
||||||
|
CONF_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ] && ! grep -q debug.log-request-header /etc/lighttpd/lighttpd.conf; then
|
||||||
|
cat << CONF_FILE >> /etc/lighttpd/lighttpd.conf
|
||||||
|
debug.log-request-header = "enable"
|
||||||
|
debug.log-response-header = "enable"
|
||||||
|
CONF_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
# Check config file
|
# Check config file
|
||||||
lighttpd -tt -f /etc/lighttpd/lighttpd.conf
|
lighttpd -tt -f /etc/lighttpd/lighttpd.conf
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,19 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# Probably from here https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/Dockerfile
|
# Probably from here https://github.com/elastic/dockerfiles/blob/9.3/elasticsearch/Dockerfile
|
||||||
FROM elasticsearch:8.19.13
|
FROM elasticsearch:9.4.1
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
# hadolint ignore=DL3041
|
||||||
|
|
||||||
# hadolint ignore=DL3008
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
\
|
\
|
||||||
apt-get update; \
|
microdnf update -y; \
|
||||||
apt-get upgrade -y; \
|
microdnf install -y --setopt=tsflags=nodocs \
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
tzdata \
|
tzdata \
|
||||||
; \
|
; \
|
||||||
rm -rf /var/lib/apt/lists/*;
|
microdnf clean all;
|
||||||
|
|
||||||
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
USER 1000:0
|
USER 1000:0
|
||||||
@@ -23,5 +21,12 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Full Text Search for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Elasticsearch-based full-text search for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
ENV ES_JAVA_OPTS="-Xms512M -Xmx512M"
|
ENV ES_JAVA_OPTS="-Xms512M -Xmx512M"
|
||||||
|
|
||||||
|
ENTRYPOINT ["/start.sh"]
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
nc -z 127.0.0.1 9200 || exit 1
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -fs "http://127.0.0.1:9200/_cluster/health?filter_path=status" | grep -qE '"status":"(green|yellow)"' || exit 1
|
||||||
|
|||||||
9
Containers/fulltextsearch/start.sh
Normal file
9
Containers/fulltextsearch/start.sh
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
ELASTIC_LOG_LEVEL="$(echo "$AIO_LOG_LEVEL" | tr '[:lower:]' '[:upper:]')"
|
||||||
|
|
||||||
|
exec env "logger.level=$ELASTIC_LOG_LEVEL" /usr/local/bin/docker-entrypoint.sh "$@"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM golang:1.26.1-alpine3.23 AS go
|
FROM golang:1.26.3-alpine3.23 AS go
|
||||||
|
|
||||||
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
|
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ RUN set -ex; \
|
|||||||
build-base; \
|
build-base; \
|
||||||
go install github.com/h2non/imaginary@"$IMAGINARY_HASH";
|
go install github.com/h2non/imaginary@"$IMAGINARY_HASH";
|
||||||
|
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
apk add --no-cache \
|
apk add --no-cache \
|
||||||
@@ -33,7 +33,8 @@ COPY --from=go /go/bin/imaginary /usr/local/bin/imaginary
|
|||||||
COPY --chmod=775 start.sh /start.sh
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
ENV PORT=9000
|
ENV PORT=9000 \
|
||||||
|
AIO_LOG_LEVEL=warn
|
||||||
|
|
||||||
USER 65534
|
USER 65534
|
||||||
|
|
||||||
@@ -44,4 +45,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Imaginary for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="High-performance image processing service for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z 127.0.0.1 "$PORT" || exit 1
|
nc -z 127.0.0.1 "$PORT" || exit 1
|
||||||
|
|||||||
@@ -1,8 +1,26 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
echo "Imaginary has started"
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
if [ -z "$IMAGINARY_SECRET" ]; then
|
set -x
|
||||||
imaginary -return-size -max-allowed-resolution 222.2 "$@"
|
|
||||||
else
|
|
||||||
imaginary -return-size -max-allowed-resolution 222.2 -key "$IMAGINARY_SECRET" "$@"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
GOLANG_LOG="$(case "$AIO_LOG_LEVEL" in
|
||||||
|
debug) printf 'info' ;;
|
||||||
|
info) printf 'info' ;;
|
||||||
|
warn) printf 'warning' ;;
|
||||||
|
error) printf 'error' ;;
|
||||||
|
esac)"
|
||||||
|
export GOLANG_LOG
|
||||||
|
if [ "$AIO_LOG_LEVEL" = "debug" ]; then
|
||||||
|
export DEBUG='*'
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Imaginary has started"
|
||||||
|
|
||||||
|
IMAGINARY_ARGS=(-return-size -max-allowed-resolution 222.2)
|
||||||
|
|
||||||
|
if [ -n "$IMAGINARY_SECRET" ]; then
|
||||||
|
IMAGINARY_ARGS+=(-key "$IMAGINARY_SECRET")
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec imaginary "${IMAGINARY_ARGS[@]}" "$@"
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# Docker CLI is a requirement
|
# Docker CLI is a requirement
|
||||||
FROM docker:29.3.1-cli AS docker
|
FROM docker:29.4.3-cli AS docker
|
||||||
|
|
||||||
ARG CADDY_REMOTE_HOST_HASH=b21775afa730ffb52a24ddff310c8a6d1fd37276
|
ARG CADDY_REMOTE_HOST_HASH=e80a9931765a8dbcbb47db415863387f0df0e1b3
|
||||||
|
|
||||||
# Caddy is a requirement
|
# Caddy is a requirement
|
||||||
FROM caddy:2.11.2-builder-alpine AS caddy
|
FROM caddy:2.11.3-builder-alpine AS caddy
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
xcaddy build --with github.com/muety/caddy-remote-host@"$CADDY_REMOTE_HOST_HASH"; \
|
xcaddy build --with github.com/muety/caddy-remote-host@"$CADDY_REMOTE_HOST_HASH"; \
|
||||||
/usr/bin/caddy list-modules
|
/usr/bin/caddy list-modules
|
||||||
|
|
||||||
# From https://github.com/docker-library/php/blob/master/8.5/alpine3.23/fpm/Dockerfile
|
# From https://github.com/docker-library/php/blob/master/8.5/alpine3.23/fpm/Dockerfile
|
||||||
FROM php:8.5.4-fpm-alpine3.23
|
FROM php:8.5.6-fpm-alpine3.23
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
@@ -53,6 +53,16 @@ RUN set -ex; \
|
|||||||
build-base; \
|
build-base; \
|
||||||
pecl install APCu-5.1.28; \
|
pecl install APCu-5.1.28; \
|
||||||
docker-php-ext-enable apcu; \
|
docker-php-ext-enable apcu; \
|
||||||
|
{ \
|
||||||
|
echo 'apc.shm_size=32M'; \
|
||||||
|
} >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
|
||||||
|
{ \
|
||||||
|
echo 'opcache.enable=1'; \
|
||||||
|
echo 'opcache.memory_consumption=32'; \
|
||||||
|
echo 'opcache.interned_strings_buffer=8'; \
|
||||||
|
echo 'opcache.max_accelerated_files=4000'; \
|
||||||
|
echo 'opcache.validate_timestamps=0'; \
|
||||||
|
} > /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini; \
|
||||||
rm -r /tmp/pear; \
|
rm -r /tmp/pear; \
|
||||||
runDeps="$( \
|
runDeps="$( \
|
||||||
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
|
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
|
||||||
@@ -90,7 +100,12 @@ RUN set -ex; \
|
|||||||
mkdir /var/run/supervisord;
|
mkdir /var/run/supervisord;
|
||||||
|
|
||||||
# hadolint ignore=DL3048
|
# hadolint ignore=DL3048
|
||||||
LABEL org.label-schema.vendor="Nextcloud" \
|
LABEL org.opencontainers.image.title="Nextcloud All-in-One Mastercontainer" \
|
||||||
|
org.opencontainers.image.description="Easy deployment and maintenance of a Nextcloud server with all dependencies and optional services" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md" \
|
||||||
wud.watch="false" \
|
wud.watch="false" \
|
||||||
com.docker.compose.project="nextcloud-aio"
|
com.docker.compose.project="nextcloud-aio"
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ http://:80 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
https://:8443 {
|
https://:8443 {
|
||||||
|
import headers.Caddyfile
|
||||||
|
header Strict-Transport-Security max-age=31536000;
|
||||||
|
|
||||||
@denied {
|
@denied {
|
||||||
path /api/auth/login /api/auth/getlogin
|
path /api/auth/login /api/auth/getlogin
|
||||||
remote_host nextcloud-aio-nextcloud
|
remote_host nextcloud-aio-nextcloud
|
||||||
@@ -46,6 +49,7 @@ https://:8443 {
|
|||||||
tls {
|
tls {
|
||||||
on_demand
|
on_demand
|
||||||
issuer acme {
|
issuer acme {
|
||||||
|
profile shortlived
|
||||||
disable_tlsalpn_challenge
|
disable_tlsalpn_challenge
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
restart_process() {
|
restart_process() {
|
||||||
echo "Restarting cron.sh because daily backup time was set, changed or unset."
|
echo "Restarting cron.sh because daily backup time was set, changed or unset."
|
||||||
pkill cron.sh
|
pkill cron.sh
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
if [ -f "/mnt/docker-aio-config/data/daily_backup_time" ]; then
|
if [ -f "/mnt/docker-aio-config/data/daily_backup_time" ]; then
|
||||||
set -x
|
set -x
|
||||||
@@ -17,7 +21,9 @@ while true; do
|
|||||||
else
|
else
|
||||||
export SEND_SUCCESS_NOTIFICATIONS=0
|
export SEND_SUCCESS_NOTIFICATIONS=0
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
if [ -f "/mnt/docker-aio-config/data/daily_backup_running" ]; then
|
if [ -f "/mnt/docker-aio-config/data/daily_backup_running" ]; then
|
||||||
export LOCK_FILE_PRESENT=1
|
export LOCK_FILE_PRESENT=1
|
||||||
else
|
else
|
||||||
@@ -59,8 +65,9 @@ while true; do
|
|||||||
sudo -E -u www-data docker container remove nextcloud-aio-domaincheck
|
sudo -E -u www-data docker container remove nextcloud-aio-domaincheck
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove dangling images
|
# Remove dangling images (support both deprecated label-schema and OCI standard vendor label)
|
||||||
sudo -E -u www-data docker image prune --filter "label=org.label-schema.vendor=Nextcloud" --force
|
sudo -E -u www-data docker image prune --filter "label=org.label-schema.vendor=Nextcloud" --force
|
||||||
|
sudo -E -u www-data docker image prune --filter "label=org.opencontainers.image.vendor=Nextcloud" --force
|
||||||
|
|
||||||
# Check for available free space
|
# Check for available free space
|
||||||
sudo -E -u www-data php /var/www/docker-aio/php/src/Cron/CheckFreeDiskSpace.php
|
sudo -E -u www-data php /var/www/docker-aio/php/src/Cron/CheckFreeDiskSpace.php
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Daily backup script has started"
|
echo "Daily backup script has started"
|
||||||
|
|
||||||
# Check if initial configuration has been done, otherwise this script should do nothing.
|
# Check if initial configuration has been done, otherwise this script should do nothing.
|
||||||
|
|||||||
31
Containers/mastercontainer/headers.Caddyfile
Normal file
31
Containers/mastercontainer/headers.Caddyfile
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
header {
|
||||||
|
# CSP limits which features can be used. By default we allow nothing and only allow required options. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy
|
||||||
|
# default-src 'none'; Allow nothing by default
|
||||||
|
# script-src-elem/style-src-elem 'self'; Only allow loading css/js files from same origin (AIO itself) while blocking all inline css/js
|
||||||
|
# img-src 'self'; Only allow loading images from same origin (from AIO itself)
|
||||||
|
# connect-src 'self'; Allow fetch to only connect same origin (to AIO itself)
|
||||||
|
# frame-src 'self'; Allow AIO to only embed itself "what can be embedded"
|
||||||
|
# base-uri 'none'; This does not fallback to default-src, AIO does not use the html base tag
|
||||||
|
# form-action 'self'; Html forms are only allowed to submit to AIO and not cross origin
|
||||||
|
# frame-ancestors 'self'; Only allow AIO itself to embed it self "who can embed"
|
||||||
|
# upgrade-insecure-requests; Upgrade all http embedings to https
|
||||||
|
# require-trusted-types-for 'script'; trusted-types 'none'; Blocks DOM changes via js
|
||||||
|
Content-Security-Policy "default-src 'none'; script-src-elem 'self'; style-src-elem 'self'; img-src 'self'; connect-src 'self'; frame-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; trusted-types 'none';"
|
||||||
|
X-Content-Type-Options "nosniff" # This forces the browser to use the MIME type of the Content-Type header. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Content-Type-Options
|
||||||
|
X-Frame-Options "SAMEORIGIN" # Only allow AIO itself to embed itself, this is also enforced as part of the CSP frame-ancestors. See https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Headers/X-Frame-Options
|
||||||
|
X-Permitted-Cross-Domain-Policies "none" # We block all cross origin request, including ones from Adobe Acrobat or Microsoft Silverlight and Adobe Flash Player. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Permitted-Cross-Domain-Policies
|
||||||
|
X-DNS-Prefetch-Control "off" # Tells the browser to not pre-fetch the DNS of linked pages. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-DNS-Prefetch-Control
|
||||||
|
Referrer-Policy "no-referrer" # Tells the browser to never sent a Referer header. See https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Headers/Referrer-Policy
|
||||||
|
X-Robots-Tag "noindex, nofollow" # Tells web crawlers to not index this page. See https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Headers/X-Robots-Tag
|
||||||
|
Origin-Agent-Cluster "?1" # Isolates AIO from other same site pages. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Origin-Agent-Cluster
|
||||||
|
Cross-Origin-Opener-Policy "same-origin" # AIO does not use any popup, still we can isolate its BCG if it is opened as a pop up by another page. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Opener-Policy
|
||||||
|
Cross-Origin-Embedder-Policy "require-corp" # Harder rules for cross origin embeds. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Embedder-Policy
|
||||||
|
Cross-Origin-Resource-Policy "same-origin" # Only allow the same origin to load resources. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cross-Origin_Resource_Policy
|
||||||
|
|
||||||
|
# Permissions-Policy disables browser features that AIO does not use. Since there is no "deny all" option, all known features need to be listed explicitly. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Permissions-Policy
|
||||||
|
Permissions-Policy "accelerometer=(), ambient-light-sensor=(), aria-notify=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), captured-surface-control=(), ch-ua-high-entropy-values=(), compute-pressure=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), display-capture=(), encrypted-media=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), local-network=(), local-network-access=(), loopback-network=(), magnetometer=(), microphone=(), midi=(), on-device-speech-recognition=(), otp-credentials=(), payment=(), picture-in-picture=(), private-state-token-issuance=(), private-state-token-redemption=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), summarizer=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()"
|
||||||
|
|
||||||
|
-Server
|
||||||
|
-X-Powered-By
|
||||||
|
-Via
|
||||||
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -f "/mnt/docker-aio-config/data/configuration.json" ]; then
|
if [ -f "/mnt/docker-aio-config/data/configuration.json" ]; then
|
||||||
nc -z 127.0.0.1 80 || exit 1
|
nc -z 127.0.0.1 80 || exit 1
|
||||||
nc -z 127.0.0.1 8080 || exit 1
|
nc -z 127.0.0.1 8080 || exit 1
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
https://:8080 {
|
https://:8080 {
|
||||||
|
import headers.Caddyfile
|
||||||
|
|
||||||
@denied {
|
@denied {
|
||||||
path /api/auth/login /api/auth/getlogin
|
path /api/auth/login /api/auth/getlogin
|
||||||
remote_host nextcloud-aio-nextcloud
|
remote_host nextcloud-aio-nextcloud
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ compare_times() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
compare_times
|
compare_times
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ case "${1}" in
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if running as root user
|
# Check if running as root user
|
||||||
if [ "$EUID" != "0" ]; then
|
if [ "$EUID" != "0" ]; then
|
||||||
print_red "Container does not run as root user. This is not supported."
|
print_red "Container does not run as root user. This is not supported."
|
||||||
@@ -169,7 +173,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
|
||||||
@@ -312,6 +316,42 @@ if [ -n "$AIO_COMMUNITY_CONTAINERS" ]; then
|
|||||||
print_red "You've set AIO_COMMUNITY_CONTAINERS but the option was removed.
|
print_red "You've set AIO_COMMUNITY_CONTAINERS but the option was removed.
|
||||||
The community containers get managed via the AIO interface now."
|
The community containers get managed via the AIO interface now."
|
||||||
fi
|
fi
|
||||||
|
if [ -n "$NEXTCLOUD_ENABLE_DRI_DEVICE" ]; then
|
||||||
|
print_red "The environmental variable NEXTCLOUD_ENABLE_DRI_DEVICE is deprecated. Please mount the /dev/dri device into the mastercontainer instead and remove NEXTCLOUD_ENABLE_DRI_DEVICE. It will then be set automatically."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Automatically enable the /dev/dri device if it is mounted into the mastercontainer
|
||||||
|
if [ -d "/dev/dri" ]; then
|
||||||
|
export NEXTCLOUD_ENABLE_DRI_DEVICE="true"
|
||||||
|
if [ -e "/dev/dri/renderD128" ]; then
|
||||||
|
NEXTCLOUD_DRI_GID="$(stat -c '%g' /dev/dri/renderD128)"
|
||||||
|
export NEXTCLOUD_DRI_GID
|
||||||
|
else
|
||||||
|
export NEXTCLOUD_DRI_GID=""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ -z "$NEXTCLOUD_ENABLE_DRI_DEVICE" ]; then
|
||||||
|
# Force the unset of the env if it was not externally overwritten already
|
||||||
|
export NEXTCLOUD_ENABLE_DRI_DEVICE="false"
|
||||||
|
fi
|
||||||
|
export NEXTCLOUD_DRI_GID=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Log level logics
|
||||||
|
if [ -n "$AIO_LOG_LEVEL" ] && ! echo "$AIO_LOG_LEVEL" | grep -q "^debug$\|^info$\|^warn$\|^error$"; then
|
||||||
|
print_red "AIO_LOG_LEVEL must be one of 'debug', 'info', 'warn' or 'error'.
|
||||||
|
It is set to '$AIO_LOG_LEVEL'".
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ -z "$AIO_LOG_LEVEL" ]; then
|
||||||
|
export AIO_LOG_LEVEL="warn"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
export SUPERVISORD_STDOUT=/dev/stdout
|
||||||
|
else
|
||||||
|
export SUPERVISORD_STDOUT=NONE
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if ghcr.io is reachable
|
# Check if ghcr.io is reachable
|
||||||
# Solves issues like https://github.com/nextcloud/all-in-one/discussions/5268
|
# Solves issues like https://github.com/nextcloud/all-in-one/discussions/5268
|
||||||
@@ -403,5 +443,11 @@ caddy fmt --overwrite /internal.Caddyfile
|
|||||||
# Fix caddy log
|
# Fix caddy log
|
||||||
chmod 777 /root
|
chmod 777 /root
|
||||||
|
|
||||||
|
# Create Twig template cache directory (path must match TWIG_CACHE_PATH in php/public/index.php)
|
||||||
|
mkdir -p /tmp/twig-cache
|
||||||
|
rm -rf /tmp/twig-cache/*
|
||||||
|
chown www-data:www-data /tmp/twig-cache
|
||||||
|
chmod 770 /tmp/twig-cache
|
||||||
|
|
||||||
# Start supervisord
|
# Start supervisord
|
||||||
exec /usr/bin/supervisord -c /supervisord.conf
|
exec /usr/bin/supervisord -c /supervisord.conf
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ pidfile=/var/run/supervisord/supervisord.pid
|
|||||||
childlogdir=/var/log/supervisord/
|
childlogdir=/var/log/supervisord/
|
||||||
logfile_maxbytes=50MB
|
logfile_maxbytes=50MB
|
||||||
logfile_backups=10
|
logfile_backups=10
|
||||||
loglevel=error
|
loglevel=%(ENV_AIO_LOG_LEVEL)s
|
||||||
user=root
|
user=root
|
||||||
|
|
||||||
[program:php-fpm]
|
[program:php-fpm]
|
||||||
# Stdout logging is disabled as otherwise the logs are spammed
|
# Stdout logging is disabled as otherwise the logs are spammed
|
||||||
stdout_logfile=NONE
|
stdout_logfile=%(ENV_SUPERVISORD_STDOUT)s
|
||||||
stderr_logfile=/dev/stderr
|
stderr_logfile=/dev/stderr
|
||||||
stderr_logfile_maxbytes=0
|
stderr_logfile_maxbytes=0
|
||||||
command=php-fpm
|
command=php-fpm
|
||||||
@@ -58,7 +58,7 @@ user=root
|
|||||||
|
|
||||||
[program:domain-validator]
|
[program:domain-validator]
|
||||||
# Logging is disabled as otherwise all attempts will be logged which spams the logs
|
# Logging is disabled as otherwise all attempts will be logged which spams the logs
|
||||||
stdout_logfile=NONE
|
stdout_logfile=%(ENV_SUPERVISORD_STDOUT)s
|
||||||
stderr_logfile=NONE
|
stderr_logfile=%(ENV_SUPERVISORD_STDOUT)s
|
||||||
command=php -S 127.0.0.1:9876 /var/www/docker-aio/php/domain-validator.php
|
command=php -S 127.0.0.1:9876 /var/www/docker-aio/php/domain-validator.php
|
||||||
user=www-data
|
user=www-data
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM php:8.3.30-fpm-alpine3.23
|
FROM php:8.3.31-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.8
|
ENV NEXTCLOUD_VERSION=33.0.3
|
||||||
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!
|
||||||
@@ -114,18 +114,18 @@ RUN set -ex; \
|
|||||||
# set recommended PHP.ini settings
|
# set recommended PHP.ini settings
|
||||||
# see https://docs.nextcloud.com/server/stable/admin_manual/installation/server_tuning.html#enable-php-opcache and below
|
# see https://docs.nextcloud.com/server/stable/admin_manual/installation/server_tuning.html#enable-php-opcache and below
|
||||||
{ \
|
{ \
|
||||||
echo 'opcache.max_accelerated_files=10000'; \
|
echo 'opcache.max_accelerated_files=20000'; \
|
||||||
echo 'opcache.memory_consumption=256'; \
|
echo 'opcache.memory_consumption=256'; \
|
||||||
echo 'opcache.interned_strings_buffer=64'; \
|
echo 'opcache.interned_strings_buffer=64'; \
|
||||||
echo 'opcache.save_comments=1'; \
|
echo 'opcache.save_comments=1'; \
|
||||||
echo 'opcache.revalidate_freq=60'; \
|
echo 'opcache.revalidate_freq=60'; \
|
||||||
echo 'opcache.jit=1255'; \
|
echo 'opcache.jit=1255'; \
|
||||||
echo 'opcache.jit_buffer_size=8M'; \
|
echo 'opcache.jit_buffer_size=128M'; \
|
||||||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini; \
|
} > /usr/local/etc/php/conf.d/opcache-recommended.ini; \
|
||||||
\
|
\
|
||||||
{ \
|
{ \
|
||||||
echo 'apc.enable_cli=1'; \
|
echo 'apc.enable_cli=1'; \
|
||||||
echo 'apc.shm_size=64M'; \
|
echo 'apc.shm_size=128M'; \
|
||||||
} >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
|
} >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
|
||||||
\
|
\
|
||||||
{ \
|
{ \
|
||||||
@@ -135,14 +135,20 @@ RUN set -ex; \
|
|||||||
echo 'max_execution_time=${PHP_MAX_TIME}'; \
|
echo 'max_execution_time=${PHP_MAX_TIME}'; \
|
||||||
echo 'max_input_time=-1'; \
|
echo 'max_input_time=-1'; \
|
||||||
echo 'default_socket_timeout=${PHP_MAX_TIME}'; \
|
echo 'default_socket_timeout=${PHP_MAX_TIME}'; \
|
||||||
|
echo 'output_buffering=0'; \
|
||||||
|
echo 'realpath_cache_size=8M'; \
|
||||||
|
echo 'realpath_cache_ttl=600'; \
|
||||||
} > /usr/local/etc/php/conf.d/nextcloud.ini; \
|
} > /usr/local/etc/php/conf.d/nextcloud.ini; \
|
||||||
\
|
\
|
||||||
{ \
|
{ \
|
||||||
echo 'session.save_handler = redis'; \
|
echo 'session.save_handler = redis'; \
|
||||||
echo 'session.save_path = "tcp://${REDIS_HOST}:${REDIS_PORT}?database=${REDIS_DB_INDEX}${REDIS_USER_AUTH}&auth[]=${REDIS_HOST_PASSWORD}"'; \
|
echo 'session.save_path = "tcp://${REDIS_HOST}:${REDIS_PORT}?database=${REDIS_DB_INDEX}${REDIS_USER_AUTH}&auth[]=${REDIS_HOST_PASSWORD}&timeout=3.0&read_timeout=10.0"'; \
|
||||||
echo 'redis.session.locking_enabled = 1'; \
|
echo 'redis.session.locking_enabled = 1'; \
|
||||||
echo 'redis.session.lock_retries = -1'; \
|
echo 'redis.session.lock_retries = -1'; \
|
||||||
echo 'redis.session.lock_wait_time = 10000'; \
|
echo '; 100ms in microseconds - prevents timeout on long requests such as large file uploads'; \
|
||||||
|
echo 'redis.session.lock_wait_time = 100000'; \
|
||||||
|
echo '; prevents stale locks from crashed workers (seconds)'; \
|
||||||
|
echo 'redis.session.lock_expire = 60'; \
|
||||||
echo 'session.gc_maxlifetime = 86400'; \
|
echo 'session.gc_maxlifetime = 86400'; \
|
||||||
} > /usr/local/etc/php/conf.d/redis-session.ini; \
|
} > /usr/local/etc/php/conf.d/redis-session.ini; \
|
||||||
\
|
\
|
||||||
@@ -244,6 +250,21 @@ RUN set -ex; \
|
|||||||
# We don't actually expect so many children but don't want to limit it artificially because people will report issues otherwise.
|
# We don't actually expect so many children but don't want to limit it artificially because people will report issues otherwise.
|
||||||
# Also children will usually be terminated again after the process is done due to the ondemand setting
|
# Also children will usually be terminated again after the process is done due to the ondemand setting
|
||||||
sed -i 's/^pm.max_children =.*/pm.max_children = 5000/' /usr/local/etc/php-fpm.d/www.conf; \
|
sed -i 's/^pm.max_children =.*/pm.max_children = 5000/' /usr/local/etc/php-fpm.d/www.conf; \
|
||||||
|
# With pm = ondemand, workers are killed after pm.process_idle_timeout seconds
|
||||||
|
# of inactivity. The upstream default is 10 s, which is aggressive: after a
|
||||||
|
# brief quiet period (e.g. desktop-sync clients polling every few seconds), all
|
||||||
|
# workers are reaped and the next request burst must wait for fresh forks. On
|
||||||
|
# a loaded host that spawn latency can push Apache past its FastCGI timeout and
|
||||||
|
# produce a 502. 300 s (5 min) keeps a warm pool through normal sync-client
|
||||||
|
# polling cycles while still reclaiming memory during genuinely idle periods.
|
||||||
|
sed -i 's/^;*pm.process_idle_timeout\s*=.*/pm.process_idle_timeout = 300s/' /usr/local/etc/php-fpm.d/www.conf; \
|
||||||
|
# Set request_terminate_timeout so that PHP-FPM forcibly kills workers that
|
||||||
|
# exceed the wall-clock limit. Without this (default = 0 = disabled) a worker
|
||||||
|
# stuck on a slow DB query, a stalled Redis connection, or a hung syscall is
|
||||||
|
# never reaped. Over time these zombies fill up pm.max_children, leaving no
|
||||||
|
# free slots for legitimate requests and causing Apache to return 502 Bad
|
||||||
|
# Gateway upstream.
|
||||||
|
sed -i "s|^;*request_terminate_timeout = .*|request_terminate_timeout = \${PHP_MAX_TIME}|" /usr/local/etc/php-fpm.d/www.conf; \
|
||||||
sed -i 's|access.log = /proc/self/fd/2|access.log = /proc/self/fd/1|' /usr/local/etc/php-fpm.d/docker.conf; \
|
sed -i 's|access.log = /proc/self/fd/2|access.log = /proc/self/fd/1|' /usr/local/etc/php-fpm.d/docker.conf; \
|
||||||
\
|
\
|
||||||
echo "[ -n \"\$TERM\" ] && [ -f /root.motd ] && cat /root.motd" >> /root/.bashrc; \
|
echo "[ -n \"\$TERM\" ] && [ -f /root.motd ] && cat /root.motd" >> /root/.bashrc; \
|
||||||
@@ -265,4 +286,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Nextcloud for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Nextcloud server with all required PHP extensions for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ $CONFIG = array (
|
|||||||
if (getenv('APPS_ALLOWLIST')) {
|
if (getenv('APPS_ALLOWLIST')) {
|
||||||
$CONFIG['appsallowlist'] = explode(" ", getenv('APPS_ALLOWLIST'));
|
$CONFIG['appsallowlist'] = explode(" ", getenv('APPS_ALLOWLIST'));
|
||||||
}
|
}
|
||||||
if (getenv('NEXTCLOUD_APP_STORE_URL')) {
|
|
||||||
$CONFIG['appstoreurl'] = getenv('NEXTCLOUD_APP_STORE_URL');
|
$appStoreUrl = getenv('NEXTCLOUD_APP_STORE_URL');
|
||||||
|
if ($appStoreUrl) {
|
||||||
|
if ($appStoreUrl === 'no') {
|
||||||
|
$CONFIG['appstoreenabled '] = false;
|
||||||
|
} else {
|
||||||
|
$CONFIG['appstoreurl'] = getenv('NEXTCLOUD_APP_STORE_URL');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ if (getenv('REDIS_MODE') !== 'rediscluster') {
|
|||||||
|
|
||||||
if (getenv('REDIS_HOST')) {
|
if (getenv('REDIS_HOST')) {
|
||||||
$CONFIG['redis']['host'] = (string) getenv('REDIS_HOST');
|
$CONFIG['redis']['host'] = (string) getenv('REDIS_HOST');
|
||||||
|
$CONFIG['redis']['timeout'] = 3.0;
|
||||||
|
$CONFIG['redis']['read_timeout'] = 10.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getenv('REDIS_HOST_PASSWORD')) {
|
if (getenv('REDIS_HOST_PASSWORD')) {
|
||||||
@@ -21,6 +23,10 @@ if (getenv('REDIS_MODE') !== 'rediscluster') {
|
|||||||
$CONFIG['redis']['dbindex'] = (int) getenv('REDIS_DB_INDEX');
|
$CONFIG['redis']['dbindex'] = (int) getenv('REDIS_DB_INDEX');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getenv('REDIS_PREFIX')) {
|
||||||
|
$CONFIG['redis']['memcache_customprefix'] = getenv('REDIS_PREFIX');
|
||||||
|
}
|
||||||
|
|
||||||
if (getenv('REDIS_USER_AUTH')) {
|
if (getenv('REDIS_USER_AUTH')) {
|
||||||
$CONFIG['redis']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
|
$CONFIG['redis']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
|
||||||
}
|
}
|
||||||
@@ -58,6 +64,10 @@ if (getenv('REDIS_MODE') !== 'rediscluster') {
|
|||||||
$CONFIG['redis.cluster']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
|
$CONFIG['redis.cluster']['user'] = str_replace("&auth[]=", "", getenv('REDIS_USER_AUTH'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getenv('REDIS_PREFIX')) {
|
||||||
|
$CONFIG['redis.cluster']['memcache_customprefix'] = getenv('REDIS_PREFIX');
|
||||||
|
}
|
||||||
|
|
||||||
if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_REDIS')) {
|
if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_REDIS')) {
|
||||||
$CONFIG['redis.cluster']['ssl_context']['cafile'] = '/var/www/html/data/certificates/ca-bundle.crt';
|
$CONFIG['redis.cluster']['ssl_context']['cafile'] = '/var/www/html/data/certificates/ca-bundle.crt';
|
||||||
}
|
}
|
||||||
|
|||||||
4
Containers/nextcloud/config/server.config.php
Normal file
4
Containers/nextcloud/config/server.config.php
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
$CONFIG = array (
|
||||||
|
'serverid' => crc32(gethostname()) % 512,
|
||||||
|
);
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
wait_for_cron() {
|
wait_for_cron() {
|
||||||
set -x
|
set -x
|
||||||
while [ -n "$(pgrep -f /var/www/html/cron.php)" ]; do
|
while [ -n "$(pgrep -f /var/www/html/cron.php)" ]; do
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ directory_empty() {
|
|||||||
[ -z "$(ls -A "$1/")" ]
|
[ -z "$(ls -A "$1/")" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
run_upgrade_if_needed_due_to_app_update() {
|
run_upgrade_if_needed_due_to_app_update() {
|
||||||
if php /var/www/html/occ status | grep maintenance | grep -q true; then
|
if php /var/www/html/occ status | grep maintenance | grep -q true; then
|
||||||
php /var/www/html/occ maintenance:mode --off
|
php /var/www/html/occ maintenance:mode --off
|
||||||
@@ -20,6 +24,14 @@ run_upgrade_if_needed_due_to_app_update() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NEXTCLOUD_LOG_LEVEL="$(case "$AIO_LOG_LEVEL" in
|
||||||
|
debug) printf '0' ;;
|
||||||
|
info) printf '1' ;;
|
||||||
|
warn) printf '2' ;;
|
||||||
|
error) printf '3' ;;
|
||||||
|
esac)"
|
||||||
|
export NEXTCLOUD_LOG_LEVEL
|
||||||
|
|
||||||
# Create cert bundle
|
# Create cert bundle
|
||||||
if env | grep -q NEXTCLOUD_TRUSTED_CERTIFICATES_; then
|
if env | grep -q NEXTCLOUD_TRUSTED_CERTIFICATES_; then
|
||||||
|
|
||||||
@@ -75,7 +87,9 @@ if env | grep -q NEXTCLOUD_TRUSTED_CERTIFICATES_; then
|
|||||||
cat "$CERTIFICATE_BUNDLE"
|
cat "$CERTIFICATE_BUNDLE"
|
||||||
|
|
||||||
# Disable debug mode
|
# Disable debug mode
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Adjust DATABASE_TYPE to by Nextcloud supported value
|
# Adjust DATABASE_TYPE to by Nextcloud supported value
|
||||||
@@ -115,6 +129,11 @@ rm -f "$test_file"
|
|||||||
if [ -f /var/www/html/version.php ]; then
|
if [ -f /var/www/html/version.php ]; then
|
||||||
# shellcheck disable=SC2016
|
# shellcheck disable=SC2016
|
||||||
installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
|
installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')"
|
||||||
|
if [ -z "$installed_version" ]; then
|
||||||
|
echo "Could not determine the installed Nextcloud version via php -r. The PHP installation might be broken."
|
||||||
|
echo "Please check the container logs and your PHP installation."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
installed_version="0.0.0.0"
|
installed_version="0.0.0.0"
|
||||||
fi
|
fi
|
||||||
@@ -217,7 +236,9 @@ if ! [ -f "$NEXTCLOUD_DATA_DIR/skip.update" ]; then
|
|||||||
if grep -q appstoreurl /var/www/html/config/config.php; then
|
if grep -q appstoreurl /var/www/html/config/config.php; then
|
||||||
set -x
|
set -x
|
||||||
APPSTORE_URL="$(grep appstoreurl /var/www/html/config/config.php | grep -oP 'https://.*v[0-9]+')"
|
APPSTORE_URL="$(grep appstoreurl /var/www/html/config/config.php | grep -oP 'https://.*v[0-9]+')"
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
# Default appstoreurl parameter in config.php defaults to 'https://apps.nextcloud.com/api/v1' so we check for the apps.json file stored in there
|
# Default appstoreurl parameter in config.php defaults to 'https://apps.nextcloud.com/api/v1' so we check for the apps.json file stored in there
|
||||||
CURL_STATUS="$(curl -LI "$APPSTORE_URL"/apps.json -o /dev/null -w '%{http_code}\n' -s)"
|
CURL_STATUS="$(curl -LI "$APPSTORE_URL"/apps.json -o /dev/null -w '%{http_code}\n' -s)"
|
||||||
@@ -284,7 +305,9 @@ if ! [ -f "$NEXTCLOUD_DATA_DIR/skip.update" ]; then
|
|||||||
"$SOURCE_LOCATION/custom_apps/" \
|
"$SOURCE_LOCATION/custom_apps/" \
|
||||||
/var/www/html/custom_apps/
|
/var/www/html/custom_apps/
|
||||||
done
|
done
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy these from Nextcloud archive if they don't exist yet (i.e. new install)
|
# Copy these from Nextcloud archive if they don't exist yet (i.e. new install)
|
||||||
@@ -437,12 +460,20 @@ EOF
|
|||||||
# Apply log settings
|
# Apply log settings
|
||||||
echo "Applying default settings..."
|
echo "Applying default settings..."
|
||||||
mkdir -p /var/www/html/data
|
mkdir -p /var/www/html/data
|
||||||
php /var/www/html/occ config:system:set loglevel --value="2" --type=integer
|
php /var/www/html/occ config:system:set loglevel --value="$NEXTCLOUD_LOG_LEVEL" --type=integer
|
||||||
php /var/www/html/occ config:system:set log_type --value="file"
|
if [ "$NEXTCLOUD_LOG_TYPE" = "errorlog" ]; then
|
||||||
php /var/www/html/occ config:system:set logfile --value="/var/www/html/data/nextcloud.log"
|
php /var/www/html/occ config:system:set log_type --value="errorlog"
|
||||||
|
php /var/www/html/occ config:system:set log_type_audit --value="errorlog"
|
||||||
|
php /var/www/html/occ app:disable logreader
|
||||||
|
else
|
||||||
|
php /var/www/html/occ config:system:set log_type --value="file"
|
||||||
|
php /var/www/html/occ config:system:set log_type_audit --value="file"
|
||||||
|
php /var/www/html/occ app:enable logreader
|
||||||
|
php /var/www/html/occ config:system:set logfile --value="/var/www/html/data/nextcloud.log"
|
||||||
|
php /var/www/html/occ config:system:set logfile_audit --value="/var/www/html/data/audit.log"
|
||||||
|
fi
|
||||||
php /var/www/html/occ config:system:set log_rotate_size --value="10485760" --type=integer
|
php /var/www/html/occ config:system:set log_rotate_size --value="10485760" --type=integer
|
||||||
php /var/www/html/occ app:enable admin_audit
|
php /var/www/html/occ app:enable admin_audit
|
||||||
php /var/www/html/occ config:app:set admin_audit logfile --value="/var/www/html/data/audit.log"
|
|
||||||
php /var/www/html/occ config:system:set log.condition apps 0 --value="admin_audit"
|
php /var/www/html/occ config:system:set log.condition apps 0 --value="admin_audit"
|
||||||
|
|
||||||
# Apply preview settings
|
# Apply preview settings
|
||||||
@@ -640,8 +671,18 @@ fi
|
|||||||
# Adjusting log files to be stored on a volume
|
# Adjusting log files to be stored on a volume
|
||||||
echo "Adjusting log files..."
|
echo "Adjusting log files..."
|
||||||
php /var/www/html/occ config:system:set upgrade.cli-upgrade-link --value="https://github.com/nextcloud/all-in-one/discussions/2726"
|
php /var/www/html/occ config:system:set upgrade.cli-upgrade-link --value="https://github.com/nextcloud/all-in-one/discussions/2726"
|
||||||
php /var/www/html/occ config:system:set logfile --value="/var/www/html/data/nextcloud.log"
|
php /var/www/html/occ config:system:set loglevel --value="$NEXTCLOUD_LOG_LEVEL" --type=integer
|
||||||
php /var/www/html/occ config:app:set admin_audit logfile --value="/var/www/html/data/audit.log"
|
if [ "$NEXTCLOUD_LOG_TYPE" = "errorlog" ]; then
|
||||||
|
php /var/www/html/occ config:system:set log_type --value="errorlog"
|
||||||
|
php /var/www/html/occ config:system:set log_type_audit --value="errorlog"
|
||||||
|
php /var/www/html/occ app:disable logreader
|
||||||
|
else
|
||||||
|
php /var/www/html/occ config:system:set log_type --value="file"
|
||||||
|
php /var/www/html/occ config:system:set log_type_audit --value="file"
|
||||||
|
php /var/www/html/occ app:enable logreader
|
||||||
|
php /var/www/html/occ config:system:set logfile --value="/var/www/html/data/nextcloud.log"
|
||||||
|
php /var/www/html/occ config:system:set logfile_audit --value="/var/www/html/data/audit.log"
|
||||||
|
fi
|
||||||
php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater"
|
php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater"
|
||||||
if [ -n "$NEXTCLOUD_SKELETON_DIRECTORY" ]; then
|
if [ -n "$NEXTCLOUD_SKELETON_DIRECTORY" ]; then
|
||||||
if [ "$NEXTCLOUD_SKELETON_DIRECTORY" = "empty" ]; then
|
if [ "$NEXTCLOUD_SKELETON_DIRECTORY" = "empty" ]; then
|
||||||
@@ -742,7 +783,9 @@ if [ "$COLLABORA_ENABLED" = 'yes' ]; then
|
|||||||
if echo "$COLLABORA_HOST" | grep -q "nextcloud-.*-collabora"; then
|
if echo "$COLLABORA_HOST" | grep -q "nextcloud-.*-collabora"; then
|
||||||
COLLABORA_HOST="$NC_DOMAIN"
|
COLLABORA_HOST="$NC_DOMAIN"
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
# Remove richdcoumentscode if it should be incorrectly installed
|
# Remove richdcoumentscode if it should be incorrectly installed
|
||||||
if [ -d "/var/www/html/custom_apps/richdocumentscode" ]; then
|
if [ -d "/var/www/html/custom_apps/richdocumentscode" ]; then
|
||||||
php /var/www/html/occ app:remove richdocumentscode
|
php /var/www/html/occ app:remove richdocumentscode
|
||||||
@@ -863,7 +906,9 @@ if [ "$TALK_ENABLED" = 'yes' ]; then
|
|||||||
if [ -z "$TURN_DOMAIN" ]; then
|
if [ -z "$TURN_DOMAIN" ]; then
|
||||||
TURN_DOMAIN="$TALK_HOST"
|
TURN_DOMAIN="$TALK_HOST"
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
if ! [ -d "/var/www/html/custom_apps/spreed" ]; then
|
if ! [ -d "/var/www/html/custom_apps/spreed" ]; then
|
||||||
php /var/www/html/occ app:install spreed
|
php /var/www/html/occ app:install spreed
|
||||||
elif [ "$(php /var/www/html/occ config:app:get spreed enabled)" != "yes" ]; then
|
elif [ "$(php /var/www/html/occ config:app:get spreed enabled)" != "yes" ]; then
|
||||||
@@ -871,16 +916,20 @@ if [ "$TALK_ENABLED" = 'yes' ]; then
|
|||||||
elif [ "$SKIP_UPDATE" != 1 ]; then
|
elif [ "$SKIP_UPDATE" != 1 ]; then
|
||||||
php /var/www/html/occ app:update spreed
|
php /var/www/html/occ app:update spreed
|
||||||
fi
|
fi
|
||||||
# Based on https://github.com/nextcloud/spreed/issues/960#issuecomment-416993435
|
# Add turn server
|
||||||
if [ -z "$(php /var/www/html/occ talk:turn:list --output="plain")" ]; then
|
# shellcheck disable=SC2153
|
||||||
# shellcheck disable=SC2153
|
if ! php /var/www/html/occ talk:turn:list --output="plain" | grep server | grep -q " $TURN_DOMAIN:$TALK_PORT"; then
|
||||||
php /var/www/html/occ talk:turn:add turn "$TURN_DOMAIN:$TALK_PORT" "udp,tcp" --secret="$TURN_SECRET"
|
php /var/www/html/occ talk:turn:add turn "$TURN_DOMAIN:$TALK_PORT" "udp,tcp" --secret="$TURN_SECRET"
|
||||||
fi
|
fi
|
||||||
|
# Add stun server
|
||||||
STUN_SERVER="$(php /var/www/html/occ talk:stun:list --output="plain")"
|
STUN_SERVER="$(php /var/www/html/occ talk:stun:list --output="plain")"
|
||||||
if [ -z "$STUN_SERVER" ] || echo "$STUN_SERVER" | grep -oP '[a-zA-Z.:0-9]+' | grep -q "^stun.nextcloud.com:443$"; then
|
if ! echo "$STUN_SERVER" | grep -q " $TURN_DOMAIN:$TALK_PORT"; then
|
||||||
php /var/www/html/occ talk:stun:add "$TURN_DOMAIN:$TALK_PORT"
|
php /var/www/html/occ talk:stun:add "$TURN_DOMAIN:$TALK_PORT"
|
||||||
|
fi
|
||||||
|
if [ -z "$STUN_SERVER" ] || echo "$STUN_SERVER" | grep -oP '[a-zA-Z.:0-9]+' | grep -q "^stun.nextcloud.com:443$"; then
|
||||||
php /var/www/html/occ talk:stun:delete "stun.nextcloud.com:443"
|
php /var/www/html/occ talk:stun:delete "stun.nextcloud.com:443"
|
||||||
fi
|
fi
|
||||||
|
# Add HPB
|
||||||
if ! php /var/www/html/occ talk:signaling:list --output="plain" | grep -q "https://$TALK_HOST$HPB_PATH"; then
|
if ! php /var/www/html/occ talk:signaling:list --output="plain" | grep -q "https://$TALK_HOST$HPB_PATH"; then
|
||||||
php /var/www/html/occ talk:signaling:add "https://$TALK_HOST$HPB_PATH" "$SIGNALING_SECRET" --verify
|
php /var/www/html/occ talk:signaling:add "https://$TALK_HOST$HPB_PATH" "$SIGNALING_SECRET" --verify
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Set a default value for POSTGRES_PORT
|
# Set a default value for POSTGRES_PORT
|
||||||
if [ -z "$POSTGRES_PORT" ]; then
|
if [ -z "$POSTGRES_PORT" ]; then
|
||||||
POSTGRES_PORT=5432
|
POSTGRES_PORT=5432
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$EUID" = 0 ]]; then
|
if [[ "$EUID" = 0 ]]; then
|
||||||
COMMAND=(sudo -E -u www-data php /var/www/html/occ)
|
COMMAND=(sudo -E -u www-data php /var/www/html/occ)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$EUID" = 0 ]]; then
|
if [[ "$EUID" = 0 ]]; then
|
||||||
COMMAND=(sudo -E -u www-data php /var/www/html/occ)
|
COMMAND=(sudo -E -u www-data php /var/www/html/occ)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Wait until the apache container is ready
|
# Wait until the apache container is ready
|
||||||
while ! nc -z "$APACHE_HOST" "$APACHE_PORT"; do
|
while ! nc -z "$APACHE_HOST" "$APACHE_PORT"; do
|
||||||
echo "Waiting for $APACHE_HOST to become available..."
|
echo "Waiting for $APACHE_HOST to become available..."
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Set a default value for POSTGRES_PORT
|
# Set a default value for POSTGRES_PORT
|
||||||
if [ -z "$POSTGRES_PORT" ]; then
|
if [ -z "$POSTGRES_PORT" ]; then
|
||||||
POSTGRES_PORT=5432
|
POSTGRES_PORT=5432
|
||||||
@@ -25,7 +29,7 @@ fi
|
|||||||
# Fix false database connection on old instances
|
# Fix false database connection on old instances
|
||||||
if [ -f "/var/www/html/config/config.php" ]; then
|
if [ -f "/var/www/html/config/config.php" ]; then
|
||||||
sleep 2
|
sleep 2
|
||||||
while ! sudo -E -u www-data psql -d "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB" -c "select now()"; do
|
while ! sudo -E -u www-data env PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "select now()"; do
|
||||||
echo "Waiting for the database to start..."
|
echo "Waiting for the database to start..."
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
@@ -53,7 +57,9 @@ if ! [ -f "/dev-dri-group-was-added" ] && [ -n "$(find /dev -maxdepth 1 -mindept
|
|||||||
usermod -aG "$GROUP" www-data
|
usermod -aG "$GROUP" www-data
|
||||||
touch "/dev-dri-group-was-added"
|
touch "/dev-dri-group-was-added"
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
|
||||||
# Check datadir permissions
|
# Check datadir permissions
|
||||||
sudo -E -u www-data touch "$NEXTCLOUD_DATA_DIR/this-is-a-test-file" &>/dev/null
|
sudo -E -u www-data touch "$NEXTCLOUD_DATA_DIR/this-is-a-test-file" &>/dev/null
|
||||||
@@ -170,6 +176,8 @@ if [ "$THIS_IS_AIO" = "true" ] && [ "$APACHE_PORT" = 443 ]; then
|
|||||||
sed -i "/^listen.allowed_clients/s/,$//" /usr/local/etc/php-fpm.d/www.conf
|
sed -i "/^listen.allowed_clients/s/,$//" /usr/local/etc/php-fpm.d/www.conf
|
||||||
grep listen.allowed_clients /usr/local/etc/php-fpm.d/www.conf
|
grep listen.allowed_clients /usr/local/etc/php-fpm.d/www.conf
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ pidfile=/var/run/supervisord/supervisord.pid
|
|||||||
childlogdir=/var/log/supervisord/
|
childlogdir=/var/log/supervisord/
|
||||||
logfile_maxbytes=50MB ; maximum size of logfile before rotation
|
logfile_maxbytes=50MB ; maximum size of logfile before rotation
|
||||||
logfile_backups=10 ; number of backed up logfiles
|
logfile_backups=10 ; number of backed up logfiles
|
||||||
loglevel=error
|
loglevel=%(ENV_AIO_LOG_LEVEL)s
|
||||||
user=root
|
user=root
|
||||||
|
|
||||||
[program:php-fpm]
|
[program:php-fpm]
|
||||||
@@ -25,6 +25,14 @@ stderr_logfile_maxbytes=0
|
|||||||
command=/cron.sh
|
command=/cron.sh
|
||||||
user=www-data
|
user=www-data
|
||||||
|
|
||||||
|
[program:taskprocessing-worker]
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stderr
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
command=php /var/www/html/occ taskprocessing:worker --timeout 300
|
||||||
|
user=www-data
|
||||||
|
|
||||||
[program:run-exec-commands]
|
[program:run-exec-commands]
|
||||||
stdout_logfile=/dev/stdout
|
stdout_logfile=/dev/stdout
|
||||||
stdout_logfile_maxbytes=0
|
stdout_logfile_maxbytes=0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
|
|
||||||
COPY --chmod=775 start.sh /start.sh
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
@@ -23,4 +23,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Notify Push for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Nextcloud notify_push high-performance backend for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
if ! nc -z "$NEXTCLOUD_HOST" 9001; then
|
if ! nc -z "$NEXTCLOUD_HOST" 9001; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
export RUST_LOG="$AIO_LOG_LEVEL"
|
||||||
|
|
||||||
if [ -z "$NEXTCLOUD_HOST" ]; then
|
if [ -z "$NEXTCLOUD_HOST" ]; then
|
||||||
echo "NEXTCLOUD_HOST needs to be provided. Exiting!"
|
echo "NEXTCLOUD_HOST needs to be provided. Exiting!"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -39,8 +45,6 @@ fi
|
|||||||
echo "notify-push was started"
|
echo "notify-push was started"
|
||||||
|
|
||||||
# Run it
|
# Run it
|
||||||
/var/www/html/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push \
|
exec /var/www/html/custom_apps/notify_push/bin/"$CPU_ARCH"/notify_push \
|
||||||
--port 7867 \
|
--port 7867 \
|
||||||
/var/www/html/config/config.php
|
/var/www/html/config/config.php
|
||||||
|
|
||||||
exec "$@"
|
|
||||||
|
|||||||
@@ -9,4 +9,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="OnlyOffice for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="OnlyOffice Document Server for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z 127.0.0.1 80 || exit 1
|
nc -z 127.0.0.1 80 || exit 1
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# From https://github.com/docker-library/postgres/blob/master/17/alpine3.23/Dockerfile
|
# From https://github.com/docker-library/postgres/blob/master/18/alpine3.23/Dockerfile
|
||||||
FROM postgres:17.9-alpine
|
FROM postgres:18.4-alpine
|
||||||
|
|
||||||
|
ENV PGDATA=/var/lib/postgresql/data
|
||||||
|
|
||||||
COPY --chmod=775 start.sh /start.sh
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
@@ -12,6 +14,7 @@ RUN set -ex; \
|
|||||||
bash \
|
bash \
|
||||||
openssl \
|
openssl \
|
||||||
shadow \
|
shadow \
|
||||||
|
netcat-openbsd \
|
||||||
grep; \
|
grep; \
|
||||||
\
|
\
|
||||||
# We need to use the same gid and uid as on old installations
|
# We need to use the same gid and uid as on old installations
|
||||||
@@ -22,6 +25,7 @@ RUN set -ex; \
|
|||||||
apk del --no-cache shadow; \
|
apk del --no-cache shadow; \
|
||||||
\
|
\
|
||||||
# Fix default permissions
|
# Fix default permissions
|
||||||
|
mkdir -p /var/lib/postgresql/data; \
|
||||||
chown -R postgres:postgres /var/lib/postgresql; \
|
chown -R postgres:postgres /var/lib/postgresql; \
|
||||||
chown -R postgres:postgres /var/run/postgresql; \
|
chown -R postgres:postgres /var/run/postgresql; \
|
||||||
chmod -R 777 /var/run/postgresql; \
|
chmod -R 777 /var/run/postgresql; \
|
||||||
@@ -45,4 +49,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="PostgreSQL for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="PostgreSQL database for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
test -f "/mnt/data/backup-is-running" && exit 0
|
test -f "/mnt/data/backup-is-running" && exit 0
|
||||||
|
|
||||||
psql -d "postgresql://oc_$POSTGRES_USER:$POSTGRES_PASSWORD@127.0.0.1:11000/$POSTGRES_DB" -c "select now()" && exit 0
|
# If database import is running, do not continue with the health check
|
||||||
|
if nc -z 127.0.0.1 11000; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
psql -d "postgresql://oc_$POSTGRES_USER:$POSTGRES_PASSWORD@127.0.0.1:5432/$POSTGRES_DB" -c "select now()" || exit 1
|
PGPASSWORD="$POSTGRES_PASSWORD" psql -h 127.0.0.1 -p 5432 -U "oc_$POSTGRES_USER" -d "$POSTGRES_DB" -c "select now()" || exit 1
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
touch "$DUMP_DIR/initialization.failed"
|
touch "$DUMP_DIR/initialization.failed"
|
||||||
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \
|
||||||
CREATE USER "oc_$POSTGRES_USER" WITH PASSWORD '$POSTGRES_PASSWORD' CREATEDB;
|
-v "pg_new_password=$POSTGRES_PASSWORD" <<-EOSQL
|
||||||
|
CREATE USER "oc_$POSTGRES_USER" WITH PASSWORD :'pg_new_password' CREATEDB;
|
||||||
ALTER DATABASE "$POSTGRES_DB" OWNER TO "oc_$POSTGRES_USER";
|
ALTER DATABASE "$POSTGRES_DB" OWNER TO "oc_$POSTGRES_USER";
|
||||||
GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB" TO "oc_$POSTGRES_USER";
|
GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB" TO "oc_$POSTGRES_USER";
|
||||||
GRANT ALL PRIVILEGES ON SCHEMA public TO "oc_$POSTGRES_USER";
|
GRANT ALL PRIVILEGES ON SCHEMA public TO "oc_$POSTGRES_USER";
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
POSTGRES_LOG_MIN_MESSAGES="$(case "$AIO_LOG_LEVEL" in
|
||||||
|
debug) printf 'debug1' ;;
|
||||||
|
info) printf 'info' ;;
|
||||||
|
warn) printf 'warning' ;;
|
||||||
|
error) printf 'error' ;;
|
||||||
|
esac)"
|
||||||
|
export POSTGRES_LOG_MIN_MESSAGES
|
||||||
|
|
||||||
# Variables
|
# Variables
|
||||||
DATADIR="/var/lib/postgresql/data"
|
DATADIR="/var/lib/postgresql/data"
|
||||||
export DUMP_DIR="/mnt/data"
|
export DUMP_DIR="/mnt/data"
|
||||||
@@ -85,7 +97,7 @@ if ( [ -f "$DATADIR/PG_VERSION" ] && [ "$PG_MAJOR" != "$(cat "$DATADIR/PG_VERSIO
|
|||||||
exec docker-entrypoint.sh postgres &
|
exec docker-entrypoint.sh postgres &
|
||||||
|
|
||||||
# Wait for creation
|
# Wait for creation
|
||||||
while ! psql -d "postgresql://oc_$POSTGRES_USER:$POSTGRES_PASSWORD@127.0.0.1:11000/$POSTGRES_DB" -c "select now()"; do
|
while ! psql -h 127.0.0.1 -p 11000 -U "oc_$POSTGRES_USER" -d "$POSTGRES_DB" -c "select now()"; do
|
||||||
echo "Waiting for the database to start."
|
echo "Waiting for the database to start."
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
@@ -107,8 +119,9 @@ if ( [ -f "$DATADIR/PG_VERSION" ] && [ "$PG_MAJOR" != "$(cat "$DATADIR/PG_VERSIO
|
|||||||
exit 1
|
exit 1
|
||||||
elif [ "$DB_OWNER" != "oc_$POSTGRES_USER" ]; then
|
elif [ "$DB_OWNER" != "oc_$POSTGRES_USER" ]; then
|
||||||
DIFFERENT_DB_OWNER=1
|
DIFFERENT_DB_OWNER=1
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \
|
||||||
CREATE USER "$DB_OWNER" WITH PASSWORD '$POSTGRES_PASSWORD' CREATEDB;
|
-v "pg_new_password=$POSTGRES_PASSWORD" <<-EOSQL
|
||||||
|
CREATE USER "$DB_OWNER" WITH PASSWORD :'pg_new_password' CREATEDB;
|
||||||
ALTER DATABASE "$POSTGRES_DB" OWNER TO "$DB_OWNER";
|
ALTER DATABASE "$POSTGRES_DB" OWNER TO "$DB_OWNER";
|
||||||
GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB" TO "$DB_OWNER";
|
GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB" TO "$DB_OWNER";
|
||||||
GRANT ALL PRIVILEGES ON SCHEMA public TO "$DB_OWNER";
|
GRANT ALL PRIVILEGES ON SCHEMA public TO "$DB_OWNER";
|
||||||
@@ -151,23 +164,71 @@ fi
|
|||||||
# Modify postgresql.conf
|
# Modify postgresql.conf
|
||||||
if [ -f "/var/lib/postgresql/data/postgresql.conf" ]; then
|
if [ -f "/var/lib/postgresql/data/postgresql.conf" ]; then
|
||||||
echo "Setting postgres values..."
|
echo "Setting postgres values..."
|
||||||
|
PGCONF="/var/lib/postgresql/data/postgresql.conf"
|
||||||
|
|
||||||
# Sync this with max pm.max_children and MaxRequestWorkers
|
# Sync this with max pm.max_children and MaxRequestWorkers
|
||||||
# 5000 connections is apparently the highest possible value with postgres so set it to that so that we don't run into a limit here.
|
# 5000 connections is apparently the highest possible value with postgres so set it to that so that we don't run into a limit here.
|
||||||
# We don't actually expect so many connections but don't want to limit it artificially because people will report issues otherwise
|
# We don't actually expect so many connections but don't want to limit it artificially because people will report issues otherwise
|
||||||
# Also connections should usually be closed again after the process is done
|
# Also connections should usually be closed again after the process is done
|
||||||
# If we should actually exceed this limit, it is definitely a bug in Nextcloud server or some of its apps that does not close connections correctly and not a bug in AIO
|
# If we should actually exceed this limit, it is definitely a bug in Nextcloud server or some of its apps that does not close connections correctly and not a bug in AIO
|
||||||
sed -i "s|^max_connections =.*|max_connections = 5000|" "/var/lib/postgresql/data/postgresql.conf"
|
sed -i "s|^max_connections =.*|max_connections = 5000|" "$PGCONF"
|
||||||
|
|
||||||
# Do not log checkpoints
|
# Do not log checkpoints
|
||||||
if grep -q "#log_checkpoints" /var/lib/postgresql/data/postgresql.conf; then
|
if grep -q "#log_checkpoints" "$PGCONF"; then
|
||||||
sed -i 's|#log_checkpoints.*|log_checkpoints = off|' /var/lib/postgresql/data/postgresql.conf
|
sed -i 's|#log_checkpoints.*|log_checkpoints = off|' "$PGCONF"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -q "^#\?log_min_messages" /var/lib/postgresql/data/postgresql.conf; then
|
||||||
|
sed -i "s|^#\?log_min_messages.*|log_min_messages = $POSTGRES_LOG_MIN_MESSAGES|" /var/lib/postgresql/data/postgresql.conf
|
||||||
|
else
|
||||||
|
echo "log_min_messages = $POSTGRES_LOG_MIN_MESSAGES" >> /var/lib/postgresql/data/postgresql.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Closing idling connections automatically seems to break any logic so was reverted again to default where it is disabled
|
# Closing idling connections automatically seems to break any logic so was reverted again to default where it is disabled
|
||||||
if grep -q "^idle_session_timeout" /var/lib/postgresql/data/postgresql.conf; then
|
if grep -q "^idle_session_timeout" "$PGCONF"; then
|
||||||
sed -i 's|^idle_session_timeout.*|#idle_session_timeout|' /var/lib/postgresql/data/postgresql.conf
|
sed -i 's|^idle_session_timeout.*|#idle_session_timeout|' "$PGCONF"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Increase shared_buffers from the 128MB default for better data caching
|
||||||
|
sed -i "s|^#shared_buffers = .*|shared_buffers = 256MB|" "$PGCONF"
|
||||||
|
sed -i "s|^shared_buffers = .*|shared_buffers = 256MB|" "$PGCONF"
|
||||||
|
|
||||||
|
# Hint to the query planner about available OS page cache (does not allocate memory)
|
||||||
|
sed -i "s|^#effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF"
|
||||||
|
sed -i "s|^effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF"
|
||||||
|
|
||||||
|
# Increase per-operation sort/hash memory to reduce disk spills for file listing and share queries.
|
||||||
|
# Note: this is allocated per sort/hash operation, not per connection, so the theoretical worst-case
|
||||||
|
# (max_connections × work_mem) is rarely approached in practice.
|
||||||
|
sed -i "s|^#work_mem = .*|work_mem = 16MB|" "$PGCONF"
|
||||||
|
sed -i "s|^work_mem = .*|work_mem = 16MB|" "$PGCONF"
|
||||||
|
|
||||||
|
# Increase memory for VACUUM, CREATE INDEX, and other maintenance operations
|
||||||
|
sed -i "s|^#maintenance_work_mem = .*|maintenance_work_mem = 256MB|" "$PGCONF"
|
||||||
|
sed -i "s|^maintenance_work_mem = .*|maintenance_work_mem = 256MB|" "$PGCONF"
|
||||||
|
|
||||||
|
# Increase WAL buffers to reduce WAL write latency under concurrent write load
|
||||||
|
sed -i "s|^#wal_buffers = .*|wal_buffers = 16MB|" "$PGCONF"
|
||||||
|
sed -i "s|^wal_buffers = .*|wal_buffers = 16MB|" "$PGCONF"
|
||||||
|
|
||||||
|
# Spread checkpoint I/O over a longer window to reduce spikes
|
||||||
|
sed -i "s|^#checkpoint_timeout = .*|checkpoint_timeout = 15min|" "$PGCONF"
|
||||||
|
sed -i "s|^checkpoint_timeout = .*|checkpoint_timeout = 15min|" "$PGCONF"
|
||||||
|
|
||||||
|
# Tune for SSD storage: random reads are nearly as fast as sequential reads
|
||||||
|
sed -i "s|^#random_page_cost = .*|random_page_cost = 1.1|" "$PGCONF"
|
||||||
|
sed -i "s|^random_page_cost = .*|random_page_cost = 1.1|" "$PGCONF"
|
||||||
|
|
||||||
|
# Allow the kernel to issue more concurrent I/O prefetch requests (suitable for SSDs)
|
||||||
|
sed -i "s|^#effective_io_concurrency = .*|effective_io_concurrency = 200|" "$PGCONF"
|
||||||
|
sed -i "s|^effective_io_concurrency = .*|effective_io_concurrency = 200|" "$PGCONF"
|
||||||
|
|
||||||
|
# Trigger autovacuum earlier on large Nextcloud tables (e.g. oc_filecache, oc_activity)
|
||||||
|
# to prevent table bloat accumulating before the default 20% threshold is reached
|
||||||
|
sed -i "s|^#autovacuum_vacuum_scale_factor = .*|autovacuum_vacuum_scale_factor = 0.05|" "$PGCONF"
|
||||||
|
sed -i "s|^autovacuum_vacuum_scale_factor = .*|autovacuum_vacuum_scale_factor = 0.05|" "$PGCONF"
|
||||||
|
sed -i "s|^#autovacuum_analyze_scale_factor = .*|autovacuum_analyze_scale_factor = 0.02|" "$PGCONF"
|
||||||
|
sed -i "s|^autovacuum_analyze_scale_factor = .*|autovacuum_analyze_scale_factor = 0.02|" "$PGCONF"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
do_database_dump() {
|
do_database_dump() {
|
||||||
@@ -180,12 +241,16 @@ do_database_dump() {
|
|||||||
pg_ctl stop -m fast
|
pg_ctl stop -m fast
|
||||||
rm "$DUMP_DIR/export.failed"
|
rm "$DUMP_DIR/export.failed"
|
||||||
echo 'Database dump successful!'
|
echo 'Database dump successful!'
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
pg_ctl stop -m fast
|
pg_ctl stop -m fast
|
||||||
echo "Database dump unsuccessful!"
|
echo "Database dump unsuccessful!"
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
# From https://github.com/redis/docker-library-redis/blob/release/8.2/alpine/Dockerfile
|
# From https://github.com/redis/docker-library-redis/blob/release/8.2/alpine/Dockerfile
|
||||||
FROM redis:8.6.2-alpine
|
FROM redis:8.6.3-alpine
|
||||||
|
|
||||||
COPY --chmod=775 start.sh /start.sh
|
COPY --chmod=775 start.sh /start.sh
|
||||||
|
|
||||||
@@ -23,4 +23,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Redis for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Redis cache server for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
redis-cli -a "$REDIS_HOST_PASSWORD" PING || exit 1
|
redis-cli -a "$REDIS_HOST_PASSWORD" PING || exit 1
|
||||||
|
|||||||
@@ -1,17 +1,50 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Redis only supports [debug, verbose, notice, warning, nothing] as log level
|
||||||
|
if [ "$AIO_LOG_LEVEL" = "warn" ] || [ "$AIO_LOG_LEVEL" = "error" ]; then
|
||||||
|
REDIS_LOG_LEVEL="warning"
|
||||||
|
elif [ "$AIO_LOG_LEVEL" = "info" ]; then
|
||||||
|
REDIS_LOG_LEVEL="notice"
|
||||||
|
else
|
||||||
|
REDIS_LOG_LEVEL="$AIO_LOG_LEVEL"
|
||||||
|
fi
|
||||||
|
export REDIS_LOG_LEVEL
|
||||||
|
|
||||||
# Show wiki if vm.overcommit is disabled
|
# Show wiki if vm.overcommit is disabled
|
||||||
if [ "$(sysctl -n vm.overcommit_memory)" != "1" ]; then
|
if [ "$(sysctl -n vm.overcommit_memory)" != "1" ]; then
|
||||||
echo "Memory overcommit is disabled but necessary for safe operation"
|
echo "Memory overcommit is disabled but necessary for safe operation"
|
||||||
echo "See https://github.com/nextcloud/all-in-one/discussions/1731 how to enable overcommit"
|
echo "See https://github.com/nextcloud/all-in-one/discussions/1731 how to enable overcommit"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run redis with a password if provided
|
# Warn if Transparent Huge Pages are enabled (causes latency spikes)
|
||||||
echo "Redis has started"
|
if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then
|
||||||
if [ -n "$REDIS_HOST_PASSWORD" ]; then
|
if grep -q '\[always\]' /sys/kernel/mm/transparent_hugepage/enabled; then
|
||||||
exec redis-server --requirepass "$REDIS_HOST_PASSWORD" --loglevel warning
|
echo "WARNING: Transparent Huge Pages (THP) are enabled. This can cause latency and memory issues with Redis."
|
||||||
else
|
echo "Consider disabling THP by running: echo never > /sys/kernel/mm/transparent_hugepage/enabled"
|
||||||
exec redis-server --loglevel warning
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "$@"
|
# Build the redis-server argument list.
|
||||||
|
REDIS_ARGS=(
|
||||||
|
--loglevel "$REDIS_LOG_LEVEL"
|
||||||
|
--save "" # Disable RDB persistence (Redis is used as a pure cache/lock store)
|
||||||
|
--maxmemory-policy allkeys-lru # Evict least-recently-used keys when memory is full
|
||||||
|
--lazyfree-lazy-eviction yes # Perform evictions in a background thread
|
||||||
|
--lazyfree-lazy-expire yes # Expire keys in a background thread
|
||||||
|
--lazyfree-lazy-server-del yes # DEL/UNLINK in background thread
|
||||||
|
--replica-lazy-flush yes # Flush replica dataset in background thread
|
||||||
|
--activedefrag yes # Reclaim fragmented memory without restart
|
||||||
|
--hz 15 # Run background tasks 15×/s (default 10) for faster key expiry
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ -n "$REDIS_HOST_PASSWORD" ]; then
|
||||||
|
REDIS_ARGS+=(--requirepass "$REDIS_HOST_PASSWORD")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run redis with a password if provided
|
||||||
|
echo "Redis has started"
|
||||||
|
exec redis-server "${REDIS_ARGS[@]}"
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM python:3.14.3-alpine3.23
|
FROM python:3.14.5-alpine3.23
|
||||||
|
|
||||||
COPY --chmod=775 start.sh /start.sh
|
COPY --chmod=775 start.sh /start.sh
|
||||||
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
ENV RECORDING_VERSION=v0.2.1
|
ENV RECORDING_VERSION=v0.2.1
|
||||||
ENV ALLOW_ALL=false
|
ENV ALLOW_ALL=false \
|
||||||
ENV HPB_PROTOCOL=https
|
HPB_PROTOCOL=https \
|
||||||
ENV NC_PROTOCOL=https
|
NC_PROTOCOL=https \
|
||||||
ENV SKIP_VERIFY=false
|
SKIP_VERIFY=false \
|
||||||
ENV HPB_PATH=/standalone-signaling/
|
HPB_PATH=/standalone-signaling/ \
|
||||||
|
AIO_LOG_LEVEL=warn
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
@@ -19,6 +20,7 @@ RUN set -ex; \
|
|||||||
bash \
|
bash \
|
||||||
xvfb \
|
xvfb \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
|
mesa-va-gallium \
|
||||||
firefox \
|
firefox \
|
||||||
font-noto-all \
|
font-noto-all \
|
||||||
font-noto-cjk \
|
font-noto-cjk \
|
||||||
@@ -62,4 +64,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Talk Recording for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Nextcloud Talk recording service for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z 127.0.0.1 1234 || exit 1
|
nc -z 127.0.0.1 1234 || exit 1
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
TALK_RECORDING_LOG_LEVEL="$(case "$AIO_LOG_LEVEL" in
|
||||||
|
debug) printf '10' ;;
|
||||||
|
info) printf '20' ;;
|
||||||
|
warn) printf '30' ;;
|
||||||
|
error) printf '40' ;;
|
||||||
|
esac)"
|
||||||
|
export TALK_RECORDING_LOG_LEVEL
|
||||||
|
|
||||||
# Variables
|
# Variables
|
||||||
if [ -z "$NC_DOMAIN" ]; then
|
if [ -z "$NC_DOMAIN" ]; then
|
||||||
echo "You need to provide the NC_DOMAIN."
|
echo "You need to provide the NC_DOMAIN."
|
||||||
@@ -19,10 +31,37 @@ fi
|
|||||||
# Delete all contents on startup to start fresh
|
# Delete all contents on startup to start fresh
|
||||||
rm -fr /tmp/{*,.*}
|
rm -fr /tmp/{*,.*}
|
||||||
|
|
||||||
|
# Detect available hardware for transcoding and build the [ffmpeg] config section accordingly
|
||||||
|
FFMPEG_SECTION="[ffmpeg]
|
||||||
|
# common = ffmpeg -loglevel level+warning -n
|
||||||
|
# outputaudio = -c:a libopus
|
||||||
|
# outputvideo = -c:v libvpx -deadline:v realtime -crf 10 -b:v 1M
|
||||||
|
extensionaudio = .ogg
|
||||||
|
extensionvideo = .webm"
|
||||||
|
|
||||||
|
# Check for NVIDIA GPU hardware encoding (NVENC)
|
||||||
|
if [ -e "/dev/nvidia0" ] && ffmpeg -hide_banner -encoders 2>/dev/null | grep -q "h264_nvenc"; then
|
||||||
|
echo "NVIDIA GPU detected, enabling h264_nvenc hardware transcoding"
|
||||||
|
FFMPEG_SECTION="[ffmpeg]
|
||||||
|
outputvideo = -c:v h264_nvenc -preset p4
|
||||||
|
outputaudio = -c:a aac
|
||||||
|
extensionaudio = .m4a
|
||||||
|
extensionvideo = .mp4"
|
||||||
|
# Check for VA-API render node (Intel/AMD open source drivers)
|
||||||
|
elif [ -r "/dev/dri/renderD128" ] && ffmpeg -hide_banner -encoders 2>/dev/null | grep -q "h264_vaapi"; then
|
||||||
|
echo "DRI device detected, enabling h264_vaapi hardware transcoding"
|
||||||
|
FFMPEG_SECTION="[ffmpeg]
|
||||||
|
common = ffmpeg -loglevel level+warning -n -vaapi_device /dev/dri/renderD128
|
||||||
|
outputvideo = -vf format=nv12,hwupload -c:v h264_vaapi
|
||||||
|
outputaudio = -c:a aac
|
||||||
|
extensionaudio = .m4a
|
||||||
|
extensionvideo = .mp4"
|
||||||
|
fi
|
||||||
|
|
||||||
cat << RECORDING_CONF > "/conf/recording.conf"
|
cat << RECORDING_CONF > "/conf/recording.conf"
|
||||||
[logs]
|
[logs]
|
||||||
# 30 means Warning
|
# 30 means Warning
|
||||||
level = 30
|
level = ${TALK_RECORDING_LOG_LEVEL}
|
||||||
|
|
||||||
[http]
|
[http]
|
||||||
listen = 0.0.0.0:1234
|
listen = 0.0.0.0:1234
|
||||||
@@ -50,12 +89,7 @@ signalings = signaling-1
|
|||||||
url = ${HPB_PROTOCOL}://${HPB_DOMAIN}${HPB_PATH}
|
url = ${HPB_PROTOCOL}://${HPB_DOMAIN}${HPB_PATH}
|
||||||
internalsecret = ${INTERNAL_SECRET}
|
internalsecret = ${INTERNAL_SECRET}
|
||||||
|
|
||||||
[ffmpeg]
|
${FFMPEG_SECTION}
|
||||||
# common = ffmpeg -loglevel level+warning -n
|
|
||||||
# outputaudio = -c:a libopus
|
|
||||||
# outputvideo = -c:v libvpx -deadline:v realtime -crf 10 -b:v 1M
|
|
||||||
extensionaudio = .ogg
|
|
||||||
extensionvideo = .webm
|
|
||||||
|
|
||||||
[recording]
|
[recording]
|
||||||
browser = firefox
|
browser = firefox
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM nats:2.12.6-scratch AS nats
|
FROM nats:2.14.0-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.1.1 AS signaling
|
FROM strukturag/nextcloud-spreed-signaling:2.1.1 AS signaling
|
||||||
FROM alpine:3.23.3 AS janus
|
FROM alpine:3.23.4 AS janus
|
||||||
|
|
||||||
ARG JANUS_VERSION=v1.4.0
|
ARG JANUS_VERSION=v1.4.1
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
@@ -35,9 +35,10 @@ RUN set -ex; \
|
|||||||
make configs; \
|
make configs; \
|
||||||
rename -v ".jcfg.sample" ".jcfg" /usr/local/etc/janus/*.jcfg.sample
|
rename -v ".jcfg.sample" ".jcfg" /usr/local/etc/janus/*.jcfg.sample
|
||||||
|
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
ENV ETURNAL_ETC_DIR="/conf"
|
ENV ETURNAL_ETC_DIR="/conf"
|
||||||
ENV SKIP_CERT_VERIFY=false
|
ENV SKIP_CERT_VERIFY=false \
|
||||||
|
AIO_LOG_LEVEL=warn
|
||||||
COPY --from=janus --chmod=777 --chown=1000:1000 /usr/local /usr/local
|
COPY --from=janus --chmod=777 --chown=1000:1000 /usr/local /usr/local
|
||||||
COPY --from=eturnal --chmod=777 --chown=1000:1000 /opt/eturnal /opt/eturnal
|
COPY --from=eturnal --chmod=777 --chown=1000:1000 /opt/eturnal /opt/eturnal
|
||||||
COPY --from=nats --chmod=777 --chown=1000:1000 /nats-server /usr/local/bin/nats-server
|
COPY --from=nats --chmod=777 --chown=1000:1000 /nats-server /usr/local/bin/nats-server
|
||||||
@@ -82,7 +83,9 @@ RUN set -ex; \
|
|||||||
touch \
|
touch \
|
||||||
/etc/nats.conf \
|
/etc/nats.conf \
|
||||||
/etc/eturnal.yml; \
|
/etc/eturnal.yml; \
|
||||||
echo "listen: 127.0.0.1:4222" | tee /etc/nats.conf; \
|
# write_deadline: "10s" — without a write deadline, a lagging subscriber can stall the broker indefinitely, blocking all other signaling messages.
|
||||||
|
# max_payload: 8MB — the default is 1 MB; signaling payloads in large meetings (many participants, ICE candidates) can exceed this, causing dropped messages.
|
||||||
|
printf 'listen: 127.0.0.1:4222\nwrite_deadline: "10s"\nmax_payload: 8MB\n' | tee /etc/nats.conf; \
|
||||||
mkdir -p \
|
mkdir -p \
|
||||||
/var/tmp \
|
/var/tmp \
|
||||||
/conf \
|
/conf \
|
||||||
@@ -109,4 +112,9 @@ 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" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Talk for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Nextcloud Talk with NATS, Janus, eturnal, and signaling server for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z 127.0.0.1 8081 || exit 1
|
nc -z 127.0.0.1 8081 || exit 1
|
||||||
nc -z 127.0.0.1 8188 || exit 1
|
nc -z 127.0.0.1 8188 || exit 1
|
||||||
nc -z 127.0.0.1 4222 || exit 1
|
nc -z 127.0.0.1 4222 || exit 1
|
||||||
nc -z 127.0.0.1 "$TALK_PORT" || exit 1
|
nc -z 127.0.0.1 "$TALK_PORT" || exit 1
|
||||||
eturnalctl status || exit 1
|
eturnalctl status || exit 1
|
||||||
|
# Verify that the signaling server is actually serving requests, not just
|
||||||
|
# listening on the TCP port (which nc -z above only tests for open port).
|
||||||
|
wget -q -O /dev/null http://127.0.0.1:8081/api/v1/stats || exit 1
|
||||||
|
|||||||
@@ -1,5 +1,23 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = "warn" ]; then
|
||||||
|
ETURNAL_LOG_LEVEL="warning"
|
||||||
|
else
|
||||||
|
ETURNAL_LOG_LEVEL="$AIO_LOG_LEVEL"
|
||||||
|
fi
|
||||||
|
export ETURNAL_LOG_LEVEL
|
||||||
|
JANUS_LOG_LEVEL="$(case "$AIO_LOG_LEVEL" in
|
||||||
|
debug) printf '7' ;;
|
||||||
|
info) printf '4' ;;
|
||||||
|
warn) printf '3' ;;
|
||||||
|
error) printf '1' ;;
|
||||||
|
esac)"
|
||||||
|
export JANUS_LOG_LEVEL
|
||||||
|
|
||||||
# Variables
|
# Variables
|
||||||
if [ -z "$NC_DOMAIN" ]; then
|
if [ -z "$NC_DOMAIN" ]; then
|
||||||
echo "You need to provide the NC_DOMAIN."
|
echo "You need to provide the NC_DOMAIN."
|
||||||
@@ -31,7 +49,9 @@ if mountpoint -q /usr/local/share/ca-certificates; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
export SSL_CERT_FILE=/tmp/ca-certificates.crt
|
export SSL_CERT_FILE=/tmp/ca-certificates.crt
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set -x
|
set -x
|
||||||
@@ -40,7 +60,9 @@ IPv4_ADDRESS_TALK_RELAY="$(hostname -i | grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]
|
|||||||
IPv4_ADDRESS_TALK="$(dig "$TALK_HOST" IN A +short +search | grep '^[0-9.]\+$' | sort | head -n1)"
|
IPv4_ADDRESS_TALK="$(dig "$TALK_HOST" IN A +short +search | grep '^[0-9.]\+$' | sort | head -n1)"
|
||||||
# shellcheck disable=SC2153
|
# shellcheck disable=SC2153
|
||||||
IPv6_ADDRESS_TALK="$(dig "$TALK_HOST" AAAA +short +search | grep '^[0-9a-f:]\+$' | sort | head -n1)"
|
IPv6_ADDRESS_TALK="$(dig "$TALK_HOST" AAAA +short +search | grep '^[0-9a-f:]\+$' | sort | head -n1)"
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$IPv4_ADDRESS_TALK" ] && [ "$IPv4_ADDRESS_TALK_RELAY" = "$IPv4_ADDRESS_TALK" ]; then
|
if [ -n "$IPv4_ADDRESS_TALK" ] && [ "$IPv4_ADDRESS_TALK_RELAY" = "$IPv4_ADDRESS_TALK" ]; then
|
||||||
IPv4_ADDRESS_TALK=""
|
IPv4_ADDRESS_TALK=""
|
||||||
@@ -53,7 +75,9 @@ if grep -q "1" /sys/module/ipv6/parameters/disable \
|
|||||||
|| grep -q "1" /proc/sys/net/ipv6/conf/default/disable_ipv6; then
|
|| grep -q "1" /proc/sys/net/ipv6/conf/default/disable_ipv6; then
|
||||||
IP_BINDING="0.0.0.0"
|
IP_BINDING="0.0.0.0"
|
||||||
fi
|
fi
|
||||||
set +x
|
if [ "$AIO_LOG_LEVEL" != 'debug' ]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
|
||||||
# Turn
|
# Turn
|
||||||
cat << TURN_CONF > "/conf/eturnal.yml"
|
cat << TURN_CONF > "/conf/eturnal.yml"
|
||||||
@@ -66,7 +90,7 @@ eturnal:
|
|||||||
port: $TALK_PORT
|
port: $TALK_PORT
|
||||||
transport: tcp
|
transport: tcp
|
||||||
log_dir: stdout
|
log_dir: stdout
|
||||||
log_level: warning
|
log_level: ${ETURNAL_LOG_LEVEL}
|
||||||
secret: "$TURN_SECRET"
|
secret: "$TURN_SECRET"
|
||||||
relay_ipv4_addr: "$IPv4_ADDRESS_TALK_RELAY"
|
relay_ipv4_addr: "$IPv4_ADDRESS_TALK_RELAY"
|
||||||
relay_ipv6_addr: "$IPv6_ADDRESS_TALK"
|
relay_ipv6_addr: "$IPv6_ADDRESS_TALK"
|
||||||
@@ -91,10 +115,12 @@ if [ -z "$TALK_MAX_SCREEN_BITRATE" ]; then
|
|||||||
TALK_MAX_SCREEN_BITRATE=2097152
|
TALK_MAX_SCREEN_BITRATE=2097152
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Signling
|
# Signaling
|
||||||
cat << SIGNALING_CONF > "/conf/signaling.conf"
|
cat << SIGNALING_CONF > "/conf/signaling.conf"
|
||||||
[http]
|
[http]
|
||||||
listen = 0.0.0.0:8081
|
listen = 0.0.0.0:8081
|
||||||
|
readtimeout = 15
|
||||||
|
writetimeout = 30
|
||||||
|
|
||||||
[app]
|
[app]
|
||||||
debug = false
|
debug = false
|
||||||
@@ -110,7 +136,9 @@ internalsecret = ${INTERNAL_SECRET}
|
|||||||
backends = backend-1
|
backends = backend-1
|
||||||
allowall = false
|
allowall = false
|
||||||
timeout = 10
|
timeout = 10
|
||||||
connectionsperhost = 8
|
# connectionsperhost: This is the HTTP keep-alive connection pool size from the signaling server to the Nextcloud backend.
|
||||||
|
# Under load (many concurrent calls joining/leaving simultaneously) a pool of 8 creates a queue bottleneck for backend authentication and session lookups, thus increasing to 32.
|
||||||
|
connectionsperhost = 32
|
||||||
skipverify = ${SKIP_CERT_VERIFY}
|
skipverify = ${SKIP_CERT_VERIFY}
|
||||||
|
|
||||||
[backend-1]
|
[backend-1]
|
||||||
@@ -129,4 +157,34 @@ maxstreambitrate = ${TALK_MAX_STREAM_BITRATE}
|
|||||||
maxscreenbitrate = ${TALK_MAX_SCREEN_BITRATE}
|
maxscreenbitrate = ${TALK_MAX_SCREEN_BITRATE}
|
||||||
SIGNALING_CONF
|
SIGNALING_CONF
|
||||||
|
|
||||||
|
# Configure Janus to use the local TURN server for its own relay candidates.
|
||||||
|
# Ephemeral TURN credentials (TURN REST API pattern):
|
||||||
|
# username = "<expiry_unix_timestamp>:<random_hex>" (valid for 3 months)
|
||||||
|
# password = base64(HMAC-SHA1(TURN_SECRET, username))
|
||||||
|
# eturnal validates both the HMAC and the embedded expiry on every Allocate,
|
||||||
|
# so a captured credential stops working after at most 3 months.
|
||||||
|
JANUS_TURN_USER="$(( $(date +%s) + 7776000 )):$(openssl rand -hex 16)"
|
||||||
|
JANUS_TURN_PWD="$(printf '%s' "$JANUS_TURN_USER" | openssl dgst -sha1 -hmac "$TURN_SECRET" -binary | openssl base64)"
|
||||||
|
|
||||||
|
if [ -z "$TURN_DOMAIN" ]; then
|
||||||
|
TURN_DOMAIN="$NC_DOMAIN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build janus.jcfg: strip the entire nat block from the original and append a
|
||||||
|
# clean minimal one that points at the TURN server.
|
||||||
|
{
|
||||||
|
sed '/^nat:/,/^}/d' /usr/local/etc/janus/janus.jcfg
|
||||||
|
cat << NAT_CONF
|
||||||
|
nat: {
|
||||||
|
turn_server = "$TURN_DOMAIN"
|
||||||
|
turn_port = $TALK_PORT
|
||||||
|
turn_type = "udp"
|
||||||
|
turn_user = "$JANUS_TURN_USER"
|
||||||
|
turn_pwd = "$JANUS_TURN_PWD"
|
||||||
|
# The ice ignore list is set by janus by default, so also do this here
|
||||||
|
ice_ignore_list = "vmnet"
|
||||||
|
}
|
||||||
|
NAT_CONF
|
||||||
|
} > /conf/janus.jcfg
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
@@ -5,14 +5,7 @@ pidfile=/var/run/supervisord/supervisord.pid
|
|||||||
childlogdir=/var/log/supervisord/
|
childlogdir=/var/log/supervisord/
|
||||||
logfile_maxbytes=50MB
|
logfile_maxbytes=50MB
|
||||||
logfile_backups=10
|
logfile_backups=10
|
||||||
loglevel=error
|
loglevel=%(ENV_AIO_LOG_LEVEL)s
|
||||||
|
|
||||||
[program:eturnal]
|
|
||||||
stdout_logfile=/dev/stdout
|
|
||||||
stdout_logfile_maxbytes=0
|
|
||||||
stderr_logfile=/dev/stderr
|
|
||||||
stderr_logfile_maxbytes=0
|
|
||||||
command=eturnalctl foreground
|
|
||||||
|
|
||||||
[program:nats-server]
|
[program:nats-server]
|
||||||
stdout_logfile=/dev/stdout
|
stdout_logfile=/dev/stdout
|
||||||
@@ -20,14 +13,26 @@ stdout_logfile_maxbytes=0
|
|||||||
stderr_logfile=/dev/stderr
|
stderr_logfile=/dev/stderr
|
||||||
stderr_logfile_maxbytes=0
|
stderr_logfile_maxbytes=0
|
||||||
command=nats-server -c /etc/nats.conf
|
command=nats-server -c /etc/nats.conf
|
||||||
|
# Start first: signaling depends on NATS being available
|
||||||
|
priority=10
|
||||||
|
|
||||||
|
[program:eturnal]
|
||||||
|
stdout_logfile=/dev/stdout
|
||||||
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/stderr
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
command=eturnalctl foreground
|
||||||
|
# Start alongside Janus; independent of signaling
|
||||||
|
priority=20
|
||||||
|
|
||||||
[program:janus]
|
[program:janus]
|
||||||
stdout_logfile=/dev/stdout
|
stdout_logfile=/dev/stdout
|
||||||
stdout_logfile_maxbytes=0
|
stdout_logfile_maxbytes=0
|
||||||
stderr_logfile=/dev/stderr
|
stderr_logfile=/dev/stderr
|
||||||
stderr_logfile_maxbytes=0
|
stderr_logfile_maxbytes=0
|
||||||
# debug-level 3 means warning
|
command=janus --config=/conf/janus.jcfg --disable-colors --log-stdout --full-trickle --debug-level %(ENV_JANUS_LOG_LEVEL)s
|
||||||
command=janus --config=/usr/local/etc/janus/janus.jcfg --disable-colors --log-stdout --full-trickle --debug-level 3
|
# Start alongside eturnal; signaling connects to Janus via WebSocket
|
||||||
|
priority=20
|
||||||
|
|
||||||
[program:signaling]
|
[program:signaling]
|
||||||
stdout_logfile=/dev/stdout
|
stdout_logfile=/dev/stdout
|
||||||
@@ -35,3 +40,5 @@ stdout_logfile_maxbytes=0
|
|||||||
stderr_logfile=/dev/stderr
|
stderr_logfile=/dev/stderr
|
||||||
stderr_logfile_maxbytes=0
|
stderr_logfile_maxbytes=0
|
||||||
command=nextcloud-spreed-signaling -config /conf/signaling.conf
|
command=nextcloud-spreed-signaling -config /conf/signaling.conf
|
||||||
|
# Start last: depends on NATS (priority=10) and Janus (priority=20) being up
|
||||||
|
priority=30
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# syntax=docker/dockerfile:latest
|
# syntax=docker/dockerfile:latest
|
||||||
FROM golang:1.26.1-alpine3.23 AS go
|
FROM golang:1.26.3-alpine3.23 AS go
|
||||||
|
|
||||||
ENV WATCHTOWER_COMMIT_HASH=5a33e3c0aa3b2770c648a114b4a9d32e0a5b55ba
|
ENV WATCHTOWER_COMMIT_HASH=652c89577076f6bc6f2af4465217589641216ee3
|
||||||
|
|
||||||
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.14.4
|
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.16.1
|
||||||
|
|
||||||
FROM alpine:3.23.3
|
FROM alpine:3.23.4
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
apk upgrade --no-cache -a; \
|
apk upgrade --no-cache -a; \
|
||||||
@@ -25,4 +25,9 @@ USER root
|
|||||||
ENTRYPOINT ["/start.sh"]
|
ENTRYPOINT ["/start.sh"]
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
wud.watch="false" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Watchtower for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Watchtower auto-update service for Nextcloud All-in-One containers" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if socket is available and readable
|
# Check if socket is available and readable
|
||||||
if ! [ -e "/var/run/docker.sock" ]; then
|
if ! [ -e "/var/run/docker.sock" ]; then
|
||||||
echo "Docker socket is not available. Cannot continue."
|
echo "Docker socket is not available. Cannot continue."
|
||||||
@@ -17,7 +21,7 @@ if [ -f /run/.containerenv ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$CONTAINER_TO_UPDATE" ]; then
|
if [ -n "$CONTAINER_TO_UPDATE" ]; then
|
||||||
exec /watchtower --cleanup --debug --run-once "$CONTAINER_TO_UPDATE"
|
exec /watchtower --cleanup --log-level "$AIO_LOG_LEVEL" --run-once "$CONTAINER_TO_UPDATE"
|
||||||
else
|
else
|
||||||
echo "'CONTAINER_TO_UPDATE' is not set. Cannot update anything."
|
echo "'CONTAINER_TO_UPDATE' is not set. Cannot update anything."
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -24,4 +24,9 @@ ENTRYPOINT ["/start.sh"]
|
|||||||
|
|
||||||
LABEL com.centurylinklabs.watchtower.enable="false" \
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
wud.watch="false" \
|
wud.watch="false" \
|
||||||
org.label-schema.vendor="Nextcloud"
|
org.opencontainers.image.title="Whiteboard for Nextcloud AIO" \
|
||||||
|
org.opencontainers.image.description="Collaborative whiteboard service for Nextcloud All-in-One" \
|
||||||
|
org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \
|
||||||
|
org.opencontainers.image.vendor="Nextcloud" \
|
||||||
|
org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md"
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
nc -z "$REDIS_HOST" "$REDIS_PORT" || exit 0
|
nc -z "$REDIS_HOST" "$REDIS_PORT" || exit 0
|
||||||
nc -z 127.0.0.1 3002 || exit 1
|
nc -z 127.0.0.1 3002 || exit 1
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
export LOG_LEVEL="$AIO_LOG_LEVEL"
|
||||||
|
|
||||||
# Only start container if nextcloud is accessible
|
# Only start container if nextcloud is accessible
|
||||||
while ! nc -z "$REDIS_HOST" "$REDIS_PORT"; do
|
while ! nc -z "$REDIS_HOST" "$REDIS_PORT"; do
|
||||||
echo "Waiting for redis to start..."
|
echo "Waiting for redis to start..."
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<category>monitoring</category>
|
<category>monitoring</category>
|
||||||
<bugs>https://github.com/nextcloud/all-in-one/issues</bugs>
|
<bugs>https://github.com/nextcloud/all-in-one/issues</bugs>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="31" max-version="32"/>
|
<nextcloud min-version="32" max-version="33"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<settings>
|
<settings>
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ This container bundles caddy and auto-configures it for you. It also covers [vau
|
|||||||
- If you want to use this with [nextcloud-exporter](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter), make sure that you point `metrics.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for nextcloud-exporter.
|
- If you want to use this with [nextcloud-exporter](https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter), make sure that you point `metrics.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for nextcloud-exporter.
|
||||||
- If you want to use this with [local AI](https://github.com/nextcloud/all-in-one/tree/main/community-containers/local-ai), make sure that you point `ai.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for local AI.
|
- If you want to use this with [local AI](https://github.com/nextcloud/all-in-one/tree/main/community-containers/local-ai), make sure that you point `ai.your-nc-domain.com` to your server using a cname record so that caddy can get a certificate automatically for local AI.
|
||||||
- After the container was started the first time, you should see a new `nextcloud-aio-caddy` folder and inside there an `allowed-countries.txt` file when you open the files app with the default `admin` user. In there you can adjust the allowed country codes for caddy by adding them to the first line, e.g. `IT FR` would allow access from italy and france. Private ip-ranges are always allowed. Additionally, in order to activate this config, you need to get an account at https://dev.maxmind.com/geoip/geolite2-free-geolocation-data and download the `GeoLite2-Country.mmdb` and upload it with this exact name into the `nextcloud-aio-caddy` folder. Afterwards restart all containers from the AIO interface and your new config should be active!
|
- After the container was started the first time, you should see a new `nextcloud-aio-caddy` folder and inside there an `allowed-countries.txt` file when you open the files app with the default `admin` user. In there you can adjust the allowed country codes for caddy by adding them to the first line, e.g. `IT FR` would allow access from italy and france. Private ip-ranges are always allowed. Additionally, in order to activate this config, you need to get an account at https://dev.maxmind.com/geoip/geolite2-free-geolocation-data and download the `GeoLite2-Country.mmdb` and upload it with this exact name into the `nextcloud-aio-caddy` folder. Afterwards restart all containers from the AIO interface and your new config should be active!
|
||||||
- You can add your own Caddy configurations in `/data/caddy-imports/` inside the Caddy container (`sudo docker exec -it nextcloud-aio-caddy bash`). These will be imported on container startup. **Please note:** If you do not have CLI access to the server, you can now run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
|
- You can add your own Caddy configurations in the folder `nextcloud-aio-caddy/caddy-imports` in the files app of the default `admin` user. You need to create that folder manually. These will be imported on container startup.
|
||||||
|
- You can alternatively add your own Caddy configurations in `/data/caddy-imports/` inside the Caddy container (`sudo docker exec -it nextcloud-aio-caddy bash`). These will be imported on container startup. **Please note:** If you do not have CLI access to the server use the previous option or run docker commands via a web session by using this community container: https://github.com/nextcloud/all-in-one/tree/main/community-containers/container-management
|
||||||
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
|
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
|
||||||
- If you want to remove the container again and revert back to the default, you need to disable the container via the AIO-interface and follow https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#8-removing-the-reverse-proxy
|
- If you want to remove the container again and revert back to the default, you need to disable the container via the AIO-interface and follow https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#8-removing-the-reverse-proxy
|
||||||
|
|
||||||
|
|||||||
32
community-containers/home-assistant/home-assistant.json
Normal file
32
community-containers/home-assistant/home-assistant.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"aio_services_v1": [
|
||||||
|
{
|
||||||
|
"container_name": "nextcloud-aio-home-assistant",
|
||||||
|
"display_name": "Home Assistant",
|
||||||
|
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/home-assistant",
|
||||||
|
"image": "ghcr.io/home-assistant/home-assistant",
|
||||||
|
"image_tag": "stable",
|
||||||
|
"internal_port": "host",
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"init": false,
|
||||||
|
"environment": [
|
||||||
|
"TZ=%TIMEZONE%",
|
||||||
|
"DISABLE_JEMALLOC=true"
|
||||||
|
],
|
||||||
|
"cap_add": [
|
||||||
|
"NET_ADMIN",
|
||||||
|
"NET_RAW"
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"source": "nextcloud_aio_home_assistant",
|
||||||
|
"destination": "/config",
|
||||||
|
"writeable": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"backup_volumes": [
|
||||||
|
"nextcloud_aio_home_assistant"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
15
community-containers/home-assistant/readme.md
Normal file
15
community-containers/home-assistant/readme.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
## Home Assistant
|
||||||
|
This container bundles Home Assistant and auto-configures it for you.
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
- This container should only be run in home networks since Home Assistant is designed for local home automation.
|
||||||
|
- After adding and starting the container, you can visit `http://ip.address.of.this.server:8123` in order to set up your Home Assistant instance.
|
||||||
|
- The data of Home Assistant will be automatically included in AIOs backup solution!
|
||||||
|
- In order to access your Home Assistant outside the local network, you have to set up your own reverse proxy. You can set up a reverse proxy following [these instructions](https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md).
|
||||||
|
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
|
||||||
|
|
||||||
|
### Repository
|
||||||
|
https://github.com/home-assistant/core
|
||||||
|
|
||||||
|
### Maintainer
|
||||||
|
https://github.com/szaimen
|
||||||
@@ -34,6 +34,9 @@
|
|||||||
"enable_nvidia_gpu": true,
|
"enable_nvidia_gpu": true,
|
||||||
"backup_volumes": [
|
"backup_volumes": [
|
||||||
"nextcloud_aio_jellyfin"
|
"nextcloud_aio_jellyfin"
|
||||||
|
],
|
||||||
|
"depends_on": [
|
||||||
|
"nextcloud-aio-lldap"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ This container bundles Local AI and auto-configures it for you. It support hardw
|
|||||||
Documentation is available on the container repository. This documentation is regularly updated and is intended to be as simple and detailed as possible. Thanks for all your feedback!
|
Documentation is available on the container repository. This documentation is regularly updated and is intended to be as simple and detailed as possible. Thanks for all your feedback!
|
||||||
|
|
||||||
- See https://github.com/docjyJ/aio-local-ai-vulkan#getting-started for getting start with this container.
|
- See https://github.com/docjyJ/aio-local-ai-vulkan#getting-started for getting start with this container.
|
||||||
- See [this guide](https://github.com/nextcloud/all-in-one/discussions/5430) for how to improve AI task pickup speed
|
|
||||||
- Note that Nextcloud supports only one server for AI queries, so this container cannot be used at the same time as other AI containers.
|
- Note that Nextcloud supports only one server for AI queries, so this container cannot be used at the same time as other AI containers.
|
||||||
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
|
- See https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers how to add it to the AIO stack
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"display_name": "Prometheus Nextcloud Exporter",
|
"display_name": "Prometheus Nextcloud Exporter",
|
||||||
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter",
|
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nextcloud-exporter",
|
||||||
"image": "ghcr.io/xperimental/nextcloud-exporter",
|
"image": "ghcr.io/xperimental/nextcloud-exporter",
|
||||||
"image_tag": "0.9.0",
|
"image_tag": "0.9.1",
|
||||||
"internal_port": "9205",
|
"internal_port": "9205",
|
||||||
"restart": "unless-stopped",
|
"restart": "unless-stopped",
|
||||||
"ports": [
|
"ports": [
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user