5 Commits
A ... main

Author SHA1 Message Date
f2ffd10e20 Build-Option ebenfalls auf Tag-Referenz angepasst um unnötige Artefaktbildung zu umgehen
All checks were successful
build-binaries / build (, amd64, linux) (push) Has been skipped
build-binaries / build (, arm, 7, linux) (push) Has been skipped
build-binaries / build (, arm64, linux) (push) Has been skipped
build-binaries / build (.exe, amd64, windows) (push) Has been skipped
build-binaries / release (push) Has been skipped
release-tag / release-image (push) Successful in 1m25s
2025-08-07 04:13:26 +02:00
5c51c3f6a2 Integrierten HTTPS-Server aktiviert und an ENV gebunden
All checks were successful
release-tag / release-image (push) Successful in 1m28s
build-binaries / build (, amd64, linux) (push) Successful in 10m5s
build-binaries / build (, arm, 7, linux) (push) Successful in 10m5s
build-binaries / build (, arm64, linux) (push) Successful in 10m3s
build-binaries / build (.exe, amd64, windows) (push) Successful in 10m6s
build-binaries / release (push) Successful in 32s
2025-08-06 05:59:19 +02:00
7c08015cb4 Anpassung für Login-Problem bei Testverbindungen mit Cookie Secure=True. Umgebungsvariable EW_FORCEINSECURECOOKIE hinzugefügt. Wenn Produktiv und Var = True Dann Autoset Wenn False dann Secure! Wenn Produktiv = False Dann Autoset.
Some checks failed
release-tag / release-image (push) Successful in 4m33s
build-binaries / build (, arm, 7, linux) (push) Has been cancelled
build-binaries / build (, arm64, linux) (push) Has been cancelled
build-binaries / build (, amd64, linux) (push) Has been cancelled
build-binaries / build (.exe, amd64, windows) (push) Has been cancelled
build-binaries / release (push) Has been cancelled
2025-08-06 05:48:01 +02:00
fa3d082f2f Static Verzeichnis in Build-Parameter hinzugefügt
Some checks failed
release-tag / release-image (push) Successful in 1m32s
build-binaries / build (, amd64, linux) (push) Successful in 10m4s
build-binaries / build (, arm, 7, linux) (push) Successful in 10m3s
build-binaries / build (, arm64, linux) (push) Successful in 10m3s
build-binaries / build (.exe, amd64, windows) (push) Has started running
build-binaries / release (push) Has been cancelled
2025-08-06 05:11:12 +02:00
bc56b340a8 Neuer Worfklow für Alpine
Some checks failed
release-tag / release-image (push) Successful in 1m44s
build-binaries / build (, amd64, linux) (push) Successful in 10m36s
build-binaries / build (, arm, 7, linux) (push) Has started running
build-binaries / build (, arm64, linux) (push) Has been cancelled
build-binaries / build (.exe, amd64, windows) (push) Has been cancelled
build-binaries / release (push) Has been cancelled
2025-08-06 04:58:30 +02:00
4 changed files with 93 additions and 41 deletions

View File

