Initial revision

This commit is contained in:
2026-05-06 00:11:40 +02:00
commit ff10334a23
5 changed files with 81 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
.env
/pz8-relay
+14
View File
@@ -0,0 +1,14 @@
FROM golang:1.26.2 AS build
WORKDIR /code
COPY go.mod ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -v -ldflags="-s -w" -o /usr/bin/app ./...
FROM gcr.io/distroless/static:nonroot
EXPOSE 8080
COPY --from=build /usr/bin/app /app
ENTRYPOINT ["/app"]
+8
View File
@@ -0,0 +1,8 @@
# PZ8 relay
A simple utility for my iptv needs.
Upstream links change frequently and need to be updated on devices, which is annoying.
This is a simple web service that will accept an HTTP request with basic authentication
and will act as a proxy against a configured HTTP link.
The proxied URL is configured via an environment variable.
+3
View File
@@ -0,0 +1,3 @@
module ktmrt.org/domenico/pz8-relay
go 1.26.2
+54
View File
@@ -0,0 +1,54 @@
package main
import (
"crypto/subtle"
"log"
"net/http"
"net/http/httputil"
"net/url"
"os"
)
func main() {
target := mustEnv("PZ8_RELAY_TARGET_URL")
username := mustEnv("PZ8_RELAY_USERNAME")
password := mustEnv("PZ8_RELAY_PASSWORD")
addr := os.Getenv("PZ8_RELAY_LISTEN_ADDR")
if addr == "" {
addr = ":8080"
}
targetURL, err := url.Parse(target)
if err != nil {
log.Fatalf("invalid PZ8_RELAY_TARGET_URL: %v", err)
}
proxy := &httputil.ReverseProxy{
Rewrite: func(preq *httputil.ProxyRequest) {
preq.SetURL(targetURL)
},
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
u, p, ok := r.BasicAuth()
if !ok || subtle.ConstantTimeCompare([]byte(u), []byte(username)) != 1 ||
subtle.ConstantTimeCompare([]byte(p), []byte(password)) != 1 {
w.Header().Set("WWW-Authenticate", `Basic realm="pz8-relay"`)
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
proxy.ServeHTTP(w, r)
})
log.Printf("pz8-relay listening on %s, proxying to %s", addr, targetURL.Redacted())
log.Fatal(http.ListenAndServe(addr, nil))
}
func mustEnv(key string) string {
v := os.Getenv(key)
if v == "" {
log.Fatalf("missing required env var: %s", key)
}
return v
}