Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,6 @@ jspm_packages/
# dotenv environment variables file
.env
.env.test

# lychee external link checker cache
.lycheecache
160 changes: 160 additions & 0 deletions bin/check-external-links.py
Original file line number Diff line number Diff line change
@@ -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',
'^https?://virtualmedia\.online\.net',
'^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 <out_dir>/<source file>.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())
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion pages/gpu/reference-content/understanding-nvidia-fp8.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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).
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).
2 changes: 1 addition & 1 deletion pages/gpu/reference-content/understanding-nvidia-tao.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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)
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/).
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion pages/object-storage/api-cli/create-bucket-policy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import ImportantBucketPolicy from '@macros/storage/important-bucket-policy.mdx'

<StorageBucketPolicy />

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/).

<Requirements />

Expand Down
2 changes: 1 addition & 1 deletion pages/object-storage/how-to/create-bucket-policy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion pages/object-storage/how-to/edit-storage-class.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.

<Message type="note">
To change the storage class of several or all objects in a bucket, create a [lifecycle rule](/object-storage/how-to/manage-lifecycle-rules/).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
4 changes: 2 additions & 2 deletions pages/serverless-functions/api-cli/deploy-function-api.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -92,7 +92,7 @@ Refer to the [Scaleway Developers website](https://www.scaleway.com/en/developer
Your function is now being deployed.

<Message type="tip">
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 \
Expand Down
2 changes: 1 addition & 1 deletion tutorials/ceph-cluster/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion tutorials/configure-nodemcu-iot-hub/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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:
<Lightbox image={image6} alt="" />
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.
Expand Down
Loading
Loading