@@ -1,14 +1,18 @@
# Git(tea) Actions workflow: Build and publish standalone binaries # Git(tea) Actions workflow: Build and publish standalone binaries **plus** bundled `static/` assets
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# ✧ Builds the Gobased WoL server for three targets # ✧ Builds the Gobased WoL server for four targets **and** packt das Verzeichnis
# • linux/amd64 → wol-server-linux-amd64.tar.gz # `static` zusammen mit der Binary, sodass es relativ zur ausführbaren Datei
# • linux/arm64 → wol-server-linux-arm64.tar.gz (Raspberry Pi 4/5, 64bit OS) # liegt (wichtig für die eingebauten BootstrapAssets & favicon).
# • windows/amd64 → wol-server-windows-amd64.zip #
# ✧ Uploads artifacts to the workflow and, if a tag (vX.Y.Z) is pushed, # • linux/amd64 → wol-server-linux-amd64.tar.gz
# attaches them to the corresponding release. # • linux/arm64 → wol-server-linux-arm64.tar.gz
# • linux/arm/v7 → wol-server-linux-armv7.tar.gz
# • windows/amd64 → wol-server-windows-amd64.zip
#
# ✧ Artefakte landen im Workflow und bei TagPush (vX.Y.Z) als ReleaseAssets.
# #
# Secrets/variables: # Secrets/variables:
# GITEA_TOKEN optional, only needed if default token lacks release perms. # GITEA_TOKEN optional, falls default token keine ReleaseRechte hat.
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
name: build-binaries name: build-binaries
@@ -20,6 +24,7 @@ on:
jobs: jobs:
build: build:
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-fast runs-on: ubuntu-fast
strategy: strategy:
@@ -28,15 +33,19 @@ jobs:
- goos: linux - goos: linux
goarch: amd64 goarch: amd64
ext: "" ext: ""
- goos: linux # Raspberry Pi (64bit) - goos: linux
goarch: arm64 goarch: arm64
ext: "" ext: ""
- goos: linux
goarch: arm
goarm: "7"
ext: ""
- goos: windows - goos: windows
goarch: amd64 goarch: amd64
ext: ".exe" ext: ".exe"
env: env:
GO_VERSION: "1.22" GO_VERSION: "1.24"
BINARY_NAME: wol-server BINARY_NAME: wol-server
steps: steps:
@@ -49,35 +58,45 @@ jobs:
go-version: ${{ env.GO_VERSION }} go-version: ${{ env.GO_VERSION }}
cache: true cache: true
- name: Build ${{ matrix.goos }}/${{ matrix.goarch }} - name: Build ${{ matrix.goos }}/${{ matrix.goarch }}${{ matrix.goarm && format('/v{0}', matrix.goarm) || '' }}
shell: bash shell: bash
run: | run: |
mkdir -p dist set -e
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -trimpath -ldflags "-s -w" \ mkdir -p dist/package
-o "dist/${BINARY_NAME}-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}" . if [ -n "${{ matrix.goarm }}" ]; then export GOARM=${{ matrix.goarm }}; fi
CGO_ENABLED=0 GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -trimpath -ldflags "-s -w" \
-o "dist/package/${BINARY_NAME}${{ matrix.ext }}" .
# Assets: statisches Verzeichnis beilegen
cp -r static dist/package/
- name: Package archive - name: Package archive with static assets
shell: bash shell: bash
run: | run: |
set -e
cd dist cd dist
FILE="${BINARY_NAME}-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}"
if [ "${{ matrix.goos }}" == "windows" ]; then if [ "${{ matrix.goos }}" == "windows" ]; then
zip "${BINARY_NAME}-windows-amd64.zip" "$FILE" ZIP_NAME="${BINARY_NAME}-windows-amd64.zip"
rm "$FILE" (cd package && zip -r "../$ZIP_NAME" .)
else else
tar -czf "${BINARY_NAME}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz" "$FILE" ARCH_SUFFIX="${{ matrix.goarch }}"
rm "$FILE" if [ "${{ matrix.goarch }}" == "arm" ]; then ARCH_SUFFIX="armv${{ matrix.goarm }}"; fi
TAR_NAME="${BINARY_NAME}-${{ matrix.goos }}-${ARCH_SUFFIX}.tar.gz"
tar -czf "$TAR_NAME" -C package .
fi fi
- name: Upload workflow artifact - name: Upload workflow artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: ${{ matrix.goos }}-${{ matrix.goarch }} name: ${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.goarm && format('v{0}', matrix.goarm) || '' }}
path: | path: dist/*.tar.gz
dist/*.zip if-no-files-found: ignore
dist/*.tar.gz - uses: actions/upload-artifact@v3
with:
name: windows-amd64
path: dist/*.zip
if-no-files-found: ignore
# Optional release step for tag pushes # Release Schritt für TagPushes
release: release:
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
needs: build needs: build
@@ -86,7 +105,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Download build artifacts - name: Download artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
path: ./dist path: ./dist

View File

@@ -28,7 +28,12 @@ EXPOSE 8080
ENV EW_USERNAME=admin \ ENV EW_USERNAME=admin \
EW_PASSWORD=admin \ EW_PASSWORD=admin \
EW_DB=/data/machines.json \ EW_DB=/data/machines.json \
EW_PRODUCTIVE=true EW_PRODUCTIVE=true \
EW_FORCEINSECURECOOKIE=false \
HTTP_PORT=8080 \
HTTP_TLS=false \
HTTP_TLS_CERTIFICATE=./server-cert.pem \
HTTP_TLS_PRIVATEKEY=./server-key.pem
ENTRYPOINT ["/bin/edgewol"] ENTRYPOINT ["/bin/edgewol"]

View File

@@ -2,7 +2,6 @@ services:
api: api:
image: git.send.nrw/sendnrw/edge-wol:latest image: git.send.nrw/sendnrw/edge-wol:latest
container_name: edgewol container_name: edgewol
restart: unless-stopped
volumes: volumes:
- /docker/edgewol/machines.json:/data/machines.json - /docker/edgewol/machines.json:/data/machines.json
#labels: #labels:

55
main.go
View File

@@ -41,10 +41,14 @@ import (
) )
var ( var (
username = GetENV("EW_USERNAME", "root") HTTP_PORT string = "8080"
password = GetENV("EW_PASSWORD", "root") HTTP_TLS bool = false
productive = Enabled("EW_PRODUCTIVE", false) HTTP_TLS_PRIVATEKEY string = ""
hashedPassword = "" HTTP_TLS_CERTIFICATE string = ""
username = GetENV("EW_USERNAME", "root")
password = GetENV("EW_PASSWORD", "root")
productive = Enabled("EW_PRODUCTIVE", false)
hashedPassword = ""
) )
var ( var (
@@ -185,7 +189,17 @@ func generateSessionToken() string {
func main() { func main() {
// Determine DB path and load machines. // Determine DB path and load machines.
hashedPassword = hashPassword(password) hashedPassword = hashPassword(password)
dbPath = GetENV("EW_DB", "/data/machines.json") if productive {
dbPath = GetENV("EW_DB", "/data/machines.json")
} else {
dbPath = "./machines.json"
}
HTTP_PORT = GetENV("HTTP_PORT", "8080")
HTTP_TLS = Enabled("HTTP_TLS", true)
HTTP_TLS_CERTIFICATE = GetENV("HTTP_TLS_CERTIFICATE", "./server-cert.pem")
HTTP_TLS_PRIVATEKEY = GetENV("HTTP_TLS_PRIVATEKEY", "./server-key.pem")
loadMachines() loadMachines()
// Save on SIGINT/SIGTERM. // Save on SIGINT/SIGTERM.
@@ -223,13 +237,25 @@ func main() {
// Speichere Session // Speichere Session
sessionStore[token] = user sessionStore[token] = user
var envSecure bool
if productive {
var forceInsecure bool = Enabled("EW_FORCEINSECURECOOKIE", false)
if forceInsecure {
envSecure = r.TLS != nil
} else {
envSecure = true
}
} else {
envSecure = r.TLS != nil
}
// Cookie setzen // Cookie setzen
http.SetCookie(w, &http.Cookie{ http.SetCookie(w, &http.Cookie{
Name: "session", Name: "session",
Value: token, Value: token,
Path: "/", Path: "/",
HttpOnly: true, HttpOnly: true,
Secure: true, Secure: envSecure,
SameSite: http.SameSiteLaxMode, SameSite: http.SameSiteLaxMode,
}) })
@@ -298,15 +324,18 @@ func main() {
http.HandleFunc("/add", addHandler) http.HandleFunc("/add", addHandler)
http.HandleFunc("/remove", removeHandler) http.HandleFunc("/remove", removeHandler)
addr := os.Getenv("LISTEN") if HTTP_TLS {
if addr == "" { log.Printf("WoL server listening on %s (DB: %s)", ":"+HTTP_PORT, dbPath)
addr = ":8080" if err := http.ListenAndServeTLS(":"+HTTP_PORT, HTTP_TLS_CERTIFICATE, HTTP_TLS_PRIVATEKEY, nil); err != nil {
log.Fatalf("http server error: %v", err)
}
} else {
log.Printf("WoL server listening on %s (DB: %s)", ":"+HTTP_PORT, dbPath)
if err := http.ListenAndServe(":"+HTTP_PORT, nil); err != nil {
log.Fatalf("http server error: %v", err)
}
} }
log.Printf("WoL server listening on %s (DB: %s)", addr, dbPath)
if err := http.ListenAndServe(addr, nil); err != nil {
log.Fatalf("http server error: %v", err)
}
} }
// ========= persistence ========= // ========= persistence =========