From 190490bbb9e88fa8f22994b2ba1058af7e73df33 Mon Sep 17 00:00:00 2001 From: nextcloud-command Date: Tue, 5 May 2026 14:13:21 +0000 Subject: [PATCH 1/3] chore: update .github/workflows/sphinxbuild.yml from master branch Signed-off-by: GitHub --- .github/workflows/sphinxbuild.yml | 342 +++++++++++++++++++++++++++--- 1 file changed, 312 insertions(+), 30 deletions(-) diff --git a/.github/workflows/sphinxbuild.yml b/.github/workflows/sphinxbuild.yml index 3558ba0a767..8f74692f149 100644 --- a/.github/workflows/sphinxbuild.yml +++ b/.github/workflows/sphinxbuild.yml @@ -9,9 +9,10 @@ on: permissions: contents: read + packages: write concurrency: - group: build-documentation-${{ github.head_ref || github.run_id }} + group: build-documentation-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: @@ -76,20 +77,84 @@ jobs: name: ${{ matrix.manual.name }} path: ${{ matrix.manual.directory }}/${{ matrix.manual.build_path }} + # ============================================================================ + # PREPARE PDF IMAGE + # ============================================================================ + # Detects whether .devcontainer/Dockerfile changed in this run. + # - If it changed: builds a fresh image, pushes it to GHCR with a SHA tag, + # and outputs that tag so build-pdf uses the new image immediately. + # - If it did not change: outputs the stable ghcr.io/.../sphinx-latex:latest + # tag so build-pdf uses the already-published image. + # ============================================================================ + prepare-pdf-image: + name: Prepare PDF build image + runs-on: ubuntu-latest + + outputs: + image: ${{ steps.result.outputs.image }} + + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 2 + + - name: Check whether Dockerfile changed + id: changed + run: | + if git diff --name-only HEAD^ HEAD -- .devcontainer/Dockerfile 2>/dev/null | grep -q .; then + echo "dockerfile_changed=true" >> $GITHUB_OUTPUT + else + echo "dockerfile_changed=false" >> $GITHUB_OUTPUT + fi + + - name: Set up Docker Buildx + if: steps.changed.outputs.dockerfile_changed == 'true' + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + + - name: Login to GitHub Container Registry + if: steps.changed.outputs.dockerfile_changed == 'true' + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push image with SHA tag + if: steps.changed.outputs.dockerfile_changed == 'true' + uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 + with: + context: .devcontainer + push: true + tags: ghcr.io/${{ github.repository }}/sphinx-latex:sha-${{ github.sha }} + cache-from: type=registry,ref=ghcr.io/${{ github.repository }}/sphinx-latex:latest + cache-to: type=inline + + - name: Output image reference + id: result + run: | + if [ "${{ steps.changed.outputs.dockerfile_changed }}" = "true" ]; then + echo "image=ghcr.io/${{ github.repository }}/sphinx-latex:sha-${{ github.sha }}" >> $GITHUB_OUTPUT + else + echo "image=ghcr.io/${{ github.repository }}/sphinx-latex:latest" >> $GITHUB_OUTPUT + fi + # ============================================================================ # BUILD PDF # ============================================================================ # Builds the PDF documentation using the pre-built sphinx-latex Docker image. # The image already contains all LaTeX packages, so no apt install is needed. - # Starts immediately without waiting for any setup job. + # Uses the image prepared by the prepare-pdf-image job: either the stable + # ghcr.io/.../sphinx-latex:latest image or a freshly built SHA-tagged image + # if .devcontainer/Dockerfile changed in this run. # ============================================================================ build-pdf: name: Building ${{ matrix.manual.name }} PDF runs-on: ubuntu-latest - # Use the pre-built sphinx-latex image which has all LaTeX packages pre-installed. - # The image is built from .docker/sphinx-latex/Dockerfile by the docker-build.yml workflow - # and published to GHCR. Using latest ensures we always use the current image for this repo. - container: ghcr.io/nextcloud/documentation/sphinx-latex:latest + needs: prepare-pdf-image + # Use the image prepared by prepare-pdf-image: either the stable ghcr image + # or a freshly built SHA-tagged image if .devcontainer/Dockerfile changed. + container: ${{ needs.prepare-pdf-image.outputs.image }} strategy: fail-fast: false @@ -185,22 +250,6 @@ jobs: with: path: artifacts/ - # ======================================================================== - # PREPARE FOR LINK VALIDATION: BUILD FULL PAGE CONTEXT - # ======================================================================== - # We need to validate links in the new documentation, but some links may - # point to other versions or branches that are already deployed. So we: - # 1. Fetch the existing gh-pages content (old versions) - # 2. Merge in the new artifacts (what we're about to deploy) - # 3. Run link checks only on the NEW content, but with full context - # ======================================================================== - - name: Checkout gh-pages branch for validation context - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - ref: gh-pages - fetch-depth: 1 - path: validation-context - # ======================================================================== # DETERMINE DEPLOYMENT TARGETS (branch_name and version_name) # ======================================================================== @@ -307,8 +356,7 @@ jobs: # ======================================================================== # UPLOAD STAGING ARTIFACTS # ======================================================================== - # Upload the staging folder for use in deploy job. - # This makes the content visible in the UI for debugging and inspection. + # Upload the staging folder for use in both the deploy and link-check jobs. # ======================================================================== - name: Upload staged artifacts uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -317,6 +365,54 @@ jobs: path: stage/ retention-days: 1 + # ============================================================================ + # LINK CHECK + # ============================================================================ + # Runs in parallel with deploy. Downloads the staged artifacts, strips + # canonical links, then runs lychee against the new content only. + # ============================================================================ + link-check: + name: Check for broken links + needs: stage-and-check + runs-on: ubuntu-latest + + steps: + - name: Download staged artifacts + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: staged-docs + path: stage/ + + - name: Strip canonical links from validation HTML + run: | + find "stage/${{ needs.stage-and-check.outputs.branch_name }}" -name '*.html' -print0 | while IFS= read -r -d '' f; do + perl -0pi -e 's{^\s*\n}{}m' "$f" + done + ls -la stage/* + + # We need to exclude certain links from the check: + # - go.php: This is a special redirect page + # - mailto: links: These are not valid URLs and will always fail + # - 404.html: This is not necessary + # - latest/stable/xx links from the version selector + - name: Check for broken links with lychee + uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 + with: + fail: true + token: ${{ secrets.GITHUB_TOKEN }} + jobSummary: true + args: | + --root-dir "$(pwd)/stage" + --offline --no-progress + --remap "https://docs.nextcloud.com/server/latest/ file://$(pwd)/stage/${{ needs.stage-and-check.outputs.branch_name }}/" + --remap "https://docs.nextcloud.com/server/ file://$(pwd)/stage/" + --exclude 'go\.php' --exclude 'mailto:' --exclude-path '.*/404\.html' --exclude-path '.*/_static/.*' + --exclude "/user_manual/" --include "/user_manual/en/" + --exclude '^file://.*/stage/(latest|stable|[0-9]+)/(developer_manual|admin_manual|user_manual)/?$' + 'stage/${{ needs.stage-and-check.outputs.branch_name }}/user_manual/en/**/*.html' + 'stage/${{ needs.stage-and-check.outputs.branch_name }}/admin_manual/**/*.html' + 'stage/${{ needs.stage-and-check.outputs.branch_name }}/developer_manual/**/*.html' + # ============================================================================ # DEPLOY # ============================================================================ @@ -459,8 +555,195 @@ jobs: env: GH_TOKEN: ${{ secrets.COMMAND_BOT_PAT }} + # ============================================================================ + # NETLIFY PREVIEW + # ============================================================================ + # Runs only on pull requests, in parallel with link-check. + # Downloads the staged-docs artifact (already produced by stage-and-check) + # and deploys a preview to Netlify under a stable per-PR alias. + # + # Required repository secrets: + # NETLIFY_AUTH_TOKEN – personal-access token for the Netlify account + # NETLIFY_SITE_ID – the target Netlify site ID + # + # Failure is non-fatal: the step uses continue-on-error so a missing secret + # or a Netlify outage does not block the pull request. + # ============================================================================ + netlify-preview: + name: Deploy Netlify preview + needs: stage-and-check + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + + permissions: + contents: read + pull-requests: write + + steps: + - name: Download staged artifacts + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: staged-docs + path: stage/ + + - name: Assemble Netlify deploy directory + run: | + branch="${{ needs.stage-and-check.outputs.branch_name }}" + mkdir -p netlify-deploy + + # Copy each manual directory into the deploy directory + for manual in admin_manual developer_manual user_manual; do + if [ -d "stage/${branch}/${manual}" ]; then + cp -r "stage/${branch}/${manual}" "netlify-deploy/${manual}" + fi + done + + # PDF files (kept at root of deploy dir) + find "stage/${branch}" -maxdepth 1 -name "*.pdf" -exec cp {} netlify-deploy/ \; + + # Minimal root index linking to the deployed content + cat > netlify-deploy/index.html <<'EOF' + + + + + + Nextcloud Documentation Preview + + + +

