From dc7a1715e8789a69d4651fba5110be81a053ca9b Mon Sep 17 00:00:00 2001 From: Samy OUBOUAZIZ Date: Wed, 28 Oct 2026 11:43:16 +0100 Subject: [PATCH 1/5] feat(gen): add external link checker + fix some 404s --- .gitignore | 3 + bin/check-external-links.py | 160 ++++++++++++++++++ .../api-cli/create-bucket-policy.mdx | 2 +- .../how-to/create-bucket-policy.mdx | 2 +- .../how-to/edit-storage-class.mdx | 2 +- .../api-cli/deploy-container-api.mdx | 2 +- .../api-cli/deploy-function-api.mdx | 4 +- 7 files changed, 169 insertions(+), 6 deletions(-) create mode 100755 bin/check-external-links.py diff --git a/.gitignore b/.gitignore index 0c4f160076..ec466661e5 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,6 @@ jspm_packages/ # dotenv environment variables file .env .env.test + +# lychee external link checker cache +.lycheecache diff --git a/bin/check-external-links.py b/bin/check-external-links.py new file mode 100755 index 0000000000..03a016ecd0 --- /dev/null +++ b/bin/check-external-links.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Check external links in docs-content MDX files with lychee. + +Wraps lychee (https://lychee.cli.rs) with the docs-content config below, and +also checks URLs in JSX props (url="...", src="..."), which lychee does not +read: they are extracted to temporary Markdown files checked alongside the MDX. + +Requires lychee: brew install lychee (or cargo install lychee). +Set GITHUB_TOKEN to avoid GitHub rate limits (defaults to `gh auth token`). + +Usage (from anywhere in the repository): + python3 bin/check-external-links.py # pages/, tutorials/, macros/, changelog/ + python3 bin/check-external-links.py pages/instances # a subset + python3 bin/check-external-links.py pages/ --accept '200..=299, 403, 429' + +Arguments that are existing files or directories are scanned; all other +arguments are passed to lychee as is. +""" +import os +import re +import shutil +import subprocess +import sys +import tempfile + +ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +SCAN_DIRS = ("pages", "tutorials", "macros", "changelog") + +FENCE_RE = re.compile(r"^\s*(`{3,}|~{3,})") +JSX_PROP_URL_RE = re.compile(r"""\b(?:url|src)=\{?["'](https?://[^"'}\s]+)""") + +# https://lychee.cli.rs/config/ (paths are relative to the docs-content root) +CONFIG = r""" +max_concurrency = 32 +host_concurrency = 4 +max_retries = 2 +retry_wait_time = 2 +timeout = 20 + +# Successful results are cached in .lycheecache; failures are always rechecked +cache = true +max_cache_age = "3d" +cache_exclude_status = "400..=599" + +# 429: rate limited, the page exists +accept = ["200..=299", "429"] + +scheme = ["https", "http"] + +# Internal docs links are covered by bin/check-internal-links.py. +# Root-relative and relative links resolve against this placeholder, then get excluded. +base_url = "https://internal.invalid/" +exclude = [ + '^https?://internal\.invalid', + '^https?://www\.scaleway\.com/en/docs', + # Marketing site: its CDN blocks non-browser clients with 403 + '^https?://www\.scaleway\.com/(en|fr)(/|$)', + # Behind login or invite-only + '^https?://console\.scaleway\.com', + '^https?://account\.scaleway\.com', + '^https?://console\.online\.net', + '^https?://slack\.scaleway\.com', + '^https?://([a-z0-9-]+\.)?slack\.com', + # API endpoints shown as examples + '^https?://api\.scaleway\.(com|ai)', + '\.scw\.cloud', + '\.scw\.dev', + # Placeholders + '<[^>]+>', + '\{[^}]*\}', + '\$\{?[A-Z_]', + '^https?://(www\.)?example\.(com|org|net)', + '\.example\.(com|org|net)', + '^https?://(localhost|127\.0\.0\.1|0\.0\.0\.0)', + 'your-domain', +] +exclude_private = true +exclude_link_local = true +exclude_loopback = true + +# Style guide and templates contain example links +exclude_path = ['pages/guidelines\.mdx', 'TEMPLATE.*\.mdx$', 'docs/templates/'] +""" + + +def iter_mdx(paths): + for path in paths: + if os.path.isfile(path): + if path.endswith(".mdx"): + yield path + continue + for dirpath, dirnames, filenames in os.walk(path): + dirnames[:] = [d for d in dirnames if d not in ("node_modules", "assets")] + for name in sorted(filenames): + if name.endswith(".mdx"): + yield os.path.join(dirpath, name) + + +def extract_jsx_prop_urls(inputs, out_dir): + """Write URLs found in JSX props to /.md, outside code blocks.""" + for path in iter_mdx(inputs): + with open(path, encoding="utf-8", errors="replace") as f: + lines = f.read().split("\n") + found = [] + in_fence = False + for number, line in enumerate(lines, start=1): + if FENCE_RE.match(line): + in_fence = not in_fence + elif not in_fence: + found += ["- line {}: <{}>".format(number, url) for url in JSX_PROP_URL_RE.findall(line)] + if found: + # Inputs outside ROOT (../x) use their absolute path, to stay inside out_dir + name = os.path.abspath(path).lstrip(os.sep) if path.startswith("..") else path + target = os.path.join(out_dir, name + ".md") + os.makedirs(os.path.dirname(target), exist_ok=True) + with open(target, "w", encoding="utf-8") as f: + f.write("\n".join(found) + "\n") + + +def github_token(): + if os.environ.get("GITHUB_TOKEN") or not shutil.which("gh"): + return os.environ.get("GITHUB_TOKEN") + result = subprocess.run(["gh", "auth", "token"], capture_output=True, text=True) + return result.stdout.strip() or None + + +def main(): + lychee = shutil.which("lychee") + if not lychee: + print("lychee is not installed: brew install lychee (or cargo install lychee)", file=sys.stderr) + return 2 + + inputs, options = [], [] + for arg in sys.argv[1:]: + if os.path.exists(arg): + inputs.append(os.path.relpath(os.path.abspath(arg), ROOT)) + else: + options.append(arg) + inputs = inputs or list(SCAN_DIRS) + + env = dict(os.environ) + token = github_token() + if token: + env["GITHUB_TOKEN"] = token + + with tempfile.TemporaryDirectory() as tmp: + config = os.path.join(tmp, "lychee.toml") + with open(config, "w", encoding="utf-8") as f: + f.write(CONFIG) + props_dir = os.path.join(tmp, "jsx-props") + os.makedirs(props_dir) + # Relative paths so the report and exclude_path match docs-content paths + os.chdir(ROOT) + extract_jsx_prop_urls(inputs, props_dir) + command = [lychee, "--config", config, "--no-progress"] + options + inputs + [props_dir] + return subprocess.run(command, env=env).returncode + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/pages/object-storage/api-cli/create-bucket-policy.mdx b/pages/object-storage/api-cli/create-bucket-policy.mdx index e0c65451ec..96e852af61 100644 --- a/pages/object-storage/api-cli/create-bucket-policy.mdx +++ b/pages/object-storage/api-cli/create-bucket-policy.mdx @@ -13,7 +13,7 @@ import ImportantBucketPolicy from '@macros/storage/important-bucket-policy.mdx' -To create and apply a bucket policy from the [Scaleway console](https://console/scaleway.com), refer to the [dedicated documentation](/object-storage/how-to/create-bucket-policy/). +To create and apply a bucket policy from the [Scaleway console](https://console.scaleway.com), refer to the [dedicated documentation](/object-storage/how-to/create-bucket-policy/). diff --git a/pages/object-storage/how-to/create-bucket-policy.mdx b/pages/object-storage/how-to/create-bucket-policy.mdx index cf325f3567..614398a8dd 100644 --- a/pages/object-storage/how-to/create-bucket-policy.mdx +++ b/pages/object-storage/how-to/create-bucket-policy.mdx @@ -196,7 +196,7 @@ Alternatively, you can also edit a bucket policy from the **Settings tab** of yo ## How to apply an existing policy to another bucket -The [Scaleway console](https://console/scaleway.com) allows you to duplicate an existing policy, and apply it to another bucket. +The [Scaleway console](https://console.scaleway.com) allows you to duplicate an existing policy, and apply it to another bucket. 1. Click **Object Storage** on the left side menu of the console. The Object Storage dashboard displays. diff --git a/pages/object-storage/how-to/edit-storage-class.mdx b/pages/object-storage/how-to/edit-storage-class.mdx index b1b02990bf..5e3db45a9f 100644 --- a/pages/object-storage/how-to/edit-storage-class.mdx +++ b/pages/object-storage/how-to/edit-storage-class.mdx @@ -11,7 +11,7 @@ import Requirements from '@macros/iam/requirements.mdx' Scaleway Object Storage offers several [storage classes](/object-storage/concepts/#storage-class) to choose from depending on the performance, access, resiliency, and cost requirements of your workloads. -The [Scaleway console](https://console/) allows you to edit the storage class of objects individually. Technically, this action creates a copy of the object with the new class, which overwrites your previous object. +The [Scaleway console](https://console.scaleway.com) allows you to edit the storage class of objects individually. Technically, this action creates a copy of the object with the new class, which overwrites your previous object. To change the storage class of several or all objects in a bucket, create a [lifecycle rule](/object-storage/how-to/manage-lifecycle-rules/). diff --git a/pages/serverless-containers/api-cli/deploy-container-api.mdx b/pages/serverless-containers/api-cli/deploy-container-api.mdx index a51f8541aa..fee28eb9a3 100644 --- a/pages/serverless-containers/api-cli/deploy-container-api.mdx +++ b/pages/serverless-containers/api-cli/deploy-container-api.mdx @@ -9,7 +9,7 @@ dates: import Requirements from '@macros/iam/requirements.mdx' -The Scaleway API allows you to create and manage all your Scaleway resources programmatically. Anything you can do through the [Scaleway console](https://www.console.scaleway.com) can also be done through the API. +The Scaleway API allows you to create and manage all your Scaleway resources programmatically. Anything you can do through the [Scaleway console](https://console.scaleway.com) can also be done through the API. Refer to the [Scaleway Developers website](https://www.scaleway.com/en/developers/api/) for more information on the Scaleway API. diff --git a/pages/serverless-functions/api-cli/deploy-function-api.mdx b/pages/serverless-functions/api-cli/deploy-function-api.mdx index fe4ff92b62..f45c5dbc3b 100644 --- a/pages/serverless-functions/api-cli/deploy-function-api.mdx +++ b/pages/serverless-functions/api-cli/deploy-function-api.mdx @@ -9,7 +9,7 @@ dates: import Requirements from '@macros/iam/requirements.mdx' -The Scaleway API allows you to create and manage all your Scaleway resources programmatically. Anything you can do through the [Scaleway console](https://www.console.scaleway.com) +The Scaleway API allows you to create and manage all your Scaleway resources programmatically. Anything you can do through the [Scaleway console](https://console.scaleway.com) can also be done through the API. Refer to the [Scaleway Developers website](https://www.scaleway.com/en/developers/api/) for more information on the Scaleway API. @@ -92,7 +92,7 @@ Refer to the [Scaleway Developers website](https://www.scaleway.com/en/developer Your function is now being deployed. - You can check the status of your function from the [Scaleway console](https://www.console/scaleway.com/) or by running the following command: + You can check the status of your function from the [Scaleway console](https://console.scaleway.com/) or by running the following command: ```json curl -X GET \ From 9f58533bb76a1939b4fcb0230f17b9387de6df83 Mon Sep 17 00:00:00 2001 From: Samy OUBOUAZIZ Date: Wed, 28 Oct 2026 11:47:23 +0100 Subject: [PATCH 2/5] feat(gen): add one more --- tutorials/configure-nodemcu-iot-hub/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/configure-nodemcu-iot-hub/index.mdx b/tutorials/configure-nodemcu-iot-hub/index.mdx index f67763cecb..3e34f38173 100644 --- a/tutorials/configure-nodemcu-iot-hub/index.mdx +++ b/tutorials/configure-nodemcu-iot-hub/index.mdx @@ -79,7 +79,7 @@ Your Arduino IDE is now ready to communicate with the NodeMCU device. ## Creating an IoT Hub -1. Log into your [Scaleway console](https://conole.scaleway.com/) and click on **IoT Hub** in the side menu: +1. Log into your [Scaleway console](https://console.scaleway.com/) and click on **IoT Hub** in the side menu: 2. Click **Create a Hub** and create your new IoT Hub. 3. Enter a name for your hub (here we use iot-hub-esp8266) and choose a plan. For this tutorial, we use the Free plan. If your Project needs more resources you can choose one of the larger hubs. Click **Create a hub** to deploy it. From 2ec4bd02f36c6c972ecc1cab559b09b93774231a Mon Sep 17 00:00:00 2001 From: Samy OUBOUAZIZ Date: Wed, 28 Oct 2026 12:10:30 +0100 Subject: [PATCH 3/5] feat(gen): fix more --- .../api-cli/import-data-to-managed-postgresql-databases.mdx | 2 +- .../encryption-at-rest-performance-benchmark.mdx | 2 +- .../reference-content/pg-version-updates.mdx | 4 ++-- tutorials/deploy-openproject-database-postgresql/index.mdx | 2 +- tutorials/focalboard-project-management/index.mdx | 4 ++-- tutorials/lb-firewall-haproxy-pfsense/index.mdx | 2 +- tutorials/remote-desktop-with-xrdp/index.mdx | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/managed-databases-for-postgresql-and-mysql/api-cli/import-data-to-managed-postgresql-databases.mdx b/pages/managed-databases-for-postgresql-and-mysql/api-cli/import-data-to-managed-postgresql-databases.mdx index 476e2c5a5b..18479417a7 100644 --- a/pages/managed-databases-for-postgresql-and-mysql/api-cli/import-data-to-managed-postgresql-databases.mdx +++ b/pages/managed-databases-for-postgresql-and-mysql/api-cli/import-data-to-managed-postgresql-databases.mdx @@ -84,7 +84,7 @@ To complete the following procedure, you must have: - Installed [pgAdmin](https://www.pgadmin.org/). -- Ensured your pgAdmin version is compatible with the PostgreSQL version of the database you will import your data into. Refer to the official [pgAdmin documentation](https://www.pgadmin.org/docs/pgadmin4/7.8/release_notes.html) to check the compatibility. +- Ensured your pgAdmin version is compatible with the PostgreSQL version of the database you will import your data into. Refer to the official [pgAdmin documentation](https://www.pgadmin.org/docs/) to check the compatibility. #### Downloading the backup on your local machine diff --git a/pages/managed-databases-for-postgresql-and-mysql/reference-content/encryption-at-rest-performance-benchmark.mdx b/pages/managed-databases-for-postgresql-and-mysql/reference-content/encryption-at-rest-performance-benchmark.mdx index f4d0e0c5a4..8d9da9e716 100644 --- a/pages/managed-databases-for-postgresql-and-mysql/reference-content/encryption-at-rest-performance-benchmark.mdx +++ b/pages/managed-databases-for-postgresql-and-mysql/reference-content/encryption-at-rest-performance-benchmark.mdx @@ -23,7 +23,7 @@ The table below compares the different workload and setup combinations and indic |----------------------|-----------------|--------------|------------------------------------------------------------------------------------| | **Read Workloads** | Standalone | 10 | No impact | | | Standalone | 2000 | No real impact with or without encryption at rest | -| | HA | 2000 | 20-30% impact, likely due to disk writes being replicated. Refer to [this blogpost](https://blog.okmeter.io/postgresql-exploring-how-select-queries-can-produce-disk-writes-f36c8bee6b6f) to learn more about disk writes in read operations. | +| | HA | 2000 | 20-30% impact, likely due to disk writes being replicated. | | **OLTP Workloads** | Standalone | Any | 15% performance drop with encryption at rest activated | | | HA | 10 | 15% performance drop | | | HA | 2000 | Up to 30% performance drop | diff --git a/pages/managed-databases-for-postgresql-and-mysql/reference-content/pg-version-updates.mdx b/pages/managed-databases-for-postgresql-and-mysql/reference-content/pg-version-updates.mdx index 64f32271be..aff46a85c8 100644 --- a/pages/managed-databases-for-postgresql-and-mysql/reference-content/pg-version-updates.mdx +++ b/pages/managed-databases-for-postgresql-and-mysql/reference-content/pg-version-updates.mdx @@ -32,7 +32,7 @@ New features are available with PostgreSQL 17: - **Timescale** - [2.22.1](https://github.com/timescale/timescaledb/releases/tag/2.22.1) - **pgRouting** - [3.7.3](https://github.com/pgRouting/pgrouting/releases/tag/v3.7.3) - **pgvector** - [0.8.1](https://github.com/pgvector/pgvector/releases/tag/v0.8.1) -- **H3 PG** - [4.2.3](https://github.com/zachasme/h3-pg/releases/tag/v4.2.3) +- **H3 PG** - [4.2.3](https://github.com/zachasme/h3-pg/) ### Advanced settings @@ -84,7 +84,7 @@ The following extensions were also upgraded. - **Timescale** - [2.17](https://github.com/timescale/timescaledb/releases/tag/2.17.0) - **pgRouting** - [3.6.2](https://github.com/pgRouting/pgrouting/releases/tag/v3.6.2) - **pgvector** - [0.8.0](https://github.com/pgvector/pgvector/releases/tag/v0.8.0) -- **H3 PG** - [4.1.4](https://github.com/zachasme/h3-pg/releases/tag/v4.1.4) +- **H3 PG** - [4.1.4](https://github.com/zachasme/h3-pg/) ### Advanced settings diff --git a/tutorials/deploy-openproject-database-postgresql/index.mdx b/tutorials/deploy-openproject-database-postgresql/index.mdx index dab3c6502b..eb65d29d70 100644 --- a/tutorials/deploy-openproject-database-postgresql/index.mdx +++ b/tutorials/deploy-openproject-database-postgresql/index.mdx @@ -246,4 +246,4 @@ To begin editing and configuring your OpenProject workspace you must log in. ``` Upon the first login, you will be required to change your password. -Once you have done so, you can begin managing your projects. OpenProject provides a [documentation website](https://docs.openproject.org/) and a [user guide](https://docs.openproject.org/user-guide/) is available to help you get started with their different features. \ No newline at end of file +Once you have done so, you can begin managing your projects. OpenProject provides a [documentation website](https://www.openproject.org/docs/) and a [user guide](https://www.openproject.org/docs/getting-started/) is available to help you get started with their different features. \ No newline at end of file diff --git a/tutorials/focalboard-project-management/index.mdx b/tutorials/focalboard-project-management/index.mdx index ac867ab3c8..6132b33a78 100644 --- a/tutorials/focalboard-project-management/index.mdx +++ b/tutorials/focalboard-project-management/index.mdx @@ -54,7 +54,7 @@ In the following steps, we will make sure that the software and the required pac ``` apt install nginx python3-certbot-nginx mariadb-server ufw ``` -4. Download and unpack Focalboard. In this tutorial, we use v7.11.3 of Focalboard, but you can find the **latest** release in the project's [GitHub repository](https://github.com/mattermost/focalboard/releases). +4. Download and unpack Focalboard. In this tutorial, we use v7.11.3 of Focalboard, but you can find the **latest** release in the project's [GitHub repository](https://github.com/mattermost-community/focalboard). ``` wget https://github.com/mattermost/focalboard/releases/download/v8.0.0/focalboard-server-linux-amd64.tar.gz tar -xvzf focalboard-server-linux-amd64.tar.gz @@ -220,4 +220,4 @@ To avoid the Focalboard application being directly reachable via plain HTTP on p Your Focalboard Instance is now ready. You can open a web browser on your local computer and point it to your Focalboard domain — the Login screen displays. Click **Create an account** to create your first account and start using your Instance. -For more information about using your new Focalboard Instance, follow the [official Focalboard documentation](https://www.focalboard.com/guide/user/). \ No newline at end of file +For more information about using your new Focalboard Instance, follow the [official Focalboard documentation](https://github.com/mattermost-community/focalboard). \ No newline at end of file diff --git a/tutorials/lb-firewall-haproxy-pfsense/index.mdx b/tutorials/lb-firewall-haproxy-pfsense/index.mdx index 1a964130ac..45c1c4523d 100644 --- a/tutorials/lb-firewall-haproxy-pfsense/index.mdx +++ b/tutorials/lb-firewall-haproxy-pfsense/index.mdx @@ -142,7 +142,7 @@ Once rebooted, the pfSense welcome screen displays: 5. Configure the [NTP Time Server](https://en.wikipedia.org/wiki/Network_Time_Protocol). You can leave the default value and set the **Timezone** to **Europe/Paris**, then click **Next** to continue: -6. Set a [strong and secure](https://passwordsgenerator.net/) password, confirm it and click **Next**. +6. Set a strong and secure password, confirm it and click **Next**. 7. Setup is now complete. Click **Finish** to exit the wizard and start configuring rules. diff --git a/tutorials/remote-desktop-with-xrdp/index.mdx b/tutorials/remote-desktop-with-xrdp/index.mdx index 1b62abd76d..2c46da8696 100644 --- a/tutorials/remote-desktop-with-xrdp/index.mdx +++ b/tutorials/remote-desktop-with-xrdp/index.mdx @@ -25,11 +25,11 @@ import Requirements from '@macros/iam/requirements.mdx' xRDP is an open-source alternative to Microsoft RDP (Microsoft Remote Desktop Protocol). -The tool provides a graphical login to remotely access machines and accept connections from various RDP clients: [FreeRDP](http://www.freerdp.com/), [rdesktop](https://www.rdesktop.org/), [NeutrinoRDP](https://github.com/neutrinolabs/NeutrinoRDP) and [Microsoft Remote Desktop Client](https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-clients) (for Windows, macOS, iOS, and Android). +The tool provides a graphical login to remotely access machines and accept connections from various RDP clients: [FreeRDP](http://www.freerdp.com/), `rdesktop`, [NeutrinoRDP](https://github.com/neutrinolabs/NeutrinoRDP) and [Microsoft Remote Desktop Client](https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-clients) (for Windows, macOS, iOS, and Android). RDP connections are encrypted by default using TLS for increased security. -In this tutorial, you will learn how to install the [xRDP](http://xrdp.org/) server together with [xfce](https://xfce.org/), a lightweight and stable desktop environment ideally suited for the use of a remote desktop. +In this tutorial, you will learn how to install the [xRDP](http://www.xrdp.org/) server together with [xfce](https://xfce.org/), a lightweight and stable desktop environment ideally suited for the use of a remote desktop. From 654b03c7e6c0398af7992a40f98edcdfb86b85c3 Mon Sep 17 00:00:00 2001 From: Samy OUBOUAZIZ Date: Wed, 28 Oct 2026 12:18:15 +0100 Subject: [PATCH 4/5] feat(gen): fix more --- pages/gpu/reference-content/choosing-gpu-instance-type.mdx | 2 +- pages/gpu/reference-content/understanding-nvidia-fp8.mdx | 2 +- pages/gpu/reference-content/understanding-nvidia-tao.mdx | 2 +- tutorials/deploy-remote-desktop-ubuntu-2204/index.mdx | 2 +- tutorials/vuls-security-scanner/index.mdx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/gpu/reference-content/choosing-gpu-instance-type.mdx b/pages/gpu/reference-content/choosing-gpu-instance-type.mdx index 38f7c1b81e..56e648a490 100644 --- a/pages/gpu/reference-content/choosing-gpu-instance-type.mdx +++ b/pages/gpu/reference-content/choosing-gpu-instance-type.mdx @@ -22,7 +22,7 @@ Find below a guide to help you make an informed decision: * **Workload requirements:** Identify the nature of your workload. Are you running machine learning, deep learning, high-performance computing (HPC), data analytics, or graphics-intensive applications? Different Instance types are optimized for different types of workloads. For example, the H100 is not designed for graphics rendering. However, other models are. As [stated by Tim Dettmers](https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/), “Tensor Cores are most important, followed by the memory bandwidth of a GPU, the cache hierarchy, and only then FLOPS of a GPU.”. For more information, refer to the [NVIDIA GPU portfolio](https://docs.nvidia.com/data-center-gpu/line-card.pdf). * **Performance requirements:** Evaluate the performance specifications you need, such as the number of GPUs, GPU memory, processing power, and network bandwidth. You need a lot of memory and fast storage for demanding tasks like training larger Deep Learning models. * **GPU type:** Scaleway offers different GPU types, such as various NVIDIA GPUs. Each GPU has varying levels of performance, memory, and capabilities. Choose a GPU that aligns with your specific workload requirements. -* **GPU memory:** GPU memory bandwidth is an important criterion influencing overall performance. Then, larger GPU memory (VRAM) is crucial for memory-intensive tasks like training larger deep learning models, especially when using larger batch sizes. Modern GPUs offer specialized data formats designed to optimize deep learning performance. These formats, including Bfloat16, [FP8](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html), int8 and int4, enable the storage of more data in memory and can enhance performance (for example, moving from FP16 to FP8 can double the number of TFLOPS). To make an informed decision, it is thus crucial to select the appropriate architecture. Options range from Pascal and Ampere to Ada Lovelace and Hopper. Ensuring that the GPU possesses sufficient memory capacity to accommodate your specific workload is essential, preventing any potential memory-related bottlenecks. Equally important, is matching the GPU's memory type to the nature of your workload. +* **GPU memory:** GPU memory bandwidth is an important criterion influencing overall performance. Then, larger GPU memory (VRAM) is crucial for memory-intensive tasks like training larger deep learning models, especially when using larger batch sizes. Modern GPUs offer specialized data formats designed to optimize deep learning performance. These formats, including Bfloat16, FP8, int8 and int4, enable the storage of more data in memory and can enhance performance (for example, moving from FP16 to FP8 can double the number of TFLOPS). To make an informed decision, it is thus crucial to select the appropriate architecture. Options range from Pascal and Ampere to Ada Lovelace and Hopper. Ensuring that the GPU possesses sufficient memory capacity to accommodate your specific workload is essential, preventing any potential memory-related bottlenecks. Equally important, is matching the GPU's memory type to the nature of your workload. * **CPU and RAM:** A powerful CPU can be beneficial for tasks that involve preprocessing or post-processing. Sufficient system memory is also crucial to prevent memory-related bottlenecks or to cache your data in RAM. * **GPU driver and software compatibility:** Ensure that the GPU Instance type you choose supports the GPU drivers and software frameworks you need for your workload. This includes CUDA libraries, machine learning frameworks (TensorFlow, PyTorch, etc.), and other specific software tools. For all [Scaleway GPU OS images](/gpu/reference-content/docker-images/), we offer a driver version that enables the use of all GPUs, from the oldest to the latest models. As is the NGC CLI, `nvidia-docker` is preinstalled, enabling containers to be used with CUDA, cuDNN, and the main deep learning frameworks. * **Scaling:** Consider the scalability requirements of your workload. The most efficient way to scale up your workload is by using: diff --git a/pages/gpu/reference-content/understanding-nvidia-fp8.mdx b/pages/gpu/reference-content/understanding-nvidia-fp8.mdx index 00362b6b6a..bbf791e64c 100644 --- a/pages/gpu/reference-content/understanding-nvidia-fp8.mdx +++ b/pages/gpu/reference-content/understanding-nvidia-fp8.mdx @@ -21,4 +21,4 @@ The `E5M2` format adapts the IEEE FP16 format, allocating five bits to the expon The FP8 standard preserves accuracy comparable to 16-bit formats across a wide range of applications, architectures, and networks. -For more information about the FP8 standard, and instructions how to use it with H100 GPU Instances, refer to NVIDIA's [official FP8 documentation](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) and the [code example repository](https://github.com/NVIDIA/TransformerEngine/tree/main/examples). \ No newline at end of file +For more information about the FP8 standard, and instructions how to use it with H100 GPU Instances, refer to NVIDIA's [official Transformer Engine documentation](https://docs.nvidia.com/deeplearning/transformer-engine/index.html) and the [code example repository](https://github.com/NVIDIA/TransformerEngine/tree/main/examples). \ No newline at end of file diff --git a/pages/gpu/reference-content/understanding-nvidia-tao.mdx b/pages/gpu/reference-content/understanding-nvidia-tao.mdx index 40acd73612..e1f59b2ce7 100644 --- a/pages/gpu/reference-content/understanding-nvidia-tao.mdx +++ b/pages/gpu/reference-content/understanding-nvidia-tao.mdx @@ -22,4 +22,4 @@ The key components and capabilities of NVIDIA TAO include: * **Data Augmentation and Data Processing:** TAO includes tools for data augmentation and preprocessing, which are essential for training robust deep learning models. * **Deployment Support:** TAO helps to deploy trained models on NVIDIA platforms, including Jetson edge devices, Drive AGX platforms for autonomous vehicles, and more. -The latest release of the TAO toolkit is version 5, and it introduces groundbreaking features to improve your AI model development. For more information about TAO, refer to the official [NVIDIA TAO Getting Started documentation](https://docs.nvidia.com/tao/tao-toolkit/text/quick_start_guide/index.html) \ No newline at end of file +The latest release of the TAO toolkit is version 5, and it introduces groundbreaking features to improve your AI model development. For more information about TAO, refer to the official [NVIDIA TAO Getting Started documentation](https://docs.nvidia.com/tao/tao-toolkit/). \ No newline at end of file diff --git a/tutorials/deploy-remote-desktop-ubuntu-2204/index.mdx b/tutorials/deploy-remote-desktop-ubuntu-2204/index.mdx index c4552ce41c..ba676835f2 100644 --- a/tutorials/deploy-remote-desktop-ubuntu-2204/index.mdx +++ b/tutorials/deploy-remote-desktop-ubuntu-2204/index.mdx @@ -34,7 +34,7 @@ A remote desktop serves various purposes, including: This tutorial guides you through deploying a remote desktop on an Instance running Ubuntu Jammy Jellyfish (22.04 LTS) using the following stack: -- [xRDP](http://xrdp.org/): An open-source alternative to Microsoft RDP (Remote Desktop Protocol). +- [xRDP](https://www.xrdp.org/): An open-source alternative to Microsoft RDP (Remote Desktop Protocol). - [Xfce](https://xfce.org/): A lightweight and stable desktop environment. diff --git a/tutorials/vuls-security-scanner/index.mdx b/tutorials/vuls-security-scanner/index.mdx index b1fa352fc7..a86d234ef7 100644 --- a/tutorials/vuls-security-scanner/index.mdx +++ b/tutorials/vuls-security-scanner/index.mdx @@ -67,7 +67,7 @@ import Requirements from '@macros/iam/requirements.mdx' ## Deploying go-cve-dictionary -Vuls uses [go-cve-dictionary](https://github.com/kotakanbe/go-cve-dictionary), a Go package providing access to the [NVD](https://nvd.nist.gov/) (National Vulnerability Database) and the Japanese [JVN](https://jvndb.jvn.jp/en/), both providing information regarding security vulnerabilities according to their [CVE identifiers](https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures) and a risk score. +Vuls uses [go-cve-dictionary](https://github.com/kotakanbe/go-cve-dictionary), a Go package providing access to the [NVD](https://nvd.nist.gov/) (National Vulnerability Database) and the Japanese JVN, both providing information regarding security vulnerabilities according to their [CVE identifiers](https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures) and a risk score. 1. Create a directory to store the data: ``` From fc4ca92ff2cce60877184c3e01ad0b64d6bdcd06 Mon Sep 17 00:00:00 2001 From: Samy OUBOUAZIZ Date: Wed, 28 Oct 2026 14:10:39 +0100 Subject: [PATCH 5/5] feat(gen): fix more + exclude pattern --- bin/check-external-links.py | 2 +- tutorials/ceph-cluster/index.mdx | 2 +- tutorials/configure-virtual-machine-esxi/index.mdx | 4 ++-- tutorials/focalboard-project-management/index.mdx | 9 +++++++++ tutorials/proxmox-softraid/index.mdx | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/bin/check-external-links.py b/bin/check-external-links.py index 03a016ecd0..3ba0b247c6 100755 --- a/bin/check-external-links.py +++ b/bin/check-external-links.py @@ -53,7 +53,7 @@ exclude = [ '^https?://internal\.invalid', '^https?://www\.scaleway\.com/en/docs', - # Marketing site: its CDN blocks non-browser clients with 403 + '^https?://virtualmedia\.online\.net', '^https?://www\.scaleway\.com/(en|fr)(/|$)', # Behind login or invite-only '^https?://console\.scaleway\.com', diff --git a/tutorials/ceph-cluster/index.mdx b/tutorials/ceph-cluster/index.mdx index b1b6b07f2d..279038e4c1 100644 --- a/tutorials/ceph-cluster/index.mdx +++ b/tutorials/ceph-cluster/index.mdx @@ -162,7 +162,7 @@ This tutorial guides you through deploying a three-node Ceph cluster with a RADO --ssl-key=/etc/ceph/private/rgw.key ``` -4. Verify RGW by accessing http://ceph-node-a:80 (or https://ceph-node-a:443 for HTTPS). +4. Verify RGW by accessing `http://ceph-node-a:80` (or `https://ceph-node-a:443` for HTTPS). ## Create an RGW user diff --git a/tutorials/configure-virtual-machine-esxi/index.mdx b/tutorials/configure-virtual-machine-esxi/index.mdx index 5198b141ac..7c204ec25c 100644 --- a/tutorials/configure-virtual-machine-esxi/index.mdx +++ b/tutorials/configure-virtual-machine-esxi/index.mdx @@ -51,7 +51,7 @@ Management of the virtual machines can be done through an easy-to-use web interf - A Dedibox account logged into the [console](https://console.online.net) - [Owner](/iam/concepts/glossary/#owner) status or [IAM permissions](/iam/concepts/glossary/#permission) allowing you to perform actions in the intended Organization - A [Dedibox](http://www.scaleway.com/en/dedibox) server that fulfills the [VMware hardware requirements](https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.esxi.upgrade.doc/GUID-DEB8086A-306B-4239-BF76-E354679202FC.html) -- A [valid license](https://my.vmware.com/en/group/vmware/evalcenter?p=free-esxi7&lp=default) for ESXi (a 60-day free trial is available) +- A valid license for ESXi - At least one [failover IP](/dedibox-ip-failover/concepts/#failover-ips) with a [virtual MAC address](/dedibox-ip-failover/concepts/#virtual-mac-address) ## Installing ESXi @@ -95,7 +95,7 @@ The process from this step forward may differ according to the KVM model being u The ESXI login screen displays. 2. Log in with the user `root` and the password set during the installation of ESXi. -3. Click **Manage** (1), then **Licensing** (2) followed by **Assign License** and enter the license code for ESXi. A free ESXi license can be obtained directly [from VMware](https://my.vmware.com/en/group/vmware/evalcenter?p=free-esxi7&lp=default). +3. Click **Manage** (1), then **Licensing** (2) followed by **Assign License** and enter the license code for ESXi. 4. Validate the license. The license details are shown: diff --git a/tutorials/focalboard-project-management/index.mdx b/tutorials/focalboard-project-management/index.mdx index 6132b33a78..968e4c5ea5 100644 --- a/tutorials/focalboard-project-management/index.mdx +++ b/tutorials/focalboard-project-management/index.mdx @@ -66,13 +66,17 @@ In the following steps, we will make sure that the software and the required pac We use Nginx as a proxy in front of the application to prevent it from direct access and by providing an additional layer of security through TLS encryption. 1. Create an Nginx server configuration for Focalboard. + ``` nano /etc/nginx/sites-available/focalboard.example.com.conf ``` + In this tutorial, we use the subdomain `focalboard.example.com`. Remember to change it to your own (sub)domain where applicable. + Copy and paste the following configuration into the file, edit it, and save it. + ``` upstream focalboard { server localhost:8000; @@ -128,16 +132,21 @@ We use Nginx as a proxy in front of the application to prevent it from direct ac } } ``` + 2. Test the new configuration, enable the site, and reload Nginx to activate the Focalboard site. + ``` nginx -t ln -s /etc/nginx/sites-available/focalboard.example.com.conf /etc/nginx/sites-enabled/focalboard.example.com.conf service nginx reload ``` + 3. Run `certbot` to obtain a TLS certificate for your domain name and let the application configure Nginx automatically. + ``` certbot ``` + For more details on using [Certbot](https://certbot.eff.org/), refer to our [dedicated documentation](/tutorials/nginx-reverse-proxy/#adding-tls-to-your-nginx-reverse-proxy-using-lets-encrypt). diff --git a/tutorials/proxmox-softraid/index.mdx b/tutorials/proxmox-softraid/index.mdx index 39c70c622d..49c547f11b 100644 --- a/tutorials/proxmox-softraid/index.mdx +++ b/tutorials/proxmox-softraid/index.mdx @@ -32,7 +32,7 @@ import Requirements from '@macros/iam/requirements.mdx' Proxmox Virtual Environment - or Proxmox VE is a server virtualization platform, based on Debian Linux. It allows the deployment of management of [KVM-based](https://www.linux-kvm.org/page/Main_Page) virtual machines or [LXC](https://linuxcontainers.org/) containers. -The tool provides a REST-API as well as a graphical web interface to manage the virtual machines and is licensed under the [GNU Affero General Public License, version 3](https://www.gnu.org/licenses/agpl-3.0.de.html). +The tool provides a REST-API as well as a graphical web interface to manage the virtual machines and is licensed under the [GNU Affero General Public License, version 3](https://www.gnu.org/licenses/agpl-3.0.html).