Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
4378eb1
feat(support): add support service with WebSocket tunnels and session…
edospadoni Mar 9, 2026
566e130
feat(backend): add support session APIs, proxy, and security hardening
edospadoni Mar 9, 2026
6336111
feat(frontend): add support dashboard, terminal, and session UI
edospadoni Mar 9, 2026
840bda8
chore(infra): add support service to proxy, deploy, and CI/CD
edospadoni Mar 9, 2026
2278102
fix(ci): use separate component/path in go-tests matrix to avoid slas…
edospadoni Mar 10, 2026
77e6706
fix(proxy): add default_server to main server block to prevent suppor…
edospadoni Mar 10, 2026
cf7fe75
fix(proxy): skip PR suffix and search domain for FQDN service names
edospadoni Mar 10, 2026
07507ba
fix(support): security audit hardening across support service and bac…
edospadoni Mar 10, 2026
4dfef4e
fix(support): security audit hardening across support service and bac…
edospadoni Mar 10, 2026
dceb140
fix(proxy): configure pid and cache paths for nginx-unprivileged
edospadoni Mar 10, 2026
15ad2d9
fix(proxy): allow Logto domain in CSP connect-src directive
edospadoni Mar 10, 2026
d5997aa
feat(backend): add support_session_id to system responses
edospadoni Mar 11, 2026
c2ca848
feat(frontend): add support session popover to systems table
edospadoni Mar 11, 2026
9f967c4
refactor(support): split tunnel-client into packages and add configur…
edospadoni Mar 13, 2026
2c9a3b8
docs(support): add inline descriptions to all .env.example variables
edospadoni Mar 13, 2026
31cb6d5
chore(backend): renumber support migrations from 017-019 to 018-020
edospadoni Mar 19, 2026
6c85e77
feat(support): add pluggable diagnostics system to tunnel-client
edospadoni Mar 19, 2026
9529b75
feat(support): add static service injection via yamux COMMAND stream
edospadoni Mar 19, 2026
f3fe21e
fix(security): address all findings from penetration test review
edospadoni Mar 19, 2026
9ecdbf4
fix(support): add cross-subdomain CORS and session-scoped proxy auth
edospadoni Mar 20, 2026
bad22c2
feat(support): add per-node diagnostics endpoint and multi-node popov…
edospadoni Mar 20, 2026
05d25c8
feat(support): add ephemeral user provisioning for support sessions
edospadoni Mar 24, 2026
98d5dd5
feat(support): add custom service management and fix re-discovery merge
edospadoni Mar 24, 2026
f2532a2
fix(security): harden support tunnel system after security audit
edospadoni Mar 24, 2026
4915d7e
docs(support): expand plugin system documentation in README
edospadoni Mar 25, 2026
21fa015
feat(diagnostics): use structured JSON details in built-in system plugin
edospadoni Mar 26, 2026
a10990a
fix(diagnostics): use json.RawMessage for structured details in checks
edospadoni Mar 27, 2026
26b1554
fix(support): show host as primary label in services list, sort alpha…
edospadoni Mar 27, 2026
ee4b5d8
fix(tunnel-client): Redis fallback for module discovery on worker nodes
edospadoni Mar 28, 2026
158edab
fix(tunnel-client): clean up existing users before provisioning to pr…
edospadoni Mar 28, 2026
b70a490
fix(diagnostics): gofmt alignment in built-in system plugin
edospadoni Mar 29, 2026
535c2ad
fix(tunnel-client): spawn login shell for PTY sessions
edospadoni Mar 30, 2026
1f19197
fix(frontend): prettier formatting for SupportSessionsTable
edospadoni Mar 31, 2026
4f85797
chore(backend): go mod tidy after rebase
edospadoni May 25, 2026
d9e4e06
refactor(support): rename INTERNAL_SECRET to SUPPORT_INTERNAL_SECRET …
edospadoni May 26, 2026
d010915
feat(support): enable subdomain proxy on QA and prod
edospadoni May 26, 2026
d774f7d
fix(support): route multi-node sessions to the leader's view
edospadoni Jun 5, 2026
44c17cd
fix(tunnel-client): land the PTY shell in the user's home
edospadoni Jun 5, 2026
7f7685a
fix(frontend): rename support route to align with i18n key
edospadoni Jun 5, 2026
6e88691
fix(collect): tolerate r3labs/diff type-mismatch errors
edospadoni Jun 5, 2026
fbabd2a
fix(support): raise per-session proxy rate limit to 2000/min
edospadoni Jun 5, 2026
0748a87
fix(tunnel-client): resolve module → user domain via cluster/module_d…
edospadoni Jun 8, 2026
997770e
fix(tunnel-client): keep module_domains in sync after discovery
edospadoni Jun 8, 2026
49b0e39
fix(support): route /api requests to the right sibling on shared hosts
edospadoni Jun 8, 2026
76c9a73
fix(support): raise per-session rate limit default to 10000/min
edospadoni Jun 8, 2026
ec10122
fix(support): scope access logs by RBAC and shorten proxy token TTL
edospadoni Jun 10, 2026
d3238fa
fix(support): renumber migrations to 026-030 after rebase onto main
edospadoni Jun 18, 2026
cb73991
fix(support): drop description from empty state to match other tables
edospadoni Jun 18, 2026
b580663
fix(support): renumber migrations to 028-032 after rebase onto main
edospadoni Jun 24, 2026
aef4e4b
fix(support): renumber migrations to 033-037 after rebase onto main
edospadoni Jul 3, 2026
3b8f5bb
fix(support): correct UpdatingSpinner import path
edospadoni Jul 6, 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
78 changes: 73 additions & 5 deletions .github/workflows/ci-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,19 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
component: [backend, sync, collect]
include:
- component: backend
path: backend
- component: sync
path: sync
- component: collect
path: collect
- component: support
path: services/support

