Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
dfcaebe
ci: add GitHub configuration from network-agent pattern
obtFusi Jan 18, 2026
3d1defe
Merge pull request #1 from obtFusi/ci/github-config
obtFusi Jan 18, 2026
b036814
feat(auth): Add mTLS authentication for Machine Tunnel (S-1 Spikes)
obtFusi Jan 20, 2026
634bd3c
chore: add AUDIT files to gitignore
obtFusi Jan 20, 2026
5357588
feat(spike): Add S-1 Windows mTLS spikes - CNG signer and SAN parser
obtFusi Jan 20, 2026
e594b07
feat(lab): Add CA bootstrap and verification scripts
obtFusi Jan 20, 2026
f52cd3d
fix(lab): Fix verify-lab-ca.ps1 parsing bugs
obtFusi Jan 20, 2026
6f72ca7
feat(proto): Generate Go code for Machine Tunnel RPCs
obtFusi Jan 23, 2026
a4deec3
feat(mtls): Add per-account AllowedDomains for multi-tenant isolation
obtFusi Jan 23, 2026
648b532
feat(mtls): Add Machine Tunnel RPC handlers (T-3.6)
obtFusi Jan 23, 2026
4d79421
feat(server): Complete T-3.6 Server Peer Registration Handler with fu…
obtFusi Jan 23, 2026
0e45951
feat(mtls): Add DNSLabel uniqueness check for machine peers (T-3.7)
obtFusi Jan 24, 2026
0fcdd70
feat(server): Add separate mTLS port for Machine Tunnel clients (T-3.8)
obtFusi Jan 24, 2026
2ab03ec
fix(lint): Address golangci-lint errors in mTLS implementation
obtFusi Jan 24, 2026
aa06ac6
fix(ci): Remove duplicate PR template causing macOS case conflict
obtFusi Jan 24, 2026
aef47cc
fix(ci): Remove duplicate PR template causing macOS case conflict
obtFusi Jan 24, 2026
625c120
Merge pull request #92 from obtFusi/feature/server-mtls
obtFusi Jan 24, 2026
e876f3d
feat(build): Add multi-stage Dockerfile for management server
obtFusi Jan 24, 2026
71e11ae
feat(client): Add machine tunnel bootstrap with Setup-Key fallback (T…
obtFusi Jan 24, 2026
be66b2d
feat(client): Add domain join over tunnel functionality (T-5.2)
obtFusi Jan 24, 2026
581cbf6
fix(domainjoin): Fix lint errors for IPv6 and gosec G101
obtFusi Jan 24, 2026
5d04701
Merge pull request #95 from obtFusi/feature/multistage-dockerfile
obtFusi Jan 24, 2026
4851c75
Merge pull request #96 from obtFusi/feature/t-5.1-bootstrap-setup-key…
obtFusi Jan 24, 2026
66218ea
feat(tunnel): Add certificate enrollment after domain join (T-5.3)
obtFusi Jan 24, 2026
ff700e2
feat(scripts): Add reset and test scripts for Windows VM testing (T-5.5)
obtFusi Jan 24, 2026
6b081f6
Merge pull request #98 from obtFusi/feature/t-5.5-reset-scripts
obtFusi Jan 24, 2026
f8641ac
Merge pull request #97 from obtFusi/feature/t-5.3-cert-enrollment
obtFusi Jan 24, 2026
da666f0
feat(scripts): Update bootstrap-new-client.ps1 for v3.6 Smart Selection
obtFusi Jan 25, 2026
30d0bdd
Merge pull request #102 from obtFusi/feature/t-5.4-bootstrap-script
obtFusi Jan 25, 2026
1bf2aed
feat(e2e): Add tunnel establishment E2E tests (T-6.1)
obtFusi Jan 25, 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
31 changes: 31 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/bash

echo "Running pre-commit hook..."

# Check for unformatted Go files (only staged files)
STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$')

if [ -n "$STAGED_GO_FILES" ]; then
UNFORMATTED=$(echo "$STAGED_GO_FILES" | xargs gofmt -l 2>/dev/null)
if [ -n "$UNFORMATTED" ]; then
echo "ERROR: Unformatted Go files:"
echo "$UNFORMATTED"
echo ""
echo "Run 'gofmt -w <file>' to fix, then 'git add' again"
echo "Or run 'gofmt -w .' to fix all"
exit 1
fi
fi

# Check for secrets in staged files
SECRETS_PATTERN='(PRIVATE KEY|password.*=|api[_-]?key|secret[_-]?key|-----BEGIN)'
if git diff --cached --name-only | xargs grep -l -E "$SECRETS_PATTERN" 2>/dev/null; then
echo ""
echo "WARNING: Potential secrets detected in staged files!"
echo "Please review before committing."
echo ""
echo "To bypass this check (only if you're sure): git commit --no-verify"
exit 1
fi

echo "Pre-commit checks passed!"
29 changes: 29 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
name: Bug Report
about: Fehler oder Problem melden
title: '[Bug] '
labels: type:bug, priority:high
assignees: ''
---

## Beschreibung
Was ist passiert?

## Schritte zum Reproduzieren
1. ...
2. ...
3. ...

## Erwartetes Verhalten
Was sollte passieren?

## Tatsächliches Verhalten
Was passiert stattdessen?

## Umgebung
- OS: [z.B. Windows 11, Ubuntu 22.04]
- NetBird Version: [z.B. 0.31.0]
- Go Version: [z.B. 1.22]

## Logs/Screenshots
(Optional) Fehlermeldungen oder Screenshots
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: NetBird Documentation
url: https://docs.netbird.io
about: Official NetBird documentation
- name: NetBird Discussions
url: https://github.com/netbirdio/netbird/discussions
about: Ask questions and discuss NetBird
39 changes: 39 additions & 0 deletions .github/ISSUE_TEMPLATE/epic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
name: Epic
about: Großes Feature das mehrere Stories umfasst
title: '[Epic] E-X: '
labels: type:epic, priority:critical, phase:mvp
assignees: ''
---

## Epic Beschreibung
Was ist das übergeordnete Ziel dieses Epics?

## Business Value
Welchen Wert bringt dieses Epic für den User/das Projekt?

## Scope
Was ist Teil dieses Epics? Was ist NICHT Teil?

**In Scope:**
-

**Out of Scope:**
-

## Stories
<!-- Liste der zugehörigen Stories -->
- [ ] S-1: ...
- [ ] S-2: ...

## Acceptance Criteria
<!-- Wann gilt das Epic als abgeschlossen? -->
- [ ] ...

## Dependencies
<!-- Abhängigkeiten zu anderen Epics/externen Systemen -->
-

## Risks
<!-- Bekannte Risiken -->
-
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ['feature-request']
title: '[Feature] '
labels: type:feature
assignees: ''

---
Expand Down
32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/story.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: User Story
about: Feature aus Nutzersicht beschreiben
title: '[Story] S-X: '
labels: type:story, priority:high, phase:mvp
assignees: ''
---

## Parent Epic
<!-- Link zum Epic -->
Refs #

## User Story
Als [Rolle]
möchte ich [Funktion]
damit [Nutzen]

## Acceptance Criteria
<!-- Wann gilt die Story als abgeschlossen? -->
- [ ] ...

## Tasks
<!-- Liste der zugehörigen Tasks -->
- [ ] T-X.1: ...
- [ ] T-X.2: ...

## Technical Notes
<!-- Technische Hinweise für die Implementierung -->
-

## Branch
`feature/...`
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
name: Technical Task
about: Technische Aufgabe für die Implementierung
title: '[Task] T-X.Y: '
labels: type:task, phase:mvp
assignees: ''
---

## Parent Story
<!-- Link zur Story -->
Refs #

## Beschreibung
Was muss technisch umgesetzt werden?

## Dateien/Komponenten
<!-- Welche Files werden geändert/erstellt? -->
-

## Implementation Notes
<!-- Technische Details -->
-

## Definition of Done
- [ ] Code implementiert
- [ ] Tests geschrieben
- [ ] Code reviewed
- [ ] Dokumentation aktualisiert (falls nötig)

## Estimated Complexity
<!-- Simple | Medium | Complex -->
31 changes: 31 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: 2
updates:
# Go dependencies
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "deps"
labels:
- "type:deps"

# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "ci"
labels:
- "type:ci"

# Docker dependencies
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "deps"
labels:
- "type:deps"
97 changes: 97 additions & 0 deletions .github/workflows/auto-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
name: Auto Label

on:
issues:
types: [opened]
pull_request:
types: [opened]

permissions:
issues: write

Check notice

Code scanning / SonarCloud

Write permissions should be defined at the job level Low

Move this write permission from workflow level to job level. See more on SonarQube Cloud
pull-requests: write

Check notice

Code scanning / SonarCloud

Write permissions should be defined at the job level Low

Move this write permission from workflow level to job level. See more on SonarQube Cloud

jobs:
label-issues:
if: github.event_name == 'issues'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const title = context.payload.issue.title.toLowerCase();
const labels = ['status:backlog'];

// Epic/Story/Task detection (Machine Tunnel Plan)
if (title.includes('[epic]') || title.startsWith('e-')) {
labels.push('type:epic', 'priority:critical');
} else if (title.includes('[story]') || title.startsWith('s-')) {
labels.push('type:story', 'priority:high');
} else if (title.includes('[task]') || title.startsWith('t-')) {
labels.push('type:task');
}

// Type detection from title prefix
if (title.includes('[bug]') || title.startsWith('bug:') || title.startsWith('fix:')) {
labels.push('type:bug', 'priority:high');
} else if (title.includes('[feature]') || title.startsWith('feat:')) {
labels.push('type:feature');
} else if (title.includes('[docs]') || title.startsWith('docs:')) {
labels.push('type:docs');
} else if (title.includes('[refactor]') || title.startsWith('refactor:')) {
labels.push('type:refactor');
} else if (title.includes('[ci]') || title.startsWith('ci:')) {
labels.push('type:ci');
} else if (title.includes('[spike]') || title.startsWith('spike:')) {
labels.push('type:spike');
}

// Phase detection
if (title.includes('[mvp]') || title.includes('phase:mvp')) {
labels.push('phase:mvp');
}

await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: labels
});

label-prs:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const title = context.payload.pull_request.title.toLowerCase();
const labels = [];

// Type detection from Conventional Commit prefix
if (title.startsWith('feat:') || title.startsWith('feat(')) {
labels.push('type:feature');
} else if (title.startsWith('fix:') || title.startsWith('fix(')) {
labels.push('type:bug');
} else if (title.startsWith('docs:') || title.startsWith('docs(')) {
labels.push('type:docs');
} else if (title.startsWith('refactor:') || title.startsWith('refactor(')) {
labels.push('type:refactor');
} else if (title.startsWith('ci:') || title.startsWith('ci(')) {
labels.push('type:ci');
} else if (title.startsWith('deps:') || title.startsWith('chore(deps)')) {
labels.push('type:deps');
}

// Dependabot PRs
if (context.payload.pull_request.user.login === 'dependabot[bot]') {
labels.push('type:deps');
}

if (labels.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: labels
});
}
Loading