Compare commits
1 Commits
2026.05.6
...
5862a46b00
| Author | SHA1 | Date | |
|---|---|---|---|
| 5862a46b00 |
@@ -29,7 +29,7 @@ jobs:
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ secrets.DOCKERHUB_USERNAME }}/go-upkeep
|
||||
images: ${{ secrets.DOCKERHUB_USERNAME }}/uptop
|
||||
tags: |
|
||||
# This turns git tag "v1.0.0" into docker tag "1.0.0"
|
||||
type=semver,pattern={{version}}
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
## Development
|
||||
|
||||
```sh
|
||||
go run cmd/goupkeep/main.go -demo # starts with sample data
|
||||
go run cmd/uptop/main.go -demo # starts with sample data
|
||||
ssh -p 23234 localhost # connect to TUI
|
||||
```
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Go-Upkeep
|
||||
# uptop
|
||||
|
||||
Self-hosted uptime monitor with a TUI you can access over SSH. No browser, no install on the client — just `ssh -p 23234 your-server`.
|
||||
|
||||
Built on the foundation of [RDGames/go-upkeep](https://github.com/RDGames/go-upkeep).
|
||||
Built on the foundation of [RDGames/uptop](https://github.com/RDGames/uptop).
|
||||
|
||||
## What it does
|
||||
|
||||
@@ -18,14 +18,14 @@ Built on the foundation of [RDGames/go-upkeep](https://github.com/RDGames/go-upk
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
go run cmd/goupkeep/main.go
|
||||
go run cmd/uptop/main.go
|
||||
ssh -p 23234 localhost
|
||||
```
|
||||
|
||||
Seed some demo data to see it in action:
|
||||
|
||||
```bash
|
||||
go run cmd/goupkeep/main.go -demo
|
||||
go run cmd/uptop/main.go -demo
|
||||
```
|
||||
|
||||
## Install
|
||||
@@ -33,14 +33,14 @@ go run cmd/goupkeep/main.go -demo
|
||||
### From source
|
||||
|
||||
```bash
|
||||
go install gitea.lerkolabs.com/lerko/uptime/cmd/goupkeep@latest
|
||||
go install gitea.lerkolabs.com/lerko/uptime/cmd/uptop@latest
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
```bash
|
||||
docker pull lerko/go-upkeep:latest
|
||||
docker run -p 23234:23234 -p 8080:8080 -v ./data:/data lerko/go-upkeep
|
||||
docker pull lerko/uptop:latest
|
||||
docker run -p 23234:23234 -p 8080:8080 -v ./data:/data lerko/uptop
|
||||
```
|
||||
|
||||
### Binary
|
||||
@@ -52,15 +52,15 @@ Download from [Releases](https://gitea.lerkolabs.com/lerko/uptime/releases).
|
||||
Export your current monitors:
|
||||
|
||||
```bash
|
||||
goupkeep export -o monitors.yaml
|
||||
uptop export -o monitors.yaml
|
||||
```
|
||||
|
||||
Apply a config file:
|
||||
|
||||
```bash
|
||||
goupkeep apply -f monitors.yaml
|
||||
goupkeep apply -f monitors.yaml --dry-run # see what would change
|
||||
goupkeep apply -f monitors.yaml --prune # delete anything not in the YAML
|
||||
uptop apply -f monitors.yaml
|
||||
uptop apply -f monitors.yaml --dry-run # see what would change
|
||||
uptop apply -f monitors.yaml --prune # delete anything not in the YAML
|
||||
```
|
||||
|
||||
See [docs/config-as-code.md](docs/config-as-code.md) for the full reference.
|
||||
@@ -87,7 +87,7 @@ services:
|
||||
- UPKEEP_CLUSTER_SECRET=change-me
|
||||
```
|
||||
|
||||
First run: attach to the container (`docker attach go-upkeep`), go to the Users tab, add your SSH public key. Then detach with `Ctrl+P, Ctrl+Q` and connect normally over SSH.
|
||||
First run: attach to the container (`docker attach uptop`), go to the Users tab, add your SSH public key. Then detach with `Ctrl+P, Ctrl+Q` and connect normally over SSH.
|
||||
|
||||
## Environment variables
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@ import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"go-upkeep/internal/cluster"
|
||||
"go-upkeep/internal/config"
|
||||
"go-upkeep/internal/importer"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"go-upkeep/internal/server"
|
||||
"go-upkeep/internal/store"
|
||||
"go-upkeep/internal/tui"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/cluster"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/config"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/importer"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/server"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/tui"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
@@ -54,9 +54,9 @@ func main() {
|
||||
|
||||
func printVersion() {
|
||||
if version == "dev" {
|
||||
fmt.Println("go-upkeep dev")
|
||||
fmt.Println("uptop dev")
|
||||
} else {
|
||||
fmt.Printf("go-upkeep %s (%s, %s)\n", version, commit, date)
|
||||
fmt.Printf("uptop %s (%s, %s)\n", version, commit, date)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -305,7 +305,7 @@ func runServe(args []string) {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
}
|
||||
} else {
|
||||
fmt.Println("Go-Upkeep running in HEADLESS mode")
|
||||
fmt.Println("uptop running in HEADLESS mode")
|
||||
done := make(chan os.Signal, 1)
|
||||
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-done
|
||||
+12
-12
@@ -7,13 +7,13 @@ Define your monitors and alerts in a YAML file. Version control them, copy them
|
||||
Export what you already have:
|
||||
|
||||
```bash
|
||||
goupkeep export -o monitors.yaml
|
||||
uptop export -o monitors.yaml
|
||||
```
|
||||
|
||||
That gives you a working file you can edit and re-apply:
|
||||
|
||||
```bash
|
||||
goupkeep apply -f monitors.yaml
|
||||
uptop apply -f monitors.yaml
|
||||
```
|
||||
|
||||
That's it. Apply only creates or updates — it won't delete anything unless you tell it to.
|
||||
@@ -184,31 +184,31 @@ All 9 providers work in the YAML. The `settings` map is different per type.
|
||||
|
||||
**Export current state:**
|
||||
```bash
|
||||
goupkeep export -o monitors.yaml # to a file
|
||||
goupkeep export # to stdout
|
||||
uptop export -o monitors.yaml # to a file
|
||||
uptop export # to stdout
|
||||
```
|
||||
|
||||
**Apply a config:**
|
||||
```bash
|
||||
goupkeep apply -f monitors.yaml
|
||||
uptop apply -f monitors.yaml
|
||||
```
|
||||
|
||||
**See what would change first:**
|
||||
```bash
|
||||
goupkeep apply -f monitors.yaml --dry-run
|
||||
uptop apply -f monitors.yaml --dry-run
|
||||
```
|
||||
|
||||
**Delete monitors not in the YAML:**
|
||||
```bash
|
||||
goupkeep apply -f monitors.yaml --prune
|
||||
uptop apply -f monitors.yaml --prune
|
||||
```
|
||||
|
||||
Without `--prune`, apply never deletes anything. It only creates and updates.
|
||||
|
||||
**Pointing at a different database:**
|
||||
```bash
|
||||
goupkeep export -db-type postgres -dsn "host=localhost dbname=upkeep sslmode=disable"
|
||||
goupkeep apply -f monitors.yaml -db-type postgres -dsn "..."
|
||||
uptop export -db-type postgres -dsn "host=localhost dbname=upkeep sslmode=disable"
|
||||
uptop apply -f monitors.yaml -db-type postgres -dsn "..."
|
||||
```
|
||||
|
||||
Both commands respect the `UPKEEP_DB_TYPE` and `UPKEEP_DB_DSN` environment variables too.
|
||||
@@ -230,15 +230,15 @@ If something fails mid-apply, just fix the issue and run it again. It picks up w
|
||||
|
||||
```bash
|
||||
# set up your monitors in the TUI first, then export
|
||||
goupkeep export -o monitors.yaml
|
||||
uptop export -o monitors.yaml
|
||||
|
||||
# commit it
|
||||
git add monitors.yaml && git commit -m "add monitor config"
|
||||
|
||||
# deploy to another instance
|
||||
scp monitors.yaml prod-server:
|
||||
ssh prod-server goupkeep apply -f monitors.yaml
|
||||
ssh prod-server uptop apply -f monitors.yaml
|
||||
|
||||
# or just keep it as a backup you can restore from
|
||||
goupkeep apply -f monitors.yaml
|
||||
uptop apply -f monitors.yaml
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
module go-upkeep
|
||||
module gitea.lerkolabs.com/lerko/uptop
|
||||
|
||||
go 1.24.4
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"net/http"
|
||||
"net/smtp"
|
||||
"strconv"
|
||||
@@ -76,7 +76,7 @@ func pagerdutyPayload(routingKey, severity string) PayloadFunc {
|
||||
"event_action": "trigger",
|
||||
"payload": map[string]string{
|
||||
"summary": fmt.Sprintf("%s: %s", title, message),
|
||||
"source": "go-upkeep",
|
||||
"source": "uptop",
|
||||
"severity": severity,
|
||||
},
|
||||
})
|
||||
@@ -184,7 +184,7 @@ func (e *EmailProvider) Send(ctx context.Context, title, message string) error {
|
||||
}
|
||||
auth := smtp.PlainAuth("", e.User, e.Pass, e.Host)
|
||||
msg := []byte("To: " + e.To + "\r\n" +
|
||||
"Subject: Go-Upkeep: " + title + "\r\n" +
|
||||
"Subject: uptop: " + title + "\r\n" +
|
||||
"\r\n" +
|
||||
message + "\r\n")
|
||||
return smtp.SendMail(e.Host+":"+e.Port, auth, e.From, []string{e.To}, msg)
|
||||
|
||||
@@ -3,7 +3,7 @@ package alert
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
@@ -3,7 +3,7 @@ package cluster
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -3,8 +3,8 @@ package cluster
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"sync"
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"log"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
@@ -2,8 +2,8 @@ package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -2,8 +2,8 @@ package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"os"
|
||||
"sort"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"testing"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package importer
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -2,8 +2,8 @@ package metrics
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
@@ -2,8 +2,8 @@ package metrics
|
||||
|
||||
import (
|
||||
"context"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
|
||||
@@ -2,7 +2,7 @@ package monitor
|
||||
|
||||
import (
|
||||
"context"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"net"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -2,7 +2,7 @@ package monitor
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
|
||||
@@ -4,9 +4,9 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"go-upkeep/internal/alert"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/alert"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"math/rand/v2"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
@@ -2,7 +2,7 @@ package monitor
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -4,11 +4,11 @@ import (
|
||||
"crypto/subtle"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/importer"
|
||||
"go-upkeep/internal/metrics"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/importer"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/metrics"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"html/template"
|
||||
"log"
|
||||
"net/http"
|
||||
@@ -59,7 +59,7 @@ var statusTpl = template.Must(template.New("status").Parse(`
|
||||
<div id="summary" class="summary"></div>
|
||||
<div id="stale" class="stale-bar"></div>
|
||||
<div id="cards"></div>
|
||||
<div style="text-align: center; margin-top: 40px; color: #565f89; font-size: 0.8em;">Powered by Go-Upkeep</div>
|
||||
<div style="text-align: center; margin-top: 40px; color: #565f89; font-size: 0.8em;">Powered by uptop</div>
|
||||
</div>
|
||||
<script>
|
||||
var lastUpdate = null;
|
||||
|
||||
@@ -4,8 +4,8 @@ import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"net"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"log"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"testing"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
)
|
||||
|
||||
type Store interface {
|
||||
|
||||
@@ -2,7 +2,7 @@ package tui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package tui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -340,7 +340,7 @@ func (m Model) viewSitesTab() string {
|
||||
BorderForeground(m.theme.Accent).
|
||||
Padding(1, 3).
|
||||
Render(
|
||||
titleStyle.Render("Go-Upkeep") + "\n\n" +
|
||||
titleStyle.Render("uptop") + "\n\n" +
|
||||
"No monitors configured yet.\n\n" +
|
||||
subtleStyle.Render("[n] Add your first monitor"),
|
||||
)
|
||||
|
||||
+3
-3
@@ -3,9 +3,9 @@ package tui
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-upkeep/internal/models"
|
||||
"go-upkeep/internal/monitor"
|
||||
"go-upkeep/internal/store"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/monitor"
|
||||
"gitea.lerkolabs.com/lerko/uptop/internal/store"
|
||||
"math"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
Reference in New Issue
Block a user