From e0f9438dfa98e99d3395f283d9f87c7735f7f692 Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Sat, 21 Feb 2026 13:47:09 -0500 Subject: [PATCH] feat: Companion agent download in ServerView + Gitea CI pipeline fix Frontend: - Add Companion Agent card to ServerView (status, download links, setup instructions) - Shows agent connection status, last heartbeat, license key for copy - Download buttons for Linux/Windows amd64 from Gitea releases CI/CD: - Fix build-companion.yml: replace actions/github-script with Gitea API curl - Inject version from git tag via ldflags (-X main.version) - Add VERSION variable to Makefile with ldflags injection - Change main.go version from const to var for ldflags compatibility Deployment: - Add systemd service file (deployment/corrosion-companion.service) - Add .gitignore for bin/ (binaries should come from CI, not repo) Co-Authored-By: Claude Opus 4.6 --- .gitea/workflows/build-companion.yml | 106 +++++-------- companion-agent/.gitignore | 1 + companion-agent/Makefile | 5 +- companion-agent/cmd/agent/main.go | 2 +- .../deployment/corrosion-companion.service | 28 ++++ frontend/src/views/admin/ServerView.vue | 147 +++++++++++++++++- 6 files changed, 215 insertions(+), 74 deletions(-) create mode 100644 companion-agent/.gitignore create mode 100644 companion-agent/deployment/corrosion-companion.service diff --git a/.gitea/workflows/build-companion.yml b/.gitea/workflows/build-companion.yml index c14cbbf..9d8921c 100644 --- a/.gitea/workflows/build-companion.yml +++ b/.gitea/workflows/build-companion.yml @@ -26,13 +26,13 @@ jobs: run: | cd companion-agent mkdir -p bin - GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o bin/corrosion-companion-linux-amd64 ./cmd/agent + GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.version=${{ steps.version.outputs.VERSION }}" -o bin/corrosion-companion-linux-amd64 ./cmd/agent chmod +x bin/corrosion-companion-linux-amd64 - name: Build Windows AMD64 run: | cd companion-agent - GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o bin/corrosion-companion-windows-amd64.exe ./cmd/agent + GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -X main.version=${{ steps.version.outputs.VERSION }}" -o bin/corrosion-companion-windows-amd64.exe ./cmd/agent - name: Generate checksums run: | @@ -42,85 +42,49 @@ jobs: cat checksums.txt - name: Create Release - uses: actions/github-script@v6 env: - VERSION: ${{ steps.version.outputs.VERSION }} - with: - script: | - const fs = require('fs').promises; - const path = require('path'); + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + VERSION=${{ steps.version.outputs.VERSION }} + REPO="vantzs/corrosion-admin-panel" + API_URL="https://git.corrosionmgmt.com/api/v1" - // Create release - const release = await github.rest.repos.createRelease({ - owner: context.repo.owner, - repo: context.repo.repo, - tag_name: process.env.VERSION, - name: `Companion Agent ${process.env.VERSION}`, - body: `## Corrosion Companion Agent ${process.env.VERSION} + # Create release + RELEASE_ID=$(curl -s -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\": \"${VERSION}\", \"name\": \"Companion Agent ${VERSION}\", \"body\": \"Companion Agent release ${VERSION}\", \"draft\": false, \"prerelease\": false}" \ + "${API_URL}/repos/${REPO}/releases" | jq -r '.id') - ### Installation + # Upload Linux binary + curl -s -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @companion-agent/bin/corrosion-companion-linux-amd64 \ + "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=corrosion-companion-linux-amd64" - **Linux:** - \`\`\`bash - wget https://git.corrosionmgmt.com/vantzs/corrosion-admin-panel/releases/download/${process.env.VERSION}/corrosion-companion-linux-amd64 - chmod +x corrosion-companion-linux-amd64 - sudo mv corrosion-companion-linux-amd64 /usr/local/bin/corrosion-companion - \`\`\` + # Upload Windows binary + curl -s -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @companion-agent/bin/corrosion-companion-windows-amd64.exe \ + "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=corrosion-companion-windows-amd64.exe" - **Windows:** - Download \`corrosion-companion-windows-amd64.exe\` and run as administrator. - - ### Checksums - See \`checksums.txt\` for SHA256 verification. - - ### What's New - - Built from commit: ${context.sha.substring(0, 7)} - - Go version: 1.21 - - Platforms: Linux AMD64, Windows AMD64 - `, - draft: false, - prerelease: false - }); - - console.log(`Created release: ${release.data.html_url}`); - - // Upload Linux binary - await github.rest.repos.uploadReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: release.data.id, - name: 'corrosion-companion-linux-amd64', - data: await fs.readFile('companion-agent/bin/corrosion-companion-linux-amd64') - }); - - // Upload Windows binary - await github.rest.repos.uploadReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: release.data.id, - name: 'corrosion-companion-windows-amd64.exe', - data: await fs.readFile('companion-agent/bin/corrosion-companion-windows-amd64.exe') - }); - - // Upload checksums - await github.rest.repos.uploadReleaseAsset({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: release.data.id, - name: 'checksums.txt', - data: await fs.readFile('companion-agent/bin/checksums.txt') - }); - - console.log('Uploaded all release assets'); + # Upload checksums + curl -s -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @companion-agent/bin/checksums.txt \ + "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=checksums.txt" - name: Build Summary run: | - echo "## 🚀 Companion Agent Build Complete" >> $GITHUB_STEP_SUMMARY + echo "## Companion Agent Build Complete" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Version:** ${{ steps.version.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY echo "**Commit:** ${GITHUB_SHA:0:7}" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Built Artifacts:" >> $GITHUB_STEP_SUMMARY - echo "- ✅ Linux AMD64 ($(stat -f%z companion-agent/bin/corrosion-companion-linux-amd64 2>/dev/null || stat -c%s companion-agent/bin/corrosion-companion-linux-amd64) bytes)" >> $GITHUB_STEP_SUMMARY - echo "- ✅ Windows AMD64 ($(stat -f%z companion-agent/bin/corrosion-companion-windows-amd64.exe 2>/dev/null || stat -c%s companion-agent/bin/corrosion-companion-windows-amd64.exe) bytes)" >> $GITHUB_STEP_SUMMARY - echo "- ✅ SHA256 checksums" >> $GITHUB_STEP_SUMMARY + echo "- Linux AMD64 ($(stat -c%s companion-agent/bin/corrosion-companion-linux-amd64) bytes)" >> $GITHUB_STEP_SUMMARY + echo "- Windows AMD64 ($(stat -c%s companion-agent/bin/corrosion-companion-windows-amd64.exe) bytes)" >> $GITHUB_STEP_SUMMARY + echo "- SHA256 checksums" >> $GITHUB_STEP_SUMMARY diff --git a/companion-agent/.gitignore b/companion-agent/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/companion-agent/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/companion-agent/Makefile b/companion-agent/Makefile index fdaa6ff..a908753 100644 --- a/companion-agent/Makefile +++ b/companion-agent/Makefile @@ -16,8 +16,11 @@ GOTEST=$(GOCMD) test GOGET=$(GOCMD) get GOMOD=$(GOCMD) mod +# Version (overridable via: make build-linux VERSION=v1.2.3) +VERSION ?= dev + # Build flags -LDFLAGS=-ldflags "-s -w" +LDFLAGS = -ldflags "-s -w -X main.version=$(VERSION)" all: clean build diff --git a/companion-agent/cmd/agent/main.go b/companion-agent/cmd/agent/main.go index ff7996e..28f6de4 100644 --- a/companion-agent/cmd/agent/main.go +++ b/companion-agent/cmd/agent/main.go @@ -32,7 +32,7 @@ type Config struct { LogLevel string `envconfig:"LOG_LEVEL" default:"info"` } -const version = "1.0.0" +var version = "dev" func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) diff --git a/companion-agent/deployment/corrosion-companion.service b/companion-agent/deployment/corrosion-companion.service new file mode 100644 index 0000000..2d75c56 --- /dev/null +++ b/companion-agent/deployment/corrosion-companion.service @@ -0,0 +1,28 @@ +[Unit] +Description=Corrosion Companion Agent +Documentation=https://corrosionmgmt.com +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=rust +Group=rust +WorkingDirectory=/opt/corrosion +ExecStart=/opt/corrosion/corrosion-companion-linux-amd64 +Restart=on-failure +RestartSec=5 +StartLimitInterval=60 +StartLimitBurst=3 + +# Environment +EnvironmentFile=/opt/corrosion/.env + +# Security hardening +NoNewPrivileges=true +ProtectSystem=strict +ReadWritePaths=/opt/corrosion /home/rust +ProtectHome=read-only + +[Install] +WantedBy=multi-user.target diff --git a/frontend/src/views/admin/ServerView.vue b/frontend/src/views/admin/ServerView.vue index d27e6af..a996f98 100644 --- a/frontend/src/views/admin/ServerView.vue +++ b/frontend/src/views/admin/ServerView.vue @@ -1,6 +1,7 @@