defaults:
run:
working-directory: ${{ matrix.component }}
working-directory: ${{ matrix.path }}

steps:
- uses: actions/checkout@v4
Expand All @@ -38,7 +46,7 @@ jobs:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ matrix.component }}-${{ hashFiles(format('{0}/go.sum', matrix.component)) }}
key: ${{ runner.os }}-go-${{ matrix.component }}-${{ hashFiles(format('{0}/go.sum', matrix.path)) }}
restore-keys: |
${{ runner.os }}-go-${{ matrix.component }}-

Expand All @@ -56,7 +64,7 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.component }}-coverage
path: ${{ matrix.component }}/coverage.out
path: ${{ matrix.path }}/coverage.out
retention-days: 30

- name: Run go vet
Expand All @@ -74,7 +82,7 @@ jobs:
uses: golangci/golangci-lint-action@v9
with:
version: v2.11.4
working-directory: ${{ matrix.component }}
working-directory: ${{ matrix.path }}
args: --timeout=10m

# ===========================================================================
Expand Down Expand Up @@ -143,6 +151,11 @@ jobs:
- component: mimir
context: services/mimir
image_description: Mimir alertmanager backend for My Nethesis
- component: support
context: services/support
- component: tunnel-client
context: services/support
dockerfile: services/support/Containerfile.tunnel-client

steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -203,3 +216,58 @@ jobs:
with:
sarif_file: 'trivy-${{ matrix.component }}-results.sarif'
category: 'trivy-${{ matrix.component }}'

# ===========================================================================
# TUNNEL CLIENT BINARY - Rolling dev release (only on main push)
# ===========================================================================
tunnel-client-binary:
runs-on: ubuntu-latest
needs: [go-tests, frontend-tests]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
permissions:
contents: write

steps:
- uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.24'
cache: false

- name: Build tunnel-client binary
working-directory: services/support
run: |
COMMIT="${{ github.sha }}"
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
LDFLAGS="-s -w -X github.com/nethesis/my/services/support/pkg/version.Version=dev-${COMMIT::7} -X github.com/nethesis/my/services/support/pkg/version.Commit=${COMMIT} -X github.com/nethesis/my/services/support/pkg/version.BuildTime=${BUILD_TIME}"

mkdir -p dist
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="${LDFLAGS}" -o dist/tunnel-client-linux-amd64 ./cmd/tunnel-client/main.go

