Skip to content

Commit 716fbe1

Browse files
authored
Merge pull request #53 from ZeroHost-Code/beta
v2.0.0
2 parents ce42185 + 0f312d2 commit 716fbe1

53 files changed

Lines changed: 5973 additions & 8432 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/deploy-beta.yml

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,56 @@
1-
name: Deploy Beta
2-
3-
on:
4-
push:
5-
branches: [beta]
6-
7-
permissions:
8-
contents: read
9-
10-
jobs:
11-
deploy:
12-
runs-on: ubuntu-latest
13-
steps:
14-
- name: SSH and deploy
15-
uses: appleboy/ssh-action@v1.2.0
16-
with:
17-
host: ${{ secrets.SSH_HOST }}
18-
username: ${{ secrets.SSH_USER }}
19-
key: ${{ secrets.SSH_PRIVATE_KEY }}
20-
port: ${{ secrets.SSH_PORT || 22 }}
21-
host_key_checking: false
22-
script: |
23-
cd ${{ secrets.BETA_PATH }}
24-
cp .env /tmp/beta.env 2>/dev/null; cp port.txt /tmp/beta.port.txt 2>/dev/null
25-
git fetch origin --prune
26-
git checkout beta
27-
git reset --hard origin/beta
28-
cp /tmp/beta.env .env 2>/dev/null; cp /tmp/beta.port.txt port.txt 2>/dev/null
29-
grep 'discord.zero-host.org' public/js/app.js || echo "⚠ DISCORD LINK NOT FOUND IN FILE"
30-
head -20 port.txt 2>/dev/null || echo "⚠ port.txt missing or empty"
31-
npm install
32-
pm2 restart beta
1+
name: Deploy Beta
2+
3+
on:
4+
push:
5+
branches: [beta]
6+
7+
permissions:
8+
contents: read
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
- name: Setup Go
18+
uses: actions/setup-go@v5
19+
with:
20+
go-version: 'stable'
21+
22+
- name: Build
23+
run: go build -o server ./cmd/server/
24+
25+
- name: Stop service
26+
uses: appleboy/ssh-action@v1.2.0
27+
with:
28+
host: ${{ secrets.SSH_HOST }}
29+
username: ${{ secrets.SSH_USER }}
30+
key: ${{ secrets.SSH_PRIVATE_KEY }}
31+
port: ${{ secrets.SSH_PORT || 22 }}
32+
script: |
33+
systemctl stop beta || true
34+
35+
- name: Upload binary
36+
uses: appleboy/scp-action@v0.1.7
37+
with:
38+
host: ${{ secrets.SSH_HOST }}
39+
username: ${{ secrets.SSH_USER }}
40+
key: ${{ secrets.SSH_PRIVATE_KEY }}
41+
port: ${{ secrets.SSH_PORT || 22 }}
42+
source: server
43+
target: ${{ secrets.BETA_PATH }}
44+
strip_components: 0
45+
overwrite: true
46+
47+
- name: Start service
48+
uses: appleboy/ssh-action@v1.2.0
49+
with:
50+
host: ${{ secrets.SSH_HOST }}
51+
username: ${{ secrets.SSH_USER }}
52+
key: ${{ secrets.SSH_PRIVATE_KEY }}
53+
port: ${{ secrets.SSH_PORT || 22 }}
54+
script: |
55+
chmod +x ${{ secrets.BETA_PATH }}/server
56+
systemctl start beta

.github/workflows/deploy-main.yml

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,56 @@
1-
name: Deploy Main
2-
3-
on:
4-
push:
5-
branches: [main]
6-
7-
permissions:
8-
contents: read
9-
10-
jobs:
11-
deploy:
12-
runs-on: ubuntu-latest
13-
steps:
14-
- name: SSH and deploy
15-
uses: appleboy/ssh-action@v1.2.0
16-
with:
17-
host: ${{ secrets.SSH_HOST }}
18-
username: ${{ secrets.SSH_USER }}
19-
key: ${{ secrets.SSH_PRIVATE_KEY }}
20-
port: ${{ secrets.SSH_PORT || 22 }}
21-
host_key_checking: false
22-
script: |
23-
cd ${{ secrets.MAIN_PATH }}
24-
cp .env /tmp/main.env 2>/dev/null; cp port.txt /tmp/main.port.txt 2>/dev/null
25-
git fetch origin --prune
26-
git checkout main
27-
git reset --hard origin/main
28-
cp /tmp/main.env .env 2>/dev/null; cp /tmp/main.port.txt port.txt 2>/dev/null
29-
npm install
30-
pm2 restart zerohost-dashboard
1+
name: Deploy Main
2+
3+
on:
4+
push:
5+
branches: [main]
6+
7+
permissions:
8+
contents: read
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
- name: Setup Go
18+
uses: actions/setup-go@v5
19+
with:
20+
go-version: 'stable'
21+
22+
- name: Build
23+
run: go build -o server ./cmd/server/
24+
25+
- name: Stop service
26+
uses: appleboy/ssh-action@v1.2.0
27+
with:
28+
host: ${{ secrets.SSH_HOST }}
29+
username: ${{ secrets.SSH_USER }}
30+
key: ${{ secrets.SSH_PRIVATE_KEY }}
31+
port: ${{ secrets.SSH_PORT || 22 }}
32+
script: |
33+
systemctl stop prod || true
34+
35+
- name: Upload binary
36+
uses: appleboy/scp-action@v0.1.7
37+
with:
38+
host: ${{ secrets.SSH_HOST }}
39+
username: ${{ secrets.SSH_USER }}
40+
key: ${{ secrets.SSH_PRIVATE_KEY }}
41+
port: ${{ secrets.SSH_PORT || 22 }}
42+
source: server
43+
target: ${{ secrets.MAIN_PATH }}
44+
strip_components: 0
45+
overwrite: true
46+
47+
- name: Start service
48+
uses: appleboy/ssh-action@v1.2.0
49+
with:
50+
host: ${{ secrets.SSH_HOST }}
51+
username: ${{ secrets.SSH_USER }}
52+
key: ${{ secrets.SSH_PRIVATE_KEY }}
53+
port: ${{ secrets.SSH_PORT || 22 }}
54+
script: |
55+
chmod +x ${{ secrets.MAIN_PATH }}/server
56+
systemctl start prod

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ uploads/
3434
# Secrets (if any local dump)
3535
*.pem
3636
*.key
37+
38+
# Go binary
39+
/server

