summaryrefslogtreecommitdiff
path: root/cmd/server
diff options
context:
space:
mode:
authorsergei <sergei@em-sysadmin.xyz>2026-04-14 06:23:55 +0400
committersergei <sergei@em-sysadmin.xyz>2026-04-14 06:23:55 +0400
commit3d51aa455006903345f554a2dd90034993796114 (patch)
tree62a7be2faf047f5eb7886feebc3b815556f03d7f /cmd/server
downloadvpnem-main.tar.gz
vpnem-main.tar.bz2
vpnem-main.zip
vpnem: VPN infrastructure with load-balanced multi-protocol nodesHEADmain
- Multi-protocol VPS nodes (VLESS-REALITY + Hysteria2 + SOCKS5) - Smart load balancing via recommendation API - Windows/Linux client (Go + Wails + sing-box) - Server API with RealIP detection and connection tracking - Auto-deployment via vpnui control plane - Silent Windows installer with UAC elevation - Load-based server recommendation (no sticky sessions) - Best Server one-click connection workflow
Diffstat (limited to 'cmd/server')
-rw-r--r--cmd/server/main.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/cmd/server/main.go b/cmd/server/main.go
new file mode 100644
index 0000000..4382c70
--- /dev/null
+++ b/cmd/server/main.go
@@ -0,0 +1,36 @@
+package main
+
+import (
+ "flag"
+ "log"
+ "net/http"
+
+ "vpnem/internal/api"
+ "vpnem/internal/rules"
+)
+
+func main() {
+ addr := flag.String("addr", ":8090", "listen address")
+ dataDir := flag.String("data", "./data", "path to data directory")
+ flag.Parse()
+
+ store := rules.NewStore(*dataDir)
+
+ // Verify data loads on startup
+ if _, err := store.LoadServers(); err != nil {
+ log.Fatalf("failed to load servers.json: %v", err)
+ }
+ if _, err := store.LoadRuleSets(); err != nil {
+ log.Fatalf("failed to load rulesets.json: %v", err)
+ }
+ if _, err := store.LoadVersion(); err != nil {
+ log.Fatalf("failed to load version.json: %v", err)
+ }
+
+ router := api.NewRouter(store)
+
+ log.Printf("vpnem server listening on %s", *addr)
+ if err := http.ListenAndServe(*addr, router); err != nil {
+ log.Fatal(err)
+ }
+}