- name: Update dev release
uses: softprops/action-gh-release@v2
with:
tag_name: dev
name: Development Build
body: |
Rolling development build from `main` branch.
Updated on every push to main.

**Commit:** ${{ github.sha }}

## Download

- `tunnel-client-linux-amd64` — tunnel client for NethSecurity (OpenWrt)
prerelease: true
make_latest: false
files: |
services/support/dist/tunnel-client-linux-amd64

- name: Delete old dev tag and recreate
run: |
git tag -d dev 2>/dev/null || true
git push origin :refs/tags/dev 2>/dev/null || true
git tag dev
git push origin dev
4 changes: 2 additions & 2 deletions .github/workflows/pr-build-trigger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:
echo "Updating build triggers with timestamp: $TIMESTAMP"
UPDATED_FILES=()

for component in backend collect frontend proxy services/mimir; do
for component in backend collect frontend proxy services/mimir services/support; do
if [ -f "$component/.render-build-trigger" ]; then
echo "Updating $component/.render-build-trigger"
perl -i -pe "s/LAST_UPDATE=.*/LAST_UPDATE=$TIMESTAMP/" "$component/.render-build-trigger"
Expand Down Expand Up @@ -108,7 +108,7 @@ jobs:

echo "✅ Safety checks passed. Proceeding with commit to branch: $TARGET_BRANCH"

git add */.render-build-trigger services/mimir/.render-build-trigger
git add */.render-build-trigger services/mimir/.render-build-trigger services/support/.render-build-trigger
git commit -m "chore: update build triggers for PR deployment

Auto-updated .render-build-trigger files to ensure all services
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/pr-update-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,9 @@ jobs:
{ name: 'Collect Build', jobKey: 'build (collect)' },
{ name: 'Sync Build', jobKey: 'build (sync)' },
{ name: 'Frontend Build', jobKey: 'build (frontend)' },
{ name: 'Proxy Build', jobKey: 'build (proxy)' }
{ name: 'Proxy Build', jobKey: 'build (proxy)' },
{ name: 'Support Tests', jobKey: 'go-tests (services/support)' },
{ name: 'Support Build', jobKey: 'build (support)' }
];

for (const { name, jobKey } of badgeReplacements) {
Expand Down
121 changes: 121 additions & 0 deletions .github/workflows/release-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ jobs:
exit 1
fi

- name: Check code formatting (support)
working-directory: services/support
run: |
if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then
echo "Code is not formatted properly in services/support:"
gofmt -s -l .
exit 1
fi

- name: Run backend linting
uses: golangci/golangci-lint-action@v9
with:
Expand All @@ -87,6 +96,13 @@ jobs:
working-directory: collect
args: --timeout=10m

- name: Run support linting
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: services/support
args: --timeout=10m

- name: Run backend tests
working-directory: backend
run: go test ./...
Expand All @@ -99,6 +115,10 @@ jobs:
working-directory: collect
run: go test ./...

- name: Run support tests
working-directory: services/support
run: go test ./...

- name: Set up Node.js
uses: actions/setup-node@v4
with:
Expand Down Expand Up @@ -200,6 +220,33 @@ jobs:
tar -czf sync-linux-amd64.tar.gz sync-linux-amd64-release
rm -rf sync-linux-amd64-release

# Support Release
- name: Build support binary
working-directory: services/support
run: |
mkdir -p dist

VERSION="${{ steps.version.outputs.VERSION }}"
COMMIT="${{ github.sha }}"
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
LDFLAGS="-s -w -X github.com/nethesis/my/services/support/pkg/version.Version=${VERSION} -X github.com/nethesis/my/services/support/pkg/version.Commit=${COMMIT} -X github.com/nethesis/my/services/support/pkg/version.BuildTime=${BUILD_TIME}"

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="${LDFLAGS}" -o dist/support-linux-amd64 main.go

cd dist
tar -czf support-linux-amd64.tar.gz support-linux-amd64

# Tunnel Client Release
- name: Build tunnel-client binary
working-directory: services/support
run: |
VERSION="${{ steps.version.outputs.VERSION }}"
COMMIT="${{ github.sha }}"
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
LDFLAGS="-s -w -X github.com/nethesis/my/services/support/pkg/version.Version=${VERSION} -X github.com/nethesis/my/services/support/pkg/version.Commit=${COMMIT} -X github.com/nethesis/my/services/support/pkg/version.BuildTime=${BUILD_TIME}"

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="${LDFLAGS}" -o dist/tunnel-client-linux-amd64 ./cmd/tunnel-client/main.go

# Docker Images
- name: Extract backend metadata
id: backend_meta
Expand Down Expand Up @@ -410,6 +457,76 @@ jobs:
format: cyclonedx-json
output-file: mimir-sbom.cdx.json

- name: Extract support metadata
id: support_meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}/support
tags: |
type=semver,pattern=v{{version}},value=${{ steps.version.outputs.VERSION }}
type=raw,value=latest

