Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e946aa8
Add Hetzner and AWS one-click deploy options to cluster setup modal
mlsmaycon Jul 11, 2026
96d2d8d
Add DigitalOcean one-click deploy option to cluster setup modal
mlsmaycon Jul 11, 2026
c925654
Add reverse proxy deployment templates for cloud deploy options
mlsmaycon Jul 11, 2026
cbedffc
Point CloudFormation launch URL at S3 bucket and add template sync wo…
mlsmaycon Jul 11, 2026
9ca44ff
Add optional IAM instance profile and compose-based bootstrap to CFN …
mlsmaycon Jul 11, 2026
d4b7041
Add optional IAM role creation and move to Ubuntu 26.04 in CFN template
mlsmaycon Jul 11, 2026
4e0490e
Allow Hetzner and DigitalOcean APIs in CSP connect-src for cloud deploy
mlsmaycon Jul 11, 2026
b44535d
Add CI test for cloud deploy CSP and template URL
mlsmaycon Jul 11, 2026
6b49636
Use configured gRPC endpoint for proxy management address in cluster …
mlsmaycon Jul 11, 2026
520ac4d
Set and display a root password for DigitalOcean droplet console access
mlsmaycon Jul 11, 2026
7b8509f
Load Hetzner catalog live with availability filtering and add static …
mlsmaycon Jul 11, 2026
b3d3a58
Use compose in cloud-init, show DNS records with instance IP, and ver…
mlsmaycon Jul 11, 2026
6ab10f5
Set bootstrap timing expectations and add root password for Hetzner c…
mlsmaycon Jul 11, 2026
3c74b15
Use Hetzner SSH keys instead of password and add registration check t…
mlsmaycon Jul 11, 2026
978d2b3
Cap container log size in deploy compose configurations
mlsmaycon Jul 11, 2026
8340ec2
Adjust and simplify 1-click proxy deployment lables
braginini Jul 12, 2026
8bd9e12
Adjust and simplify 1-click proxy deployment lables
braginini Jul 12, 2026
d6fe03f
Improve clusters wording
braginini Jul 12, 2026
29f3ee8
Add Hetzner docs link when adding proxy
braginini Jul 12, 2026
118c9f0
Re-arrange 1-click deployment flow.
braginini Jul 12, 2026
40bf729
Fix rabbit notes
braginini Jul 12, 2026
b5c8684
Remove dev ci/cd steps
braginini Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/sync-deploy-templates.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Sync deploy templates to S3

on:
push:
branches: [main]
paths:
- "templates/reverse-proxy/**"

permissions:
id-token: write
contents: read

jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Comment thread
coderabbitai[bot] marked this conversation as resolved.
with:
persist-credentials: false

- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.DEPLOY_TEMPLATES_ROLE_ARN }}
aws-region: eu-central-1

- name: Validate CloudFormation template
run: |
aws cloudformation validate-template \
--template-body file://templates/reverse-proxy/netbird-proxy-cfn.yaml

- name: Upload CloudFormation template
run: |
aws s3 cp templates/reverse-proxy/netbird-proxy-cfn.yaml \
s3://netbird-deploy-templates/templates/netbird-proxy-cfn.yaml
78 changes: 78 additions & 0 deletions .github/workflows/test-cloud-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Test cloud deploy config

on:
pull_request:
paths:
- "docker/init_react_envs.sh"
- "templates/reverse-proxy/**"
- "src/modules/reverse-proxy/clusters/ClusterCloudDeploy.tsx"
- ".github/workflows/test-cloud-deploy.yml"

permissions:
contents: read

jobs:
csp-connect-src:
name: CSP allows cloud provider APIs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install nginx
run: |
sudo apt-get update
sudo apt-get install -y nginx gettext-base

- name: Prepare nginx layout expected by the init script
run: |
sudo mkdir -p /etc/nginx/http.d /usr/share/nginx/html
echo 'add_header Content-Security-Policy "placeholder" always;' | sudo tee /etc/nginx/http.d/default.conf
sudo touch /usr/share/nginx/html/OidcTrustedDomains.js.tmpl
sudo systemctl start nginx

