Zum Hauptinhalt springen

Go SDK [community]

Community SDK

Dieses SDK wird vollständig von der Community gepflegt.

Remnawave Go SDK ist eine Bibliothek für die komfortable Interaktion mit der RestAPI.

✨ Hauptfunktionen

  • Generiert mit ogen v1.19.0: Reflexionsfreier JSON-Decoder für hohen Durchsatz
  • Typsicher: Compile-Zeit-Validierung gegen OpenAPI 3.0-Spezifikation
  • Controller-basiertes Design: Organisierte Sub-Clients für sauberen API-Zugriff
  • Vereinfachte Signaturen: Keine ausführlichen Params-Strukturen für einfache Operationen
  • Context-Unterstützung: Erstklassige context.Context-Unterstützung
  • OpenTelemetry: Eingebaute Tracing-Instrumentierung
  • Request-Optionen: Anfragespezifische Anpassung über ...RequestOption
  • Editoren: Middleware-Unterstützung für Anfragen/Antworten

Installation

go get github.com/Jolymmiles/remnawave-api-go/v2@latest
warnung

Wählen und fixieren Sie immer die korrekte SDK-Version passend zur Version des Remnawave-Backends.

SDK-VersionRemnawave-Panel-Version
v2.6.12.6.1
v2.5.32.5.3
v2.3.0-62.3.0
v2.2.6-32.2.6

Verwendung

Grundlegendes Beispiel
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

// Create base client
baseClient, err := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
if err != nil {
log.Fatal(err)
}

// Wrap with organized sub-clients
client := remapi.NewClientExt(baseClient)

// Get user by UUID - simplified signature
resp, err := client.Users().GetUserByUuid(ctx, "user-uuid-here")
if err != nil {
log.Fatal(err)
}

switch r := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User: %s\n", r.Response.Username)
case *remapi.NotFoundError:
fmt.Println("User not found")
case *remapi.BadRequestError:
fmt.Printf("Validation error: %v\n", r.Errors)
}
}
Benutzer erstellen und verwalten
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Create user
createResp, err := client.Users().CreateUser(ctx, &remapi.CreateUserRequest{
Username: "john_doe",
})
if err != nil {
log.Fatal(err)
}

user := createResp.(*remapi.UserResponse).Response
fmt.Printf("Created user: %s (UUID: %s)\n", user.Username, user.UUID)

// Disable user
_, err = client.Users().DisableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User disabled")

// Enable user
_, err = client.Users().EnableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User enabled")

// Delete user
_, err = client.Users().DeleteUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User deleted")
}
Node-Verwaltung
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Get all nodes
nodesResp, err := client.Nodes().GetAllNodes(ctx)
if err != nil {
log.Fatal(err)
}

nodes := nodesResp.(*remapi.NodesResponse).Response
fmt.Printf("Total nodes: %d\n", len(nodes))

for _, node := range nodes {
fmt.Printf(" - %s (%s): connected=%v\n",
node.Name, node.Address, node.IsConnected)
}

// Get single node
if len(nodes) > 0 {
nodeResp, _ := client.Nodes().GetOneNode(ctx, nodes[0].UUID.String())
node := nodeResp.(*remapi.NodeResponse).Response
fmt.Printf("\nNode details: %s\n", node.Name)
}
}
Seitenweise Navigation (Pagination)
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Use PaginationHelper for iterating through pages
pager := remapi.NewPaginationHelper(50) // 50 items per page

for pager.HasMore {
resp, err := client.Users().GetAllUsers(ctx,
pager.Limit, // size
pager.Offset, // start
)
if err != nil {
log.Fatal(err)
}

users := resp.(*remapi.GetAllUsersResponse)
for _, user := range users.Response.Users {
fmt.Printf("User: %s (UUID: %s)\n", user.Username, user.UUID)
}

// Advance to next page
pager.SetTotal(int(users.Response.Total))
pager.NextPage()
}

fmt.Printf("Total users: %d\n", *pager.Total)
}
Fehlerbehandlung
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

resp, err := client.Users().GetUserByUuid(ctx, "invalid-uuid")
if err != nil {
log.Fatal("Network error:", err)
}

// Available error types depend on the endpoint — check the generated
// Res interface (e.g. UsersGetUserByUuidRes) for the full list.
switch e := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User found: %s\n", e.Response.Username)
case *remapi.BadRequestError:
fmt.Println("Validation errors:")
for _, ve := range e.Errors {
fmt.Printf(" - %s: %s (path: %v)\n",
ve.Code, ve.Message, ve.Path)
}
case *remapi.NotFoundError:
fmt.Println("Resource not found")
case *remapi.InternalServerError:
fmt.Printf("Server error: %s\n", e.Message.Value)
}
}

Verfügbare Controller

ControllerBeschreibung
client.ApiTokens()API-Token-Verwaltung
client.Auth()Authentifizierung
client.BandwidthStatsNodes()Node-Bandbreitenstatistik
client.BandwidthStatsUsers()Benutzer-Bandbreitenstatistik
client.ConfigProfile()Konfigurationsprofile
client.ExternalSquad()Externe Squads
client.Hosts()Host-Verwaltung
client.HostsBulkActions()Massen-Host-Operationen
client.HwidUserDevices()HWID-Geräte
client.InfraBilling()Infrastruktur-Abrechnung
client.InternalSquad()Interne Squads
client.Keygen()Schlüsselerzeugung
client.Nodes()Node-Verwaltung
client.NodesUsageHistory()Node-Nutzungsverlauf
client.Passkey()Passkey-Authentifizierung
client.RemnawaveSettings()Panel-Einstellungen
client.Snippets()Code-Snippets
client.Subscription()Abonnement-Verwaltung
client.SubscriptionPageConfig()Abonnement-Seitenkonfiguration
client.SubscriptionSettings()Abonnement-Einstellungen
client.SubscriptionTemplate()Abonnement-Vorlagen
client.Subscriptions()Mehrere Abonnements
client.System()Systeminformationen
client.UserSubscriptionRequestHistory()Anfrageverlauf
client.Users()Benutzerverwaltung
client.UsersBulkActions()Massen-Benutzeroperationen

Fehlertypen

TypHTTP-StatusBeschreibung
BadRequestError400Validierungsfehler mit Details
UnauthorizedError401Authentifizierung erforderlich
ForbiddenError403Zugriff verweigert
NotFoundError404Ressource nicht gefunden
InternalServerError500Serverfehler