- name: Build and push support Docker image
uses: docker/build-push-action@v5
with:
context: services/support
file: services/support/Containerfile
platforms: linux/amd64
push: true
tags: ${{ steps.support_meta.outputs.tags }}
labels: |
${{ steps.support_meta.outputs.labels }}
org.opencontainers.image.title=My Nethesis Support
org.opencontainers.image.description=WebSocket tunnel support service for My Nethesis
cache-from: type=gha,scope=support
cache-to: type=gha,mode=max,scope=support
build-args: |
VERSION=${{ steps.version.outputs.VERSION }}
COMMIT=${{ github.sha }}
BUILD_TIME=${{ steps.support_meta.outputs.labels['org.opencontainers.image.created'] }}

- name: Generate support SBOM
uses: anchore/sbom-action@v0
with:
image: ${{ env.REGISTRY }}/${{ steps.image_prefix.outputs.PREFIX }}/support:${{ steps.version.outputs.VERSION }}
format: cyclonedx-json
output-file: support-sbom.cdx.json

- name: Extract tunnel-client metadata
id: tunnel_client_meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}/tunnel-client
tags: |
type=semver,pattern=v{{version}},value=${{ steps.version.outputs.VERSION }}
type=raw,value=latest

- name: Build and push tunnel-client Docker image
uses: docker/build-push-action@v5
with:
context: services/support
file: services/support/Containerfile.tunnel-client
platforms: linux/amd64
push: true
tags: ${{ steps.tunnel_client_meta.outputs.tags }}
labels: |
${{ steps.tunnel_client_meta.outputs.labels }}
org.opencontainers.image.title=My Nethesis Tunnel Client
org.opencontainers.image.description=WebSocket tunnel client for NS8 remote support
cache-from: type=gha,scope=tunnel-client
cache-to: type=gha,mode=max,scope=tunnel-client
build-args: |
VERSION=${{ steps.version.outputs.VERSION }}
COMMIT=${{ github.sha }}
BUILD_TIME=${{ steps.tunnel_client_meta.outputs.labels['org.opencontainers.image.created'] }}

- name: Generate tunnel-client SBOM
uses: anchore/sbom-action@v0
with:
image: ${{ env.REGISTRY }}/${{ steps.image_prefix.outputs.PREFIX }}/tunnel-client:${{ steps.version.outputs.VERSION }}
format: cyclonedx-json
output-file: tunnel-client-sbom.cdx.json

# Create GitHub Release
- name: Create Release
uses: softprops/action-gh-release@v2
Expand All @@ -419,9 +536,13 @@ jobs:
backend/dist/*.tar.gz
sync/dist/*.tar.gz
collect/dist/*.tar.gz
services/support/dist/support-linux-amd64.tar.gz
services/support/dist/tunnel-client-linux-amd64
backend-sbom.cdx.json
sync-sbom.cdx.json
collect-sbom.cdx.json
support-sbom.cdx.json
tunnel-client-sbom.cdx.json
frontend-sbom.cdx.json
proxy-sbom.cdx.json
mimir-sbom.cdx.json
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ collect/collect
collect/main
collect/build/
collect/*.exe
services/support/build/
services/support/tunnel-client
services/support/*.exe
*.exe
*.bin

Expand Down
Loading
Loading