Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
7d3ff1c
Utility script that removes trailing slashes on relative cloud docs l…
nmelehan-akamai Jul 22, 2026
0b868c6
Remove trailing slash from relative cloud docs links
nmelehan-akamai Jul 22, 2026
1a46db6
Update link check test to enforce no trailing slash
nmelehan-akamai Jul 28, 2026
c902b26
Make a test guide that tests the link checker
nmelehan-akamai Jul 28, 2026
ed09af6
Test aliases + link checker
nmelehan-akamai Jul 28, 2026
3d0a14b
Add trailing slash to alias of test guide
nmelehan-akamai Jul 28, 2026
d3b7a78
Update blueberry test to enforce no trailing slashes on aliases
nmelehan-akamai Jul 28, 2026
e7fed5c
Revert "Add trailing slash to alias of test guide"
nmelehan-akamai Jul 28, 2026
313103f
Remove test guides for link checker updates
nmelehan-akamai Jul 28, 2026
d6fc120
Make a test guide that tests the link checker
nmelehan-akamai Jul 28, 2026
d64f20e
Test aliases + link checker
nmelehan-akamai Jul 28, 2026
0779a91
Test 404 links
nmelehan-akamai Jul 28, 2026
35ef9fd
Test domain in links
nmelehan-akamai Jul 28, 2026
071b3d9
Fix domain in link test
nmelehan-akamai Jul 28, 2026
6a68b55
Remove trailing slash from canonical link construction in link checker
nmelehan-akamai Jul 30, 2026
116c53f
Update comments for link checker
nmelehan-akamai Jul 30, 2026
0466598
Update archetype to use akamai.com writer formatting guide links
nmelehan-akamai Jul 30, 2026
da8e682
Merge remote-tracking branch 'upstream/develop' into remove-trailing-…
nmelehan-akamai Jul 30, 2026
0d090ba
Remove link checker testing guides
nmelehan-akamai Jul 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions archetypes/content.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ external_resources:
- '[Link Title 2](http://www.example.net)'
---