- name: Run init script with production-like env
env:
AUTH_AUTHORITY: https://auth.example.com
AUTH_CLIENT_ID: test-client
AUTH_AUDIENCE: test-audience
AUTH_SUPPORTED_SCOPES: openid profile email
USE_AUTH0: "false"
NETBIRD_MGMT_API_ENDPOINT: https://api.example.com
run: sudo -E bash docker/init_react_envs.sh

- name: Assert provider APIs are in connect-src
run: |
CSP=$(grep -o 'Content-Security-Policy "[^"]*"' /etc/nginx/http.d/default.conf)
echo "Generated CSP: $CSP"
CONNECT_SRC=$(echo "$CSP" | sed 's/.*connect-src \([^;]*\);.*/\1/')
echo "connect-src: $CONNECT_SRC"
status=0
for origin in https://api.hetzner.cloud https://api.digitalocean.com; do
if echo "$CONNECT_SRC" | grep -qF "$origin"; then
echo "OK: $origin"
else
echo "MISSING in connect-src: $origin"
status=1
fi
done
exit $status

cfn-template-url:
name: CloudFormation template URL is live
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Extract template URL from component and check it
run: |
URL=$(grep -o 'https://[^"]*netbird-proxy-cfn\.yaml' src/modules/reverse-proxy/clusters/ClusterCloudDeploy.tsx)
echo "CFN_TEMPLATE_URL: $URL"
test -n "$URL"
# Non-blocking: the template is published by sync-deploy-templates on
# the default branch, so it may not exist yet for a PR that only edits
# the URL. Warn instead of failing the check.
if curl -sfI "$URL" >/dev/null; then
echo "OK: template URL is live"
else
echo "::warning::CloudFormation template URL is not reachable yet: $URL"
fi
2 changes: 1 addition & 1 deletion docker/init_react_envs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ echo "NetBird latest version: ${NETBIRD_LATEST_VERSION}"
FIRST_PARTY_CSP="pkgs.netbird.io"
FIRST_PARTY_CSP_CONNECT_SRC="wss://*.netbird.io"
THIRD_PARTY_CSP="*.licdn.com *.linkedin.com *.vector.co *.sibforms.com *.hotjar.com *.hotjar.io *.redditstatic.com pixel-config.reddit.com *.clarity.ms c.bing.com *.microsoft.com googleads.g.doubleclick.net pagead2.googlesyndication.com www.google.com www.googleadservices.com *.google-analytics.com *.googletagmanager.com analytics.google.com *.hubapi.com *.hs-banner.com *.hubspot.com *.hubspot.net js.hs-analytics.com *.hsforms.net *.hscollectedforms.net *.hs-analytics.net *.hsforms.com track.hubspot.com *.hsadspixel.net static.hsappstatic.net"
THIRD_PARTY_CSP_CONNECT_SRC="https://api.github.com/repos/netbirdio/netbird/releases/latest https://raw.githubusercontent.com/netbirdio/dashboard/ wss://ws.hotjar.com"
THIRD_PARTY_CSP_CONNECT_SRC="https://api.github.com/repos/netbirdio/netbird/releases/latest https://raw.githubusercontent.com/netbirdio/dashboard/ wss://ws.hotjar.com https://api.hetzner.cloud https://api.digitalocean.com"
THIRD_PARTY_CSP_SCRIPT_SRC="'sha256-7knV6EIjKUvCpYWE2rCYx8dYV2WCNb2bpTuitFXzBcA=' *.hs-scripts.com"

CSP_DOMAINS=""
Expand Down
6 changes: 3 additions & 3 deletions src/app/(dashboard)/reverse-proxy/clusters/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ export default function ReverseProxyClustersPage() {
</Breadcrumbs>
<h1 ref={headingRef}>Clusters</h1>
<Paragraph>
Proxy clusters that route inbound traffic to your services. Shared
clusters are deployed at the server level; account clusters are
self-hosted on your own infrastructure.{" "}
Proxy clusters route inbound traffic to your services. Shared clusters
are run by the platform; account clusters (self-hosted) run on your
own infrastructure.{" "}
<InlineLink href={REVERSE_PROXY_CLUSTERS_DOCS_LINK} target={"_blank"}>
Learn more
<ExternalLinkIcon size={12} />
Expand Down
Loading
Loading