Nextcloud Documentation Preview

+ + + + EOF + + - name: List deploy directory tree + run: find netlify-deploy -print | sort + + - name: Install Netlify CLI + run: npm install -g netlify-cli + + - name: Deploy to Netlify + id: netlify + continue-on-error: true + run: | + set +e + output=$(netlify deploy \ + --dir=netlify-deploy \ + --site="${{ secrets.NETLIFY_SITE_ID }}" \ + --auth="${{ secrets.NETLIFY_AUTH_TOKEN }}" \ + --alias="pr-${{ github.event.pull_request.number }}" \ + --message="Preview for PR #${{ github.event.pull_request.number }}" 2>&1) + exit_code=$? + echo "$output" + # Strip ANSI codes, then extract the URL from "Draft URL: " + preview_url=$(printf '%s\n' "$output" \ + | sed 's/\x1b\[[0-9;]*[mGKHFJABCDsuKl]//g' \ + | grep -oP '(?:Draft URL|Website Draft URL|Website URL):\s+\s]+' \ + | head -1) + echo "url=${preview_url}" >> "$GITHUB_OUTPUT" + exit $exit_code + + - name: Post PR preview comment + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + PREVIEW_URL: ${{ steps.netlify.outputs.url }} + with: + script: | + const previewUrl = process.env.PREVIEW_URL || ''; + const prNumber = context.payload.pull_request.number; + const MAX_LINKS = 20; + const COMMENT_MARKER = ''; + const updatedAt = new Date().toUTCString(); + + // Fetch all changed files in the PR (auto-paginated) + const allFiles = await github.paginate(github.rest.pulls.listFiles, { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + per_page: 100, + }); + + // Keep only RST files that live inside a built manual + const manuals = ['admin_manual/', 'developer_manual/', 'user_manual/']; + const rstFiles = allFiles + .map(f => f.filename) + .filter(f => manuals.some(m => f.startsWith(m)) && f.endsWith('.rst')); + + // Build the changed-pages section + let changedSection = ''; + if (previewUrl && rstFiles.length > 0) { + const links = rstFiles.map(f => { + // user_manual HTML is deployed under user_manual/en/; other manuals deploy as-is + const htmlPath = f.startsWith('user_manual/') + ? f.replace(/^user_manual\//, 'user_manual/en/').replace(/\.rst$/, '.html') + : f.replace(/\.rst$/, '.html'); + return `- [${f}](${previewUrl}/${htmlPath})`; + }); + const shown = links.slice(0, MAX_LINKS); + const extra = links.length - shown.length; + const extraLine = extra > 0 + ? `\n_…and ${extra} more. [View all changed files](https://github.com/${context.repo.owner}/${context.repo.repo}/pull/${prNumber}/files)_` + : ''; + changedSection = [ + '', + `
`, + `πŸ“„ ${rstFiles.length} changed documentation ${rstFiles.length === 1 ? 'page' : 'pages'}`, + '', + shown.join('\n') + extraLine, + '
', + ].join('\n'); + } else if (rstFiles.length === 0) { + changedSection = '\n_No RST documentation pages changed in this PR._'; + } + + // Compose the full comment body + const previewLine = previewUrl + ? `πŸ” **[Open preview β†’](${previewUrl})**` + : '⚠️ Preview deployment failed or was skipped.'; + const body = [ + COMMENT_MARKER, + '## πŸ“– Documentation Preview', + '', + previewLine, + changedSection, + '', + `_Last updated: ${updatedAt}_`, + ].join('\n'); + + // Update existing bot comment or create a new one + const comments = await github.paginate(github.rest.issues.listComments, { + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + per_page: 100, + }); + const existing = comments.find(c => c.body && c.body.includes(COMMENT_MARKER)); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body, + }); + } + summary: - needs: [build-html, build-pdf, stage-and-check, deploy] + needs: [stage-and-check, link-check, deploy, netlify-preview] runs-on: ubuntu-latest-low if: always() @@ -474,10 +757,9 @@ jobs: run: | if ${{ github.event_name == 'pull_request' }} then - echo "This workflow ran for a pull request. We need build-html, build-pdf and stage-and-check to succeed, but deploy will be skipped" - if ${{ needs.build-html.result != 'success' || needs.build-pdf.result != 'success' || needs.stage-and-check.result != 'success' || needs.deploy.result != 'skipped' }}; then exit 1; fi + echo "This workflow ran for a pull request. We need stage-and-check, link-check, and netlify-preview to succeed, and deploy must be skipped" + if ${{ needs.stage-and-check.result != 'success' || needs.link-check.result != 'success' || needs.deploy.result != 'skipped' || needs.netlify-preview.result != 'success' }}; then exit 1; fi else - echo "This workflow ran for a push. We need all jobs to succeed, including deploy" - if ${{ needs.build-html.result != 'success' || needs.build-pdf.result != 'success' || needs.stage-and-check.result != 'success' || needs.deploy.result != 'success' }}; then exit 1; fi + echo "This workflow ran for a push. We need stage-and-check, link-check, and deploy to succeed; netlify-preview must be skipped" + if ${{ needs.stage-and-check.result != 'success' || needs.link-check.result != 'success' || needs.deploy.result != 'success' || needs.netlify-preview.result != 'skipped' }}; then exit 1; fi fi - From 86ad42692e6b783b8438e86b6814669f0a0cadb3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 19:19:29 +0000 Subject: [PATCH 2/3] fix: apply link fixes from PR #14231 and add version remap to lychee Agent-Logs-Url: https://github.com/nextcloud/documentation/sessions/a45578dc-cb5b-4436-8a69-bd7bfc09937d Co-authored-by: skjnldsv <14975046+skjnldsv@users.noreply.github.com> --- .github/workflows/sphinxbuild.yml | 6 +++++- .../configuration_database/mysql_4byte_support.rst | 8 +++----- .../configuration_files/big_file_upload_configuration.rst | 2 +- .../configuration_files/encryption_configuration.rst | 4 +++- admin_manual/configuration_files/encryption_details.rst | 2 +- .../configuration_files/external_storage/webdav.rst | 4 ++-- .../configuration_server/logging_configuration.rst | 2 ++ admin_manual/installation/example_ubuntu.rst | 2 +- admin_manual/office/configuration.rst | 2 +- .../app_publishing_maintenance/publishing.rst | 2 +- developer_manual/basics/controllers.rst | 2 +- developer_manual/basics/storage/filesystem.rst | 2 +- .../getting_started/coding_standards/index.rst | 2 +- user_manual/files/access_webdav.rst | 5 ++--- user_manual/groupware/sync_android.rst | 2 +- user_manual/groupware/sync_gnome.rst | 2 +- user_manual/groupware/sync_kde.rst | 2 +- 17 files changed, 28 insertions(+), 23 deletions(-) diff --git a/.github/workflows/sphinxbuild.yml b/.github/workflows/sphinxbuild.yml index 8f74692f149..565a53e85bd 100644 --- a/.github/workflows/sphinxbuild.yml +++ b/.github/workflows/sphinxbuild.yml @@ -395,6 +395,8 @@ jobs: # - mailto: links: These are not valid URLs and will always fail # - 404.html: This is not necessary # - latest/stable/xx links from the version selector + # - /builds and /projects: ReadTheDocs theme navigation links (not real file paths) + # - openapi.html: Swagger UI pages use JavaScript-rendered anchors that lychee cannot verify - name: Check for broken links with lychee uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: @@ -404,9 +406,11 @@ jobs: args: | --root-dir "$(pwd)/stage" --offline --no-progress + ${{ needs.stage-and-check.outputs.additional_deployment != '' && format('--remap "https://docs.nextcloud.com/server/{0}/ file://$(pwd)/stage/{1}/"', needs.stage-and-check.outputs.additional_deployment, needs.stage-and-check.outputs.branch_name) || '' }} --remap "https://docs.nextcloud.com/server/latest/ file://$(pwd)/stage/${{ needs.stage-and-check.outputs.branch_name }}/" --remap "https://docs.nextcloud.com/server/ file://$(pwd)/stage/" - --exclude 'go\.php' --exclude 'mailto:' --exclude-path '.*/404\.html' --exclude-path '.*/_static/.*' + --exclude 'go\.php' --exclude 'mailto:' --exclude 'openapi\.html' --exclude-path '.*/404\.html' --exclude-path '.*/_static/.*' + --exclude '^file://.*/stage/(builds|projects)' --exclude "/user_manual/" --include "/user_manual/en/" --exclude '^file://.*/stage/(latest|stable|[0-9]+)/(developer_manual|admin_manual|user_manual)/?$' 'stage/${{ needs.stage-and-check.outputs.branch_name }}/user_manual/en/**/*.html' diff --git a/admin_manual/configuration_database/mysql_4byte_support.rst b/admin_manual/configuration_database/mysql_4byte_support.rst index 02c7cd0d2d0..bb1cea4744d 100644 --- a/admin_manual/configuration_database/mysql_4byte_support.rst +++ b/admin_manual/configuration_database/mysql_4byte_support.rst @@ -11,11 +11,9 @@ installation needs to be tweaked a bit. .. warning:: - This manual only covers MySQL 8 or newer and MariaDB 10.2 or newer. - If you use MariaDB 10.2, please check - `this older version `_ - of the documentation. If you use an older version of MySQL or MariaDB, please note that they are no longer supported - by the current Nextcloud version. + This guide applies only to MySQL 8 or newer and MariaDB 10.6 or newer. + For a list of supported MySQL and MariaDB versions, see our + :doc:`system requirements documentation <../installation/system_requirements>`. 1. Make sure the following InnoDB settings are set on your MySQL server:: diff --git a/admin_manual/configuration_files/big_file_upload_configuration.rst b/admin_manual/configuration_files/big_file_upload_configuration.rst index 1af05e3cdcb..07fdd8340df 100644 --- a/admin_manual/configuration_files/big_file_upload_configuration.rst +++ b/admin_manual/configuration_files/big_file_upload_configuration.rst @@ -172,5 +172,5 @@ enough for PHP, webservers or any load balancers involved. Federated Cloud Sharing ----------------------- -If you are using `Federated Cloud Sharing `_ and want to share large files, you can increase the timeout values for requests to the federated servers. +If you are using :doc:`Federated Cloud Sharing ` and want to share large files, you can increase the timeout values for requests to the federated servers. Therefore, you can set ``davstorage.request_timeout`` in your ``config.php``. The default value is 30 seconds. diff --git a/admin_manual/configuration_files/encryption_configuration.rst b/admin_manual/configuration_files/encryption_configuration.rst index e9c8543a10e..33ee1d59214 100644 --- a/admin_manual/configuration_files/encryption_configuration.rst +++ b/admin_manual/configuration_files/encryption_configuration.rst @@ -306,6 +306,8 @@ User Keys: Sharing & Recovery .. figure:: images/encryption9.png +.. _enabling-users-file-recovery-keys: + **Enabling file recovery keys:** - If you lose your Nextcloud password, you lose access to your encrypted files. @@ -389,6 +391,6 @@ Further Reading - :ref:`occ Command Reference: Encryption ` - `How Nextcloud uses encryption to protect your data `_ - `Technical impact of Authenticated Encryption `_ -- `Nextcloud SSE Implementation Details `_ +- :doc:`Nextcloud SSE Implementation Details ` - `Nextcloud Encryption (SSE & E2EE) Recovery Tools `_ - `Nextcloud E2EE Server API App (required for E2EE usage) `_ diff --git a/admin_manual/configuration_files/encryption_details.rst b/admin_manual/configuration_files/encryption_details.rst index ae56bdad786..2fb779f9326 100644 --- a/admin_manual/configuration_files/encryption_details.rst +++ b/admin_manual/configuration_files/encryption_details.rst @@ -346,7 +346,7 @@ Sources ------- - `encryption-recovery-tools repository on GitHub `_ -- `Nextcloud Encryption Configuration documentation `_ +- :doc:`Nextcloud Encryption Configuration documentation ` - `Nextcloud Help response concerning the usage of version information `_ - `Sourcecode: Creation of the Message Authentication Code `_ - `Sourcecode: Derivation of the Encryption Key `_ diff --git a/admin_manual/configuration_files/external_storage/webdav.rst b/admin_manual/configuration_files/external_storage/webdav.rst index e8d58057c15..b42e4afbdc5 100644 --- a/admin_manual/configuration_files/external_storage/webdav.rst +++ b/admin_manual/configuration_files/external_storage/webdav.rst @@ -10,8 +10,8 @@ You need the following information: * Folder name: The name of your local mountpoint. * The URL of the WebDAV or Nextcloud server. * Username and password for the remote server -* Secure https://: We always recommend https:// for security, though you can - leave this unchecked for http://. +* Secure ``https://``: We always recommend ``https://`` for security, though you can + leave this unchecked for ``http://``. Optionally, a ``Remote Subfolder`` can be specified to change the destination directory. The default is to use the whole root. diff --git a/admin_manual/configuration_server/logging_configuration.rst b/admin_manual/configuration_server/logging_configuration.rst index 40161f28933..5294e52aba1 100644 --- a/admin_manual/configuration_server/logging_configuration.rst +++ b/admin_manual/configuration_server/logging_configuration.rst @@ -135,6 +135,8 @@ Log field breakdown Empty value are written as two dashes: ``--``. +.. _admin-audit-log: + Admin audit log (Optional) -------------------------- diff --git a/admin_manual/installation/example_ubuntu.rst b/admin_manual/installation/example_ubuntu.rst index 61da8526581..f2390bd9571 100644 --- a/admin_manual/installation/example_ubuntu.rst +++ b/admin_manual/installation/example_ubuntu.rst @@ -14,7 +14,7 @@ following commands in a terminal:: * This installs the packages for the Nextcloud core system. If you are planning on running additional apps, keep in mind that they might - require additional packages. See `Prerequisites for manual installation `_ for details. + require additional packages. See :ref:`Prerequisites for manual installation ` for details. Now you need to create a database user and the database itself by using the MySQL command line interface. The database tables will be created by Nextcloud diff --git a/admin_manual/office/configuration.rst b/admin_manual/office/configuration.rst index 841af5a8628..76fd712a947 100644 --- a/admin_manual/office/configuration.rst +++ b/admin_manual/office/configuration.rst @@ -8,7 +8,7 @@ Nextcloud Office App Settings Collabora Online Server *********************** -URL (and port) of the Collabora Online server that provides the editing functionality as a WOPI client. Collabora Online should use the same protocol (http:// or https://) as the server installation. Naturally, https:// is recommended. +URL (and port) of the Collabora Online server that provides the editing functionality as a WOPI client. Collabora Online should use the same protocol (``http://`` or ``https://``) as the server installation. Naturally, ``https://`` is recommended. Restrict usage to specific groups ********************************* diff --git a/developer_manual/app_publishing_maintenance/publishing.rst b/developer_manual/app_publishing_maintenance/publishing.rst index 98a9e347747..b43845482b0 100644 --- a/developer_manual/app_publishing_maintenance/publishing.rst +++ b/developer_manual/app_publishing_maintenance/publishing.rst @@ -52,7 +52,7 @@ Be technically sound Respect the users ^^^^^^^^^^^^^^^^^ -* Apps have to follow design and `HTML/CSS layout guidelines <../html_css_design/css.html>`_. +* Apps have to follow design and :doc:`HTML/CSS layout guidelines <../html_css_design/css>`. * Apps correctly clean up after themselves on uninstall and correctly handle up- and downgrades. * Apps clearly communicate their intended purpose and active features, including features introduced through updates. * Apps respect the users' choices and do not make unexpected changes, or limit users' ability to revert them. For example, they do not remove other apps or disable settings. diff --git a/developer_manual/basics/controllers.rst b/developer_manual/basics/controllers.rst index 02e7a16eace..fb613113f52 100644 --- a/developer_manual/basics/controllers.rst +++ b/developer_manual/basics/controllers.rst @@ -838,7 +838,7 @@ To turn off checks the following *Attributes* can be added before the controller * ``#[NoAdminRequired]``: Also users that are not admins can access the page * ``#[PublicPage]``: Everyone can access the page without having to log in * ``#[NoTwoFactorRequired]``: A user can access the page before the two-factor challenge has been passed (use this wisely and only in two-factor auth apps, e.g. to allow setup during login) -* ``#[NoCSRFRequired]``: Don't check the CSRF token (use this wisely since you might create a security hole; to understand what it does see `CSRF in the security section <../prologue/security.html#cross-site-request-forgery>`__) +* ``#[NoCSRFRequired]``: Don't check the CSRF token (use this wisely since you might create a security hole; to understand what it does see :ref:`CSRF in the security section `) .. note:: diff --git a/developer_manual/basics/storage/filesystem.rst b/developer_manual/basics/storage/filesystem.rst index ef466b67c8c..fddd71d21ae 100644 --- a/developer_manual/basics/storage/filesystem.rst +++ b/developer_manual/basics/storage/filesystem.rst @@ -7,7 +7,7 @@ Nextcloud filesystem API High level guide to using the Nextcloud filesystem API. -Because users can choose their storage backend, the filesystem should be accessed by using the appropriate filesystem classes. For a simplified filesystem for app specific data see `IAppData `_ +Because users can choose their storage backend, the filesystem should be accessed by using the appropriate filesystem classes. For a simplified filesystem for app specific data see :doc:`IAppData ` Node API ^^^^^^^^ diff --git a/developer_manual/getting_started/coding_standards/index.rst b/developer_manual/getting_started/coding_standards/index.rst index 45a0e3d56ac..120bd04f22b 100644 --- a/developer_manual/getting_started/coding_standards/index.rst +++ b/developer_manual/getting_started/coding_standards/index.rst @@ -16,7 +16,7 @@ General You describe what you want to do, ask feedback on the direction you take it and take it from there. * When you are finished, use the merge request function on GitHub to create a pull request. The other developers will look at it and give you feedback. You can signify that your PR is ready for review by adding the label "3. to review" to it. - See `the code review page for more information <../prologue/bugtracker/codereviews.html>`_ + See :doc:`the code review page for more information <../../prologue/bugtracker/codereviews>` * It is key to keep changes separate and small. The bigger and more hairy a PR grows, the harder it is to get it in. So split things up where you can in smaller changes - if you need a small improvement like a API addition for a big feature addition, get it in first rather than adding it to the big piece of work! * Decisions are made by consensus. We strive for making the best technical decisions and as nobody can know everything, we collaborate. diff --git a/user_manual/files/access_webdav.rst b/user_manual/files/access_webdav.rst index fd9bb804113..3a5e4cbee59 100644 --- a/user_manual/files/access_webdav.rst +++ b/user_manual/files/access_webdav.rst @@ -92,8 +92,7 @@ You can access files in Linux operating systems using the following methods. Nautilus file manager ^^^^^^^^^^^^^^^^^^^^^ -**When you configure your Nextcloud account in the** `GNOME Control Center -<../groupware/sync_gnome.html>`_, **your files will automatically be mounted +**When you configure your Nextcloud account in the** :doc:`GNOME Control Center <../groupware/sync_gnome>`, **your files will automatically be mounted by Nautilus as a WebDAV share, unless you deselect file access**. You can also mount your Nextcloud files manually. Use the ``davs://`` @@ -222,7 +221,7 @@ path of your certificate as in this example:: Accessing files using macOS --------------------------- -.. note:: The macOS Finder suffers from a `series of implementation problems `_ and should only be used if the Nextcloud server runs on **Apache** and **mod_php**, or **Nginx 1.3.8+**. Alternative macOS-compatible clients capable of accessing WebDAV shares include open source apps like `Cyberduck `_ (see instructions `here `_) and `Filezilla `_. Commercial clients include `Mountain Duck `_, `Forklift `_, `Transmit `_, and `Commander One `_. +.. note:: The macOS Finder suffers from a `series of implementation problems `_ and should only be used if the Nextcloud server runs on **Apache** and **mod_php**, or **Nginx 1.3.8+**. Alternative macOS-compatible clients capable of accessing WebDAV shares include open source apps like `Cyberduck `_ (see instructions `here <#accessing-files-using-cyberduck>`_) and `Filezilla `_. Commercial clients include `Mountain Duck `_, `Forklift `_, `Transmit `_, and `Commander One `_. To access files through the macOS Finder: diff --git a/user_manual/groupware/sync_android.rst b/user_manual/groupware/sync_android.rst index 6dffd2a71b8..5c87a1eae54 100644 --- a/user_manual/groupware/sync_android.rst +++ b/user_manual/groupware/sync_android.rst @@ -14,7 +14,7 @@ Files and notifications confirm to grant access. *Or*: In Nextcloud's web GUI, go to the - `user preferences <../userpreferences.html>`_, go to + :doc:`user preferences <../userpreferences>`, go to **Security**. Generate an App password, click "Generate QR code" and tap the QR scanner icon in the Nextcloud app, point your phone's camera towards the screen. diff --git a/user_manual/groupware/sync_gnome.rst b/user_manual/groupware/sync_gnome.rst index 5c3c6368d92..71c8aa31212 100644 --- a/user_manual/groupware/sync_gnome.rst +++ b/user_manual/groupware/sync_gnome.rst @@ -15,7 +15,7 @@ This can be done by following these steps: #. Enter your server URL, username, and password. If you have enabled two-factor authentication (2FA), you need to generate an application password/token, because GNOME Online Accounts `doesn't support Nextcloud's WebFlow login yet `_ - (`Learn more `_): + (:ref:`Learn more `): .. image:: ../images/goa-add-nextcloud-account.png diff --git a/user_manual/groupware/sync_kde.rst b/user_manual/groupware/sync_kde.rst index 832b2914f9e..e4bea12190a 100644 --- a/user_manual/groupware/sync_kde.rst +++ b/user_manual/groupware/sync_kde.rst @@ -28,7 +28,7 @@ In Kalendar: In KOrganizer and Kalendar: -3. Enter your username. As password, you need to generate an app-password/token (`Learn more `_): +3. Enter your username. As password, you need to generate an app-password/token (:ref:`Learn more `): .. image:: ../images/korganizer_credentials.png From 7af10cce7e116317dad0470bf67c67229b3a6725 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 19:25:07 +0000 Subject: [PATCH 3/3] fix: improve lychee workflow comments for clarity Agent-Logs-Url: https://github.com/nextcloud/documentation/sessions/a45578dc-cb5b-4436-8a69-bd7bfc09937d Co-authored-by: skjnldsv <14975046+skjnldsv@users.noreply.github.com> --- .github/workflows/sphinxbuild.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sphinxbuild.yml b/.github/workflows/sphinxbuild.yml index 565a53e85bd..72a21b112a8 100644 --- a/.github/workflows/sphinxbuild.yml +++ b/.github/workflows/sphinxbuild.yml @@ -395,8 +395,10 @@ jobs: # - mailto: links: These are not valid URLs and will always fail # - 404.html: This is not necessary # - latest/stable/xx links from the version selector - # - /builds and /projects: ReadTheDocs theme navigation links (not real file paths) - # - openapi.html: Swagger UI pages use JavaScript-rendered anchors that lychee cannot verify + # - /builds and /projects: These absolute paths come from the sphinx_rtd_theme when + # READTHEDOCS=True is set. They appear in the generated HTML as navigation links + # to ReadTheDocs build/project pages, but don't correspond to actual staged files. + # - openapi.html: Swagger UI pages with JavaScript-rendered anchors that lychee cannot verify - name: Check for broken links with lychee uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: