diff --git a/.cloudcannon/schemas/default.md b/.cloudcannon/schemas/default.md
index e3a9186f0..474baab89 100644
--- a/.cloudcannon/schemas/default.md
+++ b/.cloudcannon/schemas/default.md
@@ -39,7 +39,7 @@ To do xzy, take the following steps:
2. Format as numbered lists.
- {{< note >}}Add notes like this.{{}}
+ {{< call-out "note" >}}Add notes like this.{{< /call-out >}}
3. If there is only one step, you don't need to format it as a numbered list.
diff --git a/.cloudcannon/schemas/nms/policy.md b/.cloudcannon/schemas/nms/policy.md
index 4f5d0054c..bd2d670c3 100644
--- a/.cloudcannon/schemas/nms/policy.md
+++ b/.cloudcannon/schemas/nms/policy.md
@@ -81,7 +81,7 @@ The following table lists the configurable settings and their default values for
{{%tab name="API"%}}
-{{}}{{< include "acm/how-to/access-acm-api.md" >}}{{}}
+{{< call-out "note" >}}{{< include "acm/how-to/access-acm-api.md" >}}{{< /call-out >}}
To create an XYZ policy using the REST API, send an HTTP `POST` request to the Add-Endpoint-Name-Here endpoint.
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 47978539f..09f9c2eea 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,35 +1,31 @@
### Proposed changes
-Write a clear and concise description that helps reviewers understand the purpose and impact of your changes. Use the
-following format:
+[//]: # "Write a clear and concise description of what the pull request changes."
+[//]: # "You can use our Commit messages guidance for this."
+[//]: # "https://github.com/nginx/documentation/blob/main/documentation/git-conventions.md#commit-messages"
-Problem: Give a brief overview of the problem or feature being addressed.
+[//]: # "First, explain what was changed, and why. This should be most of the detail."
+[//]: # "Then how the changes were made, such as referring to existing styles and conventions."
+[//]: # "Finish by noting anything beyond the scope of the PR changes that may be affected."
-Solution: Explain the approach you took to implement the solution, highlighting any significant design decisions or
-considerations.
+[//]: # "Include information on testing if relevant and non-obvious from the deployment preview."
+[//]: # "For expediency, you can use screenshots to show small before and after examples."
-Testing: Describe any testing that you did.
+[//]: # "If the changes were defined by a GitHub issue, reference it using keywords."
+[//]: # "https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests"
-Please focus on (optional): If you any specific areas where you would like reviewers to focus their attention or provide
-specific feedback, add them here.
-
-If this PR addresses an [issue](https://github.com/nginx/documentation/issues) on GitHub, ensure that you link to it here:
-
-Closes #ISSUE
+[//]: # "Do not like to any internal, non-public resources. This includes internal repository issues or anything in an intranet."
+[//]: # "You can make reference to internal discussions without linking to them: see 'Referencing internal information'."
+[//]: # "https://github.com/nginx/documentation/blob/main/documentation/closed-contributions.md#referencing-internal-information"
### Checklist
-Before merging a pull request, run through this checklist and mark each as complete.
+Before sharing this pull request, I completed the following checklist:
-- [ ] I have read the [contributing guidelines](https://github.com/nginx/documentation/blob/main/CONTRIBUTING.md)
-- [ ] I have signed the [F5 Contributor License Agreement (CLA)](https://github.com/f5/.github/blob/main/CLA/cla-markdown.md)
-- [ ] I have rebased my branch onto main
-- [ ] I have ensured my PR is targeting the main branch and pulling from my branch from my own fork
-- [ ] I have ensured that the commit messages adhere to [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary)
-- [ ] I have ensured that documentation content adheres to [the style guide](/documentation/style-guide.md)
-- [ ] If the change involves potentially sensitive changes[^1], I have assessed the possible impact
-- [ ] If applicable, I have added tests that prove my fix is effective or that my feature works
-- [ ] I have ensured that existing tests pass after adding my changes
-- [ ] If applicable, I have updated [`README.md`](/README.md)
+- [ ] I read the [Contributing guidelines](https://github.com/nginx/documentation/blob/main/CONTRIBUTING.md)
+- [ ] My branch adheres to the [Git conventions](https://github.com/nginx/documentation/blob/main/documentation/git-conventions.md)
+- [ ] My content changes adhere to the [F5 NGINX Documentation style guide](https://github.com/nginx/documentation/blob/main/documentation/style-guide.md)
+- [ ] If my changes involve potentially sensitive information[^1], I have assessed the possible impact
+- [ ] I have waited to ensure my changes pass tests, and addressed any discovered issues
-[^1]: Potentially sensitive changes include anything involving code, personally identify information (PII), live URLs or significant amounts of new or revised documentation. Please refer to [our style guide](/documentation/style-guide.md) for guidance about placeholder content.
\ No newline at end of file
+[^1]: Potentially sensitive information includes personally identify information (PII), authentication credentials, and live URLs. Refer to the [style guide](https://github.com/nginx/documentation/blob/main/documentation/style-guide.md) for guidance about placeholder content.
diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml
index aedf4214e..a473c09de 100644
--- a/.github/workflows/build-push.yml
+++ b/.github/workflows/build-push.yml
@@ -101,6 +101,11 @@ jobs:
value: `${{ github.event.client_payload.author }}`,
short: true
},
+ {
+ title: 'Description',
+ value: `${{ github.event.client_payload.description }}`,
+ short: false
+ },
{
title: 'Preview URL',
value: `${{ env.PREVIEW_URL }}`,
@@ -118,10 +123,10 @@ jobs:
needs: call-docs-build-push
runs-on: ubuntu-22.04
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
ref: ${{ github.event.workflow_run.head_branch }}
- - uses: actions/setup-node@v4
+ - uses: actions/setup-node@v5
with:
node-version: 18
- name: Installing packages
diff --git a/.github/workflows/coveo.yml b/.github/workflows/coveo.yml
index 3f1bf42fd..b9d52f99c 100644
--- a/.github/workflows/coveo.yml
+++ b/.github/workflows/coveo.yml
@@ -72,7 +72,7 @@ jobs:
needs: generate-coveo-search-token
steps:
- name: Download Coveo search token
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v5
- name: View files
run: ls -R
diff --git a/.github/workflows/dot-org-content.yml b/.github/workflows/dot-org-content.yml
new file mode 100644
index 000000000..692274238
--- /dev/null
+++ b/.github/workflows/dot-org-content.yml
@@ -0,0 +1,56 @@
+name: Detect changes in documentation within nginx/nginx.org
+
+on:
+ schedule:
+ - cron: "0 */23 * * *"
+permissions:
+ contents: write
+ pull-requests: write
+ issues: write
+
+jobs:
+ detect-changes:
+ name: Detect changes in 'en' docs of nginx/nginx.org
+ runs-on: ubuntu-latest
+ outputs:
+ IS_CHANGES_DETECTED: ${{ steps.check_changes.outputs.changed }}
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v4.2.2
+ with:
+ fetch-depth: 0
+ - name: Clone the nginx/nginx-org repository
+ run: |
+ git clone --depth=2 https://github.com/nginx/nginx.org.git dot-org-repo
+ - name: Check for changes in xml/en folder
+ id: check_changes
+ run: |
+ cd dot-org-repo
+
+ if git whatchanged --since="1 day ago" -- _xml/en/; then
+ echo "Changes detected in /en"
+ echo "changed=true" >> $GITHUB_OUTPUT
+ else
+ echo "No changes in /en"
+ echo "changed=false" >> $GITHUB_OUTPUT
+ fi
+ - name: Execute make target 'make hugo-md' to generate markdown
+ if: steps.check_changes.outputs.changed == 'true'
+ run: |
+ cd dot-org-repo
+ make module-markdown
+ - name: Create PR
+ uses: peter-evans/create-pull-request@v7
+ if: steps.check_changes.outputs.changed == 'true'
+ with:
+ commit-message: "chore: Update nginx plus module reference from detected changes in nginx/nginx.org"
+ labels: product/nginx-plus, dependencies, module-reference
+ base: main
+ branch: update-nginx-module-ref
+ title: 'NGINX Plus - Module Ref: Update content for content/nginx due to detected changes'
+ add-paths: |
+ dot-org-repo/libxslt-md/
+ dot-org-repo/yaml/nginx_api.yaml
+ body: |
+ ### Proposed Changes
+ Updated NGINX Plus docs.
diff --git a/.github/workflows/fossa.yml b/.github/workflows/fossa.yml
index 7d94f92bb..3b59e5672 100644
--- a/.github/workflows/fossa.yml
+++ b/.github/workflows/fossa.yml
@@ -22,7 +22,7 @@ jobs:
if: ${{ github.event.repository.fork == false }}
steps:
- name: Checkout Repository
- uses: actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2 # v4.2.2
+ uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v4.2.2
- name: Scan
uses: fossas/fossa-action@3ebcea1862c6ffbd5cf1b4d0bd6b3fe7bd6f2cac # v1.7.0
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index 975aad2c4..9f984f1b2 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -12,6 +12,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Apply labels based on file paths
- uses: actions/labeler@v5
+ uses: actions/labeler@v6
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml
index bf148bda9..4114412f7 100644
--- a/.github/workflows/linkchecker.yml
+++ b/.github/workflows/linkchecker.yml
@@ -31,7 +31,13 @@ env:
--ignore-url ^https://lightstep.com --ignore-url ^https://www.owasp.org/ --ignore-url ^https://www.maxmind.com --ignore-url ^https://www.splunk.com/
--ignore-url ^https://oauth2.googleapis.com --ignore-url ^https://openidconnect.googleapis.com --ignore-url ^https://www.base64url.com/
--ignore-url ^https://go.googlesource.com/ --ignore-url ^https://go.googlesource.com/sync --ignore-url ^https://linkerd.io/2.13/
- --ignore-url ^http://www.redirectpage.com/ --ignore-url ^https://www.gnu.org/ --ignore-url ^https://insert_your_tenant_name.console.ves.volterra.io/
+ --ignore-url ^http://www.redirectpage.com/ --ignore-url ^https://www.gnu.org/ --ignore-url ^https://insert_your_tenant_name.console.ves.volterra.io
+ --ignore-url ^https://pkgs.nginx.com
+ --ignore-url ^http://backend1.example.com --ignore-url ^http://example.com --ignore-url ^https://my-nginx.example.com
+ --ignore-url ^https://www.nginxroute53.com --ignore-url ^http://cafe --ignore-url ^http://192.168.1.23 --ignore-url ^https://company.com
+ --ignore-url ^https://my-nginx-plus.example.com --ignore-url ^https://cognito-idp --ignore-url ^https:///www.okta.com
+ --ignore-url ^http://www.maxmind.com --ignore-url ^https://www.maxmind.com --ignore-url ^https://www.opswat.com
+ --ignore-url ^https://support.pingidentity.com --ignore-url ^https://docs.pingidentity.com --ignore-url ^https://demo.example.com
--ignore-url ^https://\([a-zA-Z0-9-]+\).nginx.com/nginx-ingress-controller/css
--ignore-url ^https://\([a-zA-Z0-9-]+\).nginx.com/nginxaas/azure/css
--ignore-url ^https://\([a-zA-Z0-9-]+\).nginx.com/nginx-gateway-fabric/css
@@ -55,6 +61,8 @@ jobs:
- nginx-waf
- nginx-management-suite
- nginx-gateway-fabric
+ - nginx-agent
+ - nginx
steps:
# Determine and set basepath for schedule or workflow_dispatch
- name: Set Basepath
diff --git a/.github/workflows/mend.yml b/.github/workflows/mend.yml
index 38fecbc59..30c0547b4 100644
--- a/.github/workflows/mend.yml
+++ b/.github/workflows/mend.yml
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout Repository
- uses: actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2 # v4.2.2
+ uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v4.2.2
with:
ref: ${{ inputs.branch && inputs.branch || github.ref }}
diff --git a/.github/workflows/notification.yml b/.github/workflows/notification.yml
index 810345ea2..79eb389eb 100644
--- a/.github/workflows/notification.yml
+++ b/.github/workflows/notification.yml
@@ -3,7 +3,6 @@ on:
workflow_run:
branches: [main]
workflows:
- - "UI validation on prod"
- "QE LinkChecker"
- "Check for Broken Links"
types: [completed]
@@ -21,7 +20,7 @@ jobs:
checks: read
steps:
- name: Retrieve Job Data
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
continue-on-error: true
id: data
with:
diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml
index 864924b3a..b69359d4c 100644
--- a/.github/workflows/ossf_scorecard.yml
+++ b/.github/workflows/ossf_scorecard.yml
@@ -29,7 +29,7 @@ jobs:
checks: read # To detect SAST tools
steps:
- name: Check out the codebase
- uses: actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2 # v4.2.0
+ uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v4.2.0
with:
persist-credentials: false
@@ -56,6 +56,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: Upload SARIF results to code scanning
- uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
+ uses: github/codeql-action/upload-sarif@f1f6e5f6af878fb37288ce1c627459e94dbf7d01 # v3.29.5
with:
sarif_file: results.sarif
diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
deleted file mode 100644
index 8f0343ed2..000000000
--- a/.github/workflows/playwright.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: UI validation on prod
-on:
- workflow_dispatch:
- schedule:
- - cron: "0 * * * *"
-
-jobs:
- run-playwright-tests:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
- with:
- node-version: lts/*
- - name: Install dependencies
- run: npm ci
- - name: Install Playwright Browsers
- run: npx playwright install --with-deps
- - name: Run Playwright tests
- run: npx playwright test --retries=2
- - uses: actions/upload-artifact@v4
- if: ${{ !cancelled() }}
- with:
- name: playwright-report
- path: tests/playwright-report/
- retention-days: 30
- - uses: actions/upload-artifact@v4
- if: ${{ !cancelled() }}
- with:
- name: test-results
- path: tests/test-results/
- retention-days: 30
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index a16041dc5..f10888ec3 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -18,7 +18,7 @@ jobs:
pull-requests: write # for actions/stale to close stale PRs
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v9.1.0
+ - uses: actions/stale@v10.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open for 90 days with no activity. Remove the stale label or add a comment to keep it open. If you do not take action, this will be closed in 10 days.'
diff --git a/.gitignore b/.gitignore
index 15fbca634..1573f641d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,6 @@
# testing
/coverage
*/test-results
-*/playwright-report
# production
./public
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7a0af1f48..3988f3345 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -41,6 +41,7 @@ To understand how we use Git in this repository, read our [Git conventions](/doc
The broad workflow is as follows:
- Fork the NGINX repository
+ - If you're an F5/NGINX user, you can work from a clone
- Create a branch
- Implement your changes in your branch
- Submit a pull request (PR) when your changes are ready for review
diff --git a/_banners/eos-acm.md b/_banners/eos-acm.md
new file mode 100644
index 000000000..e69f51b6b
--- /dev/null
+++ b/_banners/eos-acm.md
@@ -0,0 +1,8 @@
+{{< banner "warning" "End of Sale Notice:" >}}
+
+ F5 NGINX is announcing the End of Sale (EoS) for NGINX Management Suite API Connectivity Manager Module, effective January 1, 2024.
+
+ F5 maintains generous lifecycle policies that allow customers to continue support and receive product updates. Existing API Connectivity Manager Module customers can continue to use the product past the EoS date. License renewals are not available after September 30, 2024.
+
+ See our End of Sale announcement for more details.
+{{ banner >}}
\ No newline at end of file
diff --git a/_banners/eos-mesh.md b/_banners/eos-mesh.md
index e69f51b6b..f2b11d535 100644
--- a/_banners/eos-mesh.md
+++ b/_banners/eos-mesh.md
@@ -1,8 +1,8 @@
{{< banner "warning" "End of Sale Notice:" >}}
-
- F5 NGINX is announcing the End of Sale (EoS) for NGINX Management Suite API Connectivity Manager Module, effective January 1, 2024.
-
- F5 maintains generous lifecycle policies that allow customers to continue support and receive product updates. Existing API Connectivity Manager Module customers can continue to use the product past the EoS date. License renewals are not available after September 30, 2024.
-
- See our End of Sale announcement for more details.
+
+ Commercial support for NGINX Service Mesh is available to customers who currently have active NGINX Microservices Bundle subscriptions. F5 NGINX announced the End of Sale (EoS) for the NGINX Microservices Bundles as of July 1, 2023.
+
+
+ See our End of Sale announcement for more details.
+
{{ banner >}}
\ No newline at end of file
diff --git a/_banners/eos-nms.md b/_banners/eos-nms.md
new file mode 100644
index 000000000..2ff86d3e3
--- /dev/null
+++ b/_banners/eos-nms.md
@@ -0,0 +1,4 @@
+{{< banner "warning" "End of Sale Notice:" >}}
+
+ This product is End of Sale. See our End of Sale announcement for more details.
+{{ banner >}}
\ No newline at end of file
diff --git a/_banners/ngf-2.0-release.md b/_banners/ngf-2.0-release.md
index 135681553..44523d981 100644
--- a/_banners/ngf-2.0-release.md
+++ b/_banners/ngf-2.0-release.md
@@ -1,6 +1,8 @@
-{{< banner "notice" "NGINX Gateway Fabric 2.0 is now available" >}}
+{{< banner "notice" >}}
-NGINX Gateway Fabric 2.0 has released! Follow [these instructions]({{< ref "/ngf/install/upgrade-version.md#upgrade-from-v1x-to-v2x" >}}) to upgrade from 1.x to 2.0.
+NGINX Gateway Fabric {{< version-ngf >}} is now available.
+
+Follow [these instructions]({{< ref "/ngf/install/upgrade-version.md#upgrade-from-v1x-to-v2x" >}}) to upgrade from 1.x to 2.0.
For 1.x, checkout [an older version]({{< ref "/ngf/install/upgrade-version.md#access-nginx-gateway-fabric-1x-documentation" >}}) of documentation.
diff --git a/archetypes/landing-page.md b/archetypes/landing-page.md
index 91c1ab0d2..be1cca187 100644
--- a/archetypes/landing-page.md
+++ b/archetypes/landing-page.md
@@ -31,18 +31,16 @@ nd-product:
[//]: # "One card will take full width page: two will take half width each. Three will stack like an inverse pyramid."
[//]: # "Some examples of content could be the latest release note, the most common install path, and a popular new feature."
-{{}}
- {{}}
- {{}}
-
- {{}}
-
-
- {{}}
-
- {{}}
- {{}}
-{{}}
+{{}}
+ {{}}
+
+ {{}}
+
+
+ {{}}
+
+ {{}}
+{{}}
## Other content
diff --git a/content/_index.md b/content/_index.md
index d6816edad..e7ff70aa2 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,4 +1,49 @@
---
title: NGINX Product Documentation
description: Learn how to deliver, manage, and protect your applications using F5 NGINX products.
----
\ No newline at end of file
+---
+
+## NGINX Product Documentation
+Learn how to deliver, manage, and protect your applications using F5 NGINX products.
+
+{{}}
+ {{}}
+ Monitor your infrastructure, address security vulnerabilities, and assess the health of your NGINX fleet, all from a single console.
+ {{}}
+ {{}}
+ The all-in-one load balancer, reverse proxy, web server, content cache, and API gateway.
+ {{}}
+ {{}}
+ Track and control NGINX Open Source and NGINX Plus instances.
+ {{}}
+ {{}}
+ Kubernetes traffic management with API gateway, identity, and observability features.
+ {{}}
+ {{}}
+ Next-generation Kubernetes connectivity using the Gateway API.
+ {{}}
+ {{}}
+ The open source all-in-one load balancer, content cache, and web server.
+ {{}}
+ {{}}
+ A daemon providing observability data and remote configuration for NGINX Open Source and NGINX Plus instances.
+ {{}}
+ {{}}
+ Stay compliant with your NGINX subscription licenses and see how you can use NGINX One to build secure, scalable, and high-performing applications and APIs.
+ {{}}
+{{}}
+
+{{}}
+ {{}}
+ Lightweight, high-performance, advanced protection against Layer 7 attacks on your apps and APIs.
+ {{}}
+ {{}}
+ Defend, adapt, and mitigate against Layer 7 denial-of-service attacks on your apps and APIs.
+ {{}}
+{{}}
+
+{{}}
+ {{}}
+ Infrastructure-as-a-Service (IaaS) version of NGINX Plus for your Microsoft Azure application stack.
+ {{}}
+{{}}
diff --git a/content/agent/_index.md b/content/agent/_index.md
index 478ab4f4b..c8be3a6bf 100644
--- a/content/agent/_index.md
+++ b/content/agent/_index.md
@@ -2,7 +2,7 @@
title: NGINX Agent
url: /nginx-agent/
cascade:
- logo: NGINX-product-icon.png
+ logo: NGINX-Agent-product-icon.svg
nd-banner:
enabled: true
type: deprecation
@@ -33,26 +33,22 @@ configurations, collection and reporting of real-time NGINX performance and oper
[//]: # "One card will take full width page: two will take half width each. Three will stack like an inverse pyramid."
[//]: # "Some examples of content could be the latest release note, the most common install path, and a popular new feature."
-{{}}
- {{}}
- {{}}
- Learn everything you need to know about NGINX Agent
- {{}}
-
-
- {{}}
- Install NGINX Agent and run a mock control plane
- {{}}
- {{}}
-{{}}
+{{}}
+ {{}}
+ Learn everything you need to know about NGINX Agent
+ {{}}
+
+
+ {{}}
+ Install NGINX Agent and run a mock control plane
+ {{}}
+{{}}
-{{}}
- {{}}
- {{}}
- {{}}
- {{}}
- {{}}
- {{}}
- {{}}
- {{}}
-{{}}
\ No newline at end of file
+{{}}
+ {{}}
+ {{}}
+ {{}}
+ {{}}
+ {{}}
+ {{}}
+{{}}
\ No newline at end of file
diff --git a/content/agent/about.md b/content/agent/about.md
index 19434fbb2..6bf106885 100644
--- a/content/agent/about.md
+++ b/content/agent/about.md
@@ -46,7 +46,6 @@ For NGINX Agent to work properly with an NGINX Plus instance, the API needs to b
NGINX Agent allows a gRPC connected control system to register a listener for a specific event. The control mechanism is then invoked when NGINX Agent sends an associated system signal. The source of a notification can be either the NGINX instance or NGINX Agent itself. Here's a list of currently supported events:
-{{}}
| Event | Description |
| -------------------------------- | -------------------------------------------- |
| AGENT_START_MESSAGE | Agent process started |
@@ -61,7 +60,6 @@ NGINX Agent allows a gRPC connected control system to register a listener for a
| CONFIG_APPLY_FAILURE_MESSAGE | Failed to apply new NGINX configuration |
| CONFIG_ROLLBACK_SUCCESS_MESSAGE | Successfully rolled back NGINX configuration |
| CONFIG_ROLLBACK_FAILURE_MESSAGE | Failed to roll back NGINX configuration |
-{{}}
diff --git a/content/agent/configuration/_index.md b/content/agent/configuration/_index.md
index ca784b6eb..efb76f9ff 100644
--- a/content/agent/configuration/_index.md
+++ b/content/agent/configuration/_index.md
@@ -3,7 +3,7 @@ title: "Configuration"
weight: "400"
url: /nginx-agent/configuration/
cascade:
- logo: NGINX-product-icon.png
+ logo: NGINX-product-icon.svg
layout: agent-v2-migration
---
diff --git a/content/agent/configuration/configuration-overview.md b/content/agent/configuration/configuration-overview.md
index 41086bd8a..0a85eede6 100644
--- a/content/agent/configuration/configuration-overview.md
+++ b/content/agent/configuration/configuration-overview.md
@@ -9,7 +9,7 @@ nd-content-type: how-to
The following sections explain how to configure NGINX Agent using configuration files, CLI flags, and environment variables.
-{{}}
+{{< call-out "note" >}}
- NGINX Agent interprets configuration values set by configuration files, CLI flags, and environment variables in the following priorities:
@@ -19,7 +19,7 @@ The following sections explain how to configure NGINX Agent using configuration
- You must open any required firewall ports or add SELinux/AppArmor rules for the ports and IPs you want to use.
-{{}}
+{{< /call-out >}}
## Configure with Config Files
@@ -30,9 +30,9 @@ Examples of the configuration files are provided below:
example nginx-agent.conf
-{{}}
+{{< call-out "note" >}}
In the following example `nginx-agent.conf` file, you can change the `server.host` and `server.grpcPort` to connect to the control plane.
-{{}}
+{{< /call-out >}}
```nginx {hl_lines=[13]}
#
@@ -118,11 +118,11 @@ nginx_app_protect:
example dynamic-agent.conf
-{{}}
+{{< call-out "note" >}}
Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf`
Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf`
-{{}}
+{{< /call-out >}}
```yaml
# Dynamic configuration file for NGINX Agent.
@@ -169,15 +169,15 @@ nginx-agent
### CLI Flags and Environment Variables
-{{< warning >}}
+{{< call-out "warning" >}}
Before version 2.35.0, the environment variables were prefixed with `NMS_` instead of `NGINX_AGENT_`.
If you are upgrading from an older version, update your configuration accordingly.
-{{< /warning >}}
+{{< /call-out >}}
-{{}}
+{{< table >}}
| CLI flag | Environment variable | Description |
|---------------------------------------------|--------------------------------------|-----------------------------------------------------------------------------|
| `--api-cert` | `NGINX_AGENT_API_CERT` | Specifies the certificate used by the Agent API. |
@@ -214,11 +214,9 @@ If you are upgrading from an older version, update your configuration accordingl
| `--tls-enable` | `NGINX_AGENT_TLS_ENABLE` | Enables TLS for secure communications. |
| `--tls-key` | `NGINX_AGENT_TLS_KEY` | Specifies the path to the certificate key file for TLS. |
| `--tls-skip-verify` | `NGINX_AGENT_TLS_SKIP_VERIFY` | Insecurely skips verification for gRPC TLS credentials. |
-{{}}
+{{< /table >}}
-
-
-{{}}
+{{< call-out "note" >}}
Use the `--config-dirs` command-line option, or the `config_dirs` key in the `nginx-agent.conf` file, to identify the directories NGINX Agent can read from or write to. This setting also defines the location to which you can upload config files when using a control plane.
NGINX Agent cannot write to directories outside the specified location when updating a config and cannot upload files to directories outside of the configured location.
@@ -227,15 +225,15 @@ NGINX Agent follows NGINX configuration directives to file paths outside the des
- [`ssl_certificate`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate)
-{{}}
+{{< /call-out >}}
-{{}} Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location.
+{{< call-out "note" >}} Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location.
Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf`
Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf`
-{{}}
+{{< /call-out >}}
## Log Rotation
diff --git a/content/agent/configuration/encrypt-communication.md b/content/agent/configuration/encrypt-communication.md
index 6a1503cf6..2d8b67dde 100644
--- a/content/agent/configuration/encrypt-communication.md
+++ b/content/agent/configuration/encrypt-communication.md
@@ -94,7 +94,7 @@ NGINX_AGENT_TLS_ENABLE=true
## Enable Server-Side TLS With Self-Signed Certificate
-{{< warning >}}These steps are not recommended for production environments.{{< /warning >}}
+{{< call-out "warning" >}}These steps are not recommended for production environments.{{< /call-out >}}
To enable server-side TLS with a self-signed certificate, you must have TLS enabled and set `skip_verify` to `true`, which disables hostname validation. Setting `skip_verify` can be done done only by updating the configuration file. See the following example:
diff --git a/content/agent/installation-upgrade/_index.md b/content/agent/installation-upgrade/_index.md
index d17ef4d5d..9d4f84513 100644
--- a/content/agent/installation-upgrade/_index.md
+++ b/content/agent/installation-upgrade/_index.md
@@ -4,6 +4,6 @@ description: Learn how to install, upgrade, and uninstall NGINX Agent.
weight: 300
url: /nginx-agent/v2/installation-upgrade/
cascade:
- logo: NGINX-product-icon.png
+ logo: NGINX-product-icon.svg
type: agent-v2-migration
---
diff --git a/content/agent/installation-upgrade/container-environments/_index.md b/content/agent/installation-upgrade/container-environments/_index.md
index bc1eeddd7..5f5968743 100644
--- a/content/agent/installation-upgrade/container-environments/_index.md
+++ b/content/agent/installation-upgrade/container-environments/_index.md
@@ -4,6 +4,6 @@ description: Learn how to build and run NGINX Agent docker images.
weight: 800
url: /nginx-agent/v2/installation-upgrade/container-environments/
cascade:
- logo: NGINX-product-icon.png
+ logo: NGINX-product-icon.svg
type: agent-v2-migration
---
diff --git a/content/agent/installation-upgrade/container-environments/docker-images.md b/content/agent/installation-upgrade/container-environments/docker-images.md
index f21c23929..93d954a97 100644
--- a/content/agent/installation-upgrade/container-environments/docker-images.md
+++ b/content/agent/installation-upgrade/container-environments/docker-images.md
@@ -27,7 +27,7 @@ This guide provides instructions on how to build images with NGINX Agent and NGI
You can use [Docker](https://docs.docker.com/engine/install/) or [Podman](https://podman.io/docs/installation) to manage NGINX Agent container images. Follow the installation instructions for your preferred container engine and be sure the service is running before proceeding with the instructions in this document.
-{{}}The examples in this document primarily use Docker commands. You can adapt these using the appropriate [Podman commands](https://docs.podman.io/en/latest/Commands.html) if you're not using Docker.{{}}
+{{< call-out "note" >}}The examples in this document primarily use Docker commands. You can adapt these using the appropriate [Podman commands](https://docs.podman.io/en/latest/Commands.html) if you're not using Docker.{{< /call-out >}}
### Install the GNU Make package
@@ -77,7 +77,7 @@ git clone git@github.com:nginx/agent.git
### Download the NGINX Plus certificate and key {#myf5-download}
-{{< fa "circle-info" "text-muted" >}} **This step is required if you are using NGINX Plus. If you are using NGINX open source, you can skip this section.**
+{{< icon "circle-info" "text-muted" >}} **This step is required if you are using NGINX Plus. If you are using NGINX open source, you can skip this section.**
In order to build a container image with NGINX Plus, you must provide the SSL certificate and private key files provided with your NGINX Plus license. These files grant access to the package repository from which the script will download the NGINX Plus package.
@@ -112,11 +112,11 @@ docker tag docker-registry.nginx.com/nginx/agent:mainline nginx-agent
docker run --name nginx-agent -d nginx-agent
```
-{{}}To learn more about the configuration options, refer to the NGINX Agent [Configuration Overview]({{< ref "/agent/configuration/configuration-overview" >}}).{{}}
+{{< call-out "note" >}}To learn more about the configuration options, refer to the NGINX Agent [Configuration Overview]({{< ref "/agent/configuration/configuration-overview" >}}).{{< /call-out >}}
### Enable the gRPC interface
-To connect your NGINX Agent container to your NGINX One or NGINX Instance Manager instance, you must enable the gRPC interface. To do this, you must edit the NGINX Agent configuration file, *nginx-agent.conf*. For example:
+To connect your NGINX Agent container to your NGINX One Console or NGINX Instance Manager instance, you must enable the gRPC interface. To do this, you must edit the NGINX Agent configuration file, *nginx-agent.conf*. For example:
```yaml
server:
@@ -166,7 +166,7 @@ If the REST Interface is configured correctly, then you should see a JSON object
## Build the NGINX Agent images for specific OS targets
-{{}}The only **officially supported** base operating system is **Alpine**. The instructions below for other operating systems are provided for informational and **testing purposes only**.{{}}
+{{< call-out "important" >}}The only **officially supported** base operating system is **Alpine**. The instructions below for other operating systems are provided for informational and **testing purposes only**.{{< /call-out >}}
The NGINX Agent GitHub repo has a set of Make commands that you can use to build a container image for an specific operating system and version:
@@ -175,15 +175,12 @@ The NGINX Agent GitHub repo has a set of Make commands that you can use to build
You can pass the following arguments when running the **make** command to build an NGINX Agent container image.
-{{}}
| Argument | Definition |
| ---------------- | -------------------------|
| OS_RELEASE | The Linux distribution to use as the base image.
Can also be set in the repo Makefile.|
| OS_VERSION | The version of the Linux distribution to use as the base image.
Can also be set in the repo Makefile.|
| AGENT_VERSION | The versions of NGINX agent that you want installed on the image.|
-{{}}
-
### Build NGINX open source images
Run the following `make` command to build the default image, which uses Alpine as the base image:
@@ -200,7 +197,7 @@ IMAGE_BUILD_TARGET=install-agent-repo NGINX_AGENT_VERSION=2.37.0~bullseye OS_REL
### Build NGINX Plus images
-{{}}You need a license to use NGINX Agent with NGINX Plus. You must complete the steps in the [Download the certificate and key files from MyF5](#myf5-download) section before proceeding.{{}}
+{{< call-out "important" >}}You need a license to use NGINX Agent with NGINX Plus. You must complete the steps in the [Download the certificate and key files from MyF5](#myf5-download) section before proceeding.{{< /call-out >}}
Run the following `make` command to build the default image, which uses Ubuntu 24.04 (Noble) as the base image.
@@ -213,6 +210,3 @@ To build an image with Debian and an older version of NGINX Agent you can run th
```shell
IMAGE_BUILD_TARGET=install-agent-repo NGINX_AGENT_VERSION=2.37.0~bullseye OS_RELEASE=debian OS_VERSION=bullseye-slim make image
```
-
-
-
diff --git a/content/agent/installation-upgrade/container-environments/docker-support.md b/content/agent/installation-upgrade/container-environments/docker-support.md
index 1a57cafab..41b7d8773 100644
--- a/content/agent/installation-upgrade/container-environments/docker-support.md
+++ b/content/agent/installation-upgrade/container-environments/docker-support.md
@@ -10,7 +10,7 @@ nd-content-type:
## Overview
-The NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that can be used to [build custom container images]({{< ref "/agent/installation-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems.
+The NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/dev-v2/test/docker) that can be used to [build custom container images]({{< ref "/agent/installation-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems.
See the [Technical Specifications]({{< ref "/agent/technical-specifications.md" >}}) for a list of supported operationg systems.
diff --git a/content/agent/installation-upgrade/getting-started.md b/content/agent/installation-upgrade/getting-started.md
index c7ee427af..e415d9161 100644
--- a/content/agent/installation-upgrade/getting-started.md
+++ b/content/agent/installation-upgrade/getting-started.md
@@ -172,8 +172,8 @@ sudo systemctl enable nginx-agent
NGINX Agent uses formatted log files to collect metrics. Expanding log formats and instance counts will also increase the size of the NGINX Agent log files. We recommend adding a separate partition for `/var/log/nginx-agent`.
-{{< important >}}
+{{< call-out "important" >}}
Without log rotation or storage on a separate partition, log files could use up all the free drive space and cause your system to become unresponsive to certain services.
For more information, see [NGINX Agent Log Rotation]({{< ref "/agent/configuration/configuration-overview.md#nginx-agent-log-rotation" >}}).
-{{< /important >}}
+{{< /call-out >}}
diff --git a/content/agent/installation-upgrade/installation-oss.md b/content/agent/installation-upgrade/installation-oss.md
index ab4016d08..6d3073998 100644
--- a/content/agent/installation-upgrade/installation-oss.md
+++ b/content/agent/installation-upgrade/installation-oss.md
@@ -50,10 +50,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
module_hotfixes=true
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo yum install nginx-agent
+ sudo yum install -y nginx-agent-2.42.0
```
When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it.
@@ -95,7 +95,7 @@ Before you install NGINX Agent for the first time on your system, you need to se
uid nginx signing key
```
- {{< important >}}If the fingerprint is different, remove the file.{{< /important >}}
+ {{< call-out "important" >}}If the fingerprint is different, remove the file.{{< /call-out >}}
1. Add the nginx agent repository:
@@ -105,11 +105,13 @@ Before you install NGINX Agent for the first time on your system, you need to se
| sudo tee /etc/apt/sources.list.d/nginx-agent.list
```
-1. To install `nginx-agent`, run the following commands:
-
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
+
+ Update your package index and install a specific version of the nginx-agent. Replace with your current Ubuntu codename (e.g., jammy, noble).
+
```shell
sudo apt update
- sudo apt install nginx-agent
+ sudo apt install -y nginx-agent=2.42.0~
```
1. Verify the installation:
@@ -157,7 +159,7 @@ Before you install NGINX Agent for the first time on your system, you need to se
uid nginx signing key
```
- {{< important >}}If the fingerprint is different, remove the file.{{< /important >}}
+ {{< call-out "important" >}}If the fingerprint is different, remove the file.{{< /call-out >}}
1. Add the `nginx-agent` repository:
@@ -166,12 +168,13 @@ Before you install NGINX Agent for the first time on your system, you need to se
http://packages.nginx.org/nginx-agent/debian/ `lsb_release -cs` agent" \ | sudo tee /etc/apt/sources.list.d/nginx-agent.list
```
-1. To install `nginx-agent`, run the following commands:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
+ Update your package index and install a specific version of the nginx-agent. Replace with your current Debian codename (e.g., bullseye).
+
```shell
sudo apt update
- sudo apt install nginx-agent
- ```
+ sudo apt install -y nginx-agent=2.42.0~
1. Verify the installation:
@@ -229,10 +232,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
sudo rpmkeys --import /tmp/nginx_signing.key
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo zypper install nginx-agent
+ sudo zypper install -y nginx-agent=2.42.0
```
1. Verify the installation:
@@ -303,10 +306,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
sudo mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo apk add nginx-agent
+ sudo apk add nginx-agent=2.42.0
```
1. Verify the installation:
@@ -334,10 +337,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
module_hotfixes=true
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo dnf install nginx-agent
+ sudo dnf install -y nginx-agent-2.42.0
```
1. When prompted to accept the GPG key, verify that the fingerprint matches
@@ -370,10 +373,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
module_hotfixes=true
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo yum install nginx-agent
+ sudo yum install -y nginx-agent-2.42.0
```
1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it.
@@ -396,10 +399,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
}
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo pkg install nginx-agent
+ sudo pkg install nginx-agent-2.42.0
```
1. Verify the installation:
diff --git a/content/agent/installation-upgrade/installation-plus.md b/content/agent/installation-upgrade/installation-plus.md
index add1272dc..744fbde26 100644
--- a/content/agent/installation-upgrade/installation-plus.md
+++ b/content/agent/installation-upgrade/installation-plus.md
@@ -73,10 +73,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
enabled=1
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo yum install nginx-agent
+ sudo yum install -y nginx-agent-2.42.0
```
When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it.
@@ -131,11 +131,13 @@ Before you install NGINX Agent for the first time on your system, you need to se
| sudo tee /etc/apt/sources.list.d/nginx-agent.list
```
-1. To install `nginx-agent`, run the following commands:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
+ Update your package index and install a specific version of the nginx-agent. Replace with your current Ubuntu codename (e.g., jammy, noble).
+
```shell
sudo apt update
- sudo apt install nginx-agent
+ sudo apt install -y nginx-agent=2.42.0~
```
1. Verify the installation:
@@ -183,12 +185,14 @@ Before you install NGINX Agent for the first time on your system, you need to se
Acquire::https::pkgs.nginx.com::SslKey "/etc/ssl/nginx/nginx-repo.key";
```
-1. To install `nginx-agent`, run the following commands:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
+ Update your package index and install a specific version of the nginx-agent. Replace with your current Debian codename (e.g., bullseye).
+
```shell
sudo apt update
- sudo apt install nginx-agent
- ```
+ sudo apt install -y nginx-agent=2.42.0~
+
1. Verify the installation:
@@ -265,10 +269,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
sudo rpmkeys --import /tmp/nginx_signing.key
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo zypper install nginx-agent
+ sudo zypper install -y nginx-agent=2.42.0
```
1. Verify the installation:
@@ -394,10 +398,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
enabled=1
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo dnf install nginx-agent
+ sudo dnf install -y nginx-agent-2.42.0
```
1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it.
@@ -442,10 +446,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
enabled=1
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo yum install nginx-agent
+ sudo yum install -y nginx-agent-2.42.0
```
1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it.
@@ -496,10 +500,10 @@ Before you install NGINX Agent for the first time on your system, you need to se
SSL_CLIENT_KEY_FILE: "/etc/ssl/nginx/nginx-repo.key" }
```
-1. To install `nginx-agent`, run the following command:
+1. To install `nginx-agent` with a specific version (example: 2.42.0):
```shell
- sudo pkg install nginx-agent
+ sudo pkg install nginx-agent-2.42.0
```
1. Verify the installation:
diff --git a/content/agent/installation-upgrade/installation-unprivileged.md b/content/agent/installation-upgrade/installation-unprivileged.md
index 4bf90c9f1..8c36246be 100644
--- a/content/agent/installation-upgrade/installation-unprivileged.md
+++ b/content/agent/installation-upgrade/installation-unprivileged.md
@@ -30,9 +30,9 @@ The installation process involves installing NGINX Plus without root privileges
You can install NGINX Plus without root privileges following the steps on the [NGINX Plus installation page]({{< ref "/nginx/admin-guide/installing-nginx/installing-nginx-plus/#unpriv_install" >}}). The steps include a script that will allow you to install NGINX Plus in a non-root environment.
-{{< note >}}
+{{< call-out "note" >}}
NGINX Agent has its own user group (`nginx-agent`) which is created when NGINX Agent is installed. The user NGINX is running under is added to this user group during the installation of NGINX Agent. If you change the NGINX user after installing NGINX Agent, you will need to [manually add the new NGINX user]({{< ref "/agent/configuration/configure-nginx-agent-group.md" >}}) to the `nginx-agent` group.
-{{< /note >}}
+{{< /call-out >}}
### Install NGINX Agent
@@ -42,7 +42,6 @@ After installing NGINX Plus, you can install NGINX agent following the steps on
Run the command corresponding to your operating system to start NGINX Agent:
-{{}}
| Operating System | Command(s) |
|------------------------------------------------------|------------------------------------------------|
@@ -50,8 +49,6 @@ Run the command corresponding to your operating system to start NGINX Agent:
| Alpine Linux | ```sudo rc-service nginx-agent start```
or
```sudo /etc/init.d/nginx-agent start``` |
| FreeBSD | ```sudo service nginx-agent start``` |
-{{}}
-
You can confirm that NGINX Agent is running under the same user as NGINX Plus by running the following command:
```bash
diff --git a/content/agent/installation-upgrade/upgrade.md b/content/agent/installation-upgrade/upgrade.md
index f942db01f..49f6a4779 100644
--- a/content/agent/installation-upgrade/upgrade.md
+++ b/content/agent/installation-upgrade/upgrade.md
@@ -24,7 +24,7 @@ To upgrade NGINX Agent, follow these steps:
1. Install the updated version of NGINX Agent:
- - CentOS, RHEL, RPM-Based
+ - RHEL, RPM-Based
```shell
sudo yum -y makecache
@@ -60,10 +60,10 @@ To upgrade NGINX Agent to a specific **v2.x version**, follow these steps:
sudo apt-get install -y nginx-agent= -o Dpkg::Options::="--force-confold"
```
- Example (to upgrade to version 2.41.1~noble):
+ Example (to upgrade to version 2.42.0~noble):
```shell
- sudo apt-get install -y nginx-agent=2.41.1~noble -o Dpkg::Options::="--force-confold"
+ sudo apt-get install -y nginx-agent=2.42.0~noble -o Dpkg::Options::="--force-confold"
```
- CentOS, RHEL, RPM-Based
@@ -72,10 +72,10 @@ To upgrade NGINX Agent to a specific **v2.x version**, follow these steps:
sudo yum install -y nginx-agent-
```
- Example (to upgrade to version `2.41.1`):
+ Example (to upgrade to version `2.42.0`):
```shell
- sudo yum install -y nginx-agent-2.41.1
+ sudo yum install -y nginx-agent-2.42.0
```
1. Verify the installed version:
diff --git a/content/agent/technical-specifications.md b/content/agent/technical-specifications.md
index b4273c922..af3435f0a 100644
--- a/content/agent/technical-specifications.md
+++ b/content/agent/technical-specifications.md
@@ -11,33 +11,28 @@ This document describes the requirements for NGINX Agent version 2.
This document provides technical specifications for NGINX Agent. It includes information on supported distributions, deployment environments, NGINX versions, sizing recommendations, and logging.
## NGINX Agent 3.0 Compatibility
-{{< bootstrap-table "table table-striped table-bordered" >}}
+
| NGINX Product | Agent Version |
|------------------------------|----------------|
-| **NGINX One Console** | 2.x |
+| **NGINX One Console** | 3.x |
| **NGINX Gateway Fabric** | 3.x |
| **NGINX Plus** | 2.x, 3.x |
-| **NGINX Ingress Controller** | 2.x |
+| **NGINX Ingress Controller** | 2.x, 3.x |
| **NGINX Instance Manager** | 2.x |
-{{< /bootstrap-table >}}
## Supported Distributions
NGINX Agent can run in most environments. We support the following distributions:
-{{< bootstrap-table "table table-striped table-bordered" >}}
-| | AlmaLinux | Alpine Linux | Amazon Linux | Amazon Linux 2 | CentOS | Debian |
-|-|-----------|--------------|--------------|----------------|--------|--------|
-|**Version**|8
9 | 3.16
3.17
3.18
3.19| 2023| LTS| 7.4+| 11
12|
+| | AlmaLinux | Alpine Linux | Amazon Linux | Amazon Linux 2| Debian |
+|-|-----------|--------------|--------------|----------------|--------|
+|**Version**|8
9
10| 3.19
3.20
3.21
3.22| 2023| LTS| 11
12|
|**Architecture**| x86_84
aarch64| x86_64
aarch64 | x86_64
aarch64 | x86_64
aarch64 | x86_64
aarch64 | x86_64
aarch64 |
-{{< /bootstrap-table >}}
-{{< bootstrap-table "table table-striped table-bordered" >}}
| |FreeBSD | Oracle Linux | Red Hat
Enterprise Linux
(RHEL) | Rocky Linux | SUSE Linux
Enterprise Server
(SLES) | Ubuntu |
|-|--------|--------------|---------------------------------|-------------|-------------------------------------|--------|
-|**Version**|13
14|7.4+
8.1+
9|7.4+
8.1+
9.0+|8
9|12 SP5
15 SP2|20.04 LTS
22.04 LTS|
+|**Version**|13
14|8.1+
9
10|8.1+
9.0+
10|8
9
10|15 SP2|22.04 LTS
24.04 LTS
25.04 LTS|
|**Architecture**|amd64|x86_64|x86_64
aarch64|x86_64
aarch64|x86_64|x86_64
aarch64|
-{{< /bootstrap-table >}}
## Supported deployment environments
@@ -57,11 +52,10 @@ NGINX Agent works with all supported versions of NGINX Open Source and NGINX Plu
## Sizing recommendations
Minimum system sizing recommendations for NGINX Agent:
-{{< bootstrap-table "table table-striped table-bordered" >}}
+
| CPU | Memory | Network | Storage |
|------------|----------|-----------|---------|
| 1 CPU core | 1 GB RAM | 1 GbE NIC | 20 GB |
-{{< /bootstrap-table >}}
## Logging
diff --git a/content/amplify/faq/metrics-and-metadata.md b/content/amplify/faq/metrics-and-metadata.md
index f91ae8dd8..6e1b43a79 100644
--- a/content/amplify/faq/metrics-and-metadata.md
+++ b/content/amplify/faq/metrics-and-metadata.md
@@ -10,4 +10,4 @@ nd-docs: DOCS-957
[NGINX Amplify Agent Metrics and Metadata]({{< ref "/amplify/nginx-amplify-agent/metadata-metrics-collection" >}})
-{{< note >}}For a complete list of metrics, refer to the [Metrics and Metadata documentation]({{< ref "/amplify/metrics-metadata" >}}).{{< /note >}}
\ No newline at end of file
+{{< call-out "note" >}}For a complete list of metrics, refer to the [Metrics and Metadata documentation]({{< ref "/amplify/metrics-metadata" >}}).{{< /call-out >}}
\ No newline at end of file
diff --git a/content/amplify/faq/user-interface.md b/content/amplify/faq/user-interface.md
index 5bad6022b..547fadcbb 100644
--- a/content/amplify/faq/user-interface.md
+++ b/content/amplify/faq/user-interface.md
@@ -29,4 +29,4 @@ To completely delete a previously monitored object follow these steps:
To delete a system using the web interface — find it in the [Inventory]({{< ref "/amplify/user-interface/inventory" >}}), and select the [i] icon. You can delete objects from the popup window that appears next.
-{{< important >}}Deleting objects in the User Interface will not stop NGINX Amplify Agent. To completely remove a system from monitoring, please stop or uninstall NGINX Amplify Agent, clean it up in the web interface, and clean up any alerts.{{< /important >}}
+{{< call-out "important" >}}Deleting objects in the User Interface will not stop NGINX Amplify Agent. To completely remove a system from monitoring, please stop or uninstall NGINX Amplify Agent, clean it up in the web interface, and clean up any alerts.{{< /call-out >}}
diff --git a/content/amplify/known-issues.md b/content/amplify/known-issues.md
index 38b7db320..2d2bf2a79 100644
--- a/content/amplify/known-issues.md
+++ b/content/amplify/known-issues.md
@@ -6,17 +6,13 @@ toc: true
nd-docs: DOCS-1692
---
-{{}}
-
---
### {{% icon-bug %}} Unable to add some NGINX HTTP requests metrics to custom graph {#631}
-{{}}
| Issue ID | Status |
|----------|--------|
| 631 | Open |
-{{}}
#### Description
diff --git a/content/amplify/metrics-metadata/nginx-metrics.md b/content/amplify/metrics-metadata/nginx-metrics.md
index fd0e5e61c..8e4fb2278 100644
--- a/content/amplify/metrics-metadata/nginx-metrics.md
+++ b/content/amplify/metrics-metadata/nginx-metrics.md
@@ -241,7 +241,7 @@ To use the extended log format with your access log configuration:
access_log /var/log/nginx/access.log main_ext;
```
-{{< note >}} Please keep in mind that by default, NGINX Amplify Agent will process all access logs that are found in your log directory. If you define a new log file with the extended log format that will contain the entries being already logged to another access log, your metrics might be counted twice. Please refer to the NGINX Amplify Agent configuration section above to learn how to exclude specific log files from processing.{{< /note >}}
+{{< call-out "note" >}} Please keep in mind that by default, NGINX Amplify Agent will process all access logs that are found in your log directory. If you define a new log file with the extended log format that will contain the entries being already logged to another access log, your metrics might be counted twice. Please refer to the NGINX Amplify Agent configuration section above to learn how to exclude specific log files from processing.{{< /call-out >}}
The [error.log](http://nginx.org/en/docs/ngx_core_module.html#error_log) log level should be set to `warn`.
@@ -459,7 +459,7 @@ nginx.http.request.current = requests.current
The NGINX Plus metrics below are collected *per zone*. When configuring a graph using these metrics, please make sure to pick the correct server, upstream, or cache zone. A more granular peer-specific breakdown of the metrics below is currently not supported in NGINX Amplify.
-{{< note >}}NGINX Amplify Agent does not support reporting the following metrics *per zone* but it can be used to display a cumulative sum of values from each zone.{{< /note >}}
+{{< call-out "note" >}}NGINX Amplify Agent does not support reporting the following metrics *per zone* but it can be used to display a cumulative sum of values from each zone.{{< /call-out >}}
A cumulative metric set is also maintained internally by summing up the per-zone metrics. If you don't configure a specific zone when building graphs, this will result in an "all zones" visualization. E.g., for something like **plus.http.status.2xx** omitting zone will display the instance-wide sum of the successful requests across all zones.
diff --git a/content/amplify/metrics-metadata/os-metrics.md b/content/amplify/metrics-metadata/os-metrics.md
index 7de32fcb0..8ef0dbdce 100644
--- a/content/amplify/metrics-metadata/os-metrics.md
+++ b/content/amplify/metrics-metadata/os-metrics.md
@@ -168,7 +168,7 @@ nd-docs: DOCS-974
## Agent Metrics
-{{< note >}} Agent metrics are available only if you are using F5 NGINX Amplify Agent.{{< /note >}}
+{{< call-out "note" >}} Agent metrics are available only if you are using F5 NGINX Amplify Agent.{{< /call-out >}}
- #### **amplify.agent.status**
diff --git a/content/amplify/metrics-metadata/other-metrics.md b/content/amplify/metrics-metadata/other-metrics.md
index 2241f57e4..b35617d83 100644
--- a/content/amplify/metrics-metadata/other-metrics.md
+++ b/content/amplify/metrics-metadata/other-metrics.md
@@ -6,7 +6,7 @@ toc: true
nd-docs: DOCS-975
---
-{{< note >}}Monitoring PHP-FPM and MySQL metrics is only supported by F5 NGINX Amplify Agent.{{< /note >}}
+{{< call-out "note" >}}Monitoring PHP-FPM and MySQL metrics is only supported by F5 NGINX Amplify Agent.{{< /call-out >}}
## PHP-FPM metrics
@@ -24,7 +24,7 @@ To start monitoring PHP-FPM, follow the steps below:
service php7.0-fpm restart
```
-2. {{< important >}} Check that NGINX, NGINX Amplify Agent, and the PHP-FPM workers are all run under the same user ID (e.g. `www-data`). You may have to change the used ID for the nginx workers, fix the nginx directories permissions, and then restart NGINX Amplify Agent too. If there are multiple PHP-FPM pools configured with different user IDs, make sure NGINX Amplify Agent's user ID is included in the group IDs of the PHP-FPM workers. This is required in order for NGINX Amplify Agent to access the PHP-FPM pool socket when querying for metrics.{{< /important >}}
+2. {{< call-out "important" >}} Check that NGINX, NGINX Amplify Agent, and the PHP-FPM workers are all run under the same user ID (e.g. `www-data`). You may have to change the used ID for the nginx workers, fix the nginx directories permissions, and then restart NGINX Amplify Agent too. If there are multiple PHP-FPM pools configured with different user IDs, make sure NGINX Amplify Agent's user ID is included in the group IDs of the PHP-FPM workers. This is required in order for NGINX Amplify Agent to access the PHP-FPM pool socket when querying for metrics.{{< /call-out >}}
3. Confirm that the listen socket for the PHP-FPM pool you want to monitor and for which you enabled `pm.status_path`, is correctly configured with `listen.owner` and `listen.group`. Look for the following directives inside the pool configuration file.
@@ -219,7 +219,7 @@ To start monitoring MySQL, follow the instructions below.
353 rows in set (0.01 sec)
```
- {{< note >}} NGINX Amplify Agent doesn't use *mysql(1)* for metric collection, however it implements a similar query mechanism via a Python module.{{< /note >}}
+ {{< call-out "note" >}} NGINX Amplify Agent doesn't use *mysql(1)* for metric collection, however it implements a similar query mechanism via a Python module.{{< /call-out >}}
3. [Update]({{< ref "/amplify/nginx-amplify-agent/install/updating-amplify-agent.md" >}}) NGINX Amplify Agent to the most recent version.
diff --git a/content/amplify/nginx-amplify-agent/amplify-agent-overview.md b/content/amplify/nginx-amplify-agent/amplify-agent-overview.md
index 51cc08ccb..2e91e5443 100644
--- a/content/amplify/nginx-amplify-agent/amplify-agent-overview.md
+++ b/content/amplify/nginx-amplify-agent/amplify-agent-overview.md
@@ -21,6 +21,6 @@ NGINX Amplify can currently monitor and collect performance metrics for:
The NGINX Amplify Agent identifies an NGINX instance as any running NGINX master process with either a unique binary path or a unique configuration.
-{{< note >}}There's no need to manually add or configure anything in the web interface after installing NGINX Amplify Agent. When NGINX Amplify Agent is started, the metrics and the metadata are automatically reported to the Amplify backend and visualized in the web interface.{{< /note >}}
+{{< call-out "note" >}}There's no need to manually add or configure anything in the web interface after installing NGINX Amplify Agent. When NGINX Amplify Agent is started, the metrics and the metadata are automatically reported to the Amplify backend and visualized in the web interface.{{< /call-out >}}
When an NGINX instance is no longer in use it must be manually deleted in the web interface. The "Remove object" button can be found in the metadata viewer popup — see the [User Interface]({{< ref "/amplify/user-interface/">}}) documentation.
\ No newline at end of file
diff --git a/content/amplify/nginx-amplify-agent/configuration-analysis.md b/content/amplify/nginx-amplify-agent/configuration-analysis.md
index 0c227c3a9..e73c2ae4c 100644
--- a/content/amplify/nginx-amplify-agent/configuration-analysis.md
+++ b/content/amplify/nginx-amplify-agent/configuration-analysis.md
@@ -10,5 +10,5 @@ F5 NGINX Amplify Agent can automatically find all relevant NGINX configuration f
After NGINX Amplify Agent finds a particular NGINX configuration, it then automatically starts to keep track of its changes. When a change is detected with NGINX — for example, a master process restarts, or the NGINX config is edited, an update is sent to the Amplify backend.
-{{< note >}} NGINX Amplify Agent never sends the raw unprocessed config files to the backend system. In addition, the following directives in the NGINX configuration are never analyzed — and their parameters aren't exported to the SaaS backend:
-[ssl_certificate_key](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_certificate_key), [ssl_client_certificate](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_client_certificate), [ssl_password_file](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_password_file), [ssl_stapling_file](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling_file), [ssl_trusted_certificate](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate), [auth_basic_user_file](http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html#auth_basic_user_file), [secure_link_secret](http://nginx.org/en/docs/http/ngx_http_secure_link_module.html#secure_link_secret).{{< /note >}}
+{{< call-out "note" >}} NGINX Amplify Agent never sends the raw unprocessed config files to the backend system. In addition, the following directives in the NGINX configuration are never analyzed — and their parameters aren't exported to the SaaS backend:
+[ssl_certificate_key](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_certificate_key), [ssl_client_certificate](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_client_certificate), [ssl_password_file](http://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_password_file), [ssl_stapling_file](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling_file), [ssl_trusted_certificate](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate), [auth_basic_user_file](http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html#auth_basic_user_file), [secure_link_secret](http://nginx.org/en/docs/http/ngx_http_secure_link_module.html#secure_link_secret).{{< /call-out >}}
diff --git a/content/amplify/nginx-amplify-agent/configuring-metric-collection.md b/content/amplify/nginx-amplify-agent/configuring-metric-collection.md
index 311967d69..9c3bed5c9 100644
--- a/content/amplify/nginx-amplify-agent/configuring-metric-collection.md
+++ b/content/amplify/nginx-amplify-agent/configuring-metric-collection.md
@@ -49,7 +49,7 @@ nginx: configuration file /etc/nginx/nginx.conf test is successful
Test your nginx configuration after you've added the `stub_status` section above. Make sure there's no ambiguity with either [listen](http://nginx.org/en/docs/http/ngx_http_core_module.html#listen) or [server_name](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) configuration. NGINX Amplify Agent should be able to identify the [stub_status](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html) URL and will default to use 127.0.0.1 if the configuration is incomplete.
-{{< note >}} If you use the `conf.d*`directory to keep common parts of your NGINX configuration that are then automatically included in the [server](http://nginx.org/en/docs/http/ngx_http_core_module.html#server) sections across your NGINX config, do not use the snippet above. Instead, you should configure [stub_status](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html) manually within an appropriate location or server block. {{< /note >}}
+{{< call-out "note" >}} If you use the `conf.d*`directory to keep common parts of your NGINX configuration that are then automatically included in the [server](http://nginx.org/en/docs/http/ngx_http_core_module.html#server) sections across your NGINX config, do not use the snippet above. Instead, you should configure [stub_status](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html) manually within an appropriate location or server block. {{< /call-out >}}
The above is an example `nginx_status` URI for [stub_status](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html). NGINX Amplify Agent will determine the correct URI automatically upon parsing your NGINX configuration. Please make sure that the directory and the actual configuration file with `stub_status` are readable by NGINX Amplify Agent; otherwise, NGINX Amplify Agent won't be able to determine the `stub_status` URL correctly. If NGINX Amplify Agent fails to find `stub_status`, please refer to the workaround described [here]({{< ref "/amplify/nginx-amplify-agent/install/configuring-amplify-agent#configuring-the-url-for-stub_status-or-status-api" >}}).
@@ -95,7 +95,7 @@ You don't have to specifically point NGINX Amplify Agent to either the NGINX con
NGINX Amplify Agent will also try to detect the [log format](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format) for a particular log to parse it properly and try to extract even more useful metrics, for example, [$upstream_response_time](http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time).
-{{< note >}}Several metrics outlined in [Metrics and Metadata]({{< ref "metrics-metadata" >}}) will only be available if the corresponding variables are included in a custom [access.log](http://nginx.org/en/docs/http/ngx_http_log_module.html) format used for logging requests. You can find a complete list of NGINX log variables [here](http://nginx.org/en/docs/varindex.html).{{< /note >}}
+{{< call-out "note" >}}Several metrics outlined in [Metrics and Metadata]({{< ref "metrics-metadata" >}}) will only be available if the corresponding variables are included in a custom [access.log](http://nginx.org/en/docs/http/ngx_http_log_module.html) format used for logging requests. You can find a complete list of NGINX log variables [here](http://nginx.org/en/docs/varindex.html).{{< /call-out >}}
## Using Syslog for Metric Collection
@@ -118,4 +118,4 @@ If you configured NGINX Amplify Agent for syslog metric collection (see the [con
(see more [here](http://nginx.org/en/docs/control.html))
-{{< note >}}To send the NGINX logs to both the existing logging facility and NGINX Amplify Agent, include a separate [access.log](http://nginx.org/en/docs/http/ngx_http_log_module.html) directive for each destination.{{< /note >}}
+{{< call-out "note" >}}To send the NGINX logs to both the existing logging facility and NGINX Amplify Agent, include a separate [access.log](http://nginx.org/en/docs/http/ngx_http_log_module.html) directive for each destination.{{< /call-out >}}
diff --git a/content/amplify/nginx-amplify-agent/detecting-monitoring-instances.md b/content/amplify/nginx-amplify-agent/detecting-monitoring-instances.md
index 85508a998..f513971f3 100644
--- a/content/amplify/nginx-amplify-agent/detecting-monitoring-instances.md
+++ b/content/amplify/nginx-amplify-agent/detecting-monitoring-instances.md
@@ -16,4 +16,4 @@ A separate instance of NGINX, as seen by NGINX Amplify Agent, would be the follo
* A unique master process and its workers, started with an **absolute path** to a distinct NGINX binary
* A master process running with a default config path; or with a custom path set in the command-line parameters
-{{< note >}}NGINX Amplify Agent will try to detect and monitor all unique NGINX instances currently running on a host. Separate sets of metrics and metadata are collected for each unique NGINX instance. {{< /note >}}
+{{< call-out "note" >}}NGINX Amplify Agent will try to detect and monitor all unique NGINX instances currently running on a host. Separate sets of metrics and metadata are collected for each unique NGINX instance. {{< /call-out >}}
diff --git a/content/amplify/nginx-amplify-agent/install/configuring-amplify-agent.md b/content/amplify/nginx-amplify-agent/install/configuring-amplify-agent.md
index 572725403..07619c363 100644
--- a/content/amplify/nginx-amplify-agent/install/configuring-amplify-agent.md
+++ b/content/amplify/nginx-amplify-agent/install/configuring-amplify-agent.md
@@ -56,7 +56,7 @@ NGINX Amplify Agent won't start unless a valid hostname is defined. The followin
* localhost6.localdomain6
* ip6-localhost
-{{< note >}} You can also use the above method to replace the system's hostname with an arbitrary alias. Remember that if you redefine the hostname for a live object, the existing object will be marked as failed in the web interface. Redefining the hostname in NGINX Amplify Agent's configuration creates a new UUID and a new system for monitoring. {{< /note >}}
+{{< call-out "note" >}} You can also use the above method to replace the system's hostname with an arbitrary alias. Remember that if you redefine the hostname for a live object, the existing object will be marked as failed in the web interface. Redefining the hostname in NGINX Amplify Agent's configuration creates a new UUID and a new system for monitoring. {{< /call-out >}}
Alternatively, you can define an "alias" for the host in the UI (see the [Graphs]({{< ref "/amplify/user-interface/graphs" >}}) section).
@@ -80,7 +80,7 @@ To override the URI detection of the status API, use the `plus_status` option.
plus_status = /status
```
-{{< note >}} If only the URI part is specified with the options above, NGINX Amplify Agent will use `http://127.0.0.1` to construct the full URL to access either the *stub_status* or the NGINX Plus status API metrics. {{< /note >}}
+{{< call-out "note" >}} If only the URI part is specified with the options above, NGINX Amplify Agent will use `http://127.0.0.1` to construct the full URL to access either the *stub_status* or the NGINX Plus status API metrics. {{< /call-out >}}
## Configuring the Path to the NGINX Configuration File
@@ -93,7 +93,7 @@ If NGINX Amplify Agent cannot find the NGINX configuration, use the following op
configfile = /etc/nginx/nginx.conf
```
-{{< note >}} It is better to avoid using this option and only add it as a workaround. We'd appreciate it if you took some time to fill out a support ticket in case you had to manually add the path to the NGINX config file. {{< /note >}}
+{{< call-out "note" >}} It is better to avoid using this option and only add it as a workaround. We'd appreciate it if you took some time to fill out a support ticket in case you had to manually add the path to the NGINX config file. {{< /call-out >}}
## Configuring Host Tags
diff --git a/content/amplify/nginx-amplify-agent/install/installing-amplify-agent.md b/content/amplify/nginx-amplify-agent/install/installing-amplify-agent.md
index 1dcbb9241..15bd68957 100644
--- a/content/amplify/nginx-amplify-agent/install/installing-amplify-agent.md
+++ b/content/amplify/nginx-amplify-agent/install/installing-amplify-agent.md
@@ -8,7 +8,7 @@ nd-docs: DOCS-968
To use F5 NGINX Amplify to monitor your infrastructure, you need to install NGINX Amplify Agent on each system you wish to monitor.
-{{< note >}} NGINX Amplify Agent will drop *root* privileges on startup. It will then use the user ID of the user `nginx` to set its effective user ID. The package install procedure will add the `nginx` user automatically unless it's already found in the system. If the [user](https://nginx.org/en/docs/ngx_core_module.html#user) directive appears in the NGINX configuration, NGINX Amplify Agent will pick up the user specified in the NGINX config for its effective user ID (e.g. `www-data`). {{< /note >}}
+{{< call-out "note" >}} NGINX Amplify Agent will drop *root* privileges on startup. It will then use the user ID of the user `nginx` to set its effective user ID. The package install procedure will add the `nginx` user automatically unless it's already found in the system. If the [user](https://nginx.org/en/docs/ngx_core_module.html#user) directive appears in the NGINX configuration, NGINX Amplify Agent will pick up the user specified in the NGINX config for its effective user ID (e.g. `www-data`). {{< /call-out >}}
## Using the Install Script
diff --git a/content/amplify/nginx-amplify-agent/install/updating-amplify-agent.md b/content/amplify/nginx-amplify-agent/install/updating-amplify-agent.md
index e7c0f2c57..7f898c1a3 100644
--- a/content/amplify/nginx-amplify-agent/install/updating-amplify-agent.md
+++ b/content/amplify/nginx-amplify-agent/install/updating-amplify-agent.md
@@ -6,9 +6,9 @@ toc: true
nd-docs: DOCS-970
---
-{{< important >}}
+{{< call-out "important" >}}
It is *highly* recommended that you periodically check for updates and install the latest stable version of F5 NGINX Amplify Agent.
-{{< /important >}}
+{{< /call-out >}}
1. Updating NGINX Amplify Agent On Ubuntu/Debian
diff --git a/content/amplify/user-interface/alerts.md b/content/amplify/user-interface/alerts.md
index 490cc6eb7..91758e6a7 100644
--- a/content/amplify/user-interface/alerts.md
+++ b/content/amplify/user-interface/alerts.md
@@ -23,6 +23,6 @@ There's one special rule which is the about **amplify.agent.status** metric. Thi
You shouldn't see consecutive notifications about the same alert repeatedly. Instead, there will be digest information sent out *every 60 minutes*, describing which alerts were generated and which ones were cleared.
-{{< note >}} Gauges are *averaged* over the interval configured in the rule. Counters are *summed up*. Currently, this is not user configurable, and these are the only reduce functions available for configuring metric thresholds. {{< /note >}}
+{{< call-out "note" >}} Gauges are *averaged* over the interval configured in the rule. Counters are *summed up*. Currently, this is not user configurable, and these are the only reduce functions available for configuring metric thresholds. {{< /call-out >}}
-{{< note >}} Emails are sent using [AWS SES](https://aws.amazon.com/ses/). Make sure your mail relay accepts their traffic. Also, make sure to verify the specified email and check the verification status in the Account menu. {{< /note >}}
+{{< call-out "note" >}} Emails are sent using [AWS SES](https://aws.amazon.com/ses/). Make sure your mail relay accepts their traffic. Also, make sure to verify the specified email and check the verification status in the Account menu. {{< /call-out >}}
diff --git a/content/amplify/user-interface/analyzer.md b/content/amplify/user-interface/analyzer.md
index 40ce6d0b5..d01d4d6f5 100644
--- a/content/amplify/user-interface/analyzer.md
+++ b/content/amplify/user-interface/analyzer.md
@@ -46,6 +46,6 @@ Static analysis will only include information about specific issues with the NGI
In the future, the **Analyzer** page will also include *dynamic analysis*, effectively linking the observed NGINX behavior to its configuration — for example, when it makes sense to increase or decrease certain parameters like [proxy_buffers](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers), etc.
-{{< note >}} Config analysis is *on* by default. If you don't want your NGINX configuration to be checked, unset the corresponding setting in either Global, or Local (per-system) settings. See [**Settings**]({{< ref "/amplify/user-interface/account-settings" >}}). {{< /note >}}
+{{< call-out "note" >}} Config analysis is *on* by default. If you don't want your NGINX configuration to be checked, unset the corresponding setting in either Global, or Local (per-system) settings. See [**Settings**]({{< ref "/amplify/user-interface/account-settings" >}}). {{< /call-out >}}
{{< img src="amplify/amplify-analyzer-settings.png" alt="Analyzer Settings" >}}
\ No newline at end of file
diff --git a/content/amplify/user-interface/dashboards.md b/content/amplify/user-interface/dashboards.md
index 24dd0814d..5ee9ad389 100644
--- a/content/amplify/user-interface/dashboards.md
+++ b/content/amplify/user-interface/dashboards.md
@@ -38,7 +38,7 @@ To define a graph, perform these steps:
5. Last but not least, the “filter” functionality is also available for NGINX metrics collected from the log files. If you select "Add metric filter", you can add multiple criteria to define specific "metric dimensions". In the example above, we are matching the NGINX upstream response time against the **/api/feed/reports** URI. You can also build other filters, for example, displaying metric **nginx.http.status.2xx** for the responses with the status code 201.
6. Select "Save" to add the graph to the dashboard. You can also edit the graph, move it around, resize it, stack the graphs on top of each other, etc.
-{{< note >}} When using filters, all the "metric dimensions" aren't stored in the F5 NGINX Amplify backend by default. A particular filter starts to slice the metric according to the specification only after the graph is created. Hence, it can be a while before the "filtered" metric is displayed on the graph — the end result depends on how quickly the log files are being populated with the new entries, but typically you should see the first data points in under 5 minutes. {{< /note >}}
+{{< call-out "note" >}} When using filters, all the "metric dimensions" aren't stored in the F5 NGINX Amplify backend by default. A particular filter starts to slice the metric according to the specification only after the graph is created. Hence, it can be a while before the "filtered" metric is displayed on the graph — the end result depends on how quickly the log files are being populated with the new entries, but typically you should see the first data points in under 5 minutes. {{< /call-out >}}
Because NGINX Amplify is **not** a SaaS log analyzer, the additional slicing for "metric dimensions" is implemented inside NGINX Amplify Agent. NGINX Amplify Agent can parse the NGINX access logs on-the-fly and extract all the necessary metrics **without** sending the raw log entries elsewhere. Moreover, NGINX Amplify Agent understands custom log formats automatically, and will start looking for various newly defined "metric dimensions" following a particular [log_format](https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format) specification.
diff --git a/content/amplify/user-interface/inventory.md b/content/amplify/user-interface/inventory.md
index dc7e4d198..f77c83c71 100644
--- a/content/amplify/user-interface/inventory.md
+++ b/content/amplify/user-interface/inventory.md
@@ -16,4 +16,4 @@ In the rightmost column of the **Inventory**, you will find the settings and the
You can apply sorting, search, and filters to the **Inventory** to quickly find the system in question. You can search and filter by hostname, IP address, architecture, etc. You can use regular expressions with the search function.
-{{< note >}} When removing an object from monitoring, keep in mind that you also need to stop or uninstall NGINX Amplify Agent on the systems being removed; otherwise, the objects will reappear in the User Interface. Be sure to delete any system-specific alert rules too.{{< /note >}}
\ No newline at end of file
+{{< call-out "note" >}} When removing an object from monitoring, keep in mind that you also need to stop or uninstall NGINX Amplify Agent on the systems being removed; otherwise, the objects will reappear in the User Interface. Be sure to delete any system-specific alert rules too.{{< /call-out >}}
\ No newline at end of file
diff --git a/content/amplify/user-interface/overview.md b/content/amplify/user-interface/overview.md
index 02437219d..3ac91eef5 100644
--- a/content/amplify/user-interface/overview.md
+++ b/content/amplify/user-interface/overview.md
@@ -18,7 +18,7 @@ The cumulative [metrics]({{< ref "/amplify/metrics-metadata" >}}) displayed on t
* Traffic — sum of **system.net.bytes_sent** rate
* CPU Usage — average of **system.cpu.user**
-{{< note >}} By default the metrics above are calculated for all monitored hosts. You can configure specific tags in the **Overview** settings popup to display the metrics for a set of hosts (e.g. only the "production environment"). {{< /note >}}
+{{< call-out "note" >}} By default the metrics above are calculated for all monitored hosts. You can configure specific tags in the **Overview** settings popup to display the metrics for a set of hosts (e.g. only the "production environment"). {{< /call-out >}}
You may see zero numbers if some metrics are not being gathered, for example, if the request time (P95) is 0.000s, please check that you have correctly configured NGINX log for [additional metric]() collection.
diff --git a/content/controller/admin-guides/backup-restore/backup-restore-embedded-config-db.md b/content/controller/admin-guides/backup-restore/backup-restore-embedded-config-db.md
index a1d53cf56..f1e211f4b 100644
--- a/content/controller/admin-guides/backup-restore/backup-restore-embedded-config-db.md
+++ b/content/controller/admin-guides/backup-restore/backup-restore-embedded-config-db.md
@@ -23,9 +23,9 @@ NGINX Controller automatically takes a snapshot of the embedded config database
These automated config backups do not include backups of metrics data, which must be backed up separately; refer to [Backup & Restore the Metrics Database]({{< ref "/controller/admin-guides/backup-restore/backup-restore-metrics-db.md" >}}) for those instructions.
-{{< tip >}}
+{{< call-out "tip" >}}
As a best practice, we recommend that you make scheduled backups of the entire config DB volume and keep the backups off-site for safekeeping.
-{{< /tip >}}
+{{< /call-out >}}
@@ -35,7 +35,7 @@ As a best practice, we recommend that you make scheduled backups of the entire c
This section explains how to restore the embedded config database from the latest backup file or a specific, timestamped file.
-{{< important >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /important >}}
+{{< call-out "important" >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /call-out >}}
- To restore the embedded NGINX Controller config database **from the latest automated backup**, run the following command:
diff --git a/content/controller/admin-guides/backup-restore/backup-restore-external-config-db.md b/content/controller/admin-guides/backup-restore/backup-restore-external-config-db.md
index bc2adbeeb..8ff44f638 100644
--- a/content/controller/admin-guides/backup-restore/backup-restore-external-config-db.md
+++ b/content/controller/admin-guides/backup-restore/backup-restore-external-config-db.md
@@ -33,9 +33,9 @@ To backup and restore the external config database, you'll need the following:
export PGPASSWORD=
```
- {{< note >}}
+ {{< call-out "note" >}}
If you've configured PostgreSQL to use SSL, ensure that you've placed your certs in `~/.postgresql`. For more information, see [Client Certificates](https://www.postgresql.org/docs/9.5/libpq-ssl.html#LIBPQ-SSL-CLIENTCERT) in the PostgreSQL documentation.
- {{< /note >}}
+ {{< /call-out >}}
@@ -75,7 +75,7 @@ Take the following steps to back up the external NGINX Controller config databas
## Restore External Config Database
-{{< important >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /important >}}
+{{< call-out "important" >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /call-out >}}
To restore the external NGINX Controller config database:
diff --git a/content/controller/admin-guides/config-agent/about-controller-agent.md b/content/controller/admin-guides/config-agent/about-controller-agent.md
index 2ab44950d..e5efa82c0 100644
--- a/content/controller/admin-guides/config-agent/about-controller-agent.md
+++ b/content/controller/admin-guides/config-agent/about-controller-agent.md
@@ -29,7 +29,7 @@ The NGINX Controller Agent attempts to detect and monitor all unique NGINX proce
- A unique control process and its workers, started with an **absolute path** to a distinct NGINX binary.
- A control process running with a default config path, or with a custom path set in the command-line parameters.
-{{< caution >}}You should not make manual changes to the `nginx.conf` file on NGINX Plus instances that are managed by NGINX Controller. Manually updating the `nginx.conf` file on managed instances may adversely affect system performance. In most cases, NGINX Controller will revert or overwrite manual updates made to `nginx.conf`.{{< /caution >}}
+{{< call-out "caution" >}}You should not make manual changes to the `nginx.conf` file on NGINX Plus instances that are managed by NGINX Controller. Manually updating the `nginx.conf` file on managed instances may adversely affect system performance. In most cases, NGINX Controller will revert or overwrite manual updates made to `nginx.conf`.{{< /call-out >}}
@@ -37,7 +37,7 @@ The NGINX Controller Agent attempts to detect and monitor all unique NGINX proce
NGINX Controller, the NGINX Controller Agent, and the NGINX Controller Application Security Add-on support the following distributions and architectures.
-{{< see-also >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /see-also >}}
+{{< call-out "note" >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /call-out>}}
{{< bootstrap-table "table table-striped table-bordered" >}}
@@ -65,9 +65,9 @@ NGINX Controller, the NGINX Controller Agent, and the NGINX Controller Applicati
NGINX Controller v3.1 and later use an Analytics, Visibility, and Reporting daemon (AVRD) to aggregate and report app-centric metrics, which you can use to track and check the health of your apps. To learn more about these metrics, see the [NGINX Metrics Catalog]({{< ref "/controller/analytics/catalogs/metrics.md" >}}) topic.
-{{< see-also >}}
+{{< call-out "note" >}}
See the [NGINX Controller Technical Specifications]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md" >}}) for the complete list of system requirements for NGINX Controller and the NGINX Controller Agent.
-{{< /see-also >}}
+{{< /call-out>}}
## Supported Python Versions
diff --git a/content/controller/admin-guides/config-agent/configure-metrics-collection.md b/content/controller/admin-guides/config-agent/configure-metrics-collection.md
index 6fadc382c..c88443035 100644
--- a/content/controller/admin-guides/config-agent/configure-metrics-collection.md
+++ b/content/controller/admin-guides/config-agent/configure-metrics-collection.md
@@ -40,9 +40,9 @@ NGINX Controller uses the `/api` location on the NGINX Plus instance to collect
When you push a configuration to an NGINX Plus instance, NGINX Controller automatically enables the `/api` location for that instance.
-{{< note >}}
+{{< call-out "note" >}}
The `/api` location settings that NGINX Controller creates will override any settings that you have previously defined.
-{{< /note >}}
+{{< /call-out >}}
If you use NGINX Controller solely to monitor your NGINX Plus instances, you may need to enable the `/api` location on your instances manually.
Refer to the [Configuring the API](https://docs.nginx.com/nginx/admin-guide/monitoring/live-activity-monitoring/#configuring-the-api) section of the NGINX Plus Admin Guide for instructions.
@@ -63,12 +63,12 @@ The Agent will try to detect the [log format](https://nginx.org/en/docs/http/ngx
Some metrics included in the [NGINX Metrics reference]({{< ref "/controller/analytics/catalogs/metrics.md" >}}) are not available unless the corresponding variables are included in a custom [access.log](https://nginx.org/en/docs/http/ngx_http_log_module.html) format in the NGINX config.
-{{< see-also >}}
+{{< call-out "note" >}}
- Read [Configuring Logging](https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#setting-up-the-access-log) in the NGINX Admin Guide.
- View the complete list of [NGINX log variables](https://nginx.org/en/docs/varindex.html).
-{{< /see-also >}}.
+{{< /call-out>}}.
Take the steps in this section to enable the NGINX Controller Agent to collect metrics from custom `access.log` variables.
@@ -93,9 +93,9 @@ Take the steps in this section to enable the NGINX Controller Agent to collect m
access_log /var/log/nginx/access.log main_ext;
```
- {{< note >}}
+ {{< call-out "note" >}}
By default, the Controller Agent processes all access logs that it finds in your log directory. If you define a new log file with the extended log format that contains entries that are already being logged to another access log, your metrics might be counted twice. Refer to the [Agent configuration]({{< ref "/controller/admin-guides/config-agent/configure-the-agent.md" >}}) guide to learn how to exclude specific log files from processing.
- {{< /note >}}
+ {{< /call-out >}}
4. Set the [error.log](https://nginx.org/en/docs/ngx_core_module.html#error_log) log level to `warn`.
@@ -135,9 +135,9 @@ Take the steps below to enable metrics collection from Syslog:
For more information, see [Controlling NGINX](https://nginx.org/en/docs/control.html).
-{{< note >}}
+{{< call-out "note" >}}
To send the NGINX logs to both the existing logging facility and the NGINX Controller Agent, include a separate [access.log](https://nginx.org/en/docs/http/ngx_http_log_module.html) directive for each destination.
-{{< /note >}}
+{{< /call-out >}}
## What's Next
diff --git a/content/controller/admin-guides/config-agent/configure-the-agent.md b/content/controller/admin-guides/config-agent/configure-the-agent.md
index 468755759..9963d0e80 100644
--- a/content/controller/admin-guides/config-agent/configure-the-agent.md
+++ b/content/controller/admin-guides/config-agent/configure-the-agent.md
@@ -32,9 +32,9 @@ NGINX Controller uses the `/api` location on the NGINX Plus instance to collect
When you push a configuration to an NGINX Plus instance, NGINX Controller automatically enables the `/api` location for that instance.
-{{< note >}}
+{{< call-out "note" >}}
The `/api` location settings that NGINX Controller creates will override any settings that you have previously defined.
-{{< /note >}}
+{{< /call-out >}}
If you use NGINX Controller solely to monitor your NGINX Plus instances, you may need to enable the `/api` location on your instances manually.
Refer to the [Configuring the API](https://docs.nginx.com/nginx/admin-guide/monitoring/live-activity-monitoring/#configuring-the-api) section of the NGINX Plus Admin Guide for instructions.
@@ -71,13 +71,13 @@ The hostname should be real. The NGINX Controller Agent won't start unless a val
- localhost6.localdomain6
- ip6-localhost
-{{< note >}}
+{{< call-out "note" >}}
You can use the above method to replace the system's hostname with an arbitrary alias. Keep in mind that if you redefine the hostname for a live object, the existing object will be marked as failed in the NGINX Controller user interface. Redefining the hostname in the NGINX Controller Agent's configuration creates a new UUID and a new system for monitoring.
Alternatively, you can define an alias for the host in the NGINX Controller user interface. Go to the **Graphs** page, select the system that you want to update, and click the gear icon.
-{{< /note >}}
+{{< /call-out >}}
## Preserving the UUID across OS upgrades
@@ -97,7 +97,7 @@ After restarting the Controller Agent -- `service controller-agent restart` -- t
The NGINX Controller Agent detects the NGINX configuration file automatically. You shouldn't need to point the NGINX Controller Agent to the `nginx.conf` file explicitly.
-{{< caution >}}You should not make manual changes to the `nginx.conf` file on NGINX Plus instances that are managed by NGINX Controller. Manually updating the `nginx.conf` file on managed instances may adversely affect system performance. In most cases, NGINX Controller will revert or overwrite manual updates made to `nginx.conf`.{{< /caution >}}
+{{< call-out "caution" >}}You should not make manual changes to the `nginx.conf` file on NGINX Plus instances that are managed by NGINX Controller. Manually updating the `nginx.conf` file on managed instances may adversely affect system performance. In most cases, NGINX Controller will revert or overwrite manual updates made to `nginx.conf`.{{< /call-out >}}
If, for some reason, the NGINX Controller Agent cannot find the NGINX configuration, you can use the following option in `/etc/controller-agent/agent.conf` to point to the configuration file:
@@ -106,7 +106,7 @@ If, for some reason, the NGINX Controller Agent cannot find the NGINX configurat
configfile = /etc/nginx/nginx.conf
```
-{{< note >}} We recommend using this option only as a workaround if needed. If you do need to add the path to the NGINX config file, we ask that you [contact NGINX Support]({{< ref "/controller/support/contact-support.md" >}}) so they can help troubleshoot the issue.{{< /note >}}
+{{< call-out "note" >}} We recommend using this option only as a workaround if needed. If you do need to add the path to the NGINX config file, we ask that you [contact NGINX Support]({{< ref "/controller/support/contact-support.md" >}}) so they can help troubleshoot the issue.{{< /call-out >}}
## Set Host Tags
@@ -117,15 +117,15 @@ You can define arbitrary tags on a "per-host" basis. Tags can be configured in t
tags = foo bar foo:bar
```
-{{< note >}} Any changes to instance Tags made in the Controller user interface will overwrite the values stored in `agent.conf`.{{< /note >}}
+{{< call-out "note" >}} Any changes to instance Tags made in the Controller user interface will overwrite the values stored in `agent.conf`.{{< /call-out >}}
You can use tags to build custom graphs, configure alerts, and filter the systems on the **Graphs** page in the Controller user interface.
## Logging to Syslog
-{{< see-also >}}
+{{< call-out "note" >}}
[NGINX Admin Guide - Logging to Syslog](https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#logging-to-syslog)
-{{< /see-also >}}
+{{< /call-out>}}
The NGINX Controller Agent can collect NGINX log files using `syslog`. This could be useful when you don't keep the NGINX logs on disk, or when monitoring a container environment such as Docker with NGINX Controller.
@@ -147,9 +147,9 @@ To configure the NGINX Controller Agent to send logs to `syslog`:
# service controller-agent restart
```
- {{< important >}}
+ {{< call-out "important" >}}
Make sure you [add the `syslog` settings to your NGINX configuration file]({{< ref "/controller/admin-guides/config-agent/configure-metrics-collection.md#collect-metrics-from-syslog" >}}) as well.
- {{< /important >}}
+ {{< /call-out >}}
## Exclude Certain NGINX Log Files
@@ -182,9 +182,9 @@ Upon installation, the NGINX Controller Agent's log rotation schedule is added t
The normal level of logging for the NGINX Controller Agent is `INFO`. If you ever need to debug the NGINX Controller Agent, change the level to `DEBUG` as described below.
-{{< caution >}}
+{{< call-out "caution" >}}
The size of the NGINX Controller Agent's log file can proliferate in `DEBUG` mode. You should use `DEBUG` mode only for troubleshooting purposes.
-{{< /caution >}}
+{{< /call-out >}}
### Change the Agent Log Level
diff --git a/content/controller/admin-guides/install/get-n-plus-cert-and-key.md b/content/controller/admin-guides/install/get-n-plus-cert-and-key.md
index 55a141570..9b980d52f 100644
--- a/content/controller/admin-guides/install/get-n-plus-cert-and-key.md
+++ b/content/controller/admin-guides/install/get-n-plus-cert-and-key.md
@@ -19,9 +19,9 @@ This topic explains how to use the [F5 NGINX Controller REST API](https://docs.n
The NGINX Controller API uses session cookies to authenticate requests. The session cookie is returned in response to a `GET /api/v1/platform/login` request. See the Login endpoint in the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}) documentation for information about session cookie timeouts and invalidation.
-{{< tip >}}
+{{< call-out "tip" >}}
You can send a GET request to the login endpoint to find the status of the session token.
-{{< /tip >}}
+{{< /call-out >}}
For example:
@@ -60,9 +60,9 @@ For example:
curl -b cookie.txt -c cookie.txt -X GET --url 'https://192.0.2.0/api/v1/platform/licenses/nginx-plus-licenses/controller-provided' --output nginx-plus-certs.gz
```
-{{< note >}}
+{{< call-out "note" >}}
If you are using a self-signed certificate you will need to add `-k` (allow insecure connections) to your curl command to be able to download your NGINX Plus certificate and key bundle.
-{{< /note >}}
+{{< /call-out >}}
Once you have downloaded your certificate and key bundle you will need to expand the `.gz` file to get your certificate and key pair.
diff --git a/content/controller/admin-guides/install/install-agent-non-root.md b/content/controller/admin-guides/install/install-agent-non-root.md
index 7d4dd31bf..8c58211cd 100644
--- a/content/controller/admin-guides/install/install-agent-non-root.md
+++ b/content/controller/admin-guides/install/install-agent-non-root.md
@@ -36,9 +36,9 @@ Take the following steps to add an instance to NGINX Controller:
1. Add a name for the instance. If you don't provide a name, the hostname of the instance is used by default.
1. To add the instance to an existing Location, select a Location from the list. Or to create a Location, select **Create New**.
- {{< important >}}
+ {{< call-out "important" >}}
Once set, the Location for an instance cannot be changed. If you need to change or remove the Location for an instance, you must [remove the instance from NGINX Controller]({{< ref "/controller/infrastructure/instances/manage-instances.md#delete-an-instance" >}}), and then add it back.
- {{< /important >}}
+ {{< /call-out >}}
1. (Optional) By default, registration of NGINX Plus instances is performed over a secure connection. To use self-signed certificates with the Controller Agent, select **Allow insecure server connections to NGINX Controller using TLS**. For security purposes, we recommend that you secure the Controller Agent with signed certificates when possible.
1. Use SSH to connect and log in to the NGINX instance that you want to connect to NGINX Controller.
@@ -51,7 +51,7 @@ Once set, the Location for an instance cannot be changed. If you need to change
curl -sS -L https:///install/controller-agent > install.sh && API_KEY='' CONTROLLER_USER='' CONTROLLER_GROUP='' -i -l
```
- {{< note >}}
+ {{< call-out "note" >}}
Make sure you enter the commands to download and run the `install.sh` script on the NGINX Plus system, and not on the NGINX Controller.
@@ -61,7 +61,7 @@ If `CONTROLLER_USER` is not set, during the installation you will see the messag
Running agent as non-root changes the nap-syslog port to `5114` in both containerized and non-containerized instances.
- {{< /note >}}
+ {{< /call-out >}}
diff --git a/content/controller/admin-guides/install/install-nginx-controller-agent.md b/content/controller/admin-guides/install/install-nginx-controller-agent.md
index 2ee592106..65aa4ab54 100644
--- a/content/controller/admin-guides/install/install-nginx-controller-agent.md
+++ b/content/controller/admin-guides/install/install-nginx-controller-agent.md
@@ -22,7 +22,7 @@ You can use the NGINX Controller Agent to monitor your systems with the NGINX Co
## Install the NGINX Controller Agent
-{{< see-also >}} If you want to run the NGINX Controller Agent as a non-root user, follow the alternative instructions in the [Install NGINX Controller Agent for Non-root User]({{< ref "/controller/admin-guides/install/install-agent-non-root.md" >}}) guide instead of the steps provided in this section. {{< /see-also >}}
+{{< call-out "note" >}} If you want to run the NGINX Controller Agent as a non-root user, follow the alternative instructions in the [Install NGINX Controller Agent for Non-root User]({{< ref "/controller/admin-guides/install/install-agent-non-root.md" >}}) guide instead of the steps provided in this section. {{< /call-out>}}
Take the following steps to add an instance to NGINX Controller:
@@ -35,25 +35,25 @@ Take the following steps to add an instance to NGINX Controller:
7. To add the instance to an existing [Instance Group]({{< ref "/controller/infrastructure/instances/manage-instances.md#instance-groups" >}}), select an Instance Group from the list. Or to create an Instance Group, select **Create New**.
8. To add the instance to an existing Location, select a Location from the list. Or to create a Location, select **Create New**.
- {{< important >}}
+ {{< call-out "important" >}}
Once set, the Location for an instance cannot be changed. If you need to change or remove the Location for an instance, you must [remove the instance from NGINX Controller]({{< ref "/controller/infrastructure/instances/manage-instances.md#delete-an-instance" >}}), and then add it back.
- {{< /important >}}
+ {{< /call-out >}}
- {{< important >}}
+ {{< call-out "important" >}}
Instances and the instance groups they belong to should specify the same location; however, this requirement is not currently enforced. If different locations are specified, the instance group's location takes precedence. This is important to remember when [assigning locations to workload groups]({{< ref "/controller/app-delivery/manage-apps.md#workload-groups">}}).
- {{< /important >}}
+ {{< /call-out >}}
9. (Optional) By default, registration of NGINX Plus instances is performed over a secure connection. To use self-signed certificates with the Controller Agent, select **Allow insecure server connections to NGINX Controller using TLS**. For security purposes, we recommend that you secure the Controller Agent with signed certificates when possible.
10. Use SSH to connect and log in to the NGINX instance that you want to connect to NGINX Controller.
11. Run the `curl` or `wget` command that's shown in the **Installation Instructions** section on the NGINX instance to download and install the Controller Agent package. When specified, the `-i` and `-l` options for the `install.sh` script refer to the instance name and Location, respectively.
- {{< note >}}
+ {{< call-out "note" >}}
Make sure you enter the commands to download and run the `install.sh` script on the NGINX Plus system, and not on the NGINX Controller.
NGINX Controller 3.6 and earlier require Python 2.6 or 2.7. You'll be prompted to install Python if it's not installed already. Python is not required for NGINX Controller v3.7 and later.
- {{< /note >}}
+ {{< /call-out >}}
After a few minutes, the NGINX instance will appear on the **Instances** overview page.
@@ -70,11 +70,11 @@ To update the NGINX Controller Agent, take the following steps:
1. On the **Instances** overview page, select **Create**.
1. Follow the instructions in the **Install Instructions** pane to connect to the NGINX instance and install the updated Controller Agent package.
- {{< note >}}
+ {{< call-out "note" >}}
NGINX Controller 3.6 and earlier require Python 2.6 or 2.7. You'll be prompted to install Python if it's not installed already. Python is not required for NGINX Controller 3.7 and later.
- {{< /note >}}
+ {{< /call-out >}}
## Uninstall the Analytics, Visibility, and Reporting Daemon (AVRD)
@@ -100,7 +100,7 @@ To uninstall AVRD and the supporting modules, run the following command on each
Take the following steps to uninstall the Controller Agent and delete an instance.
-{{< important >}}Be sure to uninstall the Controller Agent first, before you delete an instance. If you don't uninstall the Controller Agent first, the instance may reappear in NGINX Controller after it has been deleted.{{< /important >}}
+{{< call-out "important" >}}Be sure to uninstall the Controller Agent first, before you delete an instance. If you don't uninstall the Controller Agent first, the instance may reappear in NGINX Controller after it has been deleted.{{< /call-out >}}
1. On your NGINX Plus instance, stop the Controller Agent service:
@@ -160,7 +160,7 @@ Take the following steps to uninstall the Controller Agent and delete an instanc
1. Delete alerts:
- {{< note >}}When you delete an instance, any related alerts for that instance are not deleted automatically. You can delete the alerts manually, however.{{< /note >}}
+ {{< call-out "note" >}}When you delete an instance, any related alerts for that instance are not deleted automatically. You can delete the alerts manually, however.{{< /call-out >}}
1. Open the NGINX Controller user interface and log in.
2. On the Analytics menu, select **Alerts > Alert Rules**.
diff --git a/content/controller/admin-guides/install/install-nginx-controller.md b/content/controller/admin-guides/install/install-nginx-controller.md
index 0607d2240..63ad87cb7 100644
--- a/content/controller/admin-guides/install/install-nginx-controller.md
+++ b/content/controller/admin-guides/install/install-nginx-controller.md
@@ -37,9 +37,9 @@ NGINX Controller uses a number of open source software packages in the product.
Before installing NGINX Controller, review the following prerequisites.
-{{< important >}}
+{{< call-out "important" >}}
NGINX Controller should be deployed on a secure, internal network only. We strongly recommend against exposing the NGINX Controller API to the internet.
-{{< /important >}}
+{{< /call-out >}}
Things you'll need before installing NGINX Controller:
@@ -93,14 +93,14 @@ To install all of the NGINX Controller prerequisites for your system at the same
./helper.sh prereqs
```
-{{< note >}}
+{{< call-out "note" >}}
After you've installed NGINX Controller, you can install any of the prerequisites by running the following command:
```bash
/opt/nginx-controller/helper.sh prereqs [base|docker|nfs]
```
-{{< /note >}}
+{{< /call-out >}}
@@ -150,10 +150,10 @@ If you are using Ubuntu-20.04 and want to install Docker on your own, choose the
- [Docker Community Edition (CE)](https://docs.docker.com/engine/install/ubuntu/) 19.03
- [Containerd.io](https://containerd.io/) 1.2.13
-{{< see-also >}}
-For instructions on installing Docker in offline scenarios on CentOS/RHEL 7, refer to the AskF5 [K84431427](https://support.f5.com/csp/article/K84431427) knowledge base article.{{< /see-also >}}
+{{< call-out "note" >}}
+For instructions on installing Docker in offline scenarios on CentOS/RHEL 7, refer to the AskF5 [K84431427](https://support.f5.com/csp/article/K84431427) knowledge base article.{{< /call-out>}}
-{{< important >}} You need to enable Docker log rotation to ensure that the logs don't consume all the free disk space on the server. For instructions on how to enable Docker log rotation, see the Docker guides [Configure logging drivers](https://docs.docker.com/config/containers/logging/configure/) and [JSON File logging driver](https://docs.docker.com/config/containers/logging/json-file/).{{< /important >}}
+{{< call-out "important" >}} You need to enable Docker log rotation to ensure that the logs don't consume all the free disk space on the server. For instructions on how to enable Docker log rotation, see the Docker guides [Configure logging drivers](https://docs.docker.com/config/containers/logging/configure/) and [JSON File logging driver](https://docs.docker.com/config/containers/logging/json-file/).{{< /call-out >}}
#### Red Hat Enterprise Linux
@@ -234,9 +234,9 @@ Refer to the AskF5 KB article [K49481224](https://support.f5.com/csp/article/K49
Install NGINX Controller on a dedicated node that **does not** already have Kubernetes configured. NGINX Controller does not support pre-configured Kubernetes implementations at this time. The installer for NGINX Controller will install and configure Kubernetes for you.
-{{< important >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /important >}}
+{{< call-out "important" >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /call-out >}}
-{{< caution >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /caution >}}
+{{< call-out "caution" >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /call-out >}}
To install NGINX Controller, take the following steps:
@@ -254,17 +254,17 @@ To install NGINX Controller, take the following steps:
./install.sh
```
- {{< important >}}Installing NGINX Controller as `root` is **not supported** on multi-node clusters. Instead, create a user with `sudo` permission for installing and performing all operations with NGINX Controller. Further, NGINX Controller scripts should also run with this dedicated user; scripts shouldn't be run as `sudo`, `sudo su`, or as the `root` user directly.{{< /important >}}
+ {{< call-out "important" >}}Installing NGINX Controller as `root` is **not supported** on multi-node clusters. Instead, create a user with `sudo` permission for installing and performing all operations with NGINX Controller. Further, NGINX Controller scripts should also run with this dedicated user; scripts shouldn't be run as `sudo`, `sudo su`, or as the `root` user directly.{{< /call-out >}}
- {{< note >}}If an HTTPS proxy is configured for the whole system, you should disable the proxy for the IP address and hostname of the host that you're running the NGINX Controller install script on.
- For example, run the command `export NO_PROXY=,`. {{< /note >}}
+ {{< call-out "note" >}}If an HTTPS proxy is configured for the whole system, you should disable the proxy for the IP address and hostname of the host that you're running the NGINX Controller install script on.
+ For example, run the command `export NO_PROXY=,`. {{< /call-out >}}
The installation script walks through a series of steps and asks for the following input:
- **Config database configuration**. Specify whether to use an embedded, self-hosted PostgreSQL database for the config database, or if you want to provide your own external PostgreSQL database. If you choose to provide your own database, make sure you've reviewed the [PostgreSQL prerequisites](#postgresql-optional).
- **Config database volume type**: Specify the type of volume to use to store the config database: local, NFS, or AWS. We recommend choosing `local` only for demo and trial purposes.
- {{< see-also >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /see-also >}}
+ {{< call-out "note" >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /call-out>}}
- **Analytics database volume type**: Specify the type of volume to use to store the analytics database: local, NFS, or AWS. We recommend choosing `local` for demo and trial purposes.
- **EULA**: Read the end-user license agreement. Type either `y` to accept or `n` to exit.
@@ -280,10 +280,10 @@ To install NGINX Controller, take the following steps:
- **Email address**: The contact email address for the initial admin user.
- **Password**: The initial admin's password. Passwords must be 6-64 characters long and must include letters and digits.
- **FQDN**: Fully qualified domain name (FQDN) -- a resolvable domain name for the NGINX Controller server. The FQDN is used by Controller Agents when connecting to NGINX Controller.
- {{< note >}}We recommend setting the FQDN to a internal address when possible, to avoid exposing the traffic between the Agent and NGINX Controller. This also reduces the external traffic in cloud environments. {{< /note >}}
+ {{< call-out "note" >}}We recommend setting the FQDN to a internal address when possible, to avoid exposing the traffic between the Agent and NGINX Controller. This also reduces the external traffic in cloud environments. {{< /call-out >}}
- **SSL/TLS certificates**: Type `y` to generate and use self-signed certs for running NGINX Controller over HTTPS, or type `n` to provide your own certs.
- {{< important >}}If you provide your own SSL/TLS certificates, you'll need a complete certificate chain file, with the intermediate CA cert appended to the server cert; the server certificate must appear **before** the chained certificates in the combined file. If the certificate contains a wildcard Common Name (CN=*.example.com) it must also contain a Subject Alternate Name (SAN=nginx-controller.example.com). {{< /important >}}
+ {{< call-out "important" >}}If you provide your own SSL/TLS certificates, you'll need a complete certificate chain file, with the intermediate CA cert appended to the server cert; the server certificate must appear **before** the chained certificates in the combined file. If the certificate contains a wildcard Common Name (CN=*.example.com) it must also contain a Subject Alternate Name (SAN=nginx-controller.example.com). {{< /call-out >}}
1. Log in to the NGINX Controller browser interface by navigating to the DNS, FQDN, or IP address of the NGINX Controller host, for example, `https:///login`. Use the admin email address and password that you provided during the installation process.
@@ -306,9 +306,9 @@ To add a license to NGINX Controller, take the following steps:
1. Select **Save license**.
-{{< see-also >}}
+{{< call-out "note" >}}
To add a license using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PUT request to the `/platform/license` endpoint. Provide your CAT or NGINX Controller license as a base64-encoded string in the JSON request body.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -358,9 +358,9 @@ To update the NGINX Controller software, take the steps below. When complete, yo
When updating NGINX Controller on a multi-node cluster, run the `update.sh` script on each node individually -- the order in which you update the nodes doesn't matter.
-{{< warning >}} Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /warning >}}
+{{< call-out "warning" >}} Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /call-out >}}
-{{< caution >}}
+{{< call-out "caution" >}}
We strongly recommend that you make a backup of the following information before proceeding, to avoid potential data and/or configuration loss:
- [Back up the NGINX Controller databases]({{< ref "/controller/admin-guides/backup-restore" >}}).
@@ -376,7 +376,7 @@ We strongly recommend that you make a backup of the following information before
cp /etc/controller-agent/agent.conf
```
-{{< /caution >}}
+{{< /call-out >}}
1. Download the installer package from the [MyF5 Customer Portal](https://my.f5.com/manage/s/downloads).
@@ -401,13 +401,13 @@ We strongly recommend that you make a backup of the following information before
./update.sh
```
- {{< note >}}If you're upgrading from an older version of NGINX Controller and you installed Controller as root user, use `--allow-with-root` flag when running an update script. {{< /note >}}
+ {{< call-out "note" >}}If you're upgrading from an older version of NGINX Controller and you installed Controller as root user, use `--allow-with-root` flag when running an update script. {{< /call-out >}}
1. If you are logged in to NGINX Controller using a web browser, sign out and log in again.
- To sign out, select your username in the upper right-hand corner, and then select "Sign Out". For optimal performance, also flush your browser cache.
-{{< important >}} After you upgrade NGINX Controller, you also need to [update the NGINX Controller Agent]({{< ref "/controller/admin-guides/install/install-nginx-controller-agent" >}}) to the latest version. {{< /important >}}
+{{< call-out "important" >}} After you upgrade NGINX Controller, you also need to [update the NGINX Controller Agent]({{< ref "/controller/admin-guides/install/install-nginx-controller-agent" >}}) to the latest version. {{< /call-out >}}
@@ -426,7 +426,7 @@ To uninstall NGINX Controller, run the uninstall script:
---
## Install NGINX Controller Agent
-{{< see-also >}} If you want to run the NGINX Controller Agent as a non-root user, follow the alternative instructions in the [Install NGINX Controller Agent for Non-root User]({{< ref "/controller/admin-guides/install/install-agent-non-root.md" >}}) guide instead of the steps provided in this section. {{< /see-also >}}
+{{< call-out "note" >}} If you want to run the NGINX Controller Agent as a non-root user, follow the alternative instructions in the [Install NGINX Controller Agent for Non-root User]({{< ref "/controller/admin-guides/install/install-agent-non-root.md" >}}) guide instead of the steps provided in this section. {{< /call-out>}}
Install the Controller Agent on each NGINX Plus instance that you want to manage and monitor.
@@ -441,25 +441,25 @@ Take the following steps to add an instance to NGINX Controller:
7. To add the instance to an existing [Instance Group]({{< ref "/controller/infrastructure/instances/manage-instances.md#instance-groups" >}}), select an Instance Group from the list. Or to create an Instance Group, select **Create New**.
8. To add the instance to an existing Location, select a Location from the list. Or to create a Location, select **Create New**.
- {{< important >}}
+ {{< call-out "important" >}}
Once set, the Location for an instance cannot be changed. If you need to change or remove the Location for an instance, you must [remove the instance from NGINX Controller]({{< ref "/controller/infrastructure/instances/manage-instances.md#delete-an-instance" >}}), and then add it back.
- {{< /important >}}
+ {{< /call-out >}}
- {{< important >}}
+ {{< call-out "important" >}}
Instances and the instance groups they belong to should specify the same location; however, this requirement is not currently enforced. If different locations are specified, the instance group's location takes precedence. This is important to remember when [assigning locations to workload groups]({{< ref "/controller/app-delivery/manage-apps.md#workload-groups">}}).
- {{< /important >}}
+ {{< /call-out >}}
9. (Optional) By default, registration of NGINX Plus instances is performed over a secure connection. To use self-signed certificates with the Controller Agent, select **Allow insecure server connections to NGINX Controller using TLS**. For security purposes, we recommend that you secure the Controller Agent with signed certificates when possible.
10. Use SSH to connect and log in to the NGINX instance that you want to connect to NGINX Controller.
11. Run the `curl` or `wget` command that's shown in the **Installation Instructions** section on the NGINX instance to download and install the Controller Agent package. When specified, the `-i` and `-l` options for the `install.sh` script refer to the instance name and Location, respectively.
- {{< note >}}
+ {{< call-out "note" >}}
Make sure you enter the commands to download and run the `install.sh` script on the NGINX Plus system, and not on the NGINX Controller.
NGINX Controller 3.6 and earlier require Python 2.6 or 2.7. You'll be prompted to install Python if it's not installed already. Python is not required for NGINX Controller v3.7 and later.
- {{< /note >}}
+ {{< /call-out >}}
After a few minutes, the NGINX instance will appear on the **Instances** overview page.
@@ -476,9 +476,9 @@ If NGINX Controller isn't working how you expect, see the knowledge base article
You can create a support package for NGINX Controller that you can use to diagnose issues.
-{{< note >}}
+{{< call-out "note" >}}
You will need to provide a support package if you open a ticket with NGINX Support via the [MyF5 Customer Portal](https://account.f5.com/myf5).
-{{< /note >}}
+{{< /call-out >}}
```bash
/opt/nginx-controller/helper.sh supportpkg [-o|--output ] [-s|--skip-db-dump] [-t|--timeseries-dump ]
diff --git a/content/controller/admin-guides/install/nginx-controller-tech-specs.md b/content/controller/admin-guides/install/nginx-controller-tech-specs.md
index 39b8a7da6..de963dce1 100644
--- a/content/controller/admin-guides/install/nginx-controller-tech-specs.md
+++ b/content/controller/admin-guides/install/nginx-controller-tech-specs.md
@@ -16,7 +16,7 @@ This guide lists the technical recommendations for F5 NGINX Controller v3 and NG
NGINX Controller, the NGINX Controller Agent, and the NGINX Controller Application Security Add-on support the following distributions and architectures.
-{{< see-also >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /see-also >}}
+{{< call-out "note" >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /call-out>}}
{{< bootstrap-table "table table-striped table-bordered" >}}
@@ -118,9 +118,9 @@ NGINX Controller supports the following [NGINX Plus](https://www.f5.com/products
The App Security add-on for the NGINX Controller Application Delivery module is compatible with the versions of NGINX Plus and NGINX App Protect shown in the table below. New releases of NGINX Controller ADC support the last four versions of NGINX Plus at release time.
-{{< see-also >}}
+{{< call-out "note" >}}
Refer to [Using NGINX App Protect with NGINX Controller]({{< ref "controller/admin-guides/install/install-for-controller.md" >}}) for installation instructions and additional information.
-{{< /see-also >}}
+{{< /call-out>}}
{{< bootstrap-table "table table-striped table-bordered" >}}
@@ -160,11 +160,11 @@ NGINX Controller works best with the newest and the last prior version of these
- [Safari](https://support.apple.com/downloads/safari)
- [Internet Explorer](https://support.microsoft.com/en-us/help/17621/internet-explorer-downloads) and [Microsoft Edge](https://www.microsoft.com/en-us/edge)
-{{< important >}}
+{{< call-out "important" >}}
You may need to turn off any ad blockers while using the NGINX Controller user interface.
In some cases, the NGINX Controller user interface may not display analytics or security events if an ad blocker is enabled. Refer to the AskF5 KB article [K48603454](https://support.f5.com/csp/article/K48903454) to learn more about this issue and how to resolve it.
-{{< /important >}}
+{{< /call-out >}}
@@ -204,9 +204,9 @@ When using local storage for the analytics and/or config database, we recommend
- 100 IOPS
- 155–255 GB free disk space. 255 GB of free space is recommended if NGINX Controller App Security is enabled. See the [Storage Requirements]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#storage-requirements" >}}) section for a categorized list of the storage requirements.
-{{< tip >}}
+{{< call-out "tip" >}}
To conserve IO and/or disk space, you can use a separate disk for the local storage directory `/opt/nginx-controller/clickhouse_data`.
-{{< /tip >}}
+{{< /call-out >}}
@@ -224,9 +224,9 @@ To use NFS for external storage for the analytics and/or config database, consid
### AWS EBS
-{{< important >}}
+{{< call-out "important" >}}
If you plan to run NGINX Controller on AWS EC2 instances, we recommend using NFS shares for the external volumes. Using EBS shares for multi-node clusters is not recommended because of the [EBS Availability Zone limitations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html#considerations); for example, the requirement to have EC2 instances and EBS volumes in the same Availability Zone.
-{{< /important >}}
+{{< /call-out >}}
If you are installing NGINX Controller on [AWS EC2 instances](https://aws.amazon.com/ec2/getting-started/) and plan to use EBS volumes for the analytics and/or config database, consider the following:
@@ -361,9 +361,9 @@ NGINX Controller supports the following versions of PostgreSQL:
For a system monitoring **100 NGINX Plus instances**, we recommend at least **32 GB of database storage**. Database storage requirements can vary, depending on the number of NGINX Plus instances, components, published API specs, and the churn rate for configuration changes. For monitor-only implementations, the database storage needs are small; for API Management (APIM) and/or App Delivery Controller (ADC) implementations in production, the storage needs are greater.
-{{< important >}}
+{{< call-out "important" >}}
If you use PostgreSQL 12, we recommend disabling [Just-in-Time (JIT)](https://www.postgresql.org/docs/12/jit.html) compilation to improve NGINX Controller's performance. To disable JIT, edit the `postgresql.conf` file and set `jit=off`.
-{{< /important >}}
+{{< /call-out >}}
diff --git a/content/controller/admin-guides/install/resilient-cluster-aws.md b/content/controller/admin-guides/install/resilient-cluster-aws.md
index 240c0edc5..839cc8f2e 100644
--- a/content/controller/admin-guides/install/resilient-cluster-aws.md
+++ b/content/controller/admin-guides/install/resilient-cluster-aws.md
@@ -19,8 +19,8 @@ To be resilient, a cluster requires three working nodes. That's two nodes for a
If a node fails in a resilient cluster, NGINX Controller automatically redirects traffic to the other working nodes. A multi-node cluster is operational with only two nodes; however, a two-node cluster isn't resilient to further failures. If one of the nodes in a multi-node cluster becomes degraded or fails, you must take action **as soon as possible** to recover or replace the failed node or risk losing resiliency.
-{{< important >}}The failover time can take **up to 5 minutes** when a node fails. During this time, NGINX Controller may be unavailable while services are migrated and restarted. Resiliency will be restored once there are **three working nodes** in the cluster.
-{{< /important >}}
+{{< call-out "important" >}}The failover time can take **up to 5 minutes** when a node fails. During this time, NGINX Controller may be unavailable while services are migrated and restarted. Resiliency will be restored once there are **three working nodes** in the cluster.
+{{< /call-out >}}
The following table shows how many nodes are needed for a cluster to have a quorum and what the failure tolerance is:
@@ -72,7 +72,7 @@ Before installing or configuring NGINX Controller as a multi-node cluster, revie
### Prerequisites
-{{< important >}}If you plan to run NGINX Controller on AWS EC2 instances, we recommend you use NFS shares for the external volumes. Using EBS shares for multi-node clusters is not recommended because of the [EBS Availability Zone limitations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html#considerations).{{< /important >}}
+{{< call-out "important" >}}If you plan to run NGINX Controller on AWS EC2 instances, we recommend you use NFS shares for the external volumes. Using EBS shares for multi-node clusters is not recommended because of the [EBS Availability Zone limitations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html#considerations).{{< /call-out >}}
Things you'll need before installing NGINX Controller as a resilient cluster:
@@ -92,7 +92,7 @@ Things you'll need before installing NGINX Controller as a resilient cluster:
## Configure IAM Roles
-{{< important >}}If you plan to run NGINX Controller on AWS EC2 instances, we recommend using NFS shares for the external volumes. Using EBS shares for multi-node clusters is not recommended because of the [EBS Availability Zone limitations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html#considerations); for example, the requirement to have EC2 instances and EBS volumes in the same Availability Zone.{{< /important >}}
+{{< call-out "important" >}}If you plan to run NGINX Controller on AWS EC2 instances, we recommend using NFS shares for the external volumes. Using EBS shares for multi-node clusters is not recommended because of the [EBS Availability Zone limitations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html#considerations); for example, the requirement to have EC2 instances and EBS volumes in the same Availability Zone.{{< /call-out >}}
If you are installing NGINX Controller on [AWS EC2 instances](https://aws.amazon.com/ec2/getting-started/) and plan to use EBS volumes for the analytics and/or config database, you will need to add an IAM role like the one shown below. This will also allow the automatic creation of Elastic Load Balancers (ELBs). Additionally, for successful automatic creation of ELBs, all the EC2 instances that are or will be part of the cluster must be tagged with the following key-value pair:
`kubernetes.io/cluster/NGINX-CONTROLLER : owned`
@@ -192,9 +192,9 @@ If you are installing NGINX Controller on [AWS EC2 instances](https://aws.amazon
Nodes are additional control-plane hosts that you can add to your cluster to improve uptime resilience. For a resilient cluster, you should have at least three nodes, of which **two nodes must always be operational**.
-{{< important >}}
+{{< call-out "important" >}}
When adding a third node to the cluster for the first time, NGINX Controller may become momentarily unavailable while the cluster is being created. For this reason, we recommend updating NGINX Controller during a planned maintenance window to minimize disruptions.
-{{< /important >}}
+{{< /call-out >}}
Take the following steps to add a node to the cluster:
@@ -226,9 +226,9 @@ Take the following steps to add a node to the cluster:
1. After the installation finishes, the node status in the web interface changes to `Configured`.
1. Repeat these steps for each node that you want to add to the cluster.
-{{< see-also >}}
+{{< call-out "note" >}}
To add nodes to your cluster using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a POST request to the `/platform/nodes` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -250,13 +250,13 @@ There might be situations when you need to delete a node, either temporarily for
If you need to remove a node temporarily, follow the steps in the [Add Nodes to the Cluster](#add-nodes-to-the-cluster) topic when you are ready to re-add it. Make sure to uninstall NGINX Controller from the node before re-installing NGINX Controller with the new join-key.
-{{< important >}}
+{{< call-out "important" >}}
Deleting nodes can cause NGINX Controller to become momentarily unavailable while the cluster is being updated. For this reason, we recommend updating NGINX Controller during a planned maintenance window to minimize disruptions. When deleting nodes, make sure that **at least two nodes are always operational**. If the cluster has fewer than two working nodes, NGINX Controller may become unresponsive, and you may not be able to add new nodes.
-{{< /important >}}
+{{< /call-out >}}
-{{< see-also >}}
+{{< call-out "note" >}}
To delete nodes from your cluster using the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}), send a DELETE request to the Nodes endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
To delete a node from the cluster using the web interface:
@@ -274,9 +274,9 @@ To delete a node from the cluster using the web interface:
/opt/nginx-controller/uninstall.sh
```
-{{< see-also >}}
+{{< call-out "note" >}}
To delete nodes from your cluster using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a DELETE request to the `/platform/nodes` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -301,11 +301,11 @@ To replace a failed node:
When updating NGINX Controller on a multi-node cluster, run the `update.sh` script on each node individually -- the order in which you update the nodes doesn't matter.
-{{< warning >}}Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /warning >}}
+{{< call-out "warning" >}}Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /call-out >}}
-{{< important >}}
+{{< call-out "important" >}}
Active users will be logged out from NGINX Controller during an update. We recommend updating NGINX Controller during a planned maintenance window to minimize disruptions.
-{{< /important >}}
+{{< /call-out >}}
To update your cluster to a newer version of NGINX Controller, take the following steps:
diff --git a/content/controller/admin-guides/install/resilient-cluster-private-cloud.md b/content/controller/admin-guides/install/resilient-cluster-private-cloud.md
index cb2339eb0..5672df653 100644
--- a/content/controller/admin-guides/install/resilient-cluster-private-cloud.md
+++ b/content/controller/admin-guides/install/resilient-cluster-private-cloud.md
@@ -24,8 +24,8 @@ To be resilient, a cluster requires three working nodes. That's two nodes for a
If a node fails in a resilient cluster, NGINX Controller automatically redirects traffic to the other working nodes. A multi-node cluster is operational with only two nodes; however, a two-node cluster isn't resilient to further failures. If one of the nodes in a multi-node cluster becomes degraded or fails, you must take action **as soon as possible** to recover or replace the failed node or risk losing resiliency.
-{{< important >}}The failover time can take **up to 5 minutes** when a node fails. During this time, NGINX Controller may be unavailable while services are migrated and restarted. Resiliency will be restored once there are **three working nodes** in the cluster.
-{{< /important >}}
+{{< call-out "important" >}}The failover time can take **up to 5 minutes** when a node fails. During this time, NGINX Controller may be unavailable while services are migrated and restarted. Resiliency will be restored once there are **three working nodes** in the cluster.
+{{< /call-out >}}
The following table shows how many nodes are needed for a cluster to have a quorum and what the failure tolerance is:
@@ -106,9 +106,9 @@ Things you'll need before installing NGINX Controller as a resilient cluster:
Nodes are additional control-plane hosts that you can add to your cluster to improve uptime resilience. For a resilient cluster, you should have at least three nodes, of which **two nodes must always be operational**.
-{{< important >}}
+{{< call-out "important" >}}
When adding a third node to the cluster for the first time, NGINX Controller may become momentarily unavailable while the cluster is being created. For this reason, we recommend updating NGINX Controller during a planned maintenance window to minimize disruptions.
-{{< /important >}}
+{{< /call-out >}}
Take the following steps to add a node to the cluster:
@@ -140,9 +140,9 @@ Take the following steps to add a node to the cluster:
1. After the installation finishes, the node status in the web interface changes to `Configured`.
1. Repeat these steps for each node that you want to add to the cluster.
-{{< see-also >}}
+{{< call-out "note" >}}
To add nodes to your cluster using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a POST request to the `/platform/nodes` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -154,11 +154,11 @@ To add nodes to your cluster using the [NGINX Controller REST API]({{< ref "/con
A floating IP -- also called a virtual IP -- is a static, routable IPv4 address that improves service resiliency by allowing NGINX Controller to continue to receive traffic if a node becomes unavailable. The floating IP is assigned to one of the cluster nodes, and if the node fails, the floating IP is automatically transferred to another node. The floating IP should not be in any DHCP pool.
-{{< important>}}
+{{< call-out "important" >}}
The floating IP needs to be added as an A record for the domain that's used as the Fully Qualified Domain Name (FQDN) for NGINX Controller.
NGINX Controller **does not support IPv6** addresses for the floating IP.
-{{< /important >}}
+{{< /call-out >}}
Take the following steps to add a floating IP for your private cloud cluster:
@@ -171,9 +171,9 @@ Take the following steps to add a floating IP for your private cloud cluster:
1. Select **Save**.
1. Complete the steps to [update the FQDN](#update-the-fqdn) to use the floating IP.
-{{< see-also >}}
+{{< call-out "note" >}}
To set a floating IP using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PATCH request to the `/platform/global` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
---
@@ -207,9 +207,9 @@ To change the FQDN for NGINX Controller using the web interface, take the follow
1. Select **Save**. The cluster services will restart. During this time, the web interface will be briefly unavailable.
1. Follow the steps to [update the FQDN for Controller Agents](#update-the-fqdn-for-controller-agents).
-{{< see-also >}}
+{{< call-out "note" >}}
To change the FQDN for NGINX Controller using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PATCH request to the `/platform/global` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
### Update the FQDN for Controller Agents
@@ -252,9 +252,9 @@ Take the following steps to update the API Gateway SSL certificate:
1. Select **Save**.
-{{< see-also >}}
+{{< call-out "note" >}}
To update the API Gateway SSL certificate and key using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PATCH request to the `/platform/global` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -264,9 +264,9 @@ To update the API Gateway SSL certificate and key using the [NGINX Controller RE
Take the following steps to view the status for a node:
-{{< see-also >}}
+{{< call-out "note" >}}
To view a node's status using the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}), send a GET request to the Nodes endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
1. Open the NGINX Controller web interface and log in.
1. Select the NGINX Controller menu icon, then select **Platform**.
@@ -283,13 +283,13 @@ There might be situations when you need to delete a node, either temporarily for
If you need to remove a node temporarily, follow the steps in the [Add Nodes to the Cluster](#add-nodes-to-the-cluster) topic when you are ready to re-add it. Make sure to uninstall NGINX Controller from the node before re-installing NGINX Controller with the new join-key.
-{{< important >}}
+{{< call-out "important" >}}
Deleting nodes can cause NGINX Controller to become momentarily unavailable while the cluster is being updated. For this reason, we recommend updating NGINX Controller during a planned maintenance window to minimize disruptions. When deleting nodes, make sure that **at least two nodes are always operational**. If the cluster has fewer than two working nodes, NGINX Controller may become unresponsive, and you may not be able to add new nodes.
-{{< /important >}}
+{{< /call-out >}}
-{{< see-also >}}
+{{< call-out "note" >}}
To delete nodes from your cluster using the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}), send a DELETE request to the Nodes endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
To delete a node from the cluster using the web interface:
@@ -307,9 +307,9 @@ To delete a node from the cluster using the web interface:
/opt/nginx-controller/uninstall.sh
```
-{{< see-also >}}
+{{< call-out "note" >}}
To delete nodes from your cluster using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a DELETE request to the `/platform/nodes` endpoint.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -334,11 +334,11 @@ To replace a failed node:
When updating NGINX Controller on a multi-node cluster, run the `update.sh` script on each node individually -- the order in which you update the nodes doesn't matter.
-{{< warning >}}Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /warning >}}
+{{< call-out "warning" >}}Do not update the nodes in a multi-node cluster in parallel. Doing so may result in race conditions for certain jobs, such as database migrations, and may cause the cluster to become unavailable.{{< /call-out >}}
-{{< important >}}
+{{< call-out "important" >}}
Active users will be logged out from NGINX Controller during an update. We recommend updating NGINX Controller during a planned maintenance window to minimize disruptions.
-{{< /important >}}
+{{< /call-out >}}
To update your cluster to a newer version of NGINX Controller, take the following steps:
diff --git a/content/controller/admin-guides/install/try-nginx-controller-app-sec.md b/content/controller/admin-guides/install/try-nginx-controller-app-sec.md
index ecba8d0f9..7d5bfee52 100644
--- a/content/controller/admin-guides/install/try-nginx-controller-app-sec.md
+++ b/content/controller/admin-guides/install/try-nginx-controller-app-sec.md
@@ -15,9 +15,9 @@ This quick-start tutorial shows you how to get started using F5 NGINX Controller
Take the steps in this guide to deploy NGINX Controller with App Security and deploy NGINX App Protect with NGINX Plus as a data plane instance for use with NGINX Controller.
-{{< caution >}}In this tutorial, NGINX Controller will install an embedded, self-hosted PostgreSQL database suitable for demo and trial purposes only. **These instructions are not meant for use in production environments**.{{< /caution >}}
+{{< call-out "caution" >}}In this tutorial, NGINX Controller will install an embedded, self-hosted PostgreSQL database suitable for demo and trial purposes only. **These instructions are not meant for use in production environments**.{{< /call-out >}}
-{{< note >}}If you already have an active NGINX Controller trial and want to add App Security to it, you can start with the [Install NGINX App Protect with NGINX Plus](#install-nginx-app-protect-with-nginx-plus) section. {{< /note >}}
+{{< call-out "note" >}}If you already have an active NGINX Controller trial and want to add App Security to it, you can start with the [Install NGINX App Protect with NGINX Plus](#install-nginx-app-protect-with-nginx-plus) section. {{< /call-out >}}
@@ -48,9 +48,9 @@ The following minimum hardware specifications are required for each node running
The App Security add-on for the NGINX Controller Application Delivery module is compatible with the versions of NGINX Plus and NGINX App Protect shown in the table below. New releases of NGINX Controller ADC support the last four versions of NGINX Plus at release time.
-{{< see-also >}}
+{{< call-out "note" >}}
Refer to [Using NGINX App Protect with NGINX Controller]({{< ref "controller/admin-guides/install/install-for-controller.md" >}}) for installation instructions and additional information.
-{{< /see-also >}}
+{{< /call-out>}}
{{< bootstrap-table "table table-striped table-bordered" >}}
@@ -85,7 +85,7 @@ Refer to [Using NGINX App Protect with NGINX Controller]({{< ref "controller/adm
## Sign Up for a Trial License
-{{< note >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /note >}}
+{{< call-out "note" >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /call-out >}}
First, you need to sign up for a trial license for NGINX Controller. The trial includes access to NGINX Plus, the NGINX Controller Application Delivery module, and the Application Security add-on.
@@ -103,7 +103,7 @@ First, you need to sign up for a trial license for NGINX Controller. The trial i
## Install NGINX Controller Prerequisites
-{{< note >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /note >}}
+{{< call-out "note" >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /call-out >}}
{{< include "controller/helper-script-prereqs.md" >}}
@@ -113,13 +113,13 @@ First, you need to sign up for a trial license for NGINX Controller. The trial i
## Install NGINX Controller
-{{< note >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /note >}}
+{{< call-out "note" >}}If you already have an active NGINX Controller trial instance that you want to add App Security to, you can skip this section.{{< /call-out >}}
Install NGINX Controller on a dedicated node that **does not** already have Kubernetes configured. NGINX Controller does not support pre-configured Kubernetes implementations at this time. The installer for NGINX Controller will install and configure Kubernetes for you.
-{{< important >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /important >}}
+{{< call-out "important" >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /call-out >}}
-{{< caution >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /caution >}}
+{{< call-out "caution" >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /call-out >}}
To install NGINX Controller, take the following steps:
@@ -143,7 +143,7 @@ To install NGINX Controller, take the following steps:
- **Config database volume type**: Specify the type of volume to use to store the config database: local, NFS, or AWS. We recommend choosing `local` for demo and trial purposes.
- {{< see-also >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /see-also >}}
+ {{< call-out "note" >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /call-out>}}
- **Analytics database volume type**: Specify the type of volume to use to store the analytics database: local, NFS, or AWS. We recommend choosing `local` for demo and trial purposes.
- **EULA**: Read the end-user license agreement. Type either `y` to accept or `n` to exit.
@@ -162,9 +162,9 @@ To install NGINX Controller, take the following steps:
Additionally, the FQDN is used by Controller Agents when connecting to NGINX Controller.
- **SSL/TLS certificates**: Type `y` to generate and use self-signed certs for running NGINX Controller over HTTPS, or type `n` to provide your own certs.
- {{< important >}}
+ {{< call-out "important" >}}
If you provide your own SSL/TLS certificates, you'll need a complete certificate chain file, with the intermediate CA cert appended to the server cert; the server certificate must appear **before** the chained certificates in the combined file.
- {{< /important >}}
+ {{< /call-out >}}
1. Log in to NGINX Controller at `https:///login`. Use the admin email address and password that you provided during the installation process.
@@ -186,9 +186,9 @@ To add a license to NGINX Controller, take the following steps:
1. Select **Save license**.
-{{< see-also >}}
+{{< call-out "note" >}}
To add a license using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PUT request to the `/platform/license` endpoint. Provide your CAT or NGINX Controller license as a base64-encoded string in the JSON request body.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -199,11 +199,11 @@ To add a license using the [NGINX Controller REST API]({{< ref "/controller/api/
[NGINX App Protect](https://www.nginx.com/products/nginx-app-protect/) is the security data plane for NGINX Controller App Security. Your NGINX App Protect installation will include NGINX Plus.
-{{< important >}}
+{{< call-out "important" >}}
If you are adding App Security to an existing NGINX Controller trial, we recommend that you take the steps in this section to deploy a new NGINX App Protect instance, rather than adding the App Protect module to an existing NGINX Plus instance.
NGINX Controller App Security is supported for use with a limited subset of the OS distributions that are supported by the NGINX Controller Agent and NGINX Plus. If you are planning to add NGINX App Protect to an existing NGINX Plus instance, be sure to check the [Supported Distributions](#supported-distributions) section above to verify that your NGINX Plus instance supports NGINX App Protect.
-{{< /important >}}
+{{< /call-out >}}
### Prerequisites
@@ -216,9 +216,9 @@ Take the steps below to download the cert and key files by using the NGINX Contr
The NGINX Controller API uses session cookies to authenticate requests. The session cookie is returned in response to a `GET /api/v1/platform/login` request. See the Login endpoint in the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}) documentation for information about session cookie timeouts and invalidation.
-{{< tip >}}
+{{< call-out "tip" >}}
You can send a GET request to the login endpoint to find the status of the session token.
-{{< /tip >}}
+{{< /call-out >}}
For example:
@@ -253,9 +253,9 @@ For example:
curl -b cookie.txt -c cookie.txt -X GET --url 'https://192.0.2.0/api/v1/platform/licenses/nginx-plus-licenses/controller-provided' --output nginx-plus-certs.gz
```
-{{< note >}}
+{{< call-out "note" >}}
If you are using a self-signed certificate you will need to add `-k` (allow insecure connections) to your curl command to be able to download your NGINX Plus certificate and key bundle.
-{{< /note >}}
+{{< /call-out >}}
Once you have downloaded your certificate and key bundle you will need to expand the `.gz` file to get your certificate and key pair.
@@ -272,10 +272,10 @@ gunzip nginx-plus-certs.gz
Install NGINX App Protect on a host accessible by your NGINX Controller instance by following the appropriate steps for your operating system in the [Using NGINX App Protect with NGINX Controller]({{< ref "controller/admin-guides/install/install-for-controller.md" >}}) guide.
-{{< note >}}
+{{< call-out "note" >}}
If you install NGINX App Protect by using any of the OS-specific install guides, **do not make changes to the `nginx.conf` file**.
The NGINX Controller Agent manages `nginx.conf` settings and will make the appropriate adjustments for you.
-{{< /note >}}
+{{< /call-out >}}
diff --git a/content/controller/admin-guides/install/try-nginx-controller.md b/content/controller/admin-guides/install/try-nginx-controller.md
index dd2883d56..e77bf343f 100644
--- a/content/controller/admin-guides/install/try-nginx-controller.md
+++ b/content/controller/admin-guides/install/try-nginx-controller.md
@@ -13,9 +13,9 @@ type:
This quick-start tutorial shows you how to get started using F5 NGINX Controller with NGINX Plus.
-{{< caution >}}In this tutorial, NGINX Controller will install an embedded, self-hosted PostgreSQL database suitable for demo and trial purposes only. **These instructions are not meant for use in production environments**.{{< /caution >}}
+{{< call-out "caution" >}}In this tutorial, NGINX Controller will install an embedded, self-hosted PostgreSQL database suitable for demo and trial purposes only. **These instructions are not meant for use in production environments**.{{< /call-out >}}
-{{< see-also >}}If you want to try out NGINX Controller with the Application Security add-on, refer to [Trial NGINX Controller with App Security]({{< ref "/controller/admin-guides/install/try-nginx-controller-app-sec.md" >}}).{{< /see-also >}}
+{{< call-out "note" >}}If you want to try out NGINX Controller with the Application Security add-on, refer to [Trial NGINX Controller with App Security]({{< ref "/controller/admin-guides/install/try-nginx-controller-app-sec.md" >}}).{{< /call-out>}}
@@ -29,7 +29,7 @@ Make sure to review the [NGINX Controller Technical Specifications Guide]({{< re
NGINX Controller, the NGINX Controller Agent, and the NGINX Controller Application Security Add-on support the following distributions and architectures.
-{{< see-also >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /see-also >}}
+{{< call-out "note" >}}Refer to the [NGINX Plus Technical Specifications](https://docs.nginx.com/nginx/technical-specs/) guide for the distributions that NGINX Plus supports.{{< /call-out>}}
{{< bootstrap-table "table table-striped table-bordered" >}}
@@ -116,9 +116,9 @@ First, you need to sign up for a trial license for NGINX Controller. The trial i
Install NGINX Controller on a dedicated node that **does not** already have Kubernetes configured. NGINX Controller does not support pre-configured Kubernetes implementations at this time. The installer for NGINX Controller will install and configure Kubernetes for you.
-{{< important >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /important >}}
+{{< call-out "important" >}}Before installing NGINX Controller, you must **disable swap on the host**; this is required by Kubernetes in order for the kubelet to work properly. Refer to your Linux distribution documentation for specific instructions for disabling swap for your system. For more information about this requirement, see the AskF5 knowledge base article [K82655201](https://support.f5.com/csp/article/K82655201) and the [kubeadm installation guide](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin) in the Kubernetes documentation.{{< /call-out >}}
-{{< caution >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /caution >}}
+{{< call-out "caution" >}}**For RHEL 8 deployments**, complete the additional prerequisite steps in the [Installing NGINX on RHEL 8]({{< ref "/controller/admin-guides/install/install-nginx-controller-rhel-8.md" >}}) guide before installing NGINX Controller. RHEL 8 support is a **beta** feature.{{< /call-out >}}
To install NGINX Controller, take the following steps:
@@ -142,7 +142,7 @@ To install NGINX Controller, take the following steps:
- **Config database volume type**: Specify the type of volume to use to store the config database: local, NFS, or AWS. We recommend choosing `local` for demo and trial purposes.
- {{< see-also >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /see-also >}}
+ {{< call-out "note" >}}Refer to the [NGINX Controller Technical Specifications Guide]({{< ref "/controller/admin-guides/install/nginx-controller-tech-specs.md#local-or-external-storage" >}}) for more information about the volume options and requirements.{{< /call-out>}}
- **Analytics database volume type**: Specify the type of volume to use to store the analytics database: local, NFS, or AWS. We recommend choosing `local` for demo and trial purposes.
- **EULA**: Read the end-user license agreement. Type either `y` to accept or `n` to exit.
@@ -161,9 +161,9 @@ To install NGINX Controller, take the following steps:
Additionally, the FQDN is used by Controller Agents when connecting to NGINX Controller.
- **SSL/TLS certificates**: Type `y` to generate and use self-signed certs for running NGINX Controller over HTTPS, or type `n` to provide your own certs.
- {{< important >}}
+ {{< call-out "important" >}}
If you provide your own SSL/TLS certificates, you'll need a complete certificate chain file, with the intermediate CA cert appended to the server cert; the server certificate must appear **before** the chained certificates in the combined file.
- {{< /important >}}
+ {{< /call-out >}}
1. Log in to NGINX Controller at `https:///login`. Use the admin email address and password that you provided during the installation process.
@@ -185,9 +185,9 @@ To add a license to NGINX Controller, take the following steps:
1. Select **Save license**.
-{{< see-also >}}
+{{< call-out "note" >}}
To add a license using the [NGINX Controller REST API]({{< ref "/controller/api/_index.md" >}}), send a PUT request to the `/platform/license` endpoint. Provide your CAT or NGINX Controller license as a base64-encoded string in the JSON request body.
-{{< /see-also >}}
+{{< /call-out>}}
@@ -205,9 +205,9 @@ To add a license using the [NGINX Controller REST API]({{< ref "/controller/api/
The NGINX Controller API uses session cookies to authenticate requests. The session cookie is returned in response to a `GET /api/v1/platform/login` request. See the Login endpoint in the [NGINX Controller API Reference]({{< ref "/controller/api/_index.md" >}}) documentation for information about session cookie timeouts and invalidation.
-{{< tip >}}
+{{< call-out "tip" >}}
You can send a GET request to the login endpoint to find the status of the session token.
-{{< /tip >}}
+{{< /call-out >}}
For example:
@@ -242,9 +242,9 @@ For example:
curl -b cookie.txt -c cookie.txt -X GET --url 'https://192.0.2.0/api/v1/platform/licenses/nginx-plus-licenses/controller-provided' --output nginx-plus-certs.gz
```
-{{< note >}}
+{{< call-out "note" >}}
If you are using a self-signed certificate you will need to add `-k` (allow insecure connections) to your curl command to be able to download your NGINX Plus certificate and key bundle.
-{{< /note >}}
+{{< /call-out >}}
Once you have downloaded your certificate and key bundle you will need to expand the `.gz` file to get your certificate and key pair.
@@ -259,9 +259,9 @@ gunzip nginx-plus-certs.gz
Take the following steps to install NGINX Plus:
-{{< important >}}
+{{< call-out "important" >}}
You need the NGINX Plus certificate and public key files (`nginx-repo.crt` and `nginx-repo.key`) that were provided when you signed up for the trial license.
-{{< /important >}}
+{{< /call-out >}}
1. First, make sure to review the [NGINX Plus Technical Specifications Guide](https://docs.nginx.com/nginx/technical-specs/) for the requirements for your distribution and desired configuration.
2. To install NGINX Plus, follow the instructions in the [NGINX Plus Installation Guide](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/). Refer to the relevant section for your distribution.
diff --git a/content/controller/admin-guides/install/using-helper-script.md b/content/controller/admin-guides/install/using-helper-script.md
index 382332f63..830602bb7 100644
--- a/content/controller/admin-guides/install/using-helper-script.md
+++ b/content/controller/admin-guides/install/using-helper-script.md
@@ -104,7 +104,7 @@ After installing NGINX Controller, you should back up the cluster config and enc
This section explains how to restore the embedded config database from the latest backup file or a specific, timestamped file.
-{{< important >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /important >}}
+{{< call-out "important" >}}If you restore the config database on top of a new installation of NGINX Controller, make sure to follow the steps to [restore your NGINX config and encryption keys]({{< ref "/controller/admin-guides/backup-restore/backup-restore-cluster-config.md" >}}) afterward. {{< /call-out >}}
- To restore the embedded NGINX Controller config database **from the latest automated backup**, run the following command:
@@ -134,7 +134,7 @@ To install NGINX Plus as a data plane for NGINX Controller, you need to have the
{{< deprecated >}}Using the helper.sh script to download your NGINX Plus certificate and key bundle is deprecated in in NGINX Controller v3.9.{{< /deprecated >}}
-{{< see-also >}}If you're running NGINX Controller v3.10+, you can use the REST API to [Download the NGINX Plus Cert and Key Bundle]({{< ref "/controller/admin-guides/install/get-n-plus-cert-and-key.md" >}}). {{< /see-also >}}
+{{< call-out "note" >}}If you're running NGINX Controller v3.10+, you can use the REST API to [Download the NGINX Plus Cert and Key Bundle]({{< ref "/controller/admin-guides/install/get-n-plus-cert-and-key.md" >}}). {{< /call-out>}}
If you're running NGINX Controller 3.9 or earlier, use the `helper.sh` script to extract the NGINX repository key and certificate files:
@@ -142,11 +142,11 @@ If you're running NGINX Controller 3.9 or earlier, use the `helper.sh` script to
/opt/nginx-controller/helper.sh repository-cred [-c|--cert ] [-k|--key ]
```
-{{< important >}}
+{{< call-out "important" >}}
Make sure that you've [uploaded your license in NGINX Controller]({{< ref "licensing-controller.md" >}}) first before running the `helper.sh repository-cred` command to extract the repository files.
-{{< /important >}}
+{{< /call-out >}}
\ No newline at end of file
diff --git a/layouts/shortcodes/version-ngf.html b/layouts/shortcodes/version-ngf.html
index f93ea0ca3..7c3272873 100644
--- a/layouts/shortcodes/version-ngf.html
+++ b/layouts/shortcodes/version-ngf.html
@@ -1 +1 @@
-2.0.2
\ No newline at end of file
+2.1.1
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index df8cfa951..6e464f1ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,12 +8,10 @@
"name": "documentation",
"version": "1.0.0",
"dependencies": {
- "axios": "^1.8.2",
"lighthouse": "^12.2.2",
"puppeteer": "^23.8.0"
},
"devDependencies": {
- "@playwright/test": "^1.48.0",
"hugo-bin": "^0.111.3"
}
},
@@ -96,22 +94,6 @@
"integrity": "sha512-KxWFdRNbv13U8bhYaQvH6gLG9CVEt2jKeosyOOYILVntWEVWhovbgDrbOiZ12pJO3vjZs0Zgbd3/Zgde98woEA==",
"license": "BSD-3-Clause"
},
- "node_modules/@playwright/test": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz",
- "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright": "1.48.0"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@puppeteer/browsers": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz",
@@ -488,11 +470,6 @@
"node": ">=4"
}
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
"node_modules/axe-core": {
"version": "4.10.2",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
@@ -502,17 +479,6 @@
"node": ">=4"
}
},
- "node_modules/axios": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
- "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
"node_modules/b4a": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
@@ -794,17 +760,6 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -1004,14 +959,6 @@
"node": ">= 14"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/devtools-protocol": {
"version": "0.0.1367902",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
@@ -1335,38 +1282,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/form-data-encoder": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
@@ -1390,21 +1305,6 @@
"node": ">=14.14"
}
},
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -2056,17 +1956,7 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
+ "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -2381,38 +2271,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/playwright": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz",
- "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright-core": "1.48.0"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "fsevents": "2.3.2"
- }
- },
- "node_modules/playwright-core": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz",
- "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "playwright-core": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
diff --git a/package.json b/package.json
index 6ef73422f..240394886 100644
--- a/package.json
+++ b/package.json
@@ -10,11 +10,9 @@
"buildTags": "extended"
},
"devDependencies": {
- "@playwright/test": "^1.48.0",
"hugo-bin": "^0.111.3"
},
"dependencies": {
- "axios": "^1.8.2",
"lighthouse": "^12.2.2",
"puppeteer": "^23.8.0"
}
diff --git a/playwright.config.ts b/playwright.config.ts
deleted file mode 100644
index 0a6065adb..000000000
--- a/playwright.config.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineConfig, devices } from '@playwright/test';
-
-export default defineConfig({
- testDir: 'tests',
- fullyParallel: true,
- workers: 1,
- outputDir: 'tests/test-results',
- reporter: [['html', { outputFolder: 'tests/playwright-report' }]],
- projects: [
- {
- name: 'chromium',
- use: { ...devices['Desktop Chrome'] },
- },
- {
- name: 'firefox',
- use: { ...devices['Desktop Firefox'] },
- },
- {
- name: 'webkit',
- use: { ...devices['Desktop Safari'] },
- },
- {
- name: 'Mobile Chrome',
- use: { ...devices['Pixel 5'] },
- },
- ],
- use: {
- // Base URL to use in actions like `await page.goto('/')`.
- baseURL: 'https://docs.nginx.com',
- // Set Geolocation to Cork, Ireland
- geolocation: { longitude: -8.486316, latitude: 51.896893 },
- permissions: ['geolocation'],
- video: 'retain-on-failure'
- },
-})
\ No newline at end of file
diff --git a/static/ngf/img/src/README.md b/static/ngf/img/src/README.md
deleted file mode 100644
index 02c93c4d4..000000000
--- a/static/ngf/img/src/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Diagram Source Files
-
-This directory contains the source files for the diagrams used in the docs. Source files are named after the image name.
diff --git a/static/ngf/img/src/advanced-routing.mermaid b/static/ngf/img/src/advanced-routing.mermaid
deleted file mode 100644
index dda2c7888..000000000
--- a/static/ngf/img/src/advanced-routing.mermaid
+++ /dev/null
@@ -1,38 +0,0 @@
-%% mermaid source for advanced-routing.png diagram
-graph LR
- users[Users]
- ngfSvc["Public Endpoint\nfor\ncafe.example.com"]
- subgraph cluster [Kubernetes Cluster]
- subgraph clusterPadding [" "]
- subgraph clusterPadding2 [" "]
- subgraph gwNS [Namespace\nnginx-gateway]
- ngfPod[Pod\nnginx-gateway]
- end
- end
- end
- subgraph appNs [Namespace\ndefault]
- subgraph nsPadding [" "]
- coffeeV1Pod[Pod\ncoffee v1]
- coffeeV2Pod[Pod\ncoffee v2]
- teaPod[Pod\ntea]
- teaPostPod[Pod\ntea-post]
- end
- end
- end
- ngfSvc --> ngfPod
- ngfPod --/coffee--> coffeeV1Pod
- ngfPod --/coffee\nheader: version=v2\nOR\n/coffee?TEST=v2--> coffeeV2Pod
- ngfPod --GET /tea--> teaPod
- ngfPod --POST /tea--> teaPostPod
- users --> ngfSvc
- class clusterPadding,nsPadding,clusterPadding2 noBorder
- class gwNS,appNs namespace
- class ngfSvc,ngfPod nginxNode
- class coffeeV1Pod,coffeeV2Pod coffeeNode
- class teaPod,teaPostPod teaNode
- classDef noBorder stroke:none,fill:none
- classDef default fill:#FFFFFF,stroke:#000000
- classDef namespace fill:#FFFFFF,stroke:#036ffc,stroke-dasharray: 5 5,text-align:center
- classDef nginxNode fill:#b4e0ad,stroke:#2AA317
- classDef coffeeNode fill:#edbd8c,stroke:#D9822B
- classDef teaNode fill:#ff8f6a,stroke:#e5805f
diff --git a/static/ngf/img/src/route-all-traffic-app.mermaid b/static/ngf/img/src/route-all-traffic-app.mermaid
deleted file mode 100644
index bc2d4d706..000000000
--- a/static/ngf/img/src/route-all-traffic-app.mermaid
+++ /dev/null
@@ -1,13 +0,0 @@
-%% mermaid source for route-all-traffic-app.png diagram
-graph TB
- subgraph cluster [Kubernetes Cluster]
- style cluster fill:#FFFFFF,stroke:#000000
- svc[Service\ncoffee]
- pod1[Pod\ncoffee]
- pod2[Pod\ncoffee]
- end
-
- svc --> pod1 & pod2
-
- class pod1,pod2,svc appNode
- classDef appNode fill:#edbd8c,stroke:#D9822B
diff --git a/static/ngf/img/src/route-all-traffic-config.mermaid b/static/ngf/img/src/route-all-traffic-config.mermaid
deleted file mode 100644
index d2e0a4ffc..000000000
--- a/static/ngf/img/src/route-all-traffic-config.mermaid
+++ /dev/null
@@ -1,42 +0,0 @@
-%% mermaid source for route-all-traffic-config.png diagram
-graph LR
- subgraph config [Namespace default]
- subgraph padding [" "]
- direction LR
- style config fill:#FFFFFF,stroke:#000000
- subgraph gw[Gateway cafe]
- subgraph gwPadding [" "]
- gwContents[HTTP/80]
- end
- end
- subgraph hr[HTTPRoute coffee]
- subgraph hrPadding [" "]
- hrContents[cafe.example.com]
- subgraph describeMatchAll [Match all\ntraffic]
- subgraph describeMatchPadding [" "]
- matchAll[Host: *\nPath: *]
- end
- end
- subgraph describeService [Group matching\npods within a Service]
- subgraph describePadding [" "]
- coffeeSvc[Service\ncoffee]
- end
- end
- end
- end
- end
- end
-
- gwContents --> hrContents --> matchAll --> coffeeSvc
- class padding,gwPadding,hrPadding,describeMatchAll,describeService,describePadding,describeMatchPadding noBorder
- class gw gateway
- class hr httpRoute
- class matchAll,hrContents,coffeeSvc appDevNode
- class gwContents clusterOppNode
-
- classDef noBorder stroke:none,fill:none,text-align:center
- classDef default fill:#FFFFFF,stroke:#000000
- classDef gateway fill:#FFFFFF,stroke:#2AA317,stroke-dasharray: 3 3,text-align:center
- classDef httpRoute fill:#FFFFFF,stroke:#D9822B,stroke-dasharray: 3 3,text-align:center
- classDef appDevNode fill:#edbd8c,stroke:#D9822B
- classDef clusterOppNode fill:#b4e0ad,stroke:#2AA317
diff --git a/static/ngf/img/src/route-all-traffic-flow.mermaid b/static/ngf/img/src/route-all-traffic-flow.mermaid
deleted file mode 100644
index f53d35ae5..000000000
--- a/static/ngf/img/src/route-all-traffic-flow.mermaid
+++ /dev/null
@@ -1,42 +0,0 @@
-%% mermaid source for route-all-traffic-flow.png diagram
-graph LR
- clients[Clients]
- ngfSvc["Public IP Address\nfor\ncafe.example.com"]
-
- subgraph cluster [Kubernetes Cluster]
- style cluster fill:#FFFFFF,stroke:#000000
- subgraph clusterPadding [" "]
- subgraph clusterPadding2 [" "]
- subgraph gwNS [Namespace\nnginx-gateway]
- ngfPod[Pod\nnginx-gateway]
- end
- end
- end
-
- subgraph appNs [Namespace\ndefault]
- subgraph nsPadding [" "]
- coffeePod1[Pod\ncoffee]
- coffeePod2[Pod\ncoffee]
- end
- end
- end
-
-
-
- ngfSvc --> ngfPod
- ngfPod --> coffeePod1 & coffeePod2
- clients --> ngfSvc
-
- class clusterPadding,nsPadding,clusterPadding2 noBorder
- class gwNS,appNs namespace
- class ngfPod,ngfSvc nginxNode
- class coffeePod1,coffeePod2 coffeeNode
- class clients clientNode
-
-
- classDef noBorder stroke:none,fill:none
- classDef default fill:#FFFFFF,stroke:#000000
- classDef namespace fill:#FFFFFF,stroke:#036ffc,stroke-dasharray: 5 5,text-align:center
- classDef nginxNode fill:#b4e0ad,stroke:#2AA317
- classDef coffeeNode fill:#edbd8c,stroke:#D9822B
- classDef clientNode fill:#D3D3D3
diff --git a/static/nginx-one/api/one.json b/static/nginx-one/api/one.json
index 3dcfbf8f4..00154c9a0 100644
--- a/static/nginx-one/api/one.json
+++ b/static/nginx-one/api/one.json
@@ -53,8 +53,14 @@
},
{
"name": "Staged Configs",
+ "description": "The `StagedConfigs` object represents a NGINX staged config which users can save to publish at a later time.\n",
"x-displayName": "Staged Configs"
},
+ {
+ "name": "Control Planes",
+ "description": "The `Control Planes` object represents an external control plane such as NGINX Ingress Controller or NGINX Gateway Fabric.\nFrom this endpoint, you can get detailed information about each control plane, including its NGINX instances, configurations, security advisories, and operational status.\n",
+ "x-displayName": "Control Planes"
+ },
{
"name": "Metrics",
"x-displayName": "Metrics"
@@ -63,6 +69,11 @@
"name": "Settings",
"description": "Configuration option for different aspect of NGINX One service.\nYou can set NGINX Instance cleanup preferences.\n",
"x-displayName": "Settings"
+ },
+ {
+ "name": "NGINX App Protect",
+ "description": "Manage and publish security policies on your NGINX data plane instances.\n",
+ "x-displayName": "NGINX App Protect"
}
],
"paths": {
@@ -1197,6 +1208,11 @@
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigSyncGroupDetails"
+ },
+ "examples": {
+ "ConfigSyncGroupDetails": {
+ "$ref": "#/components/examples/ConfigSyncGroupDetails"
+ }
}
}
}
@@ -1720,7 +1736,7 @@
"Config Sync Groups"
],
"summary": "Retrieves stored NGINX configurations for a NGINX config sync group",
- "description": "Returns a list of all configurations for a NGINX config sync group. Only the last 5 are kept on the NGINX One Console for a NGINX config sync group.",
+ "description": "Returns a list of all configurations for a NGINX config sync group. Only the last 10 are kept on the NGINX One Console for a NGINX config sync group.",
"operationId": "listConfigSyncGroupConfigurations",
"responses": {
"200": {
@@ -1894,14 +1910,156 @@
}
]
},
+ "/control-planes": {
+ "get": {
+ "tags": [
+ "Control Planes"
+ ],
+ "summary": "List control planes",
+ "operationId": "listControlPlanes",
+ "description": "Returns a paginated list of control planes.\n",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Paginated"
+ },
+ {
+ "$ref": "#/components/parameters/Limit"
+ },
+ {
+ "$ref": "#/components/parameters/Offset"
+ },
+ {
+ "$ref": "#/components/parameters/SortDirection"
+ },
+ {
+ "$ref": "#/components/parameters/SortNameControlPlanes"
+ },
+ {
+ "$ref": "#/components/parameters/FilterOperands"
+ },
+ {
+ "$ref": "#/components/parameters/FilterValues"
+ },
+ {
+ "$ref": "#/components/parameters/FilterFieldControlPlanes"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully retrieved the list of control planes.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ControlPlaneListResponse"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#/components/responses/Unauthorized"
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
+ }
+ }
+ }
+ },
+ "/control-planes/{controlPlaneObjectID}": {
+ "delete": {
+ "x-nginx-one-action": "delete",
+ "x-nginx-one-entity": "Control Plane",
+ "tags": [
+ "Control Planes"
+ ],
+ "summary": "Delete a control plane",
+ "description": "Delete a control plane from the NGINX One Console. You can delete a control plane, only if it contains no NGINX instances.\n",
+ "operationId": "deleteControlPlane",
+ "responses": {
+ "204": {
+ "description": "Successfully deleted the control plane"
+ },
+ "401": {
+ "$ref": "#/components/responses/Unauthorized"
+ },
+ "404": {
+ "$ref": "#/components/responses/NotFound"
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "Control Planes"
+ ],
+ "summary": "Retrieve a control plane",
+ "description": "Retrieve the details for a control plane, including:\n* Object ID\n* Product name and version\n* Cluster UUID\n* Kubernetes namespace\n* Deployment UUID\n* Data plane key\n* Certificate summary referenced by control plane instances\n* Instance status summary\n",
+ "operationId": "getControlPlane",
+ "responses": {
+ "200": {
+ "description": "Successfully retrieved the details of the control plane.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ControlPlaneDetails"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#/components/responses/Unauthorized"
+ },
+ "404": {
+ "$ref": "#/components/responses/NotFound"
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
+ }
+ }
+ },
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/ControlPlaneParamObjectID"
+ }
+ ]
+ },
+ "/control-planes/summary": {
+ "get": {
+ "tags": [
+ "Control Planes"
+ ],
+ "summary": "Retrieve a summary for all Control Planes.",
+ "description": "Retrieves details for all control planes, including:\n * Number of control planes for each product name/version\n",
+ "operationId": "getControlPlaneSummary",
+ "responses": {
+ "200": {
+ "description": "Successfully retrieved the summary of control planes.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ControlPlaneSummary"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#/components/responses/Unauthorized"
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
+ }
+ }
+ }
+ },
"/cves": {
"get": {
"tags": [
"CVEs"
],
- "summary": "List of all CVEs affecting the instances",
+ "summary": "List of all CVEs affecting any instance or control plane",
"operationId": "listNginxCVEs",
- "description": "Returns a list of all CVEs that affect at least one instance under the tenant\n",
+ "description": "Returns a list of all CVEs that affect an instance or control plane under the tenant\n",
"parameters": [
{
"$ref": "#/components/parameters/Paginated"
@@ -2040,7 +2198,7 @@
],
"responses": {
"200": {
- "description": "Successfully retrieved the list of instances affected by the CVE",
+ "description": "Successfully retrieved the list of instances affected by the CVE.",
"content": {
"application/json": {
"schema": {
@@ -2377,7 +2535,7 @@
"Instances"
],
"summary": "Retrieve an instance",
- "description": "Retrieves the details for an NGINX instance, including\n* Hostname\n* System status\n* Timestamps of key actions (registration, last reported, etc.)\n* NGINX build information\n* Certificate data\n* Operating system version\n* NGINX Agent version\n* Config Sync Group membership details\n",
+ "description": "Retrieves the details for an NGINX instance, including\n* Hostname\n* System status\n* Timestamps of key actions (registration, last reported, etc.)\n* NGINX build information\n* Certificate data\n* Operating system version\n* NGINX Agent version\n* Config Sync Group membership details\n* Control plane object ID, name, product and version\n",
"operationId": "getInstance",
"parameters": [
{
@@ -2829,7 +2987,7 @@
"Instances"
],
"summary": "Retrieves the stored NGINX configurations for an instance",
- "description": "Returns a list of all configurations for a NGINX instance. Only the last 5 are kept on the NGINX One Console for a NGINX instance.",
+ "description": "Returns a list of all configurations for a NGINX instance. Only the last 10 are kept on the NGINX One Console for a NGINX instance.",
"operationId": "listInstanceConfigurations",
"responses": {
"200": {
@@ -3223,59 +3381,6 @@
}
}
},
- "patch": {
- "x-nginx-one-action": "bulk",
- "x-nginx-one-entity": "NGINX staged configs",
- "x-feature-flag": "staged-configs-phase-2",
- "tags": [
- "Staged Configs"
- ],
- "summary": "Bulk operation on multiple staged configs",
- "operationId": "bulkStagedConfigs",
- "description": "Performs bulk operation on one or more staged configs, only delete is supported.",
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/StagedConfigBulkRequest"
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Batch request completed.",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/StagedConfigBulkResponse"
- }
- }
- }
- },
- "401": {
- "description": "Access denied.",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Error"
- }
- }
- }
- },
- "500": {
- "description": "An unexpected error occurred on the server. Please try the request again later.",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Error"
- }
- }
- }
- }
- }
- },
"post": {
"x-feature-flag": "staged-configs",
"x-nginx-one-action": "create",
@@ -3782,37 +3887,49 @@
}
}
},
- "/staged-configs/{stagedConfigObjectID}/export": {
- "get": {
- "parameters": [
- {
- "$ref": "#/components/parameters/StagedConfigParamObjectID"
- }
- ],
+ "/monitor/metrics_query_topx": {
+ "post": {
"tags": [
- "Staged Configs"
+ "Metrics"
],
- "x-feature-flag": "staged-configs-phase-2",
- "x-nginx-one-action": "export",
- "x-nginx-one-entity": "NGINX staged config",
- "summary": "Export staged configuration",
- "description": "Exports staged configuration as a gzipped tar archive. Does not include sensitive data such as SSL certificates. [Learn more](https://docs.nginx.com/nginx-one/how-to/staged-configs/import-export-staged-config/).\n",
- "operationId": "exportStagedConfig",
+ "summary": "Retrieve system metrics for instances with series limit",
+ "operationId": "queryMetricsInputTopX",
+ "description": "Returns (up to 10,000) system metrics for NGINX instances with series limit based on query parameters.\n\nYou can filter metrics by name and timestamp, aggregate metrics over a configurable period of time, and group metrics by dimension.\n",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/MetricTopXQueryRequest"
+ },
+ "example": {
+ "start_time": "now-1h",
+ "end_time": "now",
+ "resolution": "1m",
+ "metrics": [
+ {
+ "aggregate": "sum",
+ "name": "nginx.http.request.count"
+ }
+ ],
+ "series_limit": 1,
+ "group_series_by": "instance_object_id"
+ }
+ }
+ }
+ },
"responses": {
"200": {
- "description": "Successfully exported the staged configuration.",
+ "description": "Successfully retrieved system metrics.",
"content": {
- "application/gzip": {
+ "application/json": {
"schema": {
- "type": "string",
- "format": "binary",
- "example": "my-staged-config-2025-01-01T20_25_03.tar.gz"
+ "$ref": "#/components/schemas/MetricQueryResultEx"
}
}
}
},
- "401": {
- "description": "Access denied",
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
"content": {
"application/json": {
"schema": {
@@ -3822,7 +3939,7 @@
}
},
"404": {
- "description": "The NGINX staged config with the specified object_id was not found. Check that the object_id provided is correct and corresponds to an existing resource.",
+ "description": "The requested metric resource was not found. Check that the resource name provided is correct and corresponds to an existing resource.",
"content": {
"application/json": {
"schema": {
@@ -3844,54 +3961,657 @@
}
}
},
- "/staged-configs/import": {
- "post": {
+ "/settings/instance-cleanup": {
+ "get": {
"tags": [
- "Staged Configs"
+ "Settings"
],
- "x-feature-flag": "staged-configs-phase-2",
- "x-nginx-one-action": "import",
- "x-nginx-one-entity": "NGINX staged config",
- "summary": "Import staged configuration\n",
- "description": "Imports a gzipped tar archive (.tar.gz) containing configuration and aux files into NGINX One. \nOnly non-hidden files are included in the import.\n\nMaximum compressed archive size: **5 MB**\nMaximum uncompressed individual file size: **10 MB**\n\nIf `parse_only` is set to `true`, the configuration is only validated and not staged.\nBy default, validation is performed and a staged configuration is created upon success.\n",
- "parameters": [
- {
- "$ref": "#/components/parameters/StagedConfigImportParseOnly"
+ "summary": "Retrieve settings",
+ "description": "Retrieves settings for NGINX Instance cleanup\n",
+ "operationId": "getSettingInstanceCleanup",
+ "responses": {
+ "200": {
+ "description": "Successfully retrieved the setting for NGINX Instance cleanup.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SettingsInstanceCleanup"
+ }
+ }
+ }
+ },
+ "400": {
+ "$ref": "#/components/responses/InvalidRequest"
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
}
+ }
+ },
+ "put": {
+ "x-nginx-one-action": "update",
+ "x-nginx-one-entity": "NGINX Instance Cleanup Setting",
+ "tags": [
+ "Settings"
],
- "operationId": "importStagedConfig",
+ "summary": "Update settings",
+ "description": "Update settings for NGINX Instance cleanup\n",
+ "operationId": "updateSettingInstanceCleanup",
"requestBody": {
"required": true,
"content": {
- "multipart/form-data": {
+ "application/json": {
"schema": {
- "$ref": "#/components/schemas/StagedConfigImportRequest"
- },
- "encoding": {
- "file": {
- "contentType": "application/gzip, application/x-gzip"
- }
+ "$ref": "#/components/schemas/SettingsInstanceCleanup"
}
}
}
},
"responses": {
"200": {
- "description": "Return if `parse_only` is `true`: Returns data matching `StagedConfigCreateRequest` that can be used to create the staged config later. \n",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/StagedConfigCreateRequest"
- }
- }
- }
- },
- "201": {
- "description": "Return if `parse_only` is `false` or omitted: Confirms the import parsed successfully and the staged config was created.\n",
+ "description": "Successfully updated settings for NGINX Instance cleanup.",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/StagedConfigCreateResponse"
+ "$ref": "#/components/schemas/SettingsInstanceCleanup"
+ }
+ }
+ }
+ },
+ "500": {
+ "$ref": "#/components/responses/InternalServerErr"
+ }
+ }
+ }
+ },
+ "/app-protect/policies": {
+ "get": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "List NGINX App Protect policies",
+ "description": "Returns a list of NGINX App Protect policies along with deployment details.",
+ "operationId": "listNapPolicies",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/Paginated"
+ },
+ {
+ "$ref": "#/components/parameters/Limit"
+ },
+ {
+ "$ref": "#/components/parameters/Offset"
+ },
+ {
+ "$ref": "#/components/parameters/SortDirection"
+ },
+ {
+ "$ref": "#/components/parameters/SortNameNapPolicies"
+ },
+ {
+ "$ref": "#/components/parameters/FilterOperands"
+ },
+ {
+ "$ref": "#/components/parameters/FilterValues"
+ },
+ {
+ "$ref": "#/components/parameters/FilterFieldNapPolicy"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returned NGINX App Protect policies.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyListResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "x-nginx-one-action": "bulk",
+ "x-nginx-one-entity": "NGINX App Protect Policies",
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "Bulk operation on multiple Nap policy",
+ "operationId": "bulkNAPPolicy",
+ "description": "Performs bulk operation on one or more Nap policy, only delete is supported.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyBulkRequest"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Batch request completed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapBulkResponse"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "x-nginx-one-action": "create",
+ "x-nginx-one-entity": "NGINX App Protect Policies",
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "Create NGINX App Protect policy",
+ "description": "Creates NGINX App Protect policy.",
+ "operationId": "createNapPolicy",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicy"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Successfully created NGINX App Protect policy.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyMetadata"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/app-protect/policies/{nap_policy_object_id}": {
+ "delete": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "x-nginx-one-action": "delete",
+ "x-nginx-one-entity": "NGINX App Protect Policies",
+ "summary": "Delete NGINX App Protect policy",
+ "description": "Deletes NGINX App Protect policy.",
+ "operationId": "deleteNapPolicy",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Successfully deleted NGINX App Protect policy."
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "Get NGINX App Protect policy details",
+ "description": "Returns NGINX App Protect policy summary.",
+ "operationId": "getNapPolicy",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returned NGINX App Protect policy details.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyObject"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "x-nginx-one-action": "update",
+ "x-nginx-one-entity": "NGINX App Protect Policies",
+ "summary": "Update NGINX App Protect policy details",
+ "description": "Update NGINX App Protect policy details.",
+ "operationId": "updateNapPolicy",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicy"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Successfully created an NGINX App Protect policy version.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyMetadata"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/app-protect/policies/{nap_policy_object_id}/deployments": {
+ "get": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "List NGINX App Protect deployments",
+ "description": "Returns NGINX App Protect deployments, providing details such as:\n * Target of the deployment\n * Time of deployment\n * Enforcement mode\n * Policy version\n * Threat campaign\n * Attack signature\n * Bot signature\n",
+ "operationId": "listNapPolicyDeployments",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ },
+ {
+ "$ref": "#/components/parameters/Paginated"
+ },
+ {
+ "$ref": "#/components/parameters/Limit"
+ },
+ {
+ "$ref": "#/components/parameters/Offset"
+ },
+ {
+ "$ref": "#/components/parameters/SortDirection"
+ },
+ {
+ "$ref": "#/components/parameters/SortNameNapPolicyDeployments"
+ },
+ {
+ "$ref": "#/components/parameters/FilterOperands"
+ },
+ {
+ "$ref": "#/components/parameters/FilterValues"
+ },
+ {
+ "$ref": "#/components/parameters/FilterFieldNapPolicyDeployment"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returned NGINX App Protect deployments.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyDeploymentsListResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/app-protect/policies/{nap_policy_object_id}/version": {
+ "get": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "Get the latest NGINX App Protect policy version details",
+ "description": "Returns the latest NGINX App Protect policy version details.",
+ "operationId": "getLatestNapPolicyVersion",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returned NGINX App Protect policy version details.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyVersionDetails"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy version with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/app-protect/policies/{nap_policy_object_id}/versions": {
+ "get": {
+ "tags": [
+ "NGINX App Protect"
+ ],
+ "summary": "List NGINX App Protect policy versions",
+ "description": "Returns NGINX App Protect policy versions.",
+ "operationId": "listNapPolicyVersions",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ },
+ {
+ "$ref": "#/components/parameters/Paginated"
+ },
+ {
+ "$ref": "#/components/parameters/Limit"
+ },
+ {
+ "$ref": "#/components/parameters/Offset"
+ },
+ {
+ "$ref": "#/components/parameters/SortDirection"
+ },
+ {
+ "$ref": "#/components/parameters/SortNameNapPolicyVersions"
+ },
+ {
+ "$ref": "#/components/parameters/FilterOperands"
+ },
+ {
+ "$ref": "#/components/parameters/FilterValues"
+ },
+ {
+ "$ref": "#/components/parameters/FilterFieldNapPolicyVersion"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returned the NGINX App Protect policy versions.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyVersionsListResponse"
}
}
}
@@ -3907,7 +4627,17 @@
}
},
"401": {
- "description": "Access denied",
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The NGINX App Protect policy with the specified nap_policy_object_id was not found. Check that the nap_policy_object_id provided is correct and corresponds to an existing resource.",
"content": {
"application/json": {
"schema": {
@@ -3929,49 +4659,30 @@
}
}
},
- "/monitor/metrics_query_topx": {
- "post": {
+ "/app-protect/policies/{nap_policy_object_id}/versions/{nap_policy_version_object_id}": {
+ "delete": {
+ "x-nginx-one-action": "delete",
+ "x-nginx-one-entity": "NGINX App Protect Policy Version",
"tags": [
- "Metrics"
+ "NGINX App Protect"
],
- "summary": "Retrieve system metrics for instances with series limit",
- "operationId": "queryMetricsInputTopX",
- "description": "Returns (up to 10,000) system metrics for NGINX instances with series limit based on query parameters.\n\nYou can filter metrics by name and timestamp, aggregate metrics over a configurable period of time, and group metrics by dimension.\n",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/MetricTopXQueryRequest"
- },
- "example": {
- "start_time": "now-1h",
- "end_time": "now",
- "resolution": "1m",
- "metrics": [
- {
- "aggregate": "sum",
- "name": "nginx.http.request.count"
- }
- ],
- "series_limit": 1,
- "group_series_by": "instance_object_id"
- }
- }
+ "summary": "Delete NGINX App Protect policy version",
+ "description": "Deletes the NGINX App Protect policy version.",
+ "operationId": "deleteNapPolicyVersion",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ },
+ {
+ "$ref": "#/components/parameters/NapPolicyVersionParamObjectID"
}
- },
+ ],
"responses": {
- "200": {
- "description": "Successfully retrieved system metrics.",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/MetricQueryResultEx"
- }
- }
- }
+ "204": {
+ "description": "Successfully deleted the NGINX App Protect policy version."
},
- "400": {
- "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "401": {
+ "description": "Access denied.",
"content": {
"application/json": {
"schema": {
@@ -3981,7 +4692,7 @@
}
},
"404": {
- "description": "The requested metric resource was not found. Check that the resource name provided is correct and corresponds to an existing resource.",
+ "description": "The NGINX App Protect policy version with the specified nap_policy_version_object_id and nap_policy_version_object_id was not found. Check that the object IDs provided are correct and corresponds to existing resources.",
"content": {
"application/json": {
"schema": {
@@ -4001,67 +4712,62 @@
}
}
}
- }
- },
- "/settings/instance-cleanup": {
+ },
"get": {
"tags": [
- "Settings"
+ "NGINX App Protect"
+ ],
+ "summary": "Get the specified NGINX App Protect policy version details",
+ "description": "Returns the specified NGINX App Protect policy version details.",
+ "operationId": "getNapPolicyVersion",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/NapPolicyParamObjectID"
+ },
+ {
+ "$ref": "#/components/parameters/NapPolicyVersionParamObjectID"
+ }
],
- "summary": "Retrieve settings",
- "description": "Retrieves settings for NGINX Instance cleanup\n",
- "operationId": "getSettingInstanceCleanup",
"responses": {
"200": {
- "description": "Successfully retrieved the setting for NGINX Instance cleanup.",
+ "description": "Successfully returned NGINX App Protect policy version details.",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/SettingsInstanceCleanup"
+ "$ref": "#/components/schemas/NapPolicyVersionDetails"
}
}
}
},
- "400": {
- "$ref": "#/components/responses/InvalidRequest"
- },
- "500": {
- "$ref": "#/components/responses/InternalServerErr"
- }
- }
- },
- "put": {
- "x-nginx-one-action": "update",
- "x-nginx-one-entity": "NGINX Instance Cleanup Setting",
- "tags": [
- "Settings"
- ],
- "summary": "Update settings",
- "description": "Update settings for NGINX Instance cleanup\n",
- "operationId": "updateSettingInstanceCleanup",
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/SettingsInstanceCleanup"
+ "401": {
+ "description": "Access denied.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
}
}
- }
- },
- "responses": {
- "200": {
- "description": "Successfully updated settings for NGINX Instance cleanup.",
+ },
+ "404": {
+ "description": "The NGINX App Protect policy version with the specified nap_policy_version_object_id and nap_policy_version_object_id was not found. Check that the object IDs provided are correct and corresponds to existing resources.",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/SettingsInstanceCleanup"
+ "$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
- "$ref": "#/components/responses/InternalServerErr"
+ "description": "An unexpected error occurred on the server. Please try the request again later.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
}
}
}
@@ -4290,22 +4996,61 @@
"description": "A globally unique identifier for a Publication.\n",
"required": true
},
+ "SortNameControlPlanes": {
+ "name": "sort_control_planes",
+ "in": "query",
+ "description": "Sort control planes by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "name"
+ ],
+ "x-enum-varnames": [
+ "sort_name_control_plane_name"
+ ]
+ }
+ }
+ },
+ "FilterFieldControlPlanes": {
+ "name": "filter_fields",
+ "in": "query",
+ "description": "An array of strings. Identifies the fields to filter by (for example, `name`, `product`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FilterNameControlPlanes"
+ }
+ }
+ },
+ "ControlPlaneParamObjectID": {
+ "name": "controlPlaneObjectID",
+ "in": "path",
+ "schema": {
+ "$ref": "#/components/schemas/ControlPlaneObjectID"
+ },
+ "description": "A globally unique identifier for the control plane.\n",
+ "required": true
+ },
"SortNameCVEs": {
"name": "sort_cves",
"in": "query",
- "description": "Sort CVEs by the number of instances affected by that CVE.\n",
+ "description": "Sort CVEs by the number of instances or control planes affected by that CVE.\n",
"schema": {
"type": "array",
"items": {
"type": "string",
"enum": [
"instance_count",
+ "control_plane_count",
"severity",
"cve_id",
"published_at"
],
"x-enum-varnames": [
"sort_instance_count",
+ "sort_control_plane_count",
"sort_cve_severity",
"sort_cve_id",
"sort_published_at"
@@ -4362,102 +5107,220 @@
"description": "A globally unique identifier for an event.\n",
"required": true
},
- "FilterFieldInstances": {
+ "FilterFieldInstances": {
+ "name": "filter_fields",
+ "in": "query",
+ "description": "An array of strings indicating which fields to filter by (for example, `hostname`, `nginx_version`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FilterNameInstances"
+ }
+ }
+ },
+ "SortNameInstances": {
+ "name": "sort_instances",
+ "in": "query",
+ "description": "Sort instances by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "hostname",
+ "status",
+ "last_reported"
+ ],
+ "x-enum-varnames": [
+ "sort_name_instance_hostname",
+ "sort_name_instance_status",
+ "sort_name_instance_last_reported"
+ ]
+ }
+ }
+ },
+ "InstanceParamObjectID": {
+ "name": "instanceObjectID",
+ "in": "path",
+ "schema": {
+ "$ref": "#/components/schemas/InstanceObjectID"
+ },
+ "description": "A globally unique identifier for the NGINX instance.\n",
+ "required": true
+ },
+ "InstanceConfigurationParamObjectID": {
+ "name": "instanceConfigurationObjectID",
+ "in": "path",
+ "schema": {
+ "$ref": "#/components/schemas/NginxConfigObjectID"
+ },
+ "description": "A globally unique identifier for the NGINX instance configuration.\n",
+ "required": true
+ },
+ "FilterFieldStagedConfigs": {
+ "name": "filter_fields",
+ "in": "query",
+ "description": "An array of strings indicating which fields to filter by (for example, `name`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FilterStagedConfigs"
+ }
+ }
+ },
+ "SortNameStagedConfigs": {
+ "name": "sort_staged_configs",
+ "in": "query",
+ "description": "Sort staged configs by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "name"
+ ],
+ "x-enum-varnames": [
+ "sort_name_staged_config_name"
+ ]
+ }
+ }
+ },
+ "StagedConfigParamObjectID": {
+ "name": "stagedConfigObjectID",
+ "in": "path",
+ "schema": {
+ "$ref": "#/components/schemas/StagedConfigObjectID"
+ },
+ "description": "A globally unique identifier for the NGINX staged config.\n",
+ "required": true
+ },
+ "SortNameNapPolicies": {
+ "name": "sort_nap_policies",
+ "in": "query",
+ "description": "Sort NGINX App Protect policies by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "name",
+ "deployment_count",
+ "enforcement_mode",
+ "last_deployed"
+ ],
+ "x-enum-varnames": [
+ "sort_name_nap_policies_name",
+ "sort_name_nap_policies_deployment_count",
+ "sort_name_nap_policies_enforcement_mode",
+ "sort_name_nap_policies_last_deployed"
+ ]
+ }
+ }
+ },
+ "FilterFieldNapPolicy": {
"name": "filter_fields",
"in": "query",
- "description": "An array of strings indicating which fields to filter by (for example, `hostname`, `nginx_version`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
+ "description": "An array of strings indicating which fields to filter by (for example, `name`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
"schema": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/FilterNameInstances"
+ "$ref": "#/components/schemas/FilterNameNapPolicy"
}
}
},
- "SortNameInstances": {
- "name": "sort_instances",
+ "NapPolicyParamObjectID": {
+ "name": "nap_policy_object_id",
+ "in": "path",
+ "schema": {
+ "$ref": "#/components/schemas/NapPolicyObjectID"
+ },
+ "description": "A globally unique identifier for the App Protect policy.\n",
+ "required": true
+ },
+ "SortNameNapPolicyDeployments": {
+ "name": "sort_nap_deployments",
"in": "query",
- "description": "Sort instances by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "description": "Sort NGINX App Protect deployments by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
"schema": {
"type": "array",
"items": {
"type": "string",
"enum": [
- "hostname",
+ "name",
+ "type",
+ "policy_version",
"status",
- "last_reported"
+ "deployed_on",
+ "threat_campaign_version",
+ "attack_signature_version",
+ "bot_signature_version"
],
"x-enum-varnames": [
- "sort_name_instance_hostname",
- "sort_name_instance_status",
- "sort_name_instance_last_reported"
+ "sort_name_nap_policy_deployments_name",
+ "sort_name_nap_policy_deployments_type",
+ "sort_name_nap_policy_deployments_policy_version",
+ "sort_name_nap_policy_deployments_status",
+ "sort_name_nap_policy_deployments_deployed_on",
+ "sort_name_nap_policy_deployments_threat_campaign_version",
+ "sort_name_nap_policy_deployments_attack_signature_version",
+ "sort_name_nap_policy_deployments_bot_sigature_version"
]
}
}
},
- "InstanceParamObjectID": {
- "name": "instanceObjectID",
- "in": "path",
- "schema": {
- "$ref": "#/components/schemas/InstanceObjectID"
- },
- "description": "A globally unique identifier for the NGINX instance.\n",
- "required": true
- },
- "InstanceConfigurationParamObjectID": {
- "name": "instanceConfigurationObjectID",
- "in": "path",
- "schema": {
- "$ref": "#/components/schemas/NginxConfigObjectID"
- },
- "description": "A globally unique identifier for the NGINX instance configuration.\n",
- "required": true
- },
- "FilterFieldStagedConfigs": {
+ "FilterFieldNapPolicyDeployment": {
"name": "filter_fields",
"in": "query",
"description": "An array of strings indicating which fields to filter by (for example, `name`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
"schema": {
"type": "array",
"items": {
- "$ref": "#/components/schemas/FilterStagedConfigs"
+ "$ref": "#/components/schemas/FilterNameNapPolicyDeployment"
}
}
},
- "SortNameStagedConfigs": {
- "name": "sort_staged_configs",
+ "SortNameNapPolicyVersions": {
+ "name": "sort_nap_policy_versions",
"in": "query",
- "description": "Sort staged configs by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
+ "description": "Sort NGINX App Protect policy versions by enumerate value(s). Ordinal position determines primary, secondary, etc.\n",
"schema": {
"type": "array",
"items": {
"type": "string",
"enum": [
- "name"
+ "created_at",
+ "deployment_status",
+ "deployment_count",
+ "enforcement_mode"
],
"x-enum-varnames": [
- "sort_name_staged_config_name"
+ "sort_name_nap_policy_versions_created_at",
+ "sort_name_nap_policy_versions_deployment_status",
+ "sort_name_nap_policy_versions_deployment_count",
+ "sort_name_nap_policy_versions_enforcement_mode"
]
}
}
},
- "StagedConfigParamObjectID": {
- "name": "stagedConfigObjectID",
- "in": "path",
+ "FilterFieldNapPolicyVersion": {
+ "name": "filter_fields",
+ "in": "query",
+ "description": "An array of strings indicating which fields to filter by (for example, `name`). This parameter works in conjunction with `filter_values` and `filter_ops`.\n",
"schema": {
- "$ref": "#/components/schemas/StagedConfigObjectID"
- },
- "description": "A globally unique identifier for the NGINX staged config.\n",
- "required": true
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FilterNameNapPolicyVersion"
+ }
+ }
},
- "StagedConfigImportParseOnly": {
- "name": "parseOnly",
- "in": "query",
+ "NapPolicyVersionParamObjectID": {
+ "name": "nap_policy_version_object_id",
+ "in": "path",
"schema": {
- "type": "boolean",
- "default": false
+ "$ref": "#/components/schemas/NapPolicyVersionObjectID"
},
- "description": "Optional flag to control how the request is processed.\n - When `false` or omitted (by default), the request creates a Staged Config directly. (`StagedConfigCreateResponse`)\n - When `true`, the request parses the import and returns metadata you can use to create a Staged Config through a POST. ( `StagedConfigCreateRequest`)\n",
- "required": false
+ "description": "A globally unique identifier for the App Protect policy version.\n",
+ "required": true
}
},
"schemas": {
@@ -4579,6 +5442,10 @@
"instances_count": {
"type": "integer",
"description": "The number of registered instances using this data plane key. If field not populated, user should see the key has `unknown` key count"
+ },
+ "control_planes_count": {
+ "type": "integer",
+ "description": "The number of observed control planes using this data plane key."
}
}
},
@@ -5507,7 +6374,7 @@
},
"ConfigSyncStatus": {
"type": "string",
- "description": "The current config sync status of the NGINX config sync group, with the following possible values:\n* `unknown` - The status cannot be determined at this moment.\n* `in_sync` - All Nginx instances in config sync group have same config as indicated by config_version.\n* `out_of_sync` - Some Nginx instances in config sync group have config different than indicated by config_version.\n* `sync_in_progress` - The operation of applying config_version to all Nginx instances in config sync group is in progress.\n",
+ "description": "The current config sync status of the NGINX config sync group, with the following possible values:\n* `unknown` - The status cannot be determined at this moment.\n* `in_sync` - All NGINX instances in config sync group have same config as indicated by config_version.\n* `out_of_sync` - Some NGINX instances in config sync group have config different than indicated by config_version.\n* `sync_in_progress` - The operation of applying config_version to all NGINX instances in config sync group is in progress.\n",
"enum": [
"unknown",
"in_sync",
@@ -5560,6 +6427,7 @@
"required": [
"object_id",
"name",
+ "created_at",
"instances_count",
"config_status"
],
@@ -5568,11 +6436,16 @@
"$ref": "#/components/schemas/ConfigSyncGroupObjectID"
},
"name": {
- "description": "Name of the Nginx config sync group.",
+ "description": "Name of the NGINX config sync group.",
"type": "string"
},
+ "created_at": {
+ "description": "The date and time when the config sync group was created.",
+ "type": "string",
+ "format": "date-time"
+ },
"instances_count": {
- "description": "Number of instances in the Nginx config sync group.",
+ "description": "Number of instances in the NGINX config sync group.",
"type": "integer"
},
"config_status": {
@@ -5590,7 +6463,7 @@
},
{
"type": "object",
- "description": "List of Nginx config sync groups.",
+ "description": "List of NGINX config sync groups.",
"required": [
"items"
],
@@ -5614,6 +6487,7 @@
{
"object_id": "csg_-uvR3F2TQGm18jnl7bpaGw",
"name": "test-config-sync-group",
+ "created_at": "2023-12-05T22:30:20.220114Z",
"config_status": "in_sync",
"instances_count": 1
}
@@ -5621,14 +6495,14 @@
}
},
"ConfigSyncGroupCreateRequest": {
- "description": "Body to create a Nginx config sync group.",
+ "description": "Body to create a NGINX config sync group.",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
- "description": "A name to uniquely identify the Nginx config sync group in a given tenant namespace.",
+ "description": "A name to uniquely identify the NGINX config sync group in a given tenant namespace.",
"minLength": 1,
"maxLength": 256
}
@@ -5638,7 +6512,7 @@
}
},
"ConfigSyncGroupCreateResponse": {
- "description": "Response to a create Nginx config sync group request.",
+ "description": "Response to a create NGINX config sync group request.",
"required": [
"object_id",
"name"
@@ -5648,7 +6522,7 @@
"$ref": "#/components/schemas/ConfigSyncGroupObjectID"
},
"name": {
- "description": "Name of the Nginx config sync group.",
+ "description": "Name of the NGINX config sync group.",
"type": "string"
}
},
@@ -5707,26 +6581,33 @@
"description": "Meta information of the NGINX config sync group including:\n* NGINX config sync group object ID\n* unique name of the config sync group in the tenant namespace\n* last publication timestamp\n",
"required": [
"object_id",
- "name"
+ "name",
+ "created_at"
],
"properties": {
"object_id": {
"$ref": "#/components/schemas/ConfigSyncGroupObjectID"
},
"name": {
- "description": "Name of the Nginx config sync group.",
+ "description": "Name of the NGINX config sync group.",
"type": "string"
},
"last_publication": {
"description": "The date and time of the most recent config sync group publication.",
"type": "string",
"format": "date-time"
+ },
+ "created_at": {
+ "description": "The date and time when the config sync group was created.",
+ "type": "string",
+ "format": "date-time"
}
},
"example": {
"object_id": "csg_-uvR3F2TQGm18jnl7bpaGw",
"name": "test-config-sync-group",
- "last_publication": "2023-12-06T22:37:24.120114Z"
+ "last_publication": "2023-12-06T22:37:24.120114Z",
+ "created_at": "2023-12-05T22:30:20.220114Z"
}
},
"InstanceObjectID": {
@@ -5761,8 +6642,8 @@
}
}
},
- "NginxAppProtectDetails": {
- "description": "Information regarding NGINX App Protect.\n",
+ "NginxAppProtectVersions": {
+ "description": "Version information regarding NGINX App Protect.\n",
"type": "object",
"required": [
"engine_version"
@@ -5778,6 +6659,54 @@
}
}
},
+ "NginxAppProtectDeploymentCounts": {
+ "type": "object",
+ "description": "Summary count of NAP policy version deployment statues.",
+ "required": [
+ "total",
+ "deployed",
+ "deploying",
+ "failed"
+ ],
+ "properties": {
+ "total": {
+ "description": "Total count of NAP policy versions across the NGINX data plane.",
+ "type": "integer"
+ },
+ "deployed": {
+ "description": "The number of NAP policy versions that have deployed.",
+ "type": "integer"
+ },
+ "deploying": {
+ "description": "The number of NAP policy versions that are deploying.",
+ "type": "integer"
+ },
+ "failed": {
+ "description": "The number of NAP policy versions that have failed deployment.",
+ "type": "integer"
+ }
+ }
+ },
+ "NginxAppProtectSummary": {
+ "description": "Summary information regarding NGINX App Protect.\n",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NginxAppProtectVersions"
+ },
+ {
+ "type": "object",
+ "required": [
+ "deployments"
+ ],
+ "properties": {
+ "deployments": {
+ "$ref": "#/components/schemas/NginxAppProtectDeploymentCounts"
+ }
+ }
+ }
+ ]
+ },
"CveSeverityType": {
"type": "string",
"description": "Severity ratings:\n * `high` - High severity.\n * `medium` - Moderate severity.\n * `low` - Least severe.\n * `none` - Not severe.\n * `other` - Severity that does not fit the other categories.\n",
@@ -5846,6 +6775,40 @@
}
}
},
+ "ControlPlaneObjectID": {
+ "description": "A globally unique identifier for the control plane.",
+ "type": "string",
+ "format": "object_id",
+ "pattern": "^ecp_.*",
+ "x-go-type": "objects.ID"
+ },
+ "ControlPlaneBaseInfo": {
+ "type": "object",
+ "description": "Base information of a control plane, which includes name, product version and optionally an object ID.",
+ "required": [
+ "name",
+ "product_version",
+ "created_at"
+ ],
+ "properties": {
+ "object_id": {
+ "$ref": "#/components/schemas/ControlPlaneObjectID"
+ },
+ "name": {
+ "description": "Control plane name.",
+ "type": "string"
+ },
+ "product_version": {
+ "description": "Control plane product name and version.",
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the control plane was created."
+ }
+ }
+ },
"Instance": {
"type": "object",
"description": "Summary information about a NGINX instance.",
@@ -5890,7 +6853,7 @@
"example": "ubuntu_jammy"
},
"nginx_app_protect": {
- "$ref": "#/components/schemas/NginxAppProtectDetails"
+ "$ref": "#/components/schemas/NginxAppProtectSummary"
},
"registered_at": {
"description": "The date and time when the NGINX instance first registered with NGINX One.",
@@ -5928,6 +6891,9 @@
"items": {
"$ref": "#/components/schemas/IssueDetails"
}
+ },
+ "control_plane": {
+ "$ref": "#/components/schemas/ControlPlaneBaseInfo"
}
}
},
@@ -5986,57 +6952,187 @@
"properties": {
"name": {
"type": "string",
- "description": "A friendly name for the certificate."
+ "description": "A friendly name for the certificate."
+ },
+ "object_id": {
+ "$ref": "#/components/schemas/CertificateObjectID"
+ },
+ "cert_type": {
+ "$ref": "#/components/schemas/CertificateType"
+ },
+ "cert_paths": {
+ "type": "array",
+ "description": "The list of file system paths where the certificate file is installed. \nSince a single certificate file may be applied in multiple contexts, all relevant paths are included.\n",
+ "example": [
+ "/etc/ssl/cert.pem",
+ "/etc/ssl/cert.crt"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "key_paths": {
+ "type": "array",
+ "description": "The list of file system paths where the private key file is installed.\nSince a single key file may be applied in multiple contexts, all relevant paths are included.\n",
+ "example": [
+ "/etc/nginx/key.pem",
+ "/etc/ssl/server.key"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "deployment_status": {
+ "$ref": "#/components/schemas/CertificateDeploymentStatus"
+ },
+ "subject_name": {
+ "type": "string",
+ "description": "Hostname or domain for the certificate. Usually the subject-alt-name (SAN) value for the certificate.\nif SAN is not present, this will be the certificate subject's common name.\n",
+ "example": "nginx.com"
+ },
+ "cert_status": {
+ "$ref": "#/components/schemas/CertificateStatus"
+ },
+ "not_before": {
+ "type": "string",
+ "format": "date-time",
+ "description": "the effective date of the certificate."
+ },
+ "not_after": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The expiration date for the certificate."
+ }
+ }
+ },
+ "NapPolicyObjectID": {
+ "description": "A globally unique identifier for the App Protect policy.",
+ "type": "string",
+ "format": "object_id",
+ "pattern": "^pol_.*",
+ "x-go-type": "objects.ID",
+ "x-go-type-import": {
+ "name": "objects",
+ "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
+ }
+ },
+ "NapPolicyVersionObjectID": {
+ "description": "A globally unique identifier for the App Protect policy version.",
+ "type": "string",
+ "format": "object_id",
+ "pattern": "^pv_.*",
+ "x-go-type": "objects.ID",
+ "x-go-type-import": {
+ "name": "objects",
+ "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
+ }
+ },
+ "PublicationObjectID": {
+ "description": "A globally unique identifier for the publication.",
+ "type": "string",
+ "format": "object_id",
+ "example": "pub_72pGHoGsSICL_THZrs964g",
+ "pattern": "^pub_.*",
+ "x-go-type": "objects.ID",
+ "x-go-type-import": {
+ "name": "objects",
+ "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
+ }
+ },
+ "NapPolicyEnforcementMode": {
+ "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `blocking` - Any illegal or suspicious requests are logged and blocked.\n* `transparent` - Any illegal or suspicious requests are logged but not blocked.\n",
+ "type": "string",
+ "enum": [
+ "blocking",
+ "transparent"
+ ],
+ "x-enum-varnames": [
+ "nap_enforcement_mode_blocking",
+ "nap_enforcement_mode_transparent"
+ ]
+ },
+ "NapDeploymentStatus": {
+ "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `deployed` - The NGINX App Protect policy has been deployed.\n* `not_deployed` - The NGINX App Protect policy has not been deployed.\n* `deploying` - The NGINX App Protect policy is currently being deployed.\n* `failed` - The NGINX App Protect policy failed deploying.\n",
+ "type": "string",
+ "enum": [
+ "deployed",
+ "not_deployed",
+ "deploying",
+ "failed"
+ ],
+ "x-enum-varnames": [
+ "nap_deployment_status_deployed",
+ "nap_deployment_status_not_deployed",
+ "nap_deployment_status_deploying",
+ "nap_deployment_status_failed"
+ ]
+ },
+ "NapAssociation": {
+ "description": "Details for a NGINX App Protect policy version that's associated with an instance or a config sync group.",
+ "required": [
+ "name",
+ "version",
+ "policy_object_id",
+ "policy_version_object_id",
+ "paths",
+ "deployment_status",
+ "publication_object_id",
+ "deployed_on",
+ "enforcement_mode"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the policy at the time of the deployment."
},
- "object_id": {
- "$ref": "#/components/schemas/CertificateObjectID"
+ "version": {
+ "type": "string",
+ "description": "Version of the policy at the time of the deployment."
},
- "cert_type": {
- "$ref": "#/components/schemas/CertificateType"
+ "policy_object_id": {
+ "$ref": "#/components/schemas/NapPolicyObjectID"
},
- "cert_paths": {
- "type": "array",
- "description": "The list of file system paths where the certificate file is installed. \nSince a single certificate file may be applied in multiple contexts, all relevant paths are included.\n",
- "example": [
- "/etc/ssl/cert.pem",
- "/etc/ssl/cert.crt"
- ],
- "items": {
- "type": "string"
- }
+ "policy_version_object_id": {
+ "$ref": "#/components/schemas/NapPolicyVersionObjectID"
},
- "key_paths": {
+ "publication_object_id": {
+ "$ref": "#/components/schemas/PublicationObjectID"
+ },
+ "enforcement_mode": {
+ "$ref": "#/components/schemas/NapPolicyEnforcementMode"
+ },
+ "paths": {
"type": "array",
- "description": "The list of file system paths where the private key file is installed.\nSince a single key file may be applied in multiple contexts, all relevant paths are included.\n",
+ "description": "The list of file system paths where the compiled NAP policy version bundle file is installed. \nSince a single compiled NAP policy version bundle file may be applied in multiple contexts, all relevant paths are included.\n",
"example": [
- "/etc/nginx/key.pem",
- "/etc/ssl/server.key"
+ "/etc/nginx/default_policy.tgz",
+ "/etc/nginx/default_policy_server_2.tgz"
],
"items": {
"type": "string"
}
},
"deployment_status": {
- "$ref": "#/components/schemas/CertificateDeploymentStatus"
- },
- "subject_name": {
- "type": "string",
- "description": "Hostname or domain for the certificate. Usually the subject-alt-name (SAN) value for the certificate.\nif SAN is not present, this will be the certificate subject's common name.\n",
- "example": "nginx.com"
- },
- "cert_status": {
- "$ref": "#/components/schemas/CertificateStatus"
- },
- "not_before": {
- "type": "string",
- "format": "date-time",
- "description": "the effective date of the certificate."
+ "$ref": "#/components/schemas/NapDeploymentStatus"
},
- "not_after": {
+ "deployed_on": {
+ "description": "Date and time of the deployment.",
"type": "string",
- "format": "date-time",
- "description": "The expiration date for the certificate."
+ "format": "date-time"
}
+ },
+ "example": {
+ "name": "default_policy",
+ "version": "2025.05.01",
+ "policy_object_id": "pol_panEdeY-Sh2rWm365y7wsw",
+ "policy_version_object_id": "pv_kem7SCosTTOL9mMlNyY2GQ",
+ "publication_object_id": "pub_72pGHoGsSICL_THZrs964g",
+ "paths": [
+ "/etc/nginx/default_policy.tgz"
+ ],
+ "deployment_status": "deployed",
+ "enforcement_mode": "transparent",
+ "deployed_on": "2023-12-06T22:37:24.120114Z"
}
},
"ConfigSyncGroup": {
@@ -6071,6 +7167,20 @@
"items": {
"$ref": "#/components/schemas/CertAssociation"
}
+ },
+ "nginx_app_protect": {
+ "type": "object",
+ "required": [
+ "deployments"
+ ],
+ "properties": {
+ "deployments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NapAssociation"
+ }
+ }
+ }
}
}
}
@@ -6078,7 +7188,7 @@
"example": {
"object_id": "csg_-uvR3F2TQGm18jnl7bpaGw",
"name": "test-config-sync-group",
- "last_reported": "2023-12-06T22:37:24.120114Z",
+ "created_at": "2023-12-06T22:37:24.120114Z",
"config_status": "in_sync",
"config_version": "uvR3F2TQGm18jnl7bpaGw",
"instances": [
@@ -6476,34 +7586,24 @@
}
]
},
- "PublicationObjectID": {
- "description": "A globally unique identifier for the publication.",
- "type": "string",
- "format": "object_id",
- "example": "pub_72pGHoGsSICL_THZrs964g",
- "pattern": "^pub_.*",
- "x-go-type": "objects.ID",
- "x-go-type-import": {
- "name": "objects",
- "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
- }
- },
"PublicationStatusCause": {
"description": "Cause of the failure, provided only if the status is `failed`.",
"type": "object",
"properties": {
"cause": {
- "description": "Cause of the failure, detailed as follows:\n* `unknown` - The reason for the failure is not known.\n* `timeout` - The publication request reached its time limit without receiving a response from the NGINX Agent.\n* `remote` - The NGINX Agent reported a failure when trying to apply the configuration. See the message for more details.\n",
+ "description": "Cause of the failure, detailed as follows:\n* `unknown` - The reason for the failure is not known.\n* `timeout` - The publication request reached its time limit without receiving a response from the NGINX Agent.\n* `remote` - The NGINX Agent reported a failure when trying to apply the configuration. See the message for more details.\n* `payload` - The publication was successful, but there were warnings reported by attached payloads, see message for more details.\n",
"type": "string",
"enum": [
"unknown",
"timeout",
- "remote"
+ "remote",
+ "payload"
],
"x-enum-varnames": [
"publication_instance_status_cause_unknown",
"publication_instance_status_cause_timeout",
- "publication_instance_status_cause_remote"
+ "publication_instance_status_cause_remote",
+ "publication_instance_status_cause_payload"
]
},
"message": {
@@ -6597,17 +7697,19 @@
"description": "A hash that uniquely identifies the contents of the config object in the publication.\n"
},
"status": {
- "description": "Publication status for the NGINX instance:\n* `pending` - The publication request has been accepted and is currently processing.\n* `failed` - The publication attempt failed.\n* `succeeded` - The publication was successful.\n",
+ "description": "Publication status for the NGINX instance:\n* `pending` - The publication request has been accepted and is currently processing.\n* `failed` - The publication attempt failed.\n* `succeeded` - The publication was successful.\n* `succeeded_with_warnings` - The publication was successful, but there were warnings.\n",
"type": "string",
"enum": [
"pending",
"failed",
- "succeeded"
+ "succeeded",
+ "succeeded_with_warnings"
],
"x-enum-varnames": [
"publication_instance_status_pending",
"publication_instance_status_failed",
- "publication_instance_status_succeeded"
+ "publication_instance_status_succeeded",
+ "publication_instance_status_succeeded_with_warnings"
]
},
"status_cause": {
@@ -6644,103 +7746,402 @@
"description": "File where the issue is detected.",
"type": "string"
},
- "line": {
- "description": "Line number in the configuration where the issue is found.",
+ "line": {
+ "description": "Line number in the configuration where the issue is found.",
+ "type": "integer"
+ }
+ }
+ },
+ "NginxConfigReport": {
+ "type": "object",
+ "description": "An analysis of the NGINX configuration, highlighting issues and their severity, and offering recommendations.",
+ "properties": {
+ "rule": {
+ "description": "The name of the configuration rule that was violated.",
+ "type": "string"
+ },
+ "info": {
+ "description": "A detailed description of the issue.",
+ "type": "string"
+ },
+ "severity": {
+ "description": "The severity level of the issue.",
+ "type": "string"
+ },
+ "category": {
+ "description": "Classification category of the issue.",
+ "type": "string"
+ },
+ "documentation": {
+ "description": "Links to documentation that can assist in resolving the identified issue.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "where": {
+ "description": "Specific locations in the configuration where issues were detected.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NginxConfigProblem"
+ }
+ }
+ }
+ },
+ "NginxConfigReports": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NginxConfigReport"
+ }
+ },
+ "NginxConfigMeta": {
+ "type": "object",
+ "description": "Meta data of an NGINX configuration, including its unique identifier, the config_version.\n",
+ "required": [
+ "object_id",
+ "config_version",
+ "created_at",
+ "modified_at",
+ "config_source"
+ ],
+ "properties": {
+ "object_id": {
+ "$ref": "#/components/schemas/NginxConfigObjectID"
+ },
+ "config_version": {
+ "type": "string",
+ "description": "A hash that uniquely identifies the contents of the config object.\n"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the NGINX configuration object was created for the instance."
+ },
+ "modified_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the NGINX configuration object was last modified for the instance."
+ },
+ "config_source": {
+ "type": "string",
+ "enum": [
+ "NGINX One",
+ "Other",
+ "Unspecified"
+ ],
+ "x-enum-varnames": [
+ "config_source_nginx_one",
+ "config_source_other",
+ "config_source_unspecified"
+ ],
+ "description": "The source from which the config was created:\n- `NGINX One`: The config was created from NGINX One.\n- `Other`: The config was created from data plane.\n- `Unspecified`: The source of the config is unspecified.\n"
+ }
+ },
+ "example": {
+ "object_id": "nc_AamgWtYSSb6OWGljx3wNDA",
+ "config_version": "Cm1hcCAkdXJpICRtYXBwZWRfc2V",
+ "created_at": "2023-08-10T16:59:15Z",
+ "modified_at": "2023-08-10T16:59:15Z",
+ "config_source": "NGINX One"
+ }
+ },
+ "FilterNameControlPlanes": {
+ "type": "string",
+ "description": "Keywords for control plane filters.\n",
+ "enum": [
+ "name",
+ "product_version",
+ "object_id",
+ "cve_severity"
+ ],
+ "x-enum-varnames": [
+ "filter_name_control_plane_name",
+ "filter_name_control_plane_product_version",
+ "filter_name_control_plane_object_id",
+ "filter_name_control_plane_cve_severity"
+ ]
+ },
+ "ListControlPlaneObject": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ControlPlaneBaseInfo"
+ },
+ {
+ "type": "object",
+ "description": "Summary information about a control plane.",
+ "required": [
+ "object_id",
+ "instances_count",
+ "online_instances_count"
+ ],
+ "properties": {
+ "object_id": {
+ "$ref": "#/components/schemas/ControlPlaneObjectID"
+ },
+ "instances_count": {
+ "description": "Total number of instances in the control plane.",
+ "type": "integer"
+ },
+ "online_instances_count": {
+ "description": "Total number of online instances in the control plane.",
+ "type": "integer"
+ },
+ "cve_severity": {
+ "type": "array",
+ "description": "An array summarizing identified Common Vulnerabilities and Exposures (CVEs) across the NGINX control plane.",
+ "items": {
+ "$ref": "#/components/schemas/CveDetails"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "ControlPlaneListResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/PaginationResponse"
+ },
+ {
+ "type": "object",
+ "description": "List of control planes.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "items": {
+ "description": "An array of control plane objects.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ListControlPlaneObject"
+ }
+ }
+ }
+ }
+ ],
+ "example": {
+ "total": 10,
+ "count": 1,
+ "start_index": 1,
+ "items_per_page": 100,
+ "items": [
+ {
+ "object_id": "ecp_tgfVM3KQTxCyiDXgV38G7A",
+ "name": "nginx-ingress-001",
+ "product_version": "nginx-ingress-controller-4.0.1",
+ "created_at": "2023-12-06T22:37:24.120114Z",
+ "instances_count": 5,
+ "online_instances_count": 3,
+ "cve_severity": [
+ {
+ "count": 6,
+ "type": "medium"
+ },
+ {
+ "count": 1,
+ "type": "high"
+ }
+ ]
+ },
+ {
+ "object_id": "ecp_-bRQlhscTKmbUIdJaYhGJA",
+ "name": "ngf-deployment",
+ "created_at": "2023-12-06T22:37:24.120114Z",
+ "product_version": "nginx-gateway-fabric-2.0.1",
+ "instances_count": 3,
+ "online_instances_count": 1,
+ "cve_severity": [
+ {
+ "count": 2,
+ "type": "medium"
+ },
+ {
+ "count": 3,
+ "type": "high"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "StatusSummary": {
+ "description": "An overview of the status for each NGINX instance, indicating availability.",
+ "type": "object",
+ "required": [
+ "online",
+ "offline",
+ "unavailable"
+ ],
+ "properties": {
+ "online": {
+ "description": "The number of NGINX instances reporting as `online`.\nThe NGINX Agent is connected to NGINX One, and the NGINX instance is online.\n",
+ "type": "integer"
+ },
+ "offline": {
+ "description": "The number of NGINX instances reporting as `offline`.\nThe NGINX Agent is connected to NGINX One, but the NGINX instance is offline.\n",
+ "type": "integer"
+ },
+ "unavailable": {
+ "description": "The number of NGINX instances reporting as `unavailable`.\nThe NGINX Agent has lost connection to NGINX One, rendering the NGINX instance unavailable.\n",
"type": "integer"
}
}
},
- "NginxConfigReport": {
+ "ControlPlane": {
"type": "object",
- "description": "An analysis of the NGINX configuration, highlighting issues and their severity, and offering recommendations.",
+ "description": "Information on control plane including:\n* Control plane object ID\n* Cluster UUID\n* Deployment UUID\n* Kubernetes namespace\n* Data plane key object ID\n* Certificate summary\n* Instance status summary\n",
+ "required": [
+ "object_id",
+ "cluster_uuid",
+ "deployment_uuid",
+ "kubernetes_namespace"
+ ],
"properties": {
- "rule": {
- "description": "The name of the configuration rule that was violated.",
+ "object_id": {
+ "$ref": "#/components/schemas/ControlPlaneObjectID"
+ },
+ "cluster_uuid": {
+ "description": "The Kubernetes UID assigned to the cluster that the product is running in.",
"type": "string"
},
- "info": {
- "description": "A detailed description of the issue.",
+ "deployment_uuid": {
+ "description": "The Kubernetes UID assigned to the control plane.",
"type": "string"
},
- "severity": {
- "description": "The severity level of the issue.",
+ "key_object_id": {
+ "$ref": "#/components/schemas/DataPlaneKeyObjectID"
+ },
+ "kubernetes_namespace": {
+ "description": "The kubernetes namespace that the product is running in.",
"type": "string"
},
- "category": {
- "description": "Classification category of the issue.",
+ "cert_summary": {
+ "$ref": "#/components/schemas/CertificateInstanceSummary"
+ },
+ "statuses": {
+ "$ref": "#/components/schemas/StatusSummary"
+ }
+ }
+ },
+ "ControlPlaneDetails": {
+ "type": "object",
+ "description": "Detailed information of control plane.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ControlPlaneBaseInfo"
+ },
+ {
+ "$ref": "#/components/schemas/ControlPlane"
+ }
+ ],
+ "example": {
+ "name": "foo",
+ "object_id": "ecp_-uvR3F2TQGm18jnl7bpaGw",
+ "product_version": "nginx-ingress-controller-1.0.0",
+ "cluster_uuid": "d1ced6c7-8980-467e-a1db-dcdfec16b1f7",
+ "deployment_uuid": "b9b00e37-5ee4-4361-8c61-1329f3828dd3",
+ "key_object_id": "key_6AT9LXyUQHyhC8kF7bVMgg",
+ "kubernetes_namespace": "nginx-ingress-controller",
+ "created_at": "2023-12-06T22:37:24.120114Z",
+ "cert_summary": {
+ "total": 9,
+ "valid": 1,
+ "expired": 5,
+ "expiring": 3,
+ "not_ready": 0
+ },
+ "statuses": {
+ "offline": 0,
+ "online": 3,
+ "unavailable": 0
+ }
+ }
+ },
+ "SummaryDisplayCount": {
+ "description": "The name, the total count, and an optional user-friendly display name of the resource being summarized.",
+ "type": "object",
+ "required": [
+ "name",
+ "count"
+ ],
+ "properties": {
+ "name": {
+ "description": "Identifies the category of data being reported, such as an operating system, NGINX version, or another type.",
"type": "string"
},
- "documentation": {
- "description": "Links to documentation that can assist in resolving the identified issue.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "count": {
+ "description": "The number of resources matching the given type.",
+ "type": "integer"
},
- "where": {
- "description": "Specific locations in the configuration where issues were detected.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/NginxConfigProblem"
- }
+ "display": {
+ "description": "A user-friendly label for the category count, intended for display purposes where a more descriptive or readable format is preferred.",
+ "type": "string"
}
}
},
- "NginxConfigReports": {
+ "ControlPlaneProductVersionSummary": {
+ "description": "An array of control plane product names/versions.",
"type": "array",
"items": {
- "$ref": "#/components/schemas/NginxConfigReport"
+ "$ref": "#/components/schemas/SummaryDisplayCount"
}
},
- "NginxConfigMeta": {
+ "CveControlPlaneSummary": {
+ "description": "A summary of Common Vulnerabilities and Exposures (CVEs) across the NGINX control plane.",
"type": "object",
- "description": "Meta data of an NGINX configuration, including its unique identifier, the config_version.\n",
"required": [
- "object_id",
- "config_version",
- "created_at",
- "modified_at",
- "config_source"
+ "severity",
+ "count",
+ "affected_control_planes"
],
"properties": {
- "object_id": {
- "$ref": "#/components/schemas/NginxConfigObjectID"
- },
- "config_version": {
- "type": "string",
- "description": "A hash that uniquely identifies the contents of the config object.\n"
+ "severity": {
+ "$ref": "#/components/schemas/CveSeverityType"
},
- "created_at": {
- "type": "string",
- "format": "date-time",
- "description": "The date and time when the NGINX configuration object was created for the instance."
+ "count": {
+ "description": "The number of CVEs at each severity level.",
+ "type": "integer"
},
- "modified_at": {
- "type": "string",
- "format": "date-time",
- "description": "The date and time when the NGINX configuration object was last modified for the instance."
+ "affected_control_planes": {
+ "description": "The number of control planes affected by each CVE.",
+ "type": "integer"
+ }
+ }
+ },
+ "ControlPlaneSummary": {
+ "description": "A summary of control planes including their product names/version details.",
+ "type": "object",
+ "properties": {
+ "product_versions": {
+ "$ref": "#/components/schemas/ControlPlaneProductVersionSummary"
},
- "config_source": {
- "type": "string",
- "enum": [
- "NGINX One",
- "Other",
- "Unspecified"
- ],
- "x-enum-varnames": [
- "config_source_nginx_one",
- "config_source_other",
- "config_source_unspecified"
- ],
- "description": "The source from which the config was created:\n- `NGINX One`: The config was created from NGINX One.\n- `Other`: The config was created from data plane.\n- `Unspecified`: The source of the config is unspecified.\n"
+ "cves": {
+ "description": "An array summarizing identified Common Vulnerabilities and Exposures (CVEs) across the NGINX control plane.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CveControlPlaneSummary"
+ }
}
},
"example": {
- "object_id": "nc_AamgWtYSSb6OWGljx3wNDA",
- "config_version": "Cm1hcCAkdXJpICRtYXBwZWRfc2V",
- "created_at": "2023-08-10T16:59:15Z",
- "modified_at": "2023-08-10T16:59:15Z",
- "config_source": "NGINX One"
+ "product_versions": [
+ {
+ "count": 10,
+ "name": "nginx-ingress-controller-1.0.0"
+ }
+ ],
+ "cves": [
+ {
+ "affected_control_planes": 3,
+ "count": 13,
+ "severity": "medium"
+ },
+ {
+ "affected_control_planes": 2,
+ "count": 2,
+ "severity": "high"
+ }
+ ]
}
},
"NginxCVEObject": {
@@ -6768,6 +8169,10 @@
"description": "Number of instances impacted by the security advisory",
"type": "integer"
},
+ "control_planes_impacted": {
+ "description": "Number of control planes impacted by the security advisory",
+ "type": "integer"
+ },
"published_at": {
"description": "The date and time when the cve was published",
"type": "string",
@@ -6800,15 +8205,19 @@
},
"NginxProduct": {
"type": "string",
- "description": "NGINX product :\n * `noss` - NGINX Open Source.\n * `nplus` - NGINX PLUS.\n",
+ "description": "NGINX product :\n * `noss` - NGINX Open Source.\n * `nplus` - NGINX PLUS.\n * `nic` - NGINX Ingress Controller.\n * `ngf` - NGINX Gateway Fabric.\n",
"enum": [
"noss",
"nplus",
+ "nic",
+ "ngf",
"unknown"
],
"x-enum-varnames": [
"nginx_product_noss",
"nginx_product_nplus",
+ "nginx_product_nic",
+ "nginx_product_ngf",
"nginx_product_unknown"
]
},
@@ -6874,6 +8283,20 @@
"1.20.2",
"1.19.9"
]
+ },
+ {
+ "name": "nic",
+ "versions": [
+ "1.0.0",
+ "2.1.0"
+ ]
+ },
+ {
+ "name": "ngf",
+ "versions": [
+ "1.6.2",
+ "2.0.1"
+ ]
}
],
"info": "Memory disclosure in the ngx_http_mp4_module",
@@ -6895,7 +8318,7 @@
"$ref": "#/components/schemas/NginxProduct"
},
"version": {
- "description": "version of the Nginx product installed on the instance.",
+ "description": "version of the NGINX product installed on the instance.",
"type": "string"
}
}
@@ -7020,12 +8443,14 @@
"enum": [
"instance_cleanup",
"certificates",
- "publications"
+ "publications",
+ "nap_compilation_jobs"
],
"x-enum-varnames": [
"event_type_instance_cleanup",
"event_type_certificates",
- "event_type_publications"
+ "event_type_publications",
+ "event_type_nap_compilation_jobs"
]
},
"object_id": {
@@ -7248,6 +8673,77 @@
}
]
},
+ "NapSignatureVersion": {
+ "description": "The version of the NGINX App Protect resource.",
+ "type": "string",
+ "example": "2023.12.06"
+ },
+ "NapInstanceAssociation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NapAssociation"
+ },
+ {
+ "type": "object",
+ "required": [
+ "threat_campaign_version",
+ "attack_signature_version",
+ "bot_signature_version"
+ ],
+ "properties": {
+ "threat_campaign_version": {
+ "$ref": "#/components/schemas/NapSignatureVersion"
+ },
+ "attack_signature_version": {
+ "$ref": "#/components/schemas/NapSignatureVersion"
+ },
+ "bot_signature_version": {
+ "$ref": "#/components/schemas/NapSignatureVersion"
+ }
+ }
+ }
+ ],
+ "example": {
+ "name": "default_policy",
+ "version": "2025.05.01",
+ "policy_object_id": "pol_panEdeY-Sh2rWm365y7wsw",
+ "policy_version_object_id": "pv_kem7SCosTTOL9mMlNyY2GQ",
+ "publication_object_id": "pub_72pGHoGsSICL_THZrs964g",
+ "paths": [
+ "/etc/nginx/default_policy.tgz"
+ ],
+ "deployment_status": "deployed",
+ "enforcement_mode": "transparent",
+ "deployed_on": "2023-12-06T22:37:24.120114Z",
+ "threat_campaign_version": "2025.01.23",
+ "attack_signature_version": "2025.01.19",
+ "bot_signature_version": "2025.01.19"
+ }
+ },
+ "NginxAppProtectDetails": {
+ "description": "Information regarding NGINX App Protect. Includes version and deployments.\n",
+ "type": "object",
+ "required": [
+ "engine_version",
+ "deployments"
+ ],
+ "properties": {
+ "release_version": {
+ "description": "The release version of NGINX App Protect.",
+ "type": "string"
+ },
+ "engine_version": {
+ "description": "The version of the App Protect enforcement engine.",
+ "type": "string"
+ },
+ "deployments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NapInstanceAssociation"
+ }
+ }
+ }
+ },
"InstanceDetails": {
"type": "object",
"description": "Detailed information about an NGINX instance.",
@@ -7270,6 +8766,12 @@
},
"config_sync_group": {
"$ref": "#/components/schemas/ConfigSyncGroupInstanceMeta"
+ },
+ "nginx_app_protect": {
+ "$ref": "#/components/schemas/NginxAppProtectDetails"
+ },
+ "control_plane": {
+ "$ref": "#/components/schemas/ControlPlaneBaseInfo"
}
}
}
@@ -7293,6 +8795,12 @@
],
"hostname": "4d116619f106",
"key": "key_wN3IhLCmR3qmwybG_6ptEg",
+ "control_plane": {
+ "object_id": "ecp_CO1DdBxZToWmr3pTcaQ8QA",
+ "name": "nginx-ingress-001",
+ "product_version": "nginx-ingress-controller-4.0.1",
+ "created_at": "2023-12-06T22:37:24.120114Z"
+ },
"last_reported": "2023-12-06T22:37:24.120114Z",
"nginx_build": {
"conf_path": "/etc/nginx/nginx.conf",
@@ -7361,63 +8869,18 @@
}
}
},
- "SummaryDisplayCount": {
- "description": "The name, the total count, and an optional user-friendly display name of the resource being summarized.",
- "type": "object",
- "required": [
- "name",
- "count"
- ],
- "properties": {
- "name": {
- "description": "Identifies the category of data being reported, such as an operating system, NGINX version, or another type.",
- "type": "string"
- },
- "count": {
- "description": "The number of resources matching the given type.",
- "type": "integer"
- },
- "display": {
- "description": "A user-friendly label for the category count, intended for display purposes where a more descriptive or readable format is preferred.",
- "type": "string"
- }
- }
- },
"OperatingSystemVersionSummary": {
- "description": "An array summarizing the operating systems and their versions on the NGINX data plane.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SummaryDisplayCount"
- }
- },
- "NGINXVersionSummary": {
- "description": "An array summarizing the versions of NGINX installed across the NGINX data plane.",
+ "description": "An array of operating systems and their versions on the NGINX data plane.",
"type": "array",
"items": {
"$ref": "#/components/schemas/SummaryDisplayCount"
}
- },
- "StatusSummary": {
- "description": "An overview of the status for each NGINX instance, indicating availability.",
- "type": "object",
- "required": [
- "online",
- "offline",
- "unavailable"
- ],
- "properties": {
- "online": {
- "description": "The number of NGINX instances reporting as `online`.\nThe NGINX Agent is connected to NGINX One, and the NGINX instance is online.\n",
- "type": "integer"
- },
- "offline": {
- "description": "The number of NGINX instances reporting as `offline`.\nThe NGINX Agent is connected to NGINX One, but the NGINX instance is offline.\n",
- "type": "integer"
- },
- "unavailable": {
- "description": "The number of NGINX instances reporting as `unavailable`.\nThe NGINX Agent has lost connection to NGINX One, rendering the NGINX instance unavailable.\n",
- "type": "integer"
- }
+ },
+ "NGINXVersionSummary": {
+ "description": "An array of NGINX versions installed across the NGINX data plane.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SummaryDisplayCount"
}
},
"CveSummary": {
@@ -7536,7 +8999,7 @@
],
"properties": {
"total": {
- "description": "Total count of certificates used as `payloads` in Nginx config.",
+ "description": "Total count of certificates used as `payloads` in NGINX config.",
"type": "integer"
},
"expired": {
@@ -7689,51 +9152,6 @@
"object_id": "sc_Tet21AeYTHCj7taOwVfzyw"
}
},
- "StagedConfigBulkRequestData": {
- "type": "object",
- "description": "Part of bulk operation on a staged config, only `delete` is supported.",
- "required": [
- "action",
- "object_id"
- ],
- "properties": {
- "object_id": {
- "$ref": "#/components/schemas/StagedConfigObjectID"
- },
- "action": {
- "$ref": "#/components/schemas/BulkRequestAction"
- }
- },
- "example": {
- "object_id": "sc_-uvR3F2TQGm18jnl7bpaGw",
- "action": "delete"
- }
- },
- "StagedConfigBulkRequest": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/StagedConfigBulkRequestData"
- },
- "minItems": 1,
- "maxItems": 50,
- "example": [
- {
- "object_id": "sc_-uvR3F2TQGm18jnl7bpaGw",
- "action": "delete"
- },
- {
- "object_id": "sc_PL0c1XodRemmzVEjiXSsTg",
- "action": "delete"
- }
- ]
- },
- "StagedConfigBulkResponse": {
- "description": "The staged config bulk outcome.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/BulkRequestObjectStatus"
- }
- },
"StagedConfigResponse": {
"description": "Get an NGINX staged config.",
"required": [
@@ -7812,35 +9230,6 @@
}
}
},
- "StagedConfigImportRequest": {
- "type": "object",
- "description": "Body to import a NGINX staged config",
- "required": [
- "name",
- "file",
- "conf_path"
- ],
- "properties": {
- "name": {
- "$ref": "#/components/schemas/StagedConfigName"
- },
- "file": {
- "type": "string",
- "format": "binary",
- "example": "my-staged-config.tar.gz",
- "maxLength": 5242880
- },
- "conf_path": {
- "$ref": "#/components/schemas/ConfigPath"
- }
- },
- "example": {
- "name": "my-nginx-config",
- "file": "my-staged-config.tar.gz",
- "conf_path": "/etc/nginx/nginx.conf",
- "parse_only": true
- }
- },
"MetricQueryResultEx": {
"type": "object",
"required": [
@@ -8039,7 +9428,7 @@
"MetricDimension": {
"type": "string",
"default": "display_name",
- "description": "Static list of all metric dimensions.\n * `display_name` - The display name of the NGINX instance.\n * `file_path` - Path to a desired file.\n * `parent_hostname` - The hostname of the NGINX Plus instance.\n * `instance_object_id` - Instance Object ID is the unique identifier for an Instance registered with NGINX One Console.\n * `location_zone` - The name of an HTTP location zone.\n * `mount_point` - A filesystem mount point.\n * `namespace` - The Namespace associated with the metric data.\n * `network_interface` - A server network interface.\n * `nginx_id` - The unique identifier of an nginx instance running on the data plane.\n * `server_zone` - The name of an HTTP or Stream server zone.\n * `system_id` - The unique identifier of the the operating system where nginx-agent is running.\n * `tenant` - The Tenant associated with the metric data.\n * `csg_object_id` - Config Sync Group Object ID is the unique identifier for a Config Sync Group registered with NGINX One Console.\n * `mode` - Variant value associated with metric `system.cpu.utilization`.\n * `state` - Variant value associated with metrics `system.filesystem.usage`, `system.memory.usage`.\n * `io_direction` - Variant value associated with metric `system.network.io`.\n * `status_range` - Variant value associated with metric `nginx.http.response.count`.\n",
+ "description": "Static list of all metric dimensions:\n * `display_name` - Display name of the NGINX instance.\n * `file_path` - Path to the file.\n * `parent_hostname` - Hostname of the NGINX Plus instance.\n * `instance_object_id` - Unique ID of the instance registered with NGINX One Console.\n * `location_zone` - Name of an HTTP location zone.\n * `mount_point` - Filesystem mount point.\n * `namespace` - Namespace for the metric data.\n * `network_interface` - Server network interface.\n * `nginx_id` - Unique ID of the NGINX instance running on the data plane.\n * `server_zone` - Name of an HTTP or Stream server zone.\n * `system_id` - Unique ID of the operating system running nginx-agent.\n * `tenant` - Tenant for the metric data.\n * `csg_object_id` - Unique ID of the Config Sync Group registered with NGINX One Console.\n * `mode` - Variant value for metric `system.cpu.utilization`.\n * `state` - Variant value for metrics `system.filesystem.usage`, `system.memory.usage`.\n * `io_direction` - Variant value for metric `system.network.io`.\n * `status_range` - Variant value for metric `nginx.http.response.count`.\n * `logical_number` - Variant value for metrics that return a processor number.\n * `outcome` - Variant value for metrics that return an outcome.\n",
"enum": [
"display_name",
"file_path",
@@ -8057,7 +9446,9 @@
"mode",
"state",
"io_direction",
- "status_range"
+ "status_range",
+ "logical_number",
+ "outcome"
],
"x-enum-varnames": [
"metric_dimension_display_name",
@@ -8076,13 +9467,17 @@
"metric_dimension_mode",
"metric_dimension_state",
"metric_dimension_io_direction",
- "metric_dimension_status_range"
+ "metric_dimension_status_range",
+ "metric_dimension_logical_number",
+ "metric_dimension_outcome"
]
},
"BaseMetricQueryRequest": {
"type": "object",
"required": [
- "metrics"
+ "metrics",
+ "start_time",
+ "resolution"
],
"properties": {
"metrics": {
@@ -8380,12 +9775,15 @@
},
{
"$ref": "#/components/schemas/MetricNginxHttpResponseCount"
+ },
+ {
+ "$ref": "#/components/schemas/MetricNginxHttpConnectionCount"
}
]
},
"MetricSystemCpuUtilization": {
"type": "string",
- "description": "Total system CPU utilization for 'system' or 'user', percentage. A filter differentiator is needed for specific mode(s).\n\nReplacement for depreciated variant(s):\n * system.cpu.system\n * system.cpu.user\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter differentiator:\n * mode (applicable filter values: 'system', 'user')\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n",
+ "description": "Total system CPU use for 'system' or 'user' (percent). A filter is required to specify the mode.\n\nReplaces deprecated variants:\n * system.cpu.system\n * system.cpu.user\n\nSupported aggregations:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter:\n * mode (valid values:: 'system', 'user')\n\nSupported catalog dimensions:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n * logical_number\n",
"enum": [
"system.cpu.utilization"
]
@@ -8411,6 +9809,13 @@
"system.cpu.logical.count"
]
},
+ "MetricNginxHttpConnectionCount": {
+ "type": "string",
+ "description": "Number of connections grouped by outcome ('ACCEPTED', 'DROPPED', 'ACTIVE', 'IDLE').\nSupported aggregations:\n * min\n * max\n * sum\n * avg\n * rate\n\nSupported catalog dimensions:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n * outcome\n",
+ "enum": [
+ "nginx.http.connection.count"
+ ]
+ },
"MetricSystemNetworkIo": {
"type": "string",
"description": "Network I/O statistics. Number of bytes sent or received per network interface. A filter differentiator is needed for specific I/O direction(s).\n\nReplacement for depreciated variant(s):\n * system.net.bytes_rcvd\n * system.net.bytes_sent\n\nAggregation(s) supported:\n * min\n * max\n * sum\n * avg\n * rate\n\nCatalog dimension filter differentiator:\n * io_direction (applicable filter values: 'transmit', 'receive')\n\nCatalog dimension(s) supported:\n * instance_object_id\n * csg_object_id\n * system_id\n * parent_hostname\n * display_name\n * nginx_id\n * network_interface\n",
@@ -8626,39 +10031,6 @@
"k8s.cluster.nodes"
]
},
- "NapPolicyEnforcementMode": {
- "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `blocking` - Any illegal or suspicious requests are logged and blocked.\n* `transparent` - Any illegal or suspicious requests are logged but not blocked.\n",
- "type": "string",
- "enum": [
- "blocking",
- "transparent"
- ],
- "x-enum-varnames": [
- "nap_enforcement_mode_blocking",
- "nap_enforcement_mode_transparent"
- ]
- },
- "NapDeploymentStatus": {
- "description": "The current enforcement mode of the NGINX App Protect policy, with the following possible values:\n* `deployed` - The NGINX App Protect policy has been deployed.\n* `not_deployed` - The NGINX App Protect policy has not been deployed.\n* `deploying` - The NGINX App Protect policy is currently being deployed.\n* `failed` - The NGINX App Protect policy failed deploying.\n",
- "type": "string",
- "enum": [
- "deployed",
- "not_deployed",
- "deploying",
- "failed"
- ],
- "x-enum-varnames": [
- "nap_deployment_status_deployed",
- "nap_deployment_status_not_deployed",
- "nap_deployment_status_deploying",
- "nap_deployment_status_failed"
- ]
- },
- "Version": {
- "description": "The version of the NGINX App Protect resource.",
- "type": "string",
- "example": "2023.12.06"
- },
"VersionsList": {
"type": "object",
"required": [
@@ -8669,21 +10041,18 @@
"description": "An array of versions.",
"type": "array",
"items": {
- "$ref": "#/components/schemas/Version"
+ "$ref": "#/components/schemas/NapSignatureVersion"
}
}
}
},
"ThreatCampaignVersionsListResponse": {
- "description": "List of Threat Campaign versions.",
"$ref": "#/components/schemas/VersionsList"
},
"AttackSignatureVersionsListResponse": {
- "description": "List of Attack Signature versions.",
"$ref": "#/components/schemas/VersionsList"
},
"BotSignatureVersionsListResponse": {
- "description": "List of Bot Signature versions.",
"$ref": "#/components/schemas/VersionsList"
},
"NapPolicy": {
@@ -8778,7 +10147,7 @@
"latest": {
"object_id": "pv_-uvR3F2TQGm18jnl7bpaGw",
"version": "2023-12-06 22:37:24",
- "created_on": "2023-12-06T22:37:24.120114Z",
+ "created_at": "2023-12-06T22:37:24.120114Z",
"deployment_status": "deployed",
"enforcement_mode": "blocking"
}
@@ -8839,7 +10208,7 @@
"$ref": "#/components/schemas/NapDeploymentStatus"
},
"deployed_on": {
- "description": "Date and time.",
+ "description": "Date and time of the deployment.",
"type": "string",
"format": "date-time"
}
@@ -8944,13 +10313,13 @@
"type": "object",
"properties": {
"threat_campaign_version": {
- "$ref": "#/components/schemas/Version"
+ "$ref": "#/components/schemas/NapSignatureVersion"
},
"attack_signature_version": {
- "$ref": "#/components/schemas/Version"
+ "$ref": "#/components/schemas/NapSignatureVersion"
},
"bot_signature_version": {
- "$ref": "#/components/schemas/Version"
+ "$ref": "#/components/schemas/NapSignatureVersion"
}
}
}
@@ -9018,19 +10387,19 @@
"object_id",
"version",
"enforcement_mode",
- "created_on"
+ "created_at"
],
"properties": {
"object_id": {
"$ref": "#/components/schemas/NapPolicyVersionObjectID"
},
"version": {
- "$ref": "#/components/schemas/Version"
+ "$ref": "#/components/schemas/NapSignatureVersion"
},
"enforcement_mode": {
"$ref": "#/components/schemas/NapPolicyEnforcementMode"
},
- "created_on": {
+ "created_at": {
"description": "The date and time when the NGINX App Protect policy version was created.",
"type": "string",
"format": "date-time"
@@ -9045,7 +10414,7 @@
"object_id",
"version",
"enforcement_mode",
- "created_on"
+ "created_at"
],
"allOf": [
{
@@ -9108,7 +10477,7 @@
{
"version": "2023-12-06 22:37:24",
"object_id": "pv_-uvR3F2TQGm18jnl7bpaGw",
- "created_on": "2023-12-06T22:37:24.120114Z",
+ "created_at": "2023-12-06T22:37:24.120114Z",
"enforcement_mode": "blocking",
"latest": false
}
@@ -9156,31 +10525,524 @@
}
}
}
- ]
+ ]
+ },
+ "NapLogProfileMetadata": {
+ "type": "object",
+ "required": [
+ "name",
+ "object_id"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the NGINX App Protect log profile."
+ },
+ "object_id": {
+ "$ref": "#/components/schemas/NapLogProfileObjectID"
+ },
+ "description": {
+ "description": "Optional field to describe the NGINX App Protect log profile.",
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 256
+ }
+ }
+ },
+ "NapGlobalSettingsListResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/PaginationResponse"
+ },
+ {
+ "type": "object",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "items": {
+ "description": "An array of NGINX App Protect global settings.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NapGlobalSettingMetadata"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "NapGlobalSettingGetResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NapGlobalSettingMetadata"
+ },
+ {
+ "type": "object",
+ "required": [
+ "config"
+ ],
+ "properties": {
+ "config": {
+ "description": "The NGINX App Protect global setting configuration.",
+ "type": "string"
+ }
+ }
+ }
+ ]
+ },
+ "NapGlobalSettingMetadata": {
+ "type": "object",
+ "required": [
+ "name",
+ "object_id"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the NGINX App Protect global setting object."
+ },
+ "description": {
+ "description": "Optional field to describe the NGINX App Protect global setting object.",
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 256
+ },
+ "object_id": {
+ "$ref": "#/components/schemas/NapGlobalSettingObjectID"
+ }
+ }
+ },
+ "NapPolicyBulkRequest": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NapPolicyBulkRequestData"
+ },
+ "minItems": 1,
+ "maxItems": 50,
+ "example": [
+ {
+ "object_id": "pol_-uvR3F2TQGm18jnl7bpaGw",
+ "action": "delete"
+ },
+ {
+ "object_id": "pol_PL0c1XodRemmzVEjiXSsTg",
+ "action": "delete"
+ }
+ ]
+ },
+ "NapPolicyBulkRequestData": {
+ "type": "object",
+ "description": "Part of bulk operation on a Nap policy, only `delete` is supported.",
+ "required": [
+ "action",
+ "object_id"
+ ],
+ "properties": {
+ "object_id": {
+ "$ref": "#/components/schemas/NapPolicyObjectID"
+ },
+ "action": {
+ "$ref": "#/components/schemas/BulkRequestAction"
+ }
+ },
+ "example": {
+ "object_id": "pol_-uvR3F2TQGm18jnl7bpaGw",
+ "action": "delete"
+ }
+ },
+ "NapBulkResponse": {
+ "description": "The Nap policy bulk outcome.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BulkRequestObjectStatus"
+ }
+ },
+ "NapSignatureMeta": {
+ "required": [
+ "signature_id",
+ "name",
+ "attack_type"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "signature_id": {
+ "type": "integer"
+ },
+ "attack_type": {
+ "type": "string"
+ }
+ }
+ },
+ "NapSignature": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NapSignatureMeta"
+ },
+ {
+ "type": "object",
+ "required": [
+ "description",
+ "signature_type",
+ "risk",
+ "accuracy",
+ "has_cve",
+ "modified_at",
+ "systems"
+ ],
+ "properties": {
+ "accuracy": {
+ "default": "low",
+ "enum": [
+ "high",
+ "low",
+ "medium"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_accuracy_high",
+ "nap_signature_accuracy_low",
+ "nap_signature_accuracy_medium"
+ ],
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "has_cve": {
+ "default": false,
+ "type": "boolean"
+ },
+ "modified_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the signature was last modified."
+ },
+ "references": {
+ "items": {
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "default": "nessus",
+ "enum": [
+ "bugtraq",
+ "cve",
+ "nessus",
+ "url"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_references_type_bugtrag",
+ "nap_signature_references_type_cve",
+ "nap_signature_references_type_nessus",
+ "nap_signature_references_type_url"
+ ],
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "risk": {
+ "default": "low",
+ "enum": [
+ "high",
+ "low",
+ "medium"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_risk_high",
+ "nap_signature_risk_low",
+ "nap_signature_risk_medium"
+ ],
+ "type": "string"
+ },
+ "signature_type": {
+ "default": "request",
+ "enum": [
+ "request",
+ "response"
+ ],
+ "type": "string",
+ "x-enum-varnames": [
+ "nap_signature_signature_type_request",
+ "nap_signature_signature_type_response"
+ ]
+ },
+ "systems": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ }
+ ],
+ "example": {
+ "signature_id": 123456789,
+ "name": "Example Signature",
+ "description": "This is an example signature.",
+ "signature_type": "request",
+ "attack_type": "SQL Injection",
+ "risk": "high",
+ "accuracy": "medium",
+ "has_cve": true,
+ "modified_at": "2023-10-01T12:00:00Z",
+ "references": [
+ {
+ "type": "cve",
+ "value": "CVE-2023-12345"
+ }
+ ],
+ "systems": [
+ "System A"
+ ]
+ }
},
- "NapLogProfileMetadata": {
+ "NapSignatureSet": {
"type": "object",
"required": [
+ "id",
"name",
- "object_id"
+ "signature_count",
+ "default_alarm",
+ "default_block",
+ "default_learn",
+ "modified_at"
],
"properties": {
+ "id": {
+ "type": "string"
+ },
"name": {
- "type": "string",
- "description": "The name of the NGINX App Protect log profile."
+ "type": "string"
},
- "object_id": {
- "$ref": "#/components/schemas/NapLogProfileObjectID"
+ "signature_count": {
+ "type": "integer"
},
- "description": {
- "description": "Optional field to describe the NGINX App Protect log profile.",
+ "assign_to_policy_by_default": {
+ "default": false,
+ "type": "boolean"
+ },
+ "category": {
+ "default": "User-defined",
+ "type": "string"
+ },
+ "default_alarm": {
+ "default": true,
+ "type": "boolean"
+ },
+ "default_block": {
+ "default": true,
+ "type": "boolean"
+ },
+ "default_learn": {
+ "default": true,
+ "type": "boolean"
+ },
+ "filter": {
+ "properties": {
+ "accuracy_filter": {
+ "default": "ge",
+ "enum": [
+ "all",
+ "eq",
+ "ge",
+ "le"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_accuracy_filter_all",
+ "nap_signature_set_accuracy_filter_eq",
+ "nap_signature_set_accuracy_filter_ge",
+ "nap_signature_set_accuracy_filter_le"
+ ],
+ "type": "string"
+ },
+ "accuracy_value": {
+ "default": "all",
+ "enum": [
+ "all",
+ "high",
+ "low",
+ "medium"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_accuracy_value_all",
+ "nap_signature_set_accuracy_value_high",
+ "nap_signature_set_accuracy_value_low",
+ "nap_signature_set_accuracy_value_medium"
+ ],
+ "type": "string"
+ },
+ "attack_type": {
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "has_cve": {
+ "default": "all",
+ "enum": [
+ "all",
+ "no",
+ "yes"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_have_cve_all",
+ "nap_signature_set_filter_have_cve_no",
+ "nap_signature_set_filter_have_cve_yes"
+ ],
+ "type": "string"
+ },
+ "modified_at_filter": {
+ "default": "all",
+ "enum": [
+ "after",
+ "all",
+ "before"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_modified_at_filter_after",
+ "nap_signature_set_filter_modified_at_filter_all",
+ "nap_signature_set_filter_modified_at_filter_before"
+ ],
+ "type": "string"
+ },
+ "modified_at_value": {
+ "default": "1970-01-01",
+ "type": "string"
+ },
+ "risk_filter": {
+ "default": "eq",
+ "enum": [
+ "all",
+ "eq",
+ "ge",
+ "le"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_risk_filter_all",
+ "nap_signature_set_filter_risk_filter_eq",
+ "nap_signature_set_filter_risk_filter_ge",
+ "nap_signature_set_filter_risk_filter_le"
+ ],
+ "type": "string"
+ },
+ "risk_value": {
+ "default": "low",
+ "enum": [
+ "all",
+ "high",
+ "low",
+ "medium"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_risk_value_all",
+ "nap_signature_set_filter_risk_value_high",
+ "nap_signature_set_filter_risk_value_low",
+ "nap_signature_set_filter_risk_value_medium"
+ ],
+ "type": "string"
+ },
+ "signature_type": {
+ "default": "request",
+ "enum": [
+ "all",
+ "request",
+ "response"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_signature_type_all",
+ "nap_signature_set_filter_signature_type_request",
+ "nap_signature_set_filter_signature_type_response"
+ ],
+ "type": "string"
+ },
+ "user_defined_filter": {
+ "default": "all",
+ "enum": [
+ "all",
+ "no",
+ "yes"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_filter_user_defined_filter_all",
+ "nap_signature_set_filter_user_defined_filter_no",
+ "nap_signature_set_filter_user_defined_filter_yes"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "modified_at": {
"type": "string",
- "minLength": 5,
- "maxLength": 256
+ "format": "date-time",
+ "description": "The date and time when the signature-set was last modified."
+ },
+ "systems": {
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "type": "array"
+ },
+ "type": {
+ "default": "filter-based",
+ "enum": [
+ "filter-based",
+ "manual"
+ ],
+ "x-enum-varnames": [
+ "nap_signature_set_type_filter_based",
+ "nap_signature_set_type_manual"
+ ],
+ "type": "string"
}
+ },
+ "example": {
+ "default_block": true,
+ "default_learn": true,
+ "signature_count": 0,
+ "filter": {
+ "accuracy_value": "all",
+ "accuracy_filter": "all",
+ "attack_type": {
+ "name": "XML External Entities (XXE)"
+ },
+ "risk_filter": "all",
+ "has_cve": "all",
+ "user_defined_filter": "all",
+ "risk_value": "all",
+ "modified_at_filter": "all",
+ "signature_type": "request"
+ },
+ "assign_to_policy_by_default": false,
+ "default_alarm": true,
+ "type": "filter-based",
+ "name": "XML External Entities (XXE) Signatures",
+ "id": "sigset_-ZMshmi83MBL97dr5d0a9w",
+ "category": "User-defined",
+ "modified_at": "2023-08-10T16:59:15Z",
+ "systems": []
}
},
- "NapGlobalSettingsListResponse": {
+ "NapSignatureListResponse": {
"allOf": [
{
"$ref": "#/components/schemas/PaginationResponse"
@@ -9192,78 +11054,87 @@
],
"properties": {
"items": {
- "description": "An array of NGINX App Protect global settings.",
+ "description": "An array of NGINX App Protect signatures.",
"type": "array",
"items": {
- "$ref": "#/components/schemas/NapGlobalSettingMetadata"
+ "$ref": "#/components/schemas/NapSignature"
}
}
}
}
]
},
- "NapGlobalSettingGetResponse": {
+ "NapSignatureSetListResponse": {
"allOf": [
{
- "$ref": "#/components/schemas/NapGlobalSettingMetadata"
+ "$ref": "#/components/schemas/PaginationResponse"
},
{
"type": "object",
"required": [
- "config"
+ "items"
],
"properties": {
- "config": {
- "description": "The NGINX App Protect global setting configuration.",
- "type": "string"
+ "items": {
+ "description": "An array of NGINX App Protect signature sets.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NapSignatureSet"
+ }
}
}
}
]
},
- "NapGlobalSettingMetadata": {
- "type": "object",
- "required": [
+ "FilterNameNapPolicy": {
+ "type": "string",
+ "description": "Keywords for NGINX App Protect policy filters.\nWhen filtering on `enforcement_mode`, only the following `filter_values` are supported:\n * blocking\n * transparent\nWhen filtering on `object_id`, both NAP Policy and NAP Policy version object id prefixes are supported.\n",
+ "enum": [
"name",
- "object_id"
+ "enforcement_mode",
+ "object_id",
+ "deployment_enforcement_mode",
+ "deployment_status"
],
- "properties": {
- "name": {
- "type": "string",
- "description": "The name of the NGINX App Protect global setting object."
- },
- "description": {
- "description": "Optional field to describe the NGINX App Protect global setting object.",
- "type": "string",
- "minLength": 5,
- "maxLength": 256
- },
- "object_id": {
- "$ref": "#/components/schemas/NapGlobalSettingObjectID"
- }
- }
+ "x-enum-varnames": [
+ "filter_name_nap_policy_name",
+ "filter_name_nap_policy_enforcement_mode",
+ "filter_name_nap_policy_object_id",
+ "filter_name_nap_policy_deployment_enforcement_mode",
+ "filter_name_nap_policy_deployment_status"
+ ]
},
- "NapPolicyObjectID": {
- "description": "A globally unique identifier for the App Protect policy.",
+ "FilterNameNapPolicyDeployment": {
"type": "string",
- "format": "object_id",
- "pattern": "^pol_.*",
- "x-go-type": "objects.ID",
- "x-go-type-import": {
- "name": "objects",
- "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
- }
+ "description": "Keywords for NGINX App Protect deployment filters.\nWhen filtering on `type`, only the following `filter_values` are supported:\n * instance\n * config_sync_group\nWhen filtering on `status`, only the following `filter_values` are supported:\n * deployed\n * deploying\n * failed\n",
+ "enum": [
+ "name",
+ "type",
+ "policy_version",
+ "status",
+ "object_id"
+ ],
+ "x-enum-varnames": [
+ "filter_name_nap_deployment_name",
+ "filter_name_nap_deployment_type",
+ "filter_name_nap_deployment_policy_version",
+ "filter_name_nap_deployment_status",
+ "filter_name_nap_deployment_object_id"
+ ]
},
- "NapPolicyVersionObjectID": {
- "description": "A globally unique identifier for the App Protect policy version.",
+ "FilterNameNapPolicyVersion": {
"type": "string",
- "format": "object_id",
- "pattern": "^pv_.*",
- "x-go-type": "objects.ID",
- "x-go-type-import": {
- "name": "objects",
- "path": "gitlab.com/f5/nginx/one/saas/control-plane/pkg/collections/objects"
- }
+ "description": "Keywords for NGINX App Protect policy version filters.\nWhen filtering on `deployment_status`, only the following `filter_values` are supported:\n * deployed\n * not_deployed\n * deploying\n * failed\nWhen filtering on `enforcement_mode`, only the following `filter_values` are supported:\n * blocking\n * transparent\n",
+ "enum": [
+ "deployment_status",
+ "enforcement_mode",
+ "object_id"
+ ],
+ "x-enum-varnames": [
+ "filter_name_nap_policy_version_deployment_status",
+ "filter_name_nap_policy_version_enforcement_mode",
+ "filter_name_nap_policy_version_object_id"
+ ]
},
"NapLogProfileObjectID": {
"description": "A globally unique identifier for the App Protect log profile.",
@@ -9303,7 +11174,8 @@
"revoked": false,
"name": "my-data-plane-key",
"object_id": "key_wN3IhLCmR3qmwybG_6ptEg",
- "instances_count": 3
+ "instances_count": 3,
+ "control_planes_count": 1
},
{
"expires_at": "2023-12-01T00:00:00Z",
@@ -9312,7 +11184,8 @@
"revoked": false,
"name": "my-data-plane-key",
"object_id": "key_Tet21AeYTHCj7taOwVfzyw",
- "instances_count": 3
+ "instances_count": 3,
+ "control_planes_count": 1
}
]
}
@@ -9339,13 +11212,57 @@
"revoked": false,
"name": "my-data-plane-key",
"object_id": "key_wN3IhLCmR3qmwybG_6ptEg",
- "instances_count": 3
+ "instances_count": 3,
+ "control_planes_count": 1
+ }
+ },
+ "ConfigSyncGroupDetails": {
+ "value": {
+ "object_id": "csg_-uvR3F2TQGm18jnl7bpaGw",
+ "name": "test-config-sync-group",
+ "config_status": "in_sync",
+ "config_version": "uvR3F2TQGm18jnl7bpaGw",
+ "created_at": "2023-12-06T22:37:24.120114Z",
+ "instances": [
+ {
+ "object_id": "inst_-uvR3F2TQGm18jnl7bpaGw",
+ "hostname": "816e3c194d59",
+ "system_id": "6066aad2-211e-3718-be5d-fcc01ffc5cc8",
+ "agent_version": "v2.33.0",
+ "registered_at": "2024-05-16T18:26:40.556048Z",
+ "last_reported": "2023-12-06T22:37:24.120114Z",
+ "status": "unavailable",
+ "nginx_build": {
+ "conf_path": "/etc/nginx/nginx.conf",
+ "version": "1.25.3"
+ },
+ "os_version": "Ubuntu 22.04",
+ "nginx_id": "b636d4376dea15405589692d3c5d3869ff3a9b26b0e7bb4bb1aa7e658ace1437",
+ "config_status": "in_sync",
+ "config_version": "abc123def456"
+ }
+ ],
+ "certs": [
+ {
+ "subject_name": "test.com",
+ "name": "client",
+ "cert_type": "cert_key",
+ "not_after": "2024-01-06T00:01:30Z",
+ "not_before": "2023-12-07T00:01:30Z",
+ "cert_paths": [
+ "/etc/nginx/client.pem"
+ ],
+ "cert_status": "expiring",
+ "deployment_status": "latest",
+ "object_id": "cert_Tet21AeYTHCj7taOwVfzyw"
+ }
+ ]
}
}
},
"responses": {
- "InvalidRequest": {
- "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "Unauthorized": {
+ "description": "Client is not authorized to perform the requested operation.",
"content": {
"application/json": {
"schema": {
@@ -9363,6 +11280,26 @@
}
}
}
+ },
+ "NotFound": {
+ "description": "Requested resource was not found.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
+ },
+ "InvalidRequest": {
+ "description": "Request cannot be processed due to invalid input or parameters. Verify the request format and provided data.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ }
+ }
}
},
"securitySchemes": {
@@ -9388,7 +11325,8 @@
"Certificates",
"CVEs",
"Events",
- "Staged Configs"
+ "Staged Configs",
+ "Control Planes"
]
},
{
@@ -9402,6 +11340,12 @@
"tags": [
"Settings"
]
+ },
+ {
+ "name": "NGINX One App Protect",
+ "tags": [
+ "NGINX App Protect"
+ ]
}
]
}
\ No newline at end of file
diff --git a/static/nginx-one/images/ai-assistant.png b/static/nginx-one/images/ai-assistant.png
new file mode 100644
index 000000000..df28268b1
Binary files /dev/null and b/static/nginx-one/images/ai-assistant.png differ
diff --git a/static/nginx-one/images/config-recommendation.png b/static/nginx-one/images/config-recommendation.png
new file mode 100644
index 000000000..e02179d20
Binary files /dev/null and b/static/nginx-one/images/config-recommendation.png differ
diff --git a/static/nginx-one/images/config-sync-edits.png b/static/nginx-one/images/config-sync-edits.png
new file mode 100644
index 000000000..f8a47580c
Binary files /dev/null and b/static/nginx-one/images/config-sync-edits.png differ
diff --git a/static/nginx-one/images/config-sync-status.png b/static/nginx-one/images/config-sync-status.png
new file mode 100644
index 000000000..272f36963
Binary files /dev/null and b/static/nginx-one/images/config-sync-status.png differ
diff --git a/static/nginx-one/images/unavailable-instances.png b/static/nginx-one/images/unavailable-instances.png
new file mode 100644
index 000000000..8414825dc
Binary files /dev/null and b/static/nginx-one/images/unavailable-instances.png differ
diff --git a/static/nginx/images/nginx-plus-dashboard-r35-overview.png b/static/nginx/images/nginx-plus-dashboard-r35-overview.png
new file mode 100644
index 000000000..86503c6d9
Binary files /dev/null and b/static/nginx/images/nginx-plus-dashboard-r35-overview.png differ
diff --git a/static/scripts/license_usage_offline.sh b/static/scripts/license_usage_offline.sh
index be2cd3a65..f94391c9d 100755
--- a/static/scripts/license_usage_offline.sh
+++ b/static/scripts/license_usage_offline.sh
@@ -4,6 +4,26 @@
set -euo pipefail
IFS=$'\n\t'
+# Debug mode
+if [[ "${DEBUG:-false}" == "true" ]]; then
+ set -x # Enable command tracing
+ echo "Debug mode enabled"
+ echo "Running in directory: $(pwd)"
+ echo "Script arguments: $*"
+ env | grep -E 'JWT_FILE|NIM_IP|USERNAME|PASSWORD|USE_CASE'
+fi
+
+# Set timeouts for operations
+CURL_TIMEOUT=${CURL_TIMEOUT:-30}
+API_POLL_TIMEOUT=${API_POLL_TIMEOUT:-60}
+
+# Function to log with timestamp
+log() {
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
+}
+
+log "Script started"
+
# Function to display usage
usage() {
echo "Usage: $0 -j -i -u -p -s "
@@ -44,7 +64,6 @@ if [ ! -d "/tmp" ]; then
mkdir -p /tmp || { echo "Failed to create /tmp directory. Exiting."; exit 1; }
fi
-
# Read JWT contents
if [ ! -f "$JWT_FILE" ]; then
echo -e "JWT file '$JWT_FILE' not found.$" >&2
@@ -84,17 +103,22 @@ is_ipv4() {
return 1
fi
}
+echo "Checking connectivity to NGINX Instance Manager using Curl ..."
+if ! curl -sk --output /dev/null --silent --fail --max-time $CURL_TIMEOUT "https://$NIM_IP"; then
+ echo -e "The NGINX Instance Manager UI is not reachable on $NIM_IP"
+ exit 1
+fi
+echo "Checking connectivity to F5 licensing server..."
+SERVER_RESPONSE=$(curl -v --max-time $CURL_TIMEOUT https://product.apis.f5.com 2>&1)
-if is_ipv4 "$NIM_IP"; then
- check_ping "$NIM_IP"
+# Check if the server is reachable by verifying connection was established
+if echo "$SERVER_RESPONSE" | grep -q "Connected to product.apis.f5.com" && echo "$SERVER_RESPONSE" | grep -q "server accepted"; then
+ echo -e "The licensing server is reachable on product.apis.f5.com"
else
- echo "Checking connectivity to NGINX Instance Manager using Curl ..."
- if ! curl -sk --output /dev/null --silent --fail "https://$NIM_IP"; then
- echo -e "The NGINX Instance Manager UI is not reachable on $NIM_IP"
- exit 1
- fi
-fi
-check_ping "product.apis.f5.com"
+ echo -e "The licensing server is not reachable on product.apis.f5.com"
+ echo -e "Connection details: $SERVER_RESPONSE"
+ exit 1
+fi
# NGINX Instance Manager Version check
VERSION_JSON=$(curl -sk -X GET "https://$NIM_IP/api/platform/v1/modules/versions" \
@@ -102,7 +126,6 @@ VERSION_JSON=$(curl -sk -X GET "https://$NIM_IP/api/platform/v1/modules/versions
--header "Authorization: Basic $AUTH_HEADER")
NIM_VER=$(echo "$VERSION_JSON" | sed -E 's/.*"nim"[ \t]*:[ \t]*"([0-9]+\.[0-9]+)(\.[0-9]+)?".*/\1/')
echo "Current version of NGINX Instance Manager is $NIM_VER"
-JWT_CONTENT=$(<"$JWT_FILE")
# Construct JSON payload
JSON_PAYLOAD=$(cat <&2
- exit 1
- fi
- # Step 1: Apply JWT license (only if use case is 'initial' or 'intial_only')
echo "Applying JWT license"
+ sleep 5
RESPONSE=$(curl -sS -k --max-time 10 -w "\n%{http_code}" -X POST "https://$NIM_IP/api/platform/v1/license?telemetry=true" \
-H "Origin: $ORIGIN" \
-H "Referer: $REFERER" \
@@ -165,12 +181,9 @@ if [[ "$USE_CASE" == "initial" ]]; then
HTTP_BODY=$(echo "$RESPONSE" | sed '$d')
HTTP_STATUS=$(echo "$RESPONSE" | tail -n1)
if [ "$HTTP_STATUS" -ne 202 ]; then
- echo -e "HTTP request failed with status code $HTTP_STATUS.
- Response: $HTTP_BODY$" >&2
+ echo -e "HTTP request failed with status code $HTTP_STATUS.\nResponse: $HTTP_BODY$" >&2
if echo "$HTTP_BODY" | jq -r '.message' | grep -q "failed to register token. already registered"; then
- echo -e "NGINX Instance Manager already registered and licensed.
- If needed, terminate the current license manually in the NGINX Instance Manager UI and re-run the script with the correct license.
- https://docs.nginx.com/nginx-instance-manager/disconnected/add-license-disconnected-deployment/"
+ echo -e "NGINX Instance Manager is already licensed.\nTo use a different license, remove the current one in the NGINX Instance Manager UI, then re-run the script.\nSee https://docs.nginx.com/nginx-instance-manager/disconnected/add-license-disconnected-deployment/ for details."
fi
exit 1
fi
@@ -179,12 +192,11 @@ fi
if [[ "$NIM_VER" < "2.18" ]]; then
echo "NGINX Instance Manager version $NIM_VER is not supported by this script. Please use NGINX Instance Manager 2.18 or later"
exit 1
-
elif [[ "$NIM_VER" == "2.18" ]] || [[ "$NIM_VER" == "2.19" ]]; then
echo "NGINX Instance Manager version $NIM_VER detected."
ORIGIN="https://$NIM_IP"
-# Send the PUT request and separate body and status code
+ # Send the PUT request and separate body and status code
PUT_RESPONSE_CODE=$(curl -k -s -w "%{http_code}" -o /tmp/put_response.json --location --request PUT "https://$NIM_IP/api/platform/v1/license?telemetry=true" \
--header "Origin: $ORIGIN" \
--header "Referer: https://$NIM_IP/ui/settings/license" \
@@ -223,7 +235,6 @@ elif [[ "$NIM_VER" == "2.18" ]] || [[ "$NIM_VER" == "2.19" ]]; then
fi
if [[ "$USE_CASE" != "telemetry" ]]; then
-
RESPONSE=$(curl -sS -k --max-time 10 -w "\n%{http_code}" -X POST "https://$NIM_IP/api/platform/v1/license?telemetry=true" \
-H "Origin: $ORIGIN" \
-H "Referer: $REFERER" \
@@ -237,8 +248,7 @@ if [[ "$USE_CASE" != "telemetry" ]]; then
echo -e "License applied successfully in DISCONNECTED mode."
fi
-
-
+sleep 5
# Continue with further steps for version >= 2.20...
echo "Executing telemetry tasks "
# Step 2: Download the usage report
@@ -263,27 +273,25 @@ if [[ "$NIM_VER" == "2.18" ]] || [[ "$NIM_VER" == "2.19" ]]; then
--header 'accept: */*' \
--header 'authorization: Basic $AUTH_HEADER' \
--output \"$report_save_path\""
+
if [ "$USE_CASE" == "telemetry" ]; then
echo "Running telemetry stage: "
-
# Run the saved command and store the response
response=$(eval $prepare_usage_command)
-
sleep 2
# Validate if the response contains "Report generation in progress"
- if echo "$response" | grep -q '"telemetry":"Report generation in progress"'; then
+ if echo "$response" | grep -q '"telemetry":"Report generation in progress"'; then
echo -e "Success: Report generation is in progress."
else
echo -e "Failure: Report generation not in progress or unexpected response."
exit 1
- fi
-
- echo "Running command: $download_usage_command"
- eval $download_usage_command
- else
- echo "Running command: $download_usage_command"
- eval $download_usage_command
- fi
+ fi
+ echo "Running command: $download_usage_command"
+ eval $download_usage_command
+ else
+ echo "Running command: $download_usage_command"
+ eval $download_usage_command
+ fi
fi
else
# Perform the request and capture the status code and output
@@ -296,24 +304,19 @@ else
# Extract the HTTP status code (last line)
HTTP_STATUS=$(echo "$HTTP_RESPONSE" | tail -n1)
- # Check the status code
+ # Check the status code
if [ "$HTTP_STATUS" -ne 200 ]; then
echo -e "Failed to download usage report from NGINX Instance Manager. HTTP Status Code: $HTTP_STATUS" >&2
echo "Please verify that NGINX Instance Manager is reachable and the credentials are correct." >&2
echo "(or) Verify that NGINX Instance Manager is licensed before using the 'telemetry' flag (run it with 'initial' first)."
- # Optionally, remove the partial or corrupt file
- rm -f /tmp/response.zip
exit 1
fi
fi
echo -e "Usage report downloaded successfully as '/tmp/response.zip'."
-
# Step 3: Upload the usage report to F5 server
echo "Uploading the usage report to F5 Licensing server"
-
TEEM_UPLOAD_URL="https://product.apis.f5.com/ee/v1/entitlements/telemetry/bulk"
-
# Capture both response body and status code
UPLOAD_RESULT=$(curl -sS -w "\n%{http_code}" --location "$TEEM_UPLOAD_URL" \
--header "Authorization: Bearer $JWT_CONTENT" \
@@ -338,7 +341,6 @@ fi
# Extract the statusLink
STATUS_LINK=$(echo "$UPLOAD_BODY" | jq -r '.statusLink // empty')
-
if [ -z "$STATUS_LINK" ]; then
echo -e "Failed to extract statusLink from the upload response. Response: $UPLOAD_BODY$" >&2
exit 1
@@ -425,7 +427,6 @@ echo -e "Report validated successfully. All conditions met."
# Step 5: Download the report from F5
echo "Downloading report from F5 License server..."
-
DOWNLOAD_URL="https://product.apis.f5.com/ee/v1/entitlements/telemetry/bulk/download/$STATUS_ID"
DOWNLOAD_RESPONSE=$(curl -sS -w "%{http_code}" --location "$DOWNLOAD_URL" \
--header "Authorization: Bearer $JWT_CONTENT" \
@@ -442,7 +443,6 @@ echo -e "Report downloaded successfully from F5 as '/tmp/response_teem.zip'."
# Step 6: Upload the acknowledgement report to NGINX Instance Manager
echo "Uploading the license acknowledgement to NGINX Instance Manager..."
-
UPLOAD_URL="https://$NIM_IP/api/platform/v1/report/upload"
UPLOAD_RESPONSE=$(curl -k -sS --location "$UPLOAD_URL" \
--header "Authorization: Basic $AUTH_HEADER" \
@@ -468,3 +468,4 @@ if [ "$UPLOAD_MESSAGE" != "Report uploaded successfully." ] || [ "$HTTP_STATUS"
fi
echo -e "Acknowledgement uploaded successfully to NGINX Instance Manager."
+
diff --git a/static/workshops/nginx-one/lab2/compose.yaml b/static/workshops/nginx-one/lab2/compose.yaml
new file mode 100644
index 000000000..65f2d30cb
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/compose.yaml
@@ -0,0 +1,187 @@
+# NGINX Plus / OSS with NGINX Agent
+# NGINX webservers with ingress-demo pages
+# NGINX One Console Instance Registration
+# NGINX Basics, Dec 2024
+# Chris Akker, Shouvik Dutta, Adam Currier
+#
+services:
+ plus1: # Alpine NGINX Plus Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey From One Console
+ # NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
+ hostname: $NAME-plus1
+ container_name: $NAME-plus1
+ image: private-registry.nginx.com/nginx-plus/agent:nginx-plus-r32-alpine-3.20-20240613 # CVE - From Nginx Private Registry
+ volumes: # Sync these folders to container
+ - ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - 80:80 # Open for HTTP
+ - 443:443 # Open for HTTPS
+ - 9000:9000 # Open for stub status page
+ - 9113:9113 # Open for Prometheus Scraper page
+ restart: always
+ #
+ plus2: # Alpine NGINX Plus Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ # NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
+ hostname: $NAME-plus2
+ container_name: $NAME-plus2
+ image: private-registry.nginx.com/nginx-plus/agent:nginx-plus-r31-alpine-3.19-20240522 # CVE - From Nginx Private Registry
+ volumes: # Sync these folders to container
+ - ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ - '9000' # Open for API / Dashboard page
+ - '9113' # Open for Prometheus Scraper page
+ restart: always
+ #
+ plus3: # RHEL UBI NGINX Plus Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ # NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
+ hostname: $NAME-plus3
+ container_name: $NAME-plus3
+ image: private-registry.nginx.com/nginx-plus/agent:nginx-plus-r31-ubi-9-20240522 # From Nginx Private Registry
+ volumes: # Sync these folders to container
+ - ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ - '9000' # Open for API / Dashboard page
+ - '9113' # Open for Prometheus Scraper page
+ restart: always
+ #
+ # plus4: # Debian R34 NGINX Plus Web / Load Balancer
+ # environment:
+ # NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ # NGINX_AGENT_SERVER_GRPCPORT: '443'
+ # NGINX_AGENT_TLS_ENABLE: 'true'
+ # NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ # NGINX_LICENSE_JWT: $JWT
+ # NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
+ # hostname: $NAME-plus4
+ # container_name: $NAME-plus4
+ # image: private-registry.nginx.com/nginx-plus/agent:debian # From NGINX Private Registry R34
+ # volumes: # Sync these folders to container
+ # - ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ # - ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
+ # - ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
+ # - ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
+ # ports:
+ # - '80' # Open for HTTP
+ # - '443' # Open for HTTPS
+ # - '9000' # Open for API / Dashboard page
+ # - '9113' # Open for Prometheus Scraper page
+ # restart: always
+ #
+ oss1: # Debian NGINX OSS Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ hostname: $NAME-oss1
+ container_name: $NAME-oss1
+ image: docker-registry.nginx.com/nginx/agent:mainline # From Docker Public Registry
+ volumes: # Sync these folders to container
+ - ./nginx-oss/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-oss/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-oss/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-oss/etc/ssl/nginx:/etc/ssl/nginx
+ - ./nginx-oss/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ - '9000' # Open for stub status page
+ - '9113' # Open for Prometheus Scraper page
+ restart: always
+ #
+ oss2: # Alpine NGINX OSS Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ hostname: $NAME-oss2
+ container_name: $NAME-oss2
+ image: docker-registry.nginx.com/nginx/agent:alpine # From Docker Public Registry
+ volumes: # Sync these folders to container
+ - ./nginx-oss/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-oss/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-oss/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-oss/etc/ssl/nginx:/etc/ssl/nginx
+ - ./nginx-oss/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ - '9000' # Open for stub status page
+ - '9113' # Open for Prometheus Scraper page
+ restart: always
+ #
+ oss3: # Older Alpine NGINX OSS Web / Load Balancer
+ environment:
+ NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
+ NGINX_AGENT_SERVER_GRPCPORT: '443'
+ NGINX_AGENT_TLS_ENABLE: 'true'
+ NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
+ hostname: $NAME-oss3
+ container_name: $NAME-oss3
+ image: docker-registry.nginx.com/nginx/agent:1.26-alpine # From Docker Public Registry
+ volumes: # Sync these folders to container
+ - ./nginx-oss/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
+ - ./nginx-oss/etc/nginx/conf.d:/etc/nginx/conf.d
+ - ./nginx-oss/etc/nginx/includes:/etc/nginx/includes
+ - ./nginx-oss/etc/ssl/nginx:/etc/ssl/nginx
+ - ./nginx-oss/usr/share/nginx/html:/usr/share/nginx/html
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ - '9000' # Open for stub status page
+ - '9113' # Open for Prometheus Scraper page
+ restart: always
+ #
+ web1:
+ hostname: $NAME-web1
+ container_name: $NAME-web1
+ platform: linux/amd64
+ image: nginxinc/ingress-demo # Image from Docker Hub
+ ports:
+ - '80' # Open for HTTP
+ - '443' # Open for HTTPS
+ web2:
+ hostname: $NAME-web2
+ container_name: $NAME-web2
+ platform: linux/amd64
+ image: nginxinc/ingress-demo
+ ports:
+ - '80'
+ - '433'
+ web3:
+ hostname: $NAME-web3
+ container_name: $NAME-web3
+ platform: linux/amd64
+ image: nginxinc/ingress-demo
+ ports:
+ - '80'
+ - '443'
+
diff --git a/static/workshops/nginx-one/lab2/generate_certs.sh b/static/workshops/nginx-one/lab2/generate_certs.sh
new file mode 100755
index 000000000..4ea736e4f
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/generate_certs.sh
@@ -0,0 +1,7 @@
+echo "Generate 1-day cert."
+openssl req -x509 -nodes -days 1 -newkey rsa:2048 -keyout nginx-oss/etc/ssl/nginx/1-day.key -out nginx-oss/etc/ssl/nginx/1-day.crt -subj "/CN=$NAME-NginxOneWorkshop"
+echo "Generate 30-day cert."
+openssl req -x509 -nodes -days 30 -newkey rsa:2048 -keyout nginx-oss/etc/ssl/nginx/30-day.key -out nginx-oss/etc/ssl/nginx/30-day.crt -subj "/CN=$NAME-NginxOneWorkshop"
+echo "copy certs to lab5 for future labs"
+cp nginx-oss/etc/ssl/nginx/1-day.* ../lab5/nginx-oss/etc/ssl/nginx/
+cp nginx-oss/etc/ssl/nginx/30-day.* ../lab5/nginx-oss/etc/ssl/nginx/
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/cafe.example.com.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/cafe.example.com.conf
new file mode 100644
index 000000000..3af707162
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/cafe.example.com.conf
@@ -0,0 +1,27 @@
+# cafe.example.com HTTP
+server {
+ # Listening on port 80 on all IP addresses on this machine
+ listen 80;
+
+ server_name cafe.example.com;
+
+ # status_zone cafe-VirtualServer;
+
+ # Server specific logging
+ access_log /var/log/nginx/cafe.example.com.log main_ext;
+ error_log /var/log/nginx/cafe.example.com_error.log info;
+
+ location / {
+
+ proxy_buffering off;
+
+ # Including best-practice headers are bonus points
+ include includes/proxy_headers.conf;
+ include includes/keepalive.conf;
+
+ # status_zone /;
+
+ proxy_pass http://nginx_cafe;
+ }
+
+}
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/stub_status.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/stub_status.conf
new file mode 100644
index 000000000..f8d249650
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/stub_status.conf
@@ -0,0 +1,19 @@
+# ngx_http_stub_status_module (Available in NGINX OSS)
+# provides Basic Status information http://nginx.org/en/docs/http/ngx_http_stub_status_module.html
+
+server {
+ listen 9000 ssl; # Listener for Stub Status
+
+ ssl_certificate /etc/ssl/nginx/30-day.crt;
+ ssl_certificate_key /etc/ssl/nginx/30-day.key;
+
+ location /basic_status {
+ stub_status;
+ }
+
+ # Redirect requests for "/" to "/basic_status"
+ location / {
+ return 301 /basic_status;
+ }
+
+}
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/tls-cars.example.com.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/tls-cars.example.com.conf
new file mode 100644
index 000000000..183534dd9
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/tls-cars.example.com.conf
@@ -0,0 +1,54 @@
+# cars.example.com HTTP/HTTPS
+# NGINX Basics Workshop
+# Nov 2024, Chris Akker, Shouvik Dutta, Adam Currier
+#
+server {
+
+ listen 443 ssl; # Uncomment to change to port 443, add "ssl" parameter for terminating TLS on all IP addresses on this machine
+
+ server_name cars.example.com; # Set hostname to match in request
+
+# Update the following lines for NGINX cert and key directives and file locations
+
+ ssl_certificate /etc/ssl/nginx/cars.crt;
+ ssl_certificate_key /etc/ssl/nginx/cars.key;
+
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_ciphers HIGH:!aNULL:3DES;
+ ssl_prefer_server_ciphers on;
+
+ access_log /var/log/nginx/cars.example.com.log main;
+
+ error_log /var/log/nginx/cars.example.com_error.log info;
+
+ root /usr/share/nginx/html; # Set the root folder for the HTML and JPG files
+
+ location / {
+
+ default_type text/html;
+ return 200 "Let's go fast, you have reached cars.example.com, path $uri\n";
+ }
+
+ location /gtr {
+
+ try_files $uri $uri.html; # Look for filename that matches the URI requested
+ }
+
+ location /nsx {
+
+ try_files $uri $uri.html;
+ }
+
+ location /rcf {
+
+ try_files $uri $uri.html;
+ }
+
+ location /browse { # new URL path
+
+ alias /usr/share/nginx/html; # Browse this folder
+ index index.html; # Use this file, but if it does *not* exist
+ autoindex on; # Perform directory/file browsing
+ }
+
+}
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/upstreams.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/upstreams.conf
new file mode 100644
index 000000000..8570729c4
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/conf.d/upstreams.conf
@@ -0,0 +1,34 @@
+# NGINX Basics, Plus Proxy to three upstream NGINX containers
+# Nov 2024 - Chris Akker, Shouvik Dutta, Adam Currier
+# nginx_cafe servers
+#
+upstream nginx_cafe { # Upstream block, the name is "nginx_cafe"
+
+ # Uncomment the zone directive below to add metrics to the Dashboard
+ # zone nginx_cafe 256k;
+
+ # Load Balancing Algorithms supported by NGINX
+ # - Round Robin (Default if nothing specified)
+ # - Least Connections
+ # - IP Hash
+ # - Hash (Any generic Hash)
+
+ # Load Balancing Algorithms supported by NGINX Plus
+ # - Least Time Last Byte / Header
+ # - Random Two
+
+ # Uncomment for Least-Time Last-Byte algorithm
+ # least_time last_byte;
+
+ # From Docker-Compose:
+ server web1:80;
+ server web2:80;
+ server web3:80;
+
+ # Uncomment for Cookie persistence
+ # sticky cookie srv_id expires=1m domain=.example.com path=/;
+
+ # Uncomment for keepalive TCP connections to upstreams
+ keepalive 16;
+
+}
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/keepalive.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/keepalive.conf
new file mode 100644
index 000000000..a9fbcf4ad
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/keepalive.conf
@@ -0,0 +1,9 @@
+# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
+proxy_http_version 1.1;
+
+# Remove the Connection header if the client sends it,
+# it could be "close" to close a keepalive connection
+proxy_set_header Connection "";
+
+# Host request header field, or the server name matching a request
+proxy_set_header Host $host;
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/log_formats/main_ext.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/log_formats/main_ext.conf
new file mode 100644
index 000000000..296ea7bfc
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/log_formats/main_ext.conf
@@ -0,0 +1,20 @@
+# Extended Log Format
+# Nginx Basics
+log_format main_ext 'remote_addr="$remote_addr", '
+ '[time_local=$time_local], '
+ 'request="$request", '
+ 'status="$status", '
+ 'http_referer="$http_referer", '
+ 'body_bytes_sent="$body_bytes_sent", '
+ 'Host="$host", '
+ 'sn="$server_name", '
+ 'request_time=$request_time, '
+ 'http_user_agent="$http_user_agent", '
+ 'http_x_forwarded_for="$http_x_forwarded_for", '
+ 'request_length="$request_length", '
+ 'upstream_address="$upstream_addr", '
+ 'upstream_status="$upstream_status", '
+ 'upstream_connect_time="$upstream_connect_time", '
+ 'upstream_header_time="$upstream_header_time", '
+ 'upstream_response_time="$upstream_response_time", '
+ 'upstream_response_length="$upstream_response_length", ';
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/proxy_headers.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/proxy_headers.conf
new file mode 100644
index 000000000..23a83d1dc
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/includes/proxy_headers.conf
@@ -0,0 +1,12 @@
+## Set Headers to the proxied servers ##
+
+# client address in a binary form, value’s length is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses
+proxy_set_header X-Real-IP $remote_addr;
+
+# X-Forwarded-For client request header field with the $remote_addr variable appended to it,
+# separated by a comma. If the “X-Forwarded-For” field is not present in the client request header,
+# the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
+proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+# request scheme, “http” or “https”
+proxy_set_header X-Forwarded-Proto $scheme;
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/nginx.conf b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/nginx.conf
new file mode 100644
index 000000000..a3b502b64
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/nginx/nginx.conf
@@ -0,0 +1,33 @@
+user nginx;
+worker_processes 1;
+
+error_log /var/log/nginx/error.log info;
+pid /var/run/nginx.pid;
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ include /etc/nginx/includes/log_formats/*.conf; # Custom Access logs formats found here
+
+ access_log /var/log/nginx/access.log main;
+
+ sendfile on;
+ #tcp_nopush on;
+
+ keepalive_timeout 65;
+
+ #gzip on;
+
+ include /etc/nginx/conf.d/*.conf;
+
+}
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.crt b/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.crt
new file mode 100644
index 000000000..4eb6334ff
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFTCCAf2gAwIBAgIUEQHIC+pN7UA+PwpufAGW4sFczqowDQYJKoZIhvcNAQEL
+BQAwGjEYMBYGA1UEAwwPTmdpbnhQbHVzQmFzaWNzMB4XDTI1MDEwMjIyMDY0OVoX
+DTI1MDEwMzIyMDY0OVowGjEYMBYGA1UEAwwPTmdpbnhQbHVzQmFzaWNzMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA17iXl8xC2AApcMaoPEu5w42U++ai
+ZPPtgEoDGE/tgNZmWwHsmfdkKbhvcFX8vLwI1OD+mKPW0RcB56x0I29KRk8HGwwX
+XXUuALmWuYVYNE71O2cBE/8JpgLlFgkbjYyFZekQeyb9QHeYxI47vCQqptBzQoCx
+Bs/zi4lh+wgRYyXmHdTQ60183Gvxs4ujIDWnOC4/PGLr/ZLjySyBDM4+rtoz5xia
+HZVBFA8HINTz4vjMkP1zrN4RsgSQQop8vuxlZsLlJCSWDMgkidu/uCvXxo+gHLMs
+nrvDloEJuU1zx2va4i0e8Zr/eV/zVRIghKx9g/mBFFPnEdu0x7B48EfTnwIDAQAB
+o1MwUTAdBgNVHQ4EFgQUDQzkk+0qMyn/nczCV7vJVlpFLnAwHwYDVR0jBBgwFoAU
+DQzkk+0qMyn/nczCV7vJVlpFLnAwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
+AQsFAAOCAQEAWXBbXqEckARXPGQtasa5+uVqwokH4TJwbnQLfZsQV766OltS4Bv/
+MFDqmFxFLvsuM2jf1vodtJTq+cuUWtn1o+0MCDFWy3lTifk0wpQyg3xF6boHdBi4
+oGFKn7oPwWaTU8yjJzbvH6A5mfjO57YklAXlmZwWsEylsgR9D9jPTUkX82P+8Ad6
+UjWmFsopTwjit1rBAnBOL/oIGl2IFE5L4Vv8tcFsfpDGpCK/h9D3G25uQY36c0av
+Q10lfV2+1eTQz//In+Li8zgGZa+XHtCxFPCEdcFQeEF3VkefgN7aL8qxmPgmSrqd
+P13gMgo7HwFPoxvuUD3vN2DKIeqfa/H7Mg==
+-----END CERTIFICATE-----
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.key b/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.key
new file mode 100644
index 000000000..3777400b3
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/etc/ssl/nginx/cars.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXuJeXzELYAClw
+xqg8S7nDjZT75qJk8+2ASgMYT+2A1mZbAeyZ92QpuG9wVfy8vAjU4P6Yo9bRFwHn
+rHQjb0pGTwcbDBdddS4AuZa5hVg0TvU7ZwET/wmmAuUWCRuNjIVl6RB7Jv1Ad5jE
+jju8JCqm0HNCgLEGz/OLiWH7CBFjJeYd1NDrTXzca/Gzi6MgNac4Lj88Yuv9kuPJ
+LIEMzj6u2jPnGJodlUEUDwcg1PPi+MyQ/XOs3hGyBJBCiny+7GVmwuUkJJYMyCSJ
+27+4K9fGj6Acsyyeu8OWgQm5TXPHa9riLR7xmv95X/NVEiCErH2D+YEUU+cR27TH
+sHjwR9OfAgMBAAECggEAGspO8UgpyP+EJgBV5l8VK+cKaJpE8rqkdTk71yod+dEm
+lwjPJHPn2ZKRLGdRYvMLObzTgYtfY0ozL11ocvogREkOPdqrkCy8UNS7lkCsKprf
+s8fgB2a2AQr8/laVOGgKLRTbuh+mdfokW8y6OGxZa6wZlFm9InZy7ZJbO7zNw/03
+jkAnDAzcAD4T9AgbR0zCVrRxehR6wGR220VWG8kw6gXswBvGvQaVAnwmjlTrh3pp
+EhZGC+iZ2el05JfGw6MlM7g6NKBK18KgrGYkhvKiML7BsOJPJD0vMId1jiVsejJR
+9xaPoBEaeTOLVWFisBfO5EZtkSZPF7nHwZGHSqZvoQKBgQDttK94ItRS33Uv/HAk
+2W+WKGSagSJeqHG9Hi3DEVLPE355QsOxgx/3h5EXnqHRVnu+CXqMHqEhf9afUZsJ
+0iMYVShYYELauRhcL8+XSrg+jFXp7Tvokv4XVbkwUyFnY+fM+coQ1rvamd5+1deX
+x1x629e/QtOtnaqkuvr9Xn8ArwKBgQDoUsKa3Eq8rx0vzI6KV4F6WncShObiKqkV
+0TR79SaNawT0vEhdDOhHuO5BNaiOI3+mbx/CRwnVedIicoi99cDgZrQPncaisnkC
+KZVcQpNMoFM8+ZYGyeYDo86sBi05WQRI/vxGKrOIUcaSsdieBLpS3E2btcNGkaLY
+pilcnRW4EQKBgQC2rR4QaEvd6GbJ2ulgGE3eCurNpiIAtti56wBmIeEOzL9sdzen
+KssdUmzZxwo6s4jjUauBFWTlNrZ8t507XeekooUf7dJS/t5OsluJvF19jCHWZX+d
+y6FD05g/IBPSvf99EhYM/MlfRNKtjK9jsE1NCbhy/utoSHvEnwGWR9G4dwKBgQCa
+fbZ1frqgYJ67E39SVcB/WbtG8GQM0Cuim30YVTyu3BTunmpMnnG0iDC/4mvVIZwY
+VFs9OTo74IexapKuJ8d8Mi/ZFqVpud8oZfix4n/Le+3+ZUaz+vzfPMYJtQ3LzftA
+g3fFPU4n/6FaGbQf2KsCwQdG3Yce3Wf6Q/zLXpZ70QKBgEseUKnmYKvFjmyVdO94
+nesTUuu7DITx4M7I3ssdKz/9KdqjmnVQn3yiNEEHEvItvKEZvFMAKB7uJFmY/oGr
+5DvP29lsr45FDTz2UWElz/LhsOkSBzRYQpXDkuaCl+lz7YE76S6F45vAy7RSY8TU
++57833tZa5uHl5GKhytuhGyQ
+-----END PRIVATE KEY-----
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.html b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.html
new file mode 100644
index 000000000..1b1bdfcd1
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx GTR !
+
+
+
+Welcome to nginx GTR !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.jpg b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.jpg
new file mode 100644
index 000000000..be39ffe4a
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/gtr.jpg differ
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/index.html b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/index.html
new file mode 100644
index 000000000..5d2b3044c
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/index.html
@@ -0,0 +1,24 @@
+
+
+
+Welcome to nginx!
+
+
+
+Welcome to nginx!
+If you see this page, the nginx web server is successfully installed and
+working. Further configuration is required.
+
+For online documentation and support please refer to
+nginx.org.
+Commercial support is available at
+nginx.com.
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.html b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.html
new file mode 100644
index 000000000..fc1de05d1
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx NSX !
+
+
+
+Welcome to nginx NSX !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.jpg b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.jpg
new file mode 100644
index 000000000..f3c27f59e
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/nsx.jpg differ
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.html b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.html
new file mode 100644
index 000000000..468ddae0b
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx RCF !
+
+
+
+Welcome to nginx RCF !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.jpg b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.jpg
new file mode 100644
index 000000000..40faef6dc
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-oss/usr/share/nginx/html/rcf.jpg differ
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/conf.d/default.conf b/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/conf.d/default.conf
new file mode 100644
index 000000000..013d7b423
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/conf.d/default.conf
@@ -0,0 +1,64 @@
+server {
+ listen 80 default_server;
+ server_name localhost;
+
+ #access_log /var/log/nginx/host.access.log main;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ }
+
+ #error_page 404 /404.html;
+
+ # redirect server error pages to the static page /50x.html
+ #
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+
+ location /test_header {
+ add_header X-Test-App true;
+ return 200 'HTTP/1.1 200 OK\nContent-Type: text/html\n\nWelcome to Lab 4 of the NGINX One Console Workshop!';
+ }
+
+ # proxy the PHP scripts to Apache listening on 127.0.0.1:80
+ #
+ #location ~ \.php$ {
+ # proxy_pass http://127.0.0.1;
+ #}
+
+ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+ #
+ #location ~ \.php$ {
+ # root html;
+ # fastcgi_pass 127.0.0.1:9000;
+ # fastcgi_index index.php;
+ # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
+ # include fastcgi_params;
+ #}
+
+ # deny access to .htaccess files, if Apache's document root
+ # concurs with nginx's one
+ #
+ #location ~ /\.ht {
+ # deny all;
+ #}
+
+ # enable /api/ location with appropriate access control in order
+ # to make use of NGINX Plus API
+ #
+ #location /api/ {
+ # api write=on;
+ # allow 127.0.0.1;
+ # deny all;
+ #}
+
+ # enable NGINX Plus Dashboard; requires /api/ location to be
+ # enabled and appropriate access control for remote access
+ #
+ #location = /dashboard.html {
+ # root /usr/share/nginx/html;
+ #}
+}
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/nginx.conf b/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/nginx.conf
new file mode 100644
index 000000000..f0ece9626
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/etc/nginx/nginx.conf
@@ -0,0 +1,75 @@
+
+user nginx;
+worker_processes auto;
+
+error_log /var/log/nginx/error.log notice;
+pid /var/run/nginx.pid;
+
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+
+ sendfile on;
+ #tcp_nopush on;
+
+ keepalive_timeout 65;
+
+ #gzip on;
+
+ include /etc/nginx/conf.d/*.conf;
+}
+
+
+# TCP/UDP proxy and load balancing block
+#
+#stream {
+ # Example configuration for TCP load balancing
+
+ #upstream stream_backend {
+ # zone tcp_servers 64k;
+ # server backend1.example.com:12345;
+ # server backend2.example.com:12345;
+ #}
+
+ #server {
+ # listen 12345;
+ # status_zone tcp_server;
+ # proxy_pass stream_backend;
+ #}
+#}
+
+# NGINX Plus Usage Reporting
+#
+# By default, every 30 minutes, NGINX Plus will send usage information
+# to NGINX Instance Manager, resolved by a "nginx-mgmt.local" DNS entry.
+# Alternate settings can be configured by uncommenting the "mgmt" block
+# and optional directives.
+#
+#mgmt {
+ #usage_report endpoint=nginx-mgmt.local interval=30m;
+ #resolver DNS_IP;
+
+ #uuid_file /var/lib/nginx/nginx.id;
+
+ #ssl_protocols TLSv1.2 TLSv1.3;
+ #ssl_ciphers DEFAULT;
+
+ #ssl_certificate client.pem;
+ #ssl_certificate_key client.key;
+
+ #ssl_trusted_certificate trusted_ca_cert.crt;
+ #ssl_verify on;
+ #ssl_verify_depth 2;
+#}
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/dashboard.html b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/dashboard.html
new file mode 100644
index 000000000..5f1d00bf1
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/dashboard.html
@@ -0,0 +1,1929 @@
+NGINX Plus Dashboard
+
\ No newline at end of file
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.html b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.html
new file mode 100644
index 000000000..1b1bdfcd1
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx GTR !
+
+
+
+Welcome to nginx GTR !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.jpg b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.jpg
new file mode 100644
index 000000000..be39ffe4a
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/gtr.jpg differ
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/index.html b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/index.html
new file mode 100644
index 000000000..5d2b3044c
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/index.html
@@ -0,0 +1,24 @@
+
+
+
+Welcome to nginx!
+
+
+
+Welcome to nginx!
+If you see this page, the nginx web server is successfully installed and
+working. Further configuration is required.
+
+For online documentation and support please refer to
+nginx.org.
+Commercial support is available at
+nginx.com.
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.html b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.html
new file mode 100644
index 000000000..fc1de05d1
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx NSX !
+
+
+
+Welcome to nginx NSX !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.jpg b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.jpg
new file mode 100644
index 000000000..f3c27f59e
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/nsx.jpg differ
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.html b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.html
new file mode 100644
index 000000000..468ddae0b
--- /dev/null
+++ b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.html
@@ -0,0 +1,22 @@
+
+
+
+Welcome to nginx RCF !
+
+
+
+Welcome to nginx RCF !
+If you see this page, the nginx web server is successfully installed and
+working.
+
+
+
+Thank you for using nginx.
+
+
diff --git a/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.jpg b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.jpg
new file mode 100644
index 000000000..40faef6dc
Binary files /dev/null and b/static/workshops/nginx-one/lab2/nginx-plus/usr/share/nginx/html/rcf.jpg differ
diff --git a/templates/release-notes/example-release-notes.md b/templates/release-notes/example-release-notes.md
index 60d8341b2..a3c4c558d 100644
--- a/templates/release-notes/example-release-notes.md
+++ b/templates/release-notes/example-release-notes.md
@@ -9,7 +9,7 @@ April 18, 2024
If you are already using a previous version of Nbeamex coffee, please make sure to clean your grinder and coffee maker thoroughly before adding the new coffee beans. This will ensure that you get the best flavor from the new beans.
-{{< see-also >}}Please consult or [list of authorized retailers](https://nbeamex.com/retailers) to find the best coffee beans for your grinder.{{< /see-also >}}
+{{< call-out "note" >}}Please consult or [list of authorized retailers](https://nbeamex.com/retailers) to find the best coffee beans for your grinder.{{< /call-out>}}
### What's new
@@ -42,9 +42,9 @@ You can find the list of known issues in the [Known issues](https://nbeamex.com/
### Security Updates
-{{< important >}}
+{{< call-out "important" >}}
For the protection of our customers, NBeamex doesn't disclose security issues until an investigation has occurred and a fix is available.
-{{< /important >}}
+{{< /call-out >}}
This release includes the following security updates:
diff --git a/templates/release-notes/template-release-notes.md b/templates/release-notes/template-release-notes.md
index f3a56e6a8..cbf53f38b 100644
--- a/templates/release-notes/template-release-notes.md
+++ b/templates/release-notes/template-release-notes.md
@@ -36,9 +36,9 @@ You can find the list of known issues in the [Known issues](https://example.com/
### (Optional) Security updates
-{{< important >}}
+{{< call-out "important" >}}
For the protection of our customers, F5 NGINX doesn't disclose security issues until an investigation has occurred and a fix is available.
-{{< /important >}}
+{{< /call-out >}}
This release includes the following security updates:
diff --git a/tests/constants.ts b/tests/constants.ts
deleted file mode 100644
index 6484baac2..000000000
--- a/tests/constants.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
- Place to store constant values.
-*/
-export const TIMEOUT = 4000
\ No newline at end of file
diff --git a/tests/search.spec.ts b/tests/search.spec.ts
deleted file mode 100644
index c0b60f150..000000000
--- a/tests/search.spec.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { test, expect} from '@playwright/test';
-import { handleConsentPopup, waitFor } from '../tests/utils/commonUtils.ts'
-
-test.describe("Testing search page", () => {
- test('Searchbar is visible', async ({ page }) => {
- await page.goto('/');
- await waitFor(() => handleConsentPopup(page));
-
- const searchBox = page.locator('.CoveoSearchbox').first();
- const searchButton = page.locator('.CoveoSearchButton');
- const searchValue = "proxy";
- expect(searchBox).toBeVisible();
-
- await searchBox.click();
- await page.keyboard.insertText(searchValue);
- await searchButton.click();
- await page.waitForURL(`/search.html#q=${searchValue}&sort=relevancy`);
- expect(await page.locator('div h1').innerHTML()).toBe('Search Results');
- });
-
- test('Search page returns results without error', async ({ page }) => {
- await page.goto("/search.html#q=proxy&sort=relevancy");
- await waitFor(() => handleConsentPopup(page));
-
- await page.waitForSelector('div.coveo-result-list-container');
- const coveoErrorReport = page.locator('div.CoveoErrorReport');
- const errorReportDisplay = await coveoErrorReport.evaluate(e => window.getComputedStyle(e).display);
- expect(errorReportDisplay).toBe('none');
- });
-})
\ No newline at end of file
diff --git a/tests/utils/commonUtils.ts b/tests/utils/commonUtils.ts
deleted file mode 100644
index 4a20e87b7..000000000
--- a/tests/utils/commonUtils.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { expect, type Page } from '@playwright/test';
-import { TIMEOUT } from '../../tests/constants.ts';
-
-// THE GDPR Consent button appears when test is run from EU locations. This handles that popup.
-export async function handleConsentPopup(page: Page) {
- const consentContent = page.locator('#truste-consent-content');
- const isConsentContentVisibile = await consentContent.isVisible();
- if(isConsentContentVisibile) {
- const consentButton = page.locator('#truste-consent-required');
- expect(consentButton).toBeVisible();
- await consentButton.click();
- }
-}
-
-let sleep = ms => new Promise(r => setTimeout(r, ms));
-export let waitFor = async function waitFor(f, ftimeout=TIMEOUT){
- while(!f()) await sleep(ftimeout);
- return f();
-};
\ No newline at end of file