+
+
+ 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+\Khttps://[^>\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 +763,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
-
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