Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update oci-migration.md #616

Closed
wants to merge 115 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
767362e
Update oci-migration.md
veiset Mar 15, 2024
0422806
Auto-instrumentation.md innehold skrivefeil i runtime for node eksemp…
espenwaaga Mar 16, 2024
ac12bf4
document how to set up dependabot with auto-merge (#615)
kimtore Mar 18, 2024
1fc3acf
Automatic update of nais application reference/example
sindrerh2 Mar 20, 2024
bb389aa
Update references to Secret Manager to Console/NAIS secrets
jhrv Mar 21, 2024
7629d06
Document global metrics
Starefossen Mar 26, 2024
ae4f95f
Bump dependabot/fetch-metadata from 1.6.0 to 2.0.0 (#622)
dependabot[bot] Apr 2, 2024
e2a96ec
Bump actions-hub/gcloud from 466.0.0 to 470.0.0 (#621)
dependabot[bot] Apr 2, 2024
67e6c85
how-to/deploy: add notes on GAR
tronghn Apr 3, 2024
70ea8ad
fix(postgres): Link to query insights returns 404 (#623)
ybelMekk Apr 4, 2024
d2ae408
Add explanation on how to expose your application
jhrv Apr 5, 2024
c03dd0e
Move explanation on exposing app to generic doc
jhrv Apr 5, 2024
a853a23
Fix broken table
jhrv Apr 5, 2024
14ab931
Fix broken link to app-spec
jhrv Apr 5, 2024
82d03e2
Fix typo
jhrv Apr 5, 2024
16d09f2
Fix ingress
jhrv Apr 5, 2024
ca56bbe
how-to/deploy: rearrange words for GAR
tronghn Apr 5, 2024
e3debe5
Remove numbering of steps in how-to's
jhrv Apr 8, 2024
0d62961
add how-to expose applicaiton
frodesundby Apr 8, 2024
655fdee
Document OpenTelemetry agent and sdk versions
Starefossen Apr 8, 2024
21fe4b9
OpenTelemetry java sdk version v1.36.0
Starefossen Apr 8, 2024
f123f4d
Automatic update of nais application reference/example
tronghn Apr 8, 2024
08179e3
A note on supported libraries and frameworks for javaagent
Starefossen Apr 8, 2024
f77cca4
Add tags overview page (#625)
thokra-nav Apr 8, 2024
592bc81
cdn: tag and title passthrough
tronghn Apr 9, 2024
5405869
Document more Otel metrics and advanced java config
Starefossen Apr 9, 2024
f09658a
Add the kyverno polices as a reference (#624)
Reasonable-Solutions Apr 11, 2024
2c8a79d
🔪 broken link stragglers (#627)
Reasonable-Solutions Apr 12, 2024
183c1db
Automatic update of nais application reference/example
tronghn Apr 12, 2024
b81d2ce
ci: main, not master
tronghn Apr 12, 2024
0ab0b6f
Add info about specific paths in ingresses
jhrv Apr 16, 2024
9fe07bc
add(postgres): faq about backup retention and log retention (#628)
ybelMekk Apr 16, 2024
b9d1e19
add(postgres): section about logical replication in faq
ybelMekk Apr 16, 2024
569538c
Corrected the documentation concerning access to secure logs. (#630)
dmykarp Apr 16, 2024
d0f4fec
Document logging and OpenTelemetry Auto-Configuration
Starefossen Apr 17, 2024
870804e
Adding a step about warning Kibana admins of new teams (#631)
dmykarp Apr 17, 2024
b66339d
add new env vars and mark sql proxy as old tech (#632)
sechmann Apr 17, 2024
585fd43
Update documentation with additional env variables for SQL Instances …
mortenlj Apr 19, 2024
2db0293
fix typos: capital I in Internet, and remove hyphens
kimtore Apr 22, 2024
00ac767
Fix more typos
kimtore Apr 22, 2024
1b3fc7d
Bump idna from 3.6 to 3.7 (#626)
dependabot[bot] Apr 22, 2024
2634fda
Document ingress uptime probes
Starefossen Apr 24, 2024
4ae951f
Document JAVA_TOOL_OPTIONS for Otel java agent
Starefossen Apr 24, 2024
f0db552
Fix broken links
Starefossen Apr 24, 2024
a75f32b
add(postgres): faq
ybelMekk Apr 24, 2024
95517ef
add(postgres): faq
ybelMekk Apr 24, 2024
44204b6
Automatic update of nais application reference/example
ybelMekk Apr 26, 2024
89f35ec
Automatic update of nais application reference/example
ybelMekk Apr 26, 2024
1805a96
Automatic update of nais application reference/example
ybelMekk Apr 26, 2024
57ad129
All applications now get jdbc-url
mortenlj Apr 30, 2024
cc363dc
Info om blokkerte suffiks for nav.no i prod-gcp (#633)
sebassonav May 2, 2024
928504f
jdbc-url is only created when database is created, so only instances …
mortenlj May 3, 2024
50a4c0f
only instances with private ip get jdbc-url out of the box
mortenlj May 3, 2024
3402983
Use books instead of computers for reference
jhrv May 7, 2024
dfe1567
Update otel node.js agent version to v0.51.0
Starefossen May 7, 2024
dfdff74
Clarify footnote about jdbc-url
mortenlj May 7, 2024
09b0445
Update links to Nginx access logs
Starefossen May 13, 2024
1796203
Restructure to 'diataxis by feature' (#640)
tronghn May 15, 2024
222d616
Revert "Restructure to 'diataxis by feature' (#640)"
tronghn May 15, 2024
82470cb
Reapply "Restructure to 'diataxis by feature' (#640)"
tronghn May 15, 2024
9e30f0f
build: include dotfiles as well
tronghn May 15, 2024
f834e1e
naisdevice: actually evaluate tenant
tronghn May 15, 2024
7ace0a7
Automatic update of nais application reference/example
tronghn May 15, 2024
dd42a29
Automatic update of nais application reference/example
tronghn May 15, 2024
9e10a9f
persistence/influxdb: correct nav entries
tronghn May 15, 2024
99a7af5
persistence/influxdb: fix broken link and formatting
tronghn May 15, 2024
d6bb559
persistence/influxdb: actually fix broken link
tronghn May 15, 2024
691efec
persistence/influxdb: more formatting
tronghn May 15, 2024
359173d
Redirect all the old observability pages
Starefossen May 15, 2024
7fffbb7
Remove duplicate redirect
Starefossen May 15, 2024
3e532f3
mkdocs: remove extraneous character in redirects
tronghn May 15, 2024
53b7d04
Fix invalid redirect
Starefossen May 15, 2024
6701ec0
fix: y-en hadde flyttet seg litt
Kyrremann May 15, 2024
59f0537
grafana: team får egen service account (#641)
Kyrremann May 15, 2024
ba4d5c6
mkdocs: add more redirects, sort alphabetically
tronghn May 15, 2024
d62ead3
Minor fixes on infoscreen doc
jhrv May 15, 2024
4587fb0
add missing title to home page
tronghn May 15, 2024
a5af6d0
add more redirects, explicitly set titles that were ambiguous on the …
tronghn May 15, 2024
c1aa62c
i am a redirector, redirecting is my passion
tronghn May 15, 2024
0f0b71f
move single page references to directories for consistency
tronghn May 16, 2024
fc7cbfc
mkdocs: fix navigation menu for mobile
tronghn May 16, 2024
2e6c2bb
Revert "mkdocs: fix navigation menu for mobile"
tronghn May 16, 2024
330625c
mkdocs: fix navigation menu for mobile
tronghn May 16, 2024
fb4f88b
Rewrite intro to auth
jhrv May 16, 2024
068e983
homepage: clean up footnotes
tronghn May 21, 2024
f61f237
homepage: adjust title for auth pointer
tronghn May 21, 2024
044840d
auth: minor cleanup for overview
tronghn May 21, 2024
c0f3b60
Update Otel metrics reference
Starefossen May 21, 2024
c0d5690
Bump requests from 2.31.0 to 2.32.0 (#643)
dependabot[bot] May 21, 2024
0c04a26
auth: fix tags
tronghn May 21, 2024
a1294bb
auth: move concepts to explanations, fix links
tronghn May 21, 2024
e34f878
mkdocs: add redirect for salsa
tronghn May 21, 2024
e7a61e0
Team authorization needs Admin role
kimtore May 21, 2024
4a0ec3a
Reflect the real UI
kimtore May 21, 2024
2d0282c
persistence/kafka: add missing pools reference
tronghn May 21, 2024
e327d73
auth/maskinporten: rewrite to diataxis
tronghn May 22, 2024
bdad733
tenants/nav/security: correct link to maskinporten
tronghn May 22, 2024
8c6ced9
auth/tokenx: rewrite to diataxis
jhrv May 22, 2024
a466df7
tenants/nav/workloads: correct links to tokenx
tronghn May 22, 2024
141dedc
auth: minor cleanups
tronghn May 23, 2024
3113d40
auth/idporten: rewrite to diataxis
tronghn May 23, 2024
c72c0aa
all: rename 'what's next' to 'related pages'
tronghn May 23, 2024
54e56ce
auth/idporten: move admonition to the top
tronghn May 23, 2024
b2e9916
auth: consistency passthrough
tronghn May 24, 2024
b7a99e9
workloads/environments: add special note for ingresses accessible fro…
tronghn May 24, 2024
718e917
workloads/environments: correct tenant
tronghn May 24, 2024
c819b28
workloads/environments: un-DRY notes on special paths
tronghn May 24, 2024
bf2f030
doc-ros: lagt til ansatt.nav.no
Kyrremann May 27, 2024
2b22de6
Bump mkdocs-build-plantuml-plugin from 1.9.0 to 1.10.0 (#620)
dependabot[bot] May 27, 2024
f4b9e80
Bump dependabot/fetch-metadata from 2.0.0 to 2.1.0 (#634)
dependabot[bot] May 27, 2024
e135bdf
Bump actions-hub/gcloud from 470.0.0 to 474.0.0 (#635)
dependabot[bot] May 27, 2024
eaba730
Bump mkdocs-material from 9.5.12 to 9.5.18 (#636)
dependabot[bot] May 27, 2024
ce481a7
Bump mkdocs-git-revision-date-localized-plugin from 1.2.4 to 1.2.5 (#…
dependabot[bot] May 27, 2024
fc9c464
Bump jinja2 from 3.1.3 to 3.1.4 (#639)
dependabot[bot] May 27, 2024
665d2e6
Bump pymdown-extensions from 10.7 to 10.8.1 (#638)
dependabot[bot] May 27, 2024
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
2 changes: 1 addition & 1 deletion .github/workflows/dependabot-auto-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v1.6.0
uses: dependabot/fetch-metadata@v2.1.0
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Enable auto-merge for Dependabot PRs
Expand Down
12 changes: 4 additions & 8 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
name: Build and publish doc

on:
push:
branches:
- main

on: push
jobs:
build:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -42,6 +37,7 @@ jobs:
./build.sh nav ssb ci-nais dev-nais tenant

publish:
if: github.ref == 'refs/heads/main'
needs: build
runs-on: ubuntu-latest
strategy:
Expand All @@ -65,7 +61,7 @@ jobs:
key: ${{ github.sha }}

- name: Sync documentation to bucket
uses: actions-hub/gcloud@466.0.0
uses: actions-hub/gcloud@474.0.0
env:
PROJECT_ID: not-used
APPLICATION_CREDENTIALS: ${{ secrets.NAIS_DOC_SA }}
Expand All @@ -74,7 +70,7 @@ jobs:
cli: gsutil

- name: Invalidate cache
uses: actions-hub/gcloud@466.0.0
uses: actions-hub/gcloud@474.0.0
env:
PROJECT_ID: not-used
APPLICATION_CREDENTIALS: ${{ secrets.NAIS_DOC_SA }}
Expand Down
13 changes: 7 additions & 6 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#! /bin/bash
set -e

rm -rf ./out ./docs-base
mkdir -p ./out ./docs-base

# Copy documentation to base folder as we need to use docs as a staging folder
cp -r ./docs/* ./docs-base
cp -ra ./docs/. ./docs-base/

for TENANT in $@;
do
for TENANT in $@;
do
rm -rf ./docs
cp -r ./docs-base ./docs
cp -rf ./tenants/$TENANT/* ./docs
TENANT=$TENANT poetry run mkdocs build --no-strict -d out/$TENANT
cp -ra ./docs-base/. ./docs/
cp -rf ./tenants/$TENANT/* ./docs || true
TENANT=$TENANT poetry run mkdocs build --strict -d out/$TENANT
done

17 changes: 17 additions & 0 deletions docs/.pages
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
nav:
- Home: README.md
- explanations
- tutorials
- "": ""
- workloads
- build
- auth
- observability
- persistence
- security
- Other services: services
- "": ""
- operate
- "": ""
- tags.md
- ...
60 changes: 25 additions & 35 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,58 +1,48 @@
---
title: NAIS Developer Documentation
hide:
- feedback
- footer
- toc
---

<style> // hides the edit button on the start-page
.md-typeset h1,
<!-- This hides the edit button on the start page -->
<style>
.md-content__button {
display: none;
}
</style>

# NAIS Documentation
# :wave: **Welcome to the NAIS developer documentation!**

<div class="grid cards" markdown>
- :seedling: **Getting Started?**
Here you'll find _explanations_[^1], _how-to guides_[^2], and _references_[^3] for all things NAIS.

---
- Initially it's a good idea to learn about [what NAIS is](./explanation/nais.md) to get an idea of the fundamentals.
- Once you're familiar with the basic concepts, move on to the [Hello NAIS](./tutorial/hello-nais/hello-nais-1.md) tutorial to get your first app running.
### :seedling: **New to NAIS?**

</div>
Start here to get an idea of the fundamentals.

<div class="grid cards" markdown>
- :rocket: **Tutorials**

---

Learning-oriented lessons that take you through a series of steps to complete a project. Most useful when you want to get started with NAIS.

[:octicons-arrow-right-24: Tutorials](tutorial/README.md)

- :dart: **How-to guides**

---

Practical step-by-step guides to help you achieve a specific goal. Most useful when you're trying to get something done.
- :ok_hand: [**What is NAIS?**](explanations/nais.md)
- :student: [**Your first application; Hello NAIS**](tutorials/hello-nais.md)

[:octicons-arrow-right-24: How-to guides](how-to-guides/README.md)

- :bulb: **Explanation**

---

Big-picture explanations of higher-level concepts. Most useful when you want to understand how NAIS works.

[:octicons-arrow-right-24: Explanations](explanation/README.md)
</div>

- :computer: **Reference**
### :technologist: **Already familiar with NAIS?**

---
What can we help you with today?

Reference documentation for the NAIS platform. Most useful when you need to look up details about a specific feature.
<div class="grid cards" markdown>

[:octicons-arrow-right-24: Reference](reference/README.md)
- :package: [**Run your code**](workloads/README.md)
- :rocket: [**Build and deploy your code**](build/README.md)
- :open_file_folder: [**Store your data**](persistence/README.md)
- :closed_lock_with_key: [**Auth your users and workloads**](auth/README.md)
- :telescope: [**Gain insight into your workloads**](observability/README.md)
- :wrench: [**Manage your workloads and services**](operate/README.md)
- :heavy_plus_sign: [**Explore the rest of NAIS**](services/README.md)

</div>

[^1]: :bulb: [_explanations_](tags.md#explanation) present higher-level concepts. Most useful when you want to understand how NAIS works.
[^2]: :dart: [_how-to guides_](tags.md#how-to) help you achieve a specific goal. Most useful when you're trying to get something done.
[^3]: :books: [_references_](tags.md#reference) contain technical descriptions and specifications. Most useful when you need to look up details about a specific feature.
5 changes: 5 additions & 0 deletions docs/auth/.pages
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
nav:
- README.md
- 💡 Explanations: explanations
- 📚 Reference: reference
- ...
96 changes: 96 additions & 0 deletions docs/auth/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
tags: [auth, explanation]
description: Services and addons to support authentication and authorization in your applications.
---

# Authentication and authorization

NAIS helps your applications [log in users](#logging-in-users), [validate inbound requests](#validating-inbound-requests) and [make authenticated outbound requests](#making-outbound-requests) using the following identity providers:

<div class="grid cards" markdown>

- [**Azure AD**][Azure AD] (aka Entra ID)

For employees and internal services.

- [**ID-porten**][ID-porten]

For Norwegian citizens.

- [**TokenX**][TokenX]

For internal applications acting on-behalf-of ID-porten citizens.

- [**Maskinporten**][Maskinporten]

For machine-to-machine communication between organizations or businesses.

</div>

Your application may have multiple use cases that can require a combination of services.

See the different scenarios below to identify which service(s) you need for your application, and follow the links to the respective service for more details.

## Logging in users

Depending on who your users are, you can use the following services to log them in:

:person_standing: Log in employees :octicons-arrow-right-24: [Azure AD](../security/auth/azure-ad/sidecar.md)

:person_standing: Log in citizens :octicons-arrow-right-24: [ID-porten]

## Validating inbound requests

...from applications acting

```mermaid
graph TD
B1[on-behalf-of]
B2[as themselves]

B1 --> |citizens| TokenX[<a href='../security/auth/tokenx'>TokenX</>]
B1 --> |employees| AAD_machine[<a href='../security/auth/azure-ad'>Azure AD</>]


B2 --> |internally| AAD_machine[<a href='../security/auth/azure-ad'>Azure AD</>]
B2 --> |externally| Maskinporten[<a href='../security/auth/maskinporten'>Maskinporten</a>]
```

The graph above can also be described as:

:material-server::person_standing: Validate requests from application on behalf of employee :octicons-arrow-right-24: [Azure AD]

:material-server::person_standing: Validate requests from application on behalf of citizen :octicons-arrow-right-24: [TokenX]

:material-server: Validate requests from internal application :octicons-arrow-right-24: [Azure AD]

:material-server: Validate requests from external application :octicons-arrow-right-24: [Maskinporten]

## Making outbound requests

```mermaid
graph TD
B1[on-behalf-of]
B2[as application]

B1 --> |citizens| TokenX[<a href='../security/auth/tokenx'>TokenX</>]
B1 --> |employees| AAD_machine[<a href='../security/auth/azure-ad'>Azure AD</>]

B2 --> |internally| AAD_machine[<a href='../security/auth/azure-ad'>Azure AD</>]
B2 --> |externally| Maskinporten[<a href='../security/auth/maskinporten'>Maskinporten</a>]
```

The graph above can also be described as:

:material-server::person_standing: Make requests on behalf of employee :octicons-arrow-right-24: [Azure AD]

:material-server::person_standing: Make requests on behalf of citizen :octicons-arrow-right-24: [TokenX]

:material-server: Make requests to internal API :octicons-arrow-right-24: [Azure AD]

:material-server: Make requests to external API :octicons-arrow-right-24: [Maskinporten]

[Azure AD]: ../security/auth/azure-ad/README.md
[ID-porten]: idporten/README.md
[TokenX]: tokenx/README.md
[Maskinporten]: maskinporten/README.md
42 changes: 23 additions & 19 deletions docs/security/auth/concepts.md → docs/auth/explanations/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# Concepts
---
tags: [auth, explanation]
---

# Auth concepts

This page describes basic concepts and glossary commonly referred to when working with authentication and authorization.

Expand All @@ -24,19 +28,19 @@ There are multiple ways of obtaining such a grant, depending on the use case:

**Internal applications**

- [Machine-to-machine with Azure AD](azure-ad/usage.md#oauth-20-client-credentials-grant)
- [Machine-to-machine with Azure AD](../../security/auth/azure-ad/usage.md#oauth-20-client-credentials-grant)

**Employee-facing applications**

- [On-behalf-of an end-user with Azure AD](azure-ad/usage.md#oauth-20-on-behalf-of-grant)
- [On-behalf-of an end-user with Azure AD](../../security/auth/azure-ad/usage.md#oauth-20-on-behalf-of-grant)

**External applications**

- [Machine-to-machine with Maskinporten](maskinporten/client.md)
- [Machine-to-machine with Maskinporten](../maskinporten/README.md)

**Citizen-facing applications**

- [On-behalf-of an end-user with TokenX](tokenx.md)
- [On-behalf-of an end-user with TokenX](../tokenx/README.md)

### OpenID Connect

Expand All @@ -45,8 +49,8 @@ It is used to authenticate end users.

The platform provides opt-in sidecars that implement OpenID Connect:

- [Sidecar for Azure AD](azure-ad/sidecar.md) (employee-facing applications)
- [Sidecar for ID-porten](idporten.md) (citizen-facing applications)
- [Sidecar for Azure AD](../../security/auth/azure-ad/sidecar.md) (employee-facing applications)
- [Sidecar for ID-porten](../idporten/README.md) (citizen-facing applications)

Due to the complexity involved in implementing and maintaining such clients, we recommend that your applications use
these sidecars when possible.
Expand All @@ -68,10 +72,10 @@ Similar terms such as _authorization server_ (AS) or _OpenID provider_ (OP) are

Providers that the platform supports provisioning for:

- [Azure AD](azure-ad/README.md)
- [ID-porten](idporten.md)
- [Maskinporten](maskinporten/README.md)
- [TokenX](tokenx.md)
- [Azure AD](../../security/auth/azure-ad/README.md)
- [ID-porten](../idporten/README.md)
- [Maskinporten](../maskinporten/README.md)
- [TokenX](../tokenx/README.md)

#### Well-Known URL / Metadata Document

Expand Down Expand Up @@ -192,9 +196,9 @@ identifier is generally not considered to be confidential.
The client ID for your client is injected at runtime as an environment variable.
See the respective identity provider page for details:

- [Azure AD](azure-ad/usage.md#runtime-variables-credentials)
- [ID-porten](idporten.md#runtime-variables-credentials)
- [TokenX](tokenx.md#runtime-variables-credentials)
- [Azure AD](../../security/auth/azure-ad/usage.md#runtime-variables-credentials)
- [ID-porten](../idporten/reference/README.md#runtime-variables-credentials)
- [TokenX](../tokenx/README.md#runtime-variables-credentials)

#### Client Authentication

Expand Down Expand Up @@ -424,7 +428,7 @@ Validation should always be performed before granting access to any [resource se
Use well-known and widely used libraries and frameworks that take care of most
of the heavy lifting for you.

See [libraries and frameworks](development.md#libraries-and-frameworks) for a non-comprehensive list.
See [libraries and frameworks](../reference/README.md#libraries-and-frameworks-for-validating-and-acquiring-tokens) for a non-comprehensive list.

#### Signature Validation

Expand Down Expand Up @@ -465,10 +469,10 @@ Most libraries will have implementations to automatically validate these de fact

See the individual identity provider pages for specific validation related to each provider:

- [Azure AD](azure-ad/usage.md#token-validation)
- [ID-porten](idporten.md#token-validation)
- [Maskinporten](maskinporten/scopes.md#3-validate-tokens)
- [TokenX](tokenx.md#token-validation)
- [Azure AD](../../security/auth/azure-ad/usage.md#token-validation)
- [ID-porten](../idporten/how-to/secure.md#validate-token-in-authorization-header)
- [Maskinporten](../maskinporten/how-to/secure.md#validate-tokens)
- [TokenX](../tokenx/README.md#token-validation)

---

Expand Down
6 changes: 6 additions & 0 deletions docs/auth/idporten/.pages
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
title: ID-porten
nav:
- README.md
- 🎯 How-To: how-to
- 📚 Reference: reference
- ...
Loading