When writing content, please reference the [Linode Writer's Formatting Guide](https://www.linode.com/docs/guides/linode-writers-formatting-guide/). This provides formatting guidelines for YAML front matter, Markdown, and our custom shortcodes (like [command](https://www.linode.com/docs/guides/linode-writers-formatting-guide/#commands), [file](https://www.linode.com/docs/guides/linode-writers-formatting-guide/#files), [notes](https://www.linode.com/docs/guides/linode-writers-formatting-guide/#note-shortcode), and [tabs](https://www.linode.com/docs/guides/linode-writers-formatting-guide/#tabs)).
When writing content, please reference the [Linode Writer's Formatting Guide](https://www.akamai.com/cloud/guides/linode-writers-formatting-guide/). This provides formatting guidelines for YAML front matter, Markdown, and our custom shortcodes (like [command](https://www.akamai.com/cloud/guides/linode-writers-formatting-guide/#commands), [file](https://www.akamai.com/cloud/guides/linode-writers-formatting-guide/#files), [notes](https://www.akamai.com/cloud/guides/linode-writers-formatting-guide/#note-shortcode), and [tabs](https://www.akamai.com/cloud/guides/linode-writers-formatting-guide/#tabs)).

## Before You Begin

In this section, list out any prerequisites necessary for the reader to complete the guide, including: services or products to be created beforehand, hardware and plan requirements, or software that needs to be preinstalled.

See: [Linode Writer's Formatting Guide: Before You Begin](http://www.linode.com/docs/guides/linode-writers-formatting-guide/#before-you-begin)
See: [Linode Writer's Formatting Guide: Before You Begin](http://www.akamai.com/cloud/guides/linode-writers-formatting-guide/#before-you-begin)
4 changes: 2 additions & 2 deletions ci/blueberry.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ def valid_alias(file_yaml, **kwargs):
if 'deprecated' not in file_yaml or file_yaml['deprecated'] is False:
errors = []
for alias in file_yaml['aliases']:
if not alias.endswith('/'):
errors.append(f"{alias} should end with a slash (/).")
if alias.endswith('/'):
errors.append(f"{alias} should not end with a slash (/).")
if errors:
return str(kwargs.get('filename')), '\n'.join(errors)
else:
Expand Down
49 changes: 36 additions & 13 deletions ci/check-links.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,13 @@ def add_issue(self, issue):
severity = 'failure',
weight = 30
))
issue_types.append(IssueType(
id = 'trailing-slash',
title = "Trailing slash",
summary = "The link ends with a trailing slash (/cloud/ links must not have one).",
severity = 'failure',
weight = 35
))
issue_types.append(IssueType(
id = 'other',
title = "Other issues",
Expand All @@ -143,6 +150,22 @@ def add_issue(self, issue):
weight = 50
))

# ------------------
# Normalize a link for comparison
# ------------------
def normalize_link(link):

# Internal /cloud/ links are written without a trailing slash, while a
# guide's aliases may be stored with one. Strip the
# trailing slash so the two forms can be compared.
stripped = link.rstrip('/')

# Never reduce the site root to an empty string
if stripped == "":
return link

return stripped

# ------------------
# Build a list of all guides
# ------------------
Expand Down Expand Up @@ -195,13 +218,13 @@ def get_guides():
#print("New file path: " + new_file_path)
os.rename(old_file_path,new_file_path)

canonical_link = "/cloud/guides/" + expanded_guide['slug'] + "/"
canonical_link = "/cloud/guides/" + expanded_guide['slug']
# ... If the guide is in any other section...
else:
canonical_link = "/" + file_path
canonical_link = canonical_link.replace('/index.md','/')
canonical_link = canonical_link.replace('/_index.md','/')
canonical_link = canonical_link.replace('/docs/','/cloud/') # Convert docs-prefix links to cloud-prefix links
canonical_link = canonical_link.replace('/index.md','')
canonical_link = canonical_link.replace('/_index.md','')
canonical_link = canonical_link.replace('/docs','/cloud') # Convert docs-prefix links to cloud-prefix links

# Construct the guide object
guide = Guide(root, file_path, expanded_guide['title'], canonical_link)
Expand Down Expand Up @@ -350,7 +373,7 @@ def check_internal_links_markdown(guides, assets):
link_unmodified = link

# Log issue if link contains "linode.com/docs/"
if "linode.com/docs/" in link:
if "linode.com/docs" in link or "akamai.com/cloud/guides" in link or "akamai.com/cloud/marketplace-docs" in link or "akamai.com/cloud/reference-architecture" in link:
issues.append(Issue(link_unmodified,'docs-domain-name'))
continue
# Ignore links that start with common protocols
Expand All @@ -373,23 +396,23 @@ def check_internal_links_markdown(guides, assets):
# Ignore links to resources within the same directory
if not "/" in link and "." in link:
continue
# Log issue if link does not start with /cloud/
if not link.startswith('/cloud/'):
# Log issue if link does not point to the /cloud root
if not link.startswith('/cloud/') and not link == '/cloud':
issues.append(Issue(link_unmodified,'incorrect-root'))
continue
# Log issue if link ends with two slashes /
if '//' in link:
# Log issue if link ends with two slashes /
issues.append(Issue(link_unmodified,'formatting'))
link = link.replace('//','/')
if not link.endswith('/'):
# Log warning if link does not end with a slash /
issues.append(Issue(link_unmodified,'formatting'))
link = link + '/'
if link.endswith('/'):
# Log issue if link ends with a slash /
issues.append(Issue(link_unmodified,'trailing-slash'))
link = normalize_link(link)
# Check if link points to a canonical internal link
if not next((x for x in guides if x.link == link), None):
if not next((x for x in guides if normalize_link(x.link) == link), None):
# Checks if the link matches an alias or not
if next((x for x in guides if link.replace('/cloud/','/') in x.aliases), None) is not None:
if next((x for x in guides if link.replace('/cloud/','/') in [normalize_link(a) for a in x.aliases]), None) is not None:
issues.append(Issue(link_unmodified,'points-to-alias'))
else:
issues.append(Issue(link_unmodified,'not-found'))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ aliases: []
---

{{< note >}}
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with `sudo`. If you're not familiar with the `sudo` command, visit our [Users and Groups](/cloud/guides/linux-users-and-groups/) guide.
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with `sudo`. If you're not familiar with the `sudo` command, visit our [Users and Groups](/cloud/guides/linux-users-and-groups) guide.

All configuration files should be edited with elevated privileges. Remember to include `sudo` before running your text editor.
{{< /note >}}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ This guide deploys a chatbot written in Python using these open-source software

- **FastAPI**: Provides components for building a REST API. The API for the example chatbot handles chat requests and responses.

The [Using LangChain and LangGraph to Build a RAG-Powered Chatbot](/cloud/guides/using-langchain-langgraph-build-rag-powered-chatbot/) guide explains the workflow of the application in more detail and provides a walkthrough of relevant code that leverages the LangChain, LangGraph, and FastAPI frameworks.
The [Using LangChain and LangGraph to Build a RAG-Powered Chatbot](/cloud/guides/using-langchain-langgraph-build-rag-powered-chatbot) guide explains the workflow of the application in more detail and provides a walkthrough of relevant code that leverages the LangChain, LangGraph, and FastAPI frameworks.

If you prefer to deploy to Kubernetes, the [Deploy a RAG-Powered Chatbot with LangChain on LKE](/cloud/guides/deploy-rag-powered-chatbot-langchain-lke) guide shows how to containerize and deploy this application on Linode Kubernetes Engine (LKE).

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ This guide demonstrates deploying a Python-based RAG chatbot to Linode Kubernete

Deploying to Kubernetes unlocks production capabilities essential for reliable applications. LKE distributes your chatbot across multiple pods for high availability, automatically replaces failed instances, performs rolling updates without downtime, and scales horizontally under load. This guide covers containerizing your application, creating Kubernetes manifests for secrets and configuration, and deploying to a managed cluster.

The [Using LangChain and LangGraph to Build a RAG-Powered Chatbot](/cloud/guides/using-langchain-langgraph-build-rag-powered-chatbot/) guide explains the workflow of the application in more detail and provides a walkthrough of relevant code that leverages the LangChain, LangGraph, and FastAPI frameworks.
The [Using LangChain and LangGraph to Build a RAG-Powered Chatbot](/cloud/guides/using-langchain-langgraph-build-rag-powered-chatbot) guide explains the workflow of the application in more detail and provides a walkthrough of relevant code that leverages the LangChain, LangGraph, and FastAPI frameworks.

If you prefer a simpler deployment, the [Deploy a RAG-Powered Chatbot with LangChain on an Akamai Compute Instance](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance) guide shows how to run the chatbot on a single compute instance.

Expand Down Expand Up @@ -107,27 +107,27 @@ Follow these sections from the [Deploy a RAG-Powered Chatbot with LangChain on a
Wherever an instruction says to run a command on an Akamai compute instance, run that command locally on your workstation instead.
{{< /note >}}

1. [Clone the Chatbot Codebase](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#clone-the-chatbot-codebase)
1. [Clone the Chatbot Codebase](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#clone-the-chatbot-codebase)

1. [Start a Python Virtual Environment](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#start-a-python-virtual-environment)
1. [Start a Python Virtual Environment](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#start-a-python-virtual-environment)

1. [Copy the .env.example Template](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#copy-the-envexample-template)
1. [Copy the .env.example Template](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#copy-the-envexample-template)

1. [Install Python Dependencies](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#install-python-dependencies)
1. [Install Python Dependencies](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#install-python-dependencies)

1. [Create an OpenAI API Key](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#create-an-openai-api-key)
1. [Create an OpenAI API Key](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#create-an-openai-api-key)

1. [Provision Managed PostgreSQL Databases](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#provision-managed-postgresql-databases)
1. [Provision Managed PostgreSQL Databases](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#provision-managed-postgresql-databases)

- When selecting a region for your databases, use the same region as your LKE cluster.

- When configuring network access for the database, add your workstation's IP address to the allowed list of IPs.

1. [Set Up Linode Object Storage](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#set-up-linode-object-storage)
1. [Set Up Linode Object Storage](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#set-up-linode-object-storage)

- When selecting a region for your object storage bucket, use the same region as your LKE cluster.

1. [Upload Documents to the Object Storage Bucket](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#upload-documents-to-the-object-storage-bucket)
1. [Upload Documents to the Object Storage Bucket](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#upload-documents-to-the-object-storage-bucket)

### Verify Database Access from LKE

Expand Down Expand Up @@ -169,7 +169,7 @@ Your cluster can now reach your databases.

### Index Documents with LangChain

Follow the [Index Documents with LangChain](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/#index-documents-with-langchain) section of the [RAG Chatbot LangChain Compute Instance](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance) guide to initialize your vector database and generate the vector embeddings of your documents.
Follow the [Index Documents with LangChain](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance#index-documents-with-langchain) section of the [RAG Chatbot LangChain Compute Instance](/cloud/guides/deploy-rag-powered-chatbot-langchain-akamai-compute-instance) guide to initialize your vector database and generate the vector embeddings of your documents.

## Containerize your Chatbot Application

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ This guide will explain how to configure a working Storm cluster and its Zookeep
- A Zookeeper or Storm cluster can have either Ubuntu 14.04 LTS or Debian 8 installed on its nodes. Its distribution does not need to be the same one as the one installed on the cluster manager Linode.

{{< note >}}
The steps in this guide and in the bash scripts referenced require root privileges. Be sure to run the steps below as `root`. For more information on privileges, see our [Users and Groups](/cloud/guides/linux-users-and-groups/) guide.
The steps in this guide and in the bash scripts referenced require root privileges. Be sure to run the steps below as `root`. For more information on privileges, see our [Users and Groups](/cloud/guides/linux-users-and-groups) guide.
{{< /note >}}

### Naming Conventions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Several steps are recommended to optimize the compute time cost savings of GPU-b

## What Is PyTorch Lightning?

PyTorch Lightning is a module of [PyTorch](/cloud/guides/pytorch-installation-ubuntu-2004/), a developer framework for deep learning. PyTorch builds upon Python's established strengths in data modeling and neural network training through the addition of GPU-optimized capabilities. PyTorch Lightning adds a framework to PyTorch that optimizes productivity in the research and modeling process. This allows portability of code while achieving the same results, as underlying hardware permits.
PyTorch Lightning is a module of [PyTorch](/cloud/guides/pytorch-installation-ubuntu-2004), a developer framework for deep learning. PyTorch builds upon Python's established strengths in data modeling and neural network training through the addition of GPU-optimized capabilities. PyTorch Lightning adds a framework to PyTorch that optimizes productivity in the research and modeling process. This allows portability of code while achieving the same results, as underlying hardware permits.

PyTorch Lightning allows developers to remove repetitive PyTorch setup code. The framework adds scaling and a command-line interface that allows developers to write modular code with repeatable results. Furthermore, PyTorch Lightning adds scaled GPU utilization that works well with Linode’s specialized GPU-enabled instances. In fact, no code change to existing PyTorch or PyTorch Lightning is needed to take advantage of Linode GPU instances.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ In this tutorial, learn how to get started with Rasa. From installing the framew
1. Follow our [Setting Up and Securing a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guide to update your system. You may also wish to set the timezone, configure your hostname, create a limited user account, and harden SSH access.

{{< note >}}
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with `sudo`. If you’re not familiar with the `sudo` command, see the [Users and Groups](/cloud/guides/linux-users-and-groups/) guide.
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with `sudo`. If you’re not familiar with the `sudo` command, see the [Users and Groups](/cloud/guides/linux-users-and-groups) guide.
{{< /note >}}

## How to Install Rasa Open Source
Expand Down Expand Up @@ -227,7 +227,7 @@ The following steps walk through setting up these prerequisites and deploying an
kubectl create namespace rasacluster
```

1. Follow our [Installing Apps on Kubernetes with Helm 3](/cloud/guides/how-to-install-apps-on-kubernetes-with-helm-3/#install-the-helm-client) tutorial how to install the Helm CLI client.
1. Follow our [Installing Apps on Kubernetes with Helm 3](/cloud/guides/how-to-install-apps-on-kubernetes-with-helm-3#install-the-helm-client) tutorial how to install the Helm CLI client.

{{< note >}}
AlmaLinux, CentOS Stream, and Rocky Linux users may need to install `git` and `tar` prior to installing Helm:
Expand Down
Loading
Loading