mirror of
https://github.com/hoellen/docker-nextcloud.git
synced 2026-06-01 22:10:44 +00:00
Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a441bbddf4 | |||
| 936b72737d | |||
| debf69d30c | |||
| 0be740bcae | |||
| 2e11f73a89 | |||
| f607c77556 | |||
| 2bf6716730 | |||
| c0066eecfd | |||
| 9479b60887 | |||
| 27e084b9c0 | |||
| 2af3f5c9a0 | |||
| b6ffac045a | |||
| 0348170b5e | |||
| dab8d10667 | |||
| be6afd88f9 | |||
| fef4cd4a28 | |||
| 4a46899d8c | |||
| 9c8f6c8edb | |||
| 69000e35c3 | |||
| aae170a54d | |||
| 0205f7afeb | |||
| db1eaf50ed | |||
| d16bcc9a32 | |||
| 0c6f92a628 | |||
| b4b8e7f154 | |||
| fd021043c4 | |||
| f623065f7a | |||
| a277e11505 | |||
| 42b36e3c9b | |||
| 51b19a1236 | |||
| 4270518e02 | |||
| 78e4175f7f | |||
| 46828aed43 | |||
| 19dc754372 | |||
| 54e9f1feda | |||
| 2892342326 | |||
| a15384e7e5 | |||
| 5d5b8ebc1a | |||
| 921eec5693 | |||
| 1b0c1fb747 | |||
| a7ade2cbc4 | |||
| 3451a6219a | |||
| 16acf58089 | |||
| ae0277a368 | |||
| aeea888ef9 | |||
| ae5b0cfd0c | |||
| ee9d26963c | |||
| a5538adb2f | |||
| ee98f35852 | |||
| 2ceb05c146 | |||
| ee2760237f | |||
| 6aa67c63b5 | |||
| a0442ed1de | |||
| 74e06ec86d | |||
| ce390fc654 | |||
| 6facdfba4f | |||
| 60954e1ad7 | |||
| 539f41e25e | |||
| fa3fe52dd2 | |||
| 1528fc9a00 | |||
| cb21fa369e | |||
| 35f8a4f1ae | |||
| 34f40fe438 | |||
| aec283db22 | |||
| 6b6e52fbdc | |||
| e0cb8643f0 | |||
| 314cc8016d | |||
| 4f112a4cdb | |||
| 18e11abda1 | |||
| bf3c76a5f8 | |||
| dec3a7f789 | |||
| cedf7fc4c6 | |||
| 80704341e6 | |||
| 1ee6c08552 | |||
| 112339b5c8 | |||
| 2334b3e231 | |||
| 6adf9e6bf8 | |||
| 0bb63de5b4 | |||
| 0ee4012ae6 | |||
| 18da631215 | |||
| e627d1fd4c | |||
| 86012886af | |||
| de096e78a4 | |||
| 2d3fd8f5c3 | |||
| 9070495ad0 | |||
| 4ba3589149 | |||
| a7ba180598 | |||
| 4ea95f826a | |||
| 8451b3d94d | |||
| 9c24fd91b2 | |||
| 0bb5b1fa73 | |||
| b2fcf47b96 | |||
| be2aa5a6d8 | |||
| fb1d5d60ff | |||
| fe53018962 | |||
| 43a5b6bb6f | |||
| 93866f1171 | |||
| 06d89226c5 | |||
| d009280681 |
+36
-16
@@ -3,10 +3,12 @@ name: build
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches: [ version-24 ]
|
branches:
|
||||||
|
- master
|
||||||
|
- version-*
|
||||||
schedule:
|
schedule:
|
||||||
# Build the image regularly (each Friday)
|
# Build the image regularly (each Friday)
|
||||||
- cron: '23 04 * * 5'
|
- cron: "23 04 * * 5"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: ghcr.io
|
REGISTRY: ghcr.io
|
||||||
@@ -23,25 +25,26 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Extract version for tags
|
- name: Extract version for tags
|
||||||
run: |
|
run: |
|
||||||
echo "FULL_VERSION=$(grep -oP '(?<=NEXTCLOUD_VERSION=).*' Dockerfile | head -c6)" >> $GITHUB_ENV
|
BRANCH="${GITHUB_REF#refs/heads/}"
|
||||||
echo "MAJOR_VERSION=$(grep -oP '(?<=NEXTCLOUD_VERSION=).*' Dockerfile | head -c2)" >> $GITHUB_ENV
|
VERSION=$(grep -oP '(?<=NEXTCLOUD_VERSION=).*' Dockerfile)
|
||||||
|
[ "$BRANCH" = "master" ] && echo "BRANCH_VERSION=latest" >> $GITHUB_ENV
|
||||||
|
echo "FULL_VERSION=${VERSION:0:7}" >> $GITHUB_ENV
|
||||||
|
echo "MAJOR_VERSION=${VERSION:0:2}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Install cosign
|
- name: Install cosign
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: sigstore/cosign-installer@main
|
uses: sigstore/cosign-installer@v4.1.1
|
||||||
with:
|
|
||||||
cosign-release: 'v1.13.1'
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v4
|
||||||
|
|
||||||
- name: Login to registry
|
- name: Login to registry
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v4
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@@ -49,19 +52,36 @@ jobs:
|
|||||||
|
|
||||||
- name: Set Docker metadata
|
- name: Set Docker metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v3
|
uses: docker/metadata-action@v6
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
|
${{ env.BRANCH_VERSION }}
|
||||||
${{ env.FULL_VERSION }}
|
${{ env.FULL_VERSION }}
|
||||||
${{ env.MAJOR_VERSION }}
|
${{ env.MAJOR_VERSION }}
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and export Docker image to Docker
|
||||||
id: build-and-push
|
id: build
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v7
|
||||||
|
with:
|
||||||
|
load: true
|
||||||
|
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:testing
|
||||||
|
context: .
|
||||||
|
|
||||||
|
- name: Test Docker image
|
||||||
|
id: test
|
||||||
|
run: |
|
||||||
|
docker run -d -p 8888:8888 --name nextcloud --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:testing && \
|
||||||
|
sleep 5 && docker exec nextcloud occ status && \
|
||||||
|
nc -z localhost 8888
|
||||||
|
|
||||||
|
- name: Push Docker image
|
||||||
|
id: push
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/build-push-action@v7
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
@@ -69,4 +89,4 @@ jobs:
|
|||||||
if: ${{ github.event_name != 'pull_request' }}
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
env:
|
env:
|
||||||
COSIGN_EXPERIMENTAL: "true"
|
COSIGN_EXPERIMENTAL: "true"
|
||||||
run: cosign sign ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@${{ steps.build-and-push.outputs.digest }}
|
run: cosign sign --yes ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@${{ steps.push.outputs.digest }}
|
||||||
|
|||||||
+11
-11
@@ -3,27 +3,27 @@ name: scan
|
|||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
# Scan the image regularly (once a day)
|
# Scan the image regularly (once a day)
|
||||||
- cron: '45 03 * * *'
|
- cron: "45 03 * * *"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Scan current image & report results
|
name: Scan current image & report results
|
||||||
runs-on: "ubuntu-20.04"
|
runs-on: "ubuntu-24.04"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Run Trivy vulnerability scanner
|
- name: Run Trivy vulnerability scanner
|
||||||
uses: aquasecurity/trivy-action@master
|
uses: aquasecurity/trivy-action@v0.36.0
|
||||||
with:
|
with:
|
||||||
image-ref: 'ghcr.io/${{ github.actor }}/nextcloud'
|
image-ref: "ghcr.io/${{ github.actor }}/nextcloud"
|
||||||
format: 'template'
|
format: "template"
|
||||||
template: '@/contrib/sarif.tpl'
|
template: "@/contrib/sarif.tpl"
|
||||||
output: 'trivy-results.sarif'
|
output: "trivy-results.sarif"
|
||||||
severity: 'CRITICAL,HIGH'
|
severity: "CRITICAL,HIGH"
|
||||||
vuln-type: "os"
|
vuln-type: "os"
|
||||||
|
|
||||||
- name: Upload Trivy scan results to GitHub Security tab
|
- name: Upload Trivy scan results to GitHub Security tab
|
||||||
uses: github/codeql-action/upload-sarif@v1
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
with:
|
with:
|
||||||
sarif_file: 'trivy-results.sarif'
|
sarif_file: "trivy-results.sarif"
|
||||||
|
|||||||
+20
-16
@@ -1,24 +1,24 @@
|
|||||||
# -------------- Build-time variables --------------
|
# -------------- Build-time variables --------------
|
||||||
ARG NEXTCLOUD_VERSION=24.0.12
|
ARG NEXTCLOUD_VERSION=33.0.3
|
||||||
ARG PHP_VERSION=8.1
|
ARG PHP_VERSION=8.4
|
||||||
ARG NGINX_VERSION=1.22
|
ARG NGINX_VERSION=1.28
|
||||||
|
|
||||||
ARG ALPINE_VERSION=3.17
|
ARG ALPINE_VERSION=3.23
|
||||||
ARG HARDENED_MALLOC_VERSION=11
|
ARG HARDENED_MALLOC_VERSION=14
|
||||||
ARG SNUFFLEUPAGUS_VERSION=0.8.3
|
ARG SNUFFLEUPAGUS_VERSION=0.13.0
|
||||||
|
|
||||||
ARG UID=1000
|
ARG UID=1000
|
||||||
ARG GID=1000
|
ARG GID=1000
|
||||||
|
|
||||||
# nextcloud-24.0.12.tar.bz2
|
# nextcloud-33.0.3.tar.bz2
|
||||||
ARG SHA256_SUM="2f093bdf7d34faf38d22f38a5e11f3aee32746ff4add3df17c790b9b36390836"
|
ARG SHA256_SUM="5c1052f860b35aa56b24bc2613a6bea0c22313b9fbd02bb0247c1f0b9dbf77d2"
|
||||||
|
|
||||||
# Nextcloud Security <security@nextcloud.com> (D75899B9A724937A)
|
# Nextcloud Security <security@nextcloud.com> (D75899B9A724937A)
|
||||||
ARG GPG_FINGERPRINT="2880 6A87 8AE4 23A2 8372 792E D758 99B9 A724 937A"
|
ARG GPG_FINGERPRINT="2880 6A87 8AE4 23A2 8372 792E D758 99B9 A724 937A"
|
||||||
# ---------------------------------------------------
|
# ---------------------------------------------------
|
||||||
|
|
||||||
### Build PHP base
|
### Build PHP base
|
||||||
FROM php:${PHP_VERSION}-fpm-alpine${ALPINE_VERSION} as base
|
FROM docker.io/library/php:${PHP_VERSION}-fpm-alpine${ALPINE_VERSION} AS base
|
||||||
|
|
||||||
ARG SNUFFLEUPAGUS_VERSION
|
ARG SNUFFLEUPAGUS_VERSION
|
||||||
|
|
||||||
@@ -43,6 +43,7 @@ RUN apk -U upgrade \
|
|||||||
gmp \
|
gmp \
|
||||||
icu \
|
icu \
|
||||||
libjpeg-turbo \
|
libjpeg-turbo \
|
||||||
|
librsvg \
|
||||||
libpq \
|
libpq \
|
||||||
libpq \
|
libpq \
|
||||||
libwebp \
|
libwebp \
|
||||||
@@ -58,12 +59,14 @@ RUN apk -U upgrade \
|
|||||||
bcmath \
|
bcmath \
|
||||||
exif \
|
exif \
|
||||||
gd \
|
gd \
|
||||||
|
bz2 \
|
||||||
intl \
|
intl \
|
||||||
ldap \
|
ldap \
|
||||||
opcache \
|
opcache \
|
||||||
pcntl \
|
pcntl \
|
||||||
pdo_mysql \
|
pdo_mysql \
|
||||||
pdo_pgsql \
|
pdo_pgsql \
|
||||||
|
sysvsem \
|
||||||
zip \
|
zip \
|
||||||
gmp \
|
gmp \
|
||||||
&& pecl install smbclient \
|
&& pecl install smbclient \
|
||||||
@@ -82,25 +85,26 @@ RUN apk -U upgrade \
|
|||||||
|
|
||||||
### Build Hardened Malloc
|
### Build Hardened Malloc
|
||||||
ARG ALPINE_VERSION
|
ARG ALPINE_VERSION
|
||||||
FROM alpine:${ALPINE_VERSION} as build-malloc
|
FROM docker.io/library/alpine:${ALPINE_VERSION} AS build-malloc
|
||||||
|
|
||||||
ARG HARDENED_MALLOC_VERSION
|
ARG HARDENED_MALLOC_VERSION
|
||||||
ARG CONFIG_NATIVE=false
|
ARG CONFIG_NATIVE=false
|
||||||
ARG VARIANT=light
|
ARG VARIANT=light
|
||||||
|
|
||||||
RUN apk --no-cache add build-base git gnupg && cd /tmp \
|
RUN apk --no-cache add build-base git openssh && cd /tmp \
|
||||||
&& wget -q https://github.com/thestinger.gpg && gpg --import thestinger.gpg \
|
&& wget -q -O - https://github.com/thestinger.keys | while read -r key; do echo "thestinger@github.com $key"; done > allowed_signers \
|
||||||
&& git clone --depth 1 --branch ${HARDENED_MALLOC_VERSION} https://github.com/GrapheneOS/hardened_malloc \
|
&& git config --global gpg.ssh.allowedSignersFile /tmp/allowed_signers && git init hardened_malloc && cd hardened_malloc \
|
||||||
&& cd hardened_malloc && git verify-tag $(git describe --tags) \
|
&& git fetch --depth 1 https://github.com/GrapheneOS/hardened_malloc tag ${HARDENED_MALLOC_VERSION} \
|
||||||
|
&& git checkout FETCH_HEAD && git verify-tag $(git describe --tags) \
|
||||||
&& make CONFIG_NATIVE=${CONFIG_NATIVE} VARIANT=${VARIANT}
|
&& make CONFIG_NATIVE=${CONFIG_NATIVE} VARIANT=${VARIANT}
|
||||||
|
|
||||||
|
|
||||||
### Fetch nginx
|
### Fetch nginx
|
||||||
FROM nginx:${NGINX_VERSION}-alpine as nginx
|
FROM docker.io/library/nginx:${NGINX_VERSION}-alpine${ALPINE_VERSION} AS nginx
|
||||||
|
|
||||||
|
|
||||||
### Build Nextcloud (production environemnt)
|
### Build Nextcloud (production environemnt)
|
||||||
FROM base as nextcloud
|
FROM base AS nextcloud
|
||||||
|
|
||||||
COPY --from=nginx /usr/sbin/nginx /usr/sbin/nginx
|
COPY --from=nginx /usr/sbin/nginx /usr/sbin/nginx
|
||||||
COPY --from=nginx /etc/nginx /etc/nginx
|
COPY --from=nginx /etc/nginx /etc/nginx
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ ___
|
|||||||
- Includes **Snuffleupagus**, [a PHP security module](https://github.com/jvoisin/snuffleupagus).
|
- Includes **Snuffleupagus**, [a PHP security module](https://github.com/jvoisin/snuffleupagus).
|
||||||
- Includes a simple **built-in cron** system.
|
- Includes a simple **built-in cron** system.
|
||||||
- Much easier to maintain thanks to multi-stages build.
|
- Much easier to maintain thanks to multi-stages build.
|
||||||
- Does not include imagick, samba, etc. by default.
|
- Includes imagick and smbclient for extended file handling and SMB/CIFS support.
|
||||||
|
|
||||||
You're free to make your own image based on this one if you want a specific feature. Uncommon features won't be included as they can increase attack surface: this image intends to stay **minimal**, but **functional enough** to cover basic needs.
|
You're free to make your own image based on this one if you want a specific feature. Uncommon features won't be included as they can increase attack surface: this image intends to stay **minimal**, but **functional enough** to cover basic needs.
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ Don't run random images from random dudes on the Internet. Ideally, you want to
|
|||||||
- **Images are scanned every day** by [Trivy](https://github.com/aquasecurity/trivy) for OS vulnerabilities. Known vulnerabilities will be automatically uploaded to [GitHub Security Lab](https://github.com/Wonderfall/docker-nextcloud/security/code-scanning) for full transparency. This also warns me if I have to take action to fix a vulnerability.
|
- **Images are scanned every day** by [Trivy](https://github.com/aquasecurity/trivy) for OS vulnerabilities. Known vulnerabilities will be automatically uploaded to [GitHub Security Lab](https://github.com/Wonderfall/docker-nextcloud/security/code-scanning) for full transparency. This also warns me if I have to take action to fix a vulnerability.
|
||||||
- **Latest tag/version is automatically built weekly**, so you should often update your images regardless if you're already using the latest Nextcloud version.
|
- **Latest tag/version is automatically built weekly**, so you should often update your images regardless if you're already using the latest Nextcloud version.
|
||||||
- **Build production images without cache** (use `docker build --no-cache` for instance) if you want to build your images manually. Latest dependencies will hence be used instead of outdated ones due to a cached layer.
|
- **Build production images without cache** (use `docker build --no-cache` for instance) if you want to build your images manually. Latest dependencies will hence be used instead of outdated ones due to a cached layer.
|
||||||
- **A security module for PHP called [Snuffleupagus](https://github.com/jvoisin/snuffleupagus) is used by default**. This module aims at killing entire bug and security exploit classes (including XXE, weak PRNG, file-upload based code execution), thus raising the cost of attacks. For now we're using a configuration file derived from [the default one](https://github.com/jvoisin/snuffleupagus/blob/master/config/default_php8.rules), with some explicit exceptions related to Nextcloud. This configuration file is tested and shouldn't break basic functionality, but it can cause issues in specific and untested use cases: if that happens to you, get logs from either `syslog` or `/nginx/logs/error.log` inside the container, and [open an issue](https://github.com/hoellen/docker-nextcloud/issues). You can also disable the security module altogether by changing the `PHP_HARDENING` environment variable to `false` before recreating the container.
|
- **A security module for PHP called [Snuffleupagus](https://github.com/jvoisin/snuffleupagus) is used by default**. This module aims at killing entire bug and security exploit classes (including weak PRNG, file-upload based code execution), thus raising the cost of attacks. For now we're using a configuration file derived from [the default one](https://github.com/jvoisin/snuffleupagus/blob/master/config/default_php8.rules), with some explicit exceptions related to Nextcloud. This configuration file is tested and shouldn't break basic functionality, but it can cause issues in specific and untested use cases: if that happens to you, get logs from either `syslog` or `/nginx/logs/error.log` inside the container, and [open an issue](https://github.com/hoellen/docker-nextcloud/issues). You can also disable the security module altogether by changing the `PHP_HARDENING` environment variable to `false` before recreating the container.
|
||||||
- **Images are signed with the GitHub-provided OIDC token in Actions** using the experimental "keyless" signing feature provided by [cosign](https://github.com/sigstore/cosign). You can verify the image signature using `cosign` as well:
|
- **Images are signed with the GitHub-provided OIDC token in Actions** using the experimental "keyless" signing feature provided by [cosign](https://github.com/sigstore/cosign). You can verify the image signature using `cosign` as well:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -58,8 +58,8 @@ Verifying the signature isn't a requirement, and might not be as seamless as usi
|
|||||||
## Tags
|
## Tags
|
||||||
|
|
||||||
- `latest` : latest Nextcloud version
|
- `latest` : latest Nextcloud version
|
||||||
- `x` : latest Nextcloud x.x (e.g. `24`)
|
- `x` : latest Nextcloud x.x (e.g. `33`)
|
||||||
- `x.x.x` : Nextcloud x.x.x (e.g. `24.0.0`)
|
- `x.x.x` : Nextcloud x.x.x (e.g. `33.0.0`)
|
||||||
|
|
||||||
You can always have a glance [here](https://github.com/users/hoellen/packages/container/package/nextcloud).
|
You can always have a glance [here](https://github.com/users/hoellen/packages/container/package/nextcloud).
|
||||||
Only the **latest stable version** will be maintained by myself.
|
Only the **latest stable version** will be maintained by myself.
|
||||||
|
|||||||
+16
-5
@@ -6,12 +6,22 @@ All versions of the Nextcloud community version which still receive updates will
|
|||||||
and will receive the minor version updates and security patches.
|
and will receive the minor version updates and security patches.
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ----------------------------- |
|
||||||
| 24. x | :white_check_mark: |
|
| 33. x | :white_check_mark: |
|
||||||
| 23. x | :white_check_mark: |
|
| 32. x | :white_check_mark: |
|
||||||
| 22. x | :white_check_mark: |
|
| 31. x | :negative_squared_cross_mark: |
|
||||||
|
| 30. x | :negative_squared_cross_mark: |
|
||||||
|
| 29. x | :negative_squared_cross_mark: |
|
||||||
|
| 28. x | :negative_squared_cross_mark: |
|
||||||
|
| 27. x | :negative_squared_cross_mark: |
|
||||||
|
| 26. x | :negative_squared_cross_mark: |
|
||||||
|
| 25. x | :negative_squared_cross_mark: |
|
||||||
|
| 24. x | :negative_squared_cross_mark: |
|
||||||
|
| 23. x | :negative_squared_cross_mark: |
|
||||||
|
| 22. x | :negative_squared_cross_mark: |
|
||||||
|
|
||||||
Please update to the latest version available. Major migrations are always tested before being pushed.
|
Please update to the latest version available. Major migrations are always tested before being pushed.
|
||||||
|
An up-to-date list of the currently maintained Nextcloud versions can also be found in the [Nextcloud Repository Wiki](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule).
|
||||||
|
|
||||||
## Automated vulnerability scanning
|
## Automated vulnerability scanning
|
||||||
|
|
||||||
@@ -19,9 +29,10 @@ Uploaded images are regularly scanned for [OS vulnerabilities](https://github.co
|
|||||||
|
|
||||||
## Reporting a vulnerability
|
## Reporting a vulnerability
|
||||||
|
|
||||||
*Upstream* vulnerabilities should be reported to *upstream* projects according to their own security policies.
|
_Upstream_ vulnerabilities should be reported to _upstream_ projects according to their own security policies.
|
||||||
|
|
||||||
Regarding vulnerabilities specific to this project:
|
Regarding vulnerabilities specific to this project:
|
||||||
|
|
||||||
- Faulty configuration files
|
- Faulty configuration files
|
||||||
- Unsafe defaults
|
- Unsafe defaults
|
||||||
- Dependencies security updates
|
- Dependencies security updates
|
||||||
|
|||||||
@@ -1,28 +1,21 @@
|
|||||||
map $http_x_forwarded_port $nc_port {
|
|
||||||
default "$http_x_forwarded_port";
|
|
||||||
'' "$server_port";
|
|
||||||
}
|
|
||||||
|
|
||||||
map $http_x_forwarded_proto $nc_proto {
|
|
||||||
default "$http_x_forwarded_proto";
|
|
||||||
'' "$scheme";
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 8888;
|
listen 8888;
|
||||||
|
listen [::]:8888;
|
||||||
root /nextcloud;
|
root /nextcloud;
|
||||||
|
|
||||||
|
# Emit relative redirects (protocol handled by reverse proxy)
|
||||||
|
absolute_redirect off;
|
||||||
|
|
||||||
fastcgi_buffers 64 4K;
|
fastcgi_buffers 64 4K;
|
||||||
fastcgi_hide_header X-Powered-By;
|
fastcgi_hide_header X-Powered-By;
|
||||||
large_client_header_buffers 4 16k;
|
large_client_header_buffers 4 16k;
|
||||||
|
client_body_timeout 300s;
|
||||||
|
|
||||||
add_header Referrer-Policy "no-referrer" always;
|
add_header Referrer-Policy "no-referrer" always;
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
add_header X-Download-Options "noopen" always;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
||||||
add_header X-Robots-Tag "none" always;
|
add_header X-Robots-Tag "noindex, nofollow" always;
|
||||||
add_header X-XSS-Protection "0" always;
|
|
||||||
|
|
||||||
location = /robots.txt {
|
location = /robots.txt {
|
||||||
allow all;
|
allow all;
|
||||||
@@ -31,14 +24,18 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location ^~ /.well-known {
|
location ^~ /.well-known {
|
||||||
location = /.well-known/carddav { return 301 $nc_proto://$host/remote.php/dav; }
|
location = /.well-known/carddav { return 301 /remote.php/dav/; }
|
||||||
location = /.well-known/caldav { return 301 $nc_proto://$host/remote.php/dav; }
|
location = /.well-known/caldav { return 301 /remote.php/dav/; }
|
||||||
location ^~ /.well-known { return 301 $nc_proto://$host/index.php$uri; }
|
|
||||||
try_files $uri $uri/ =404;
|
return 301 /index.php$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
rewrite ^ /index.php$uri;
|
rewrite ^ /index.php$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /remote {
|
||||||
|
return 301 /remote.php$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
|
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
|
||||||
@@ -49,9 +46,9 @@ server {
|
|||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
|
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy)\.php(?:$|\/) {
|
||||||
include /etc/nginx/fastcgi_params;
|
include /etc/nginx/fastcgi_params;
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
fastcgi_param modHeadersAvailable true;
|
fastcgi_param modHeadersAvailable true;
|
||||||
@@ -62,25 +59,20 @@ server {
|
|||||||
fastcgi_read_timeout 1200;
|
fastcgi_read_timeout 1200;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
|
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
|
||||||
try_files $uri/ =404;
|
try_files $uri/ =404;
|
||||||
index index.php;
|
index index.php;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.(?:css|js|svg|gif|map)$ {
|
location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|jpeg|png|webp|wasm|tflite|map|ogg|flac|mp4|webm)$ {
|
||||||
try_files $uri /index.php$uri$is_args$args;
|
try_files $uri /index.php$request_uri;
|
||||||
expires 6M;
|
expires 6M;
|
||||||
access_log off;
|
access_log off;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.woff2?$ {
|
location ~ \.(otf|woff2?)$ {
|
||||||
try_files $uri /index.php$uri$is_args$args;
|
try_files $uri /index.php$request_uri;
|
||||||
expires 7d;
|
expires 7d;
|
||||||
access_log off;
|
access_log off;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
|
|
||||||
try_files $uri /index.php$uri$is_args$args;
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,11 @@ events {
|
|||||||
|
|
||||||
http {
|
http {
|
||||||
include /etc/nginx/mime.types;
|
include /etc/nginx/mime.types;
|
||||||
|
# Add .mjs as a file extension for javascript
|
||||||
|
# https://github.com/nextcloud/server/pull/36057
|
||||||
|
types {
|
||||||
|
application/javascript mjs;
|
||||||
|
}
|
||||||
default_type application/octet-stream;
|
default_type application/octet-stream;
|
||||||
|
|
||||||
access_log /nginx/logs/access.log combined;
|
access_log /nginx/logs/access.log combined;
|
||||||
|
|||||||
@@ -15,6 +15,16 @@ if [ "$PHP_HARDENING" == "true" ] && [ ! -f /usr/local/etc/php/conf.d/snuffleupa
|
|||||||
cp /usr/local/etc/php/snuffleupagus/* /usr/local/etc/php/conf.d
|
cp /usr/local/etc/php/snuffleupagus/* /usr/local/etc/php/conf.d
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if database is available
|
||||||
|
if [ -n "${DB_TYPE}" ] && [ "${DB_TYPE}" != "sqlite3" ]; then
|
||||||
|
DB_PORT=${DB_PORT:-$( [ "${DB_TYPE}" = "pgsql" ] && echo 5432 || echo 3306 )}
|
||||||
|
until nc -z "${DB_HOST:-nextcloud-db}" "${DB_PORT}"
|
||||||
|
do
|
||||||
|
echo "waiting for the database container..."
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
# If new install, run setup
|
# If new install, run setup
|
||||||
if [ ! -f /nextcloud/config/config.php ]; then
|
if [ ! -f /nextcloud/config/config.php ]; then
|
||||||
touch /nextcloud/config/CAN_INSTALL
|
touch /nextcloud/config/CAN_INSTALL
|
||||||
@@ -24,4 +34,4 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Run processes
|
# Run processes
|
||||||
exec /bin/s6-svscan /etc/s6.d
|
exec /usr/bin/s6-svscan /etc/s6.d
|
||||||
|
|||||||
@@ -55,14 +55,6 @@ cat >> /nextcloud/config/autoconfig.php <<EOF;
|
|||||||
?>
|
?>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [ ${DB_TYPE} != "sqlite3" ]; then
|
|
||||||
until nc -z "${DB_HOST:-nextcloud-db}" "${DB_PORT:-3306}"
|
|
||||||
do
|
|
||||||
echo "waiting for the database container..."
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Starting automatic configuration..."
|
echo "Starting automatic configuration..."
|
||||||
# Execute setup
|
# Execute setup
|
||||||
(cd /nextcloud; php index.php &>/dev/null)
|
(cd /nextcloud; php index.php &>/dev/null)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
zend_extension=opcache.so
|
zend_extension=opcache.so
|
||||||
opcache.enable=1
|
opcache.enable=1
|
||||||
opcache.enable_cli=1
|
opcache.enable_cli=1
|
||||||
opcache.fast_shutdown=1
|
|
||||||
opcache.memory_consumption=<OPCACHE_MEM_SIZE>
|
opcache.memory_consumption=<OPCACHE_MEM_SIZE>
|
||||||
opcache.interned_strings_buffer=16
|
opcache.interned_strings_buffer=16
|
||||||
opcache.max_accelerated_files=10000
|
opcache.max_accelerated_files=10000
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
sp.harden_random.enable();
|
sp.harden_random.enable();
|
||||||
|
|
||||||
# Disabled XXE
|
# Disabled XXE
|
||||||
sp.xxe_protection.enable();
|
#sp.xxe_protection.enable();
|
||||||
|
|
||||||
# Global configuration variables
|
# Global configuration variables
|
||||||
# sp.global.secret_key("YOU _DO_ NEED TO CHANGE THIS WITH SOME RANDOM CHARACTERS.");
|
# sp.global.secret_key("YOU _DO_ NEED TO CHANGE THIS WITH SOME RANDOM CHARACTERS.");
|
||||||
@@ -34,16 +34,22 @@ sp.sloppy_comparison.enable();
|
|||||||
# https://snuffleupagus.readthedocs.io/features.html#protection-against-cross-site-request-forgery
|
# https://snuffleupagus.readthedocs.io/features.html#protection-against-cross-site-request-forgery
|
||||||
sp.cookie.name("PHPSESSID").samesite("lax");
|
sp.cookie.name("PHPSESSID").samesite("lax");
|
||||||
|
|
||||||
# Nextcloud whitelist (tested with Nextcloud 24.0.0)
|
# Nextcloud whitelist (tested with Nextcloud 27.0.1)
|
||||||
sp.disable_function.function("function_exists").param("function").value("proc_open").filename("/nextcloud/3rdparty/symfony/console/Terminal.php").allow();
|
sp.disable_function.function("function_exists").param("function").value("proc_open").filename("/nextcloud/3rdparty/symfony/console/Terminal.php").allow();
|
||||||
|
sp.disable_function.function("function_exists").param("function").value("exec").filename("/nextcloud/lib/private/legacy/OC_Helper.php").allow();
|
||||||
|
sp.disable_function.function("function_exists").param("function").value("exec").filename("/nextcloud/lib/public/Util.php").allow();
|
||||||
sp.disable_function.function("proc_open").filename("/nextcloud/3rdparty/symfony/console/Terminal.php").allow();
|
sp.disable_function.function("proc_open").filename("/nextcloud/3rdparty/symfony/console/Terminal.php").allow();
|
||||||
sp.disable_function.function("ini_set").param("option").value_r("display_errors").filename("/nextcloud/lib/base.php").allow();
|
sp.disable_function.function("ini_set").param("option").value_r("display_errors").filename("/nextcloud/lib/base.php").allow();
|
||||||
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/3rdparty/bantu/ini-get-wrapper/src/IniGetWrapper.php").allow();
|
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/3rdparty/bantu/ini-get-wrapper/src/IniGetWrapper.php").allow();
|
||||||
sp.disable_function.function("function_exists").param("function").value("exec").filename("/nextcloud/lib/private/legacy/OC_Helper.php").allow();
|
|
||||||
sp.disable_function.function("ini_get").param("option").value_r("suhosin").filename("/nextcloud/3rdparty/bantu/ini-get-wrapper/src/IniGetWrapper.php").allow();
|
sp.disable_function.function("ini_get").param("option").value_r("suhosin").filename("/nextcloud/3rdparty/bantu/ini-get-wrapper/src/IniGetWrapper.php").allow();
|
||||||
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/apps2/twofactor_webauthn/vendor/symfony/process/ExecutableFinder.php").allow();
|
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/apps2/twofactor_webauthn/vendor/symfony/process/ExecutableFinder.php").allow();
|
||||||
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/3rdparty/symfony/process/ExecutableFinder.php").allow();
|
sp.disable_function.function("ini_get").param("option").value("open_basedir").filename("/nextcloud/3rdparty/symfony/process/ExecutableFinder.php").allow();
|
||||||
sp.disable_function.function("ini_get").param("option").value("allow_url_fopen").filename("/nextcloud/3rdparty/guzzlehttp/guzzle/src/Utils.php").allow();
|
sp.disable_function.function("ini_get").param("option").value("allow_url_fopen").filename("/nextcloud/3rdparty/guzzlehttp/guzzle/src/Utils.php").allow();
|
||||||
|
sp.disable_function.function("exec").param("command").value("apachectl -M | grep mpm").filename("/nextcloud/apps2/spreed/lib/Settings/Admin/AdminSettings.php").allow();
|
||||||
|
|
||||||
|
# Nextcloud inherently enables XXE-Protection since 27.0.1, therefore, drop setting a new external entity loader
|
||||||
|
sp.disable_function.function("libxml_set_external_entity_loader").filename("/nextcloud/lib/base.php").allow();
|
||||||
|
sp.disable_function.function("libxml_set_external_entity_loader").drop();
|
||||||
|
|
||||||
# Harden the `chmod` function (0777 (oct = 511, 0666 = 438)
|
# Harden the `chmod` function (0777 (oct = 511, 0666 = 438)
|
||||||
sp.disable_function.function("chmod").param("permissions").value("438").drop();
|
sp.disable_function.function("chmod").param("permissions").value("438").drop();
|
||||||
|
|||||||
Reference in New Issue
Block a user