PortRelay:把内网服务临时、可控地开放给同事

边缘网关 + Agent 的端口中继:Agent 主动连出到网关,把内网目标挂到网关端口上;
通过邀请链接按设备授权,可选审批,首次连接起计时,到期、闲置自动收回。

- portrelay-server:边缘网关(端口池、白名单与授权租约、邀请与授权网页)
- portrelay-agent:Agent(yamux 隧道、本地 API 与网页面板、流量统计)
- mac-native:SwiftUI 菜单栏 App
This commit is contained in:
DeepFal committed 2026-10-13 16:33:17 +08:00
commit 86e159b3f0
67 files changed
+13888

No files matched your search

+86
View File
@@ -0,0 +1,86 @@
name: CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
go:
name: Go (vet / test / cross-build)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- name: gofmt
run: test -z "$(gofmt -l .)" || (gofmt -l . && exit 1)
- name: vet
run: go vet ./...
- name: test
run: go test -race -count=1 ./...
- name: cross-build
run: |
for p in linux/amd64 linux/arm64 darwin/arm64 windows/amd64; do
GOOS=${p%/*} GOARCH=${p#*/} CGO_ENABLED=0 go build -o /dev/null ./cmd/...
done
install:
name: Install script (systemd)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- name: Build
run: CGO_ENABLED=0 go build -o portrelay-server ./cmd/portrelay-server
- name: Install
run: sudo deploy/install-server.sh ./portrelay-server
- name: Verify
run: |
sleep 2
systemctl is-active portrelay-server
sudo test -s /etc/portrelay-server.env
test "$(sudo stat -c %a /etc/portrelay-server.env)" = 600
curl -fsS http://127.0.0.1:33000/health
sudo deploy/install-server.sh ./portrelay-server # 升级路径:保留已有 token
sleep 2
systemctl is-active portrelay-server
ls /usr/local/bin/portrelay-server.bak-*
- name: Logs
if: always()
run: sudo journalctl -u portrelay-server --no-pager | tail -30
macos:
name: macOS app
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- name: Build PortRelay.app (universal)
run: UNIVERSAL=1 ./build-app.sh
- name: Check bundle
run: |
lipo -info PortRelay.app/Contents/MacOS/PortRelay
lipo -info PortRelay.app/Contents/Resources/portrelay-agent
codesign --verify --deep PortRelay.app
docker:
name: Docker image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
context: .
push: false
tags: portrelay-server:ci
+100
View File
@@ -0,0 +1,100 @@
name: Release
# 推送 v* 标签时构建并发布;手动触发时只构建、上传 artifact,不发布
on:
push:
tags: ['v*']
workflow_dispatch:
permissions:
contents: write
packages: write
jobs:
binaries:
name: Server & agent binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- name: Build
run: make release VERSION=${GITHUB_REF_NAME#v}
- uses: actions/upload-artifact@v4
with:
name: binaries
path: |
dist/*.tar.gz
dist/*.zip
macos-app:
name: macOS app
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- name: Build universal app
run: |
VERSION=${GITHUB_REF_NAME#v}
case "$VERSION" in [0-9]*) ;; *) VERSION=0.0.0-${GITHUB_SHA::7} ;; esac
UNIVERSAL=1 VERSION=$VERSION ./build-app.sh
mkdir -p dist
ditto -c -k --sequesterRsrc --keepParent PortRelay.app "dist/PortRelay-$VERSION-macos-universal.zip"
- uses: actions/upload-artifact@v4
with:
name: macos-app
path: dist/*.zip
docker:
name: Docker image
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- name: Image name (lowercase)
run: echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/portrelay-server" >> "$GITHUB_ENV"
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest
- uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
build-args: VERSION=${{ steps.meta.outputs.version }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
publish:
name: GitHub release
needs: [binaries, macos-app]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Checksums
run: cd dist && sha256sum * > SHA256SUMS
- name: Create release
env:
GH_TOKEN: ${{ github.token }}
run: gh release create "$GITHUB_REF_NAME" dist/* --repo "$GITHUB_REPOSITORY" --title "$GITHUB_REF_NAME" --generate-notes