cmd/server/main.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http"
6+
"os"
7+
"os/signal"
8+
"strings"
9+
"syscall"
10+
11+
"github.com/go-chi/chi/v5"
12+
chimw "github.com/go-chi/chi/v5/middleware"
13+
"zerohost/dashboard/internal/config"
14+
"zerohost/dashboard/internal/database"
15+
"zerohost/dashboard/internal/embed"
16+
"zerohost/dashboard/internal/middleware"
17+
"zerohost/dashboard/internal/routes"
18+
"zerohost/dashboard/internal/services"
19+
)
20+
21+
func main() {
22+
cfg := config.Load()
23+
24+
if err := database.InitPool(cfg.DatabaseDSN); err != nil {
25+
log.Fatalf("Failed to connect to database: %v", err)
26+
}
27+
defer database.ClosePool()
28+
29+
database.RunMigrations()
30+
31+
services.PteroURL = cfg.PteroURL
32+
services.PteroAPIKey = cfg.PteroAPIKey
33+
services.PanelDBName = cfg.PanelDBName
34+
services.ResendAPIKey = cfg.ResendAPIKey
35+
services.ResendFrom = cfg.ResendFrom
36+
services.BaseURL = cfg.BaseURL
37+
38+
if cfg.ResendAPIKey == "" {
39+
log.Println("WARNING: RESEND_API_KEY not set — verification emails will not be sent")
40+
}
41+
42+
if err := services.InitSecurity(cfg.IPQSKey, cfg.AbuseIPDBKey); err != nil {
43+
log.Printf("Warning: security service init failed: %v", err)
44+
}
45+
46+
if err := services.InitFileLogger("log.txt"); err != nil {
47+
log.Printf("Warning: file logger init failed: %v", err)
48+
}
49+
50+
services.StartScheduler()
51+
52+
r := chi.NewRouter()
53+
54+
r.Use(chimw.Logger)
55+
r.Use(chimw.Recoverer)
56+
r.Use(chimw.RealIP)
57+
r.Use(middleware.SecurityHeaders)
58+
r.Use(middleware.FileLogger)
59+
60+
fileServer := http.FileServer(http.FS(embed.SubFS))
61+
62+
r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
63+
cleanPath := strings.TrimPrefix(r.URL.Path, "/")
64+
if cleanPath == "" {
65+
cleanPath = "index.html"
66+
}
67+
68+
if _, err := embed.SubFS.Open(cleanPath); err == nil {
69+
fileServer.ServeHTTP(w, r)
70+
return
71+
}
72+
73+
index, err := embed.PublicFS.ReadFile("public/index.html")
74+
if err != nil {
75+
http.Error(w, "Not found", http.StatusNotFound)
76+
return
77+
}
78+
w.Header().Set("Content-Type", "text/html; charset=utf-8")
79+
w.Write(index)
80+
})
81+
82+
r.Route("/api", func(r chi.Router) {
83+
routes.RegisterAuthRoutes(r)
84+
routes.RegisterServerRoutes(r)
85+
routes.RegisterAdminRoutes(r)
86+
routes.RegisterNotificationRoutes(r)
87+
r.Route("/auth", func(r chi.Router) {
88+
routes.RegisterPasskeyRoutes(r)
89+
routes.RegisterTOTPRoutes(r)
90+
})
91+
})
92+
93+
go func() {
94+
addr := ":" + cfg.Port
95+
log.Printf("ZeroHost Dashboard starting on %s", addr)
96+
if err := http.ListenAndServe(addr, r); err != nil {
97+
log.Fatalf("Server failed: %v", err)
98+
}
99+
}()
100+
101+
quit := make(chan os.Signal, 1)
102+
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
103+
<-quit
104+
log.Println("Shutting down...")
105+
}

config/cap.js

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)