Add self-hosted RCS backend, extension, and ops tooling

Ship the Go/SQLite API and Web UI, Chrome/Brave capture addon,
Docker Compose, Pangolin reverse-proxy support, and a user-crontab
watchdog so the binary stays running without systemd.
This commit is contained in:
2026-08-06 22:02:45 +02:00
parent 3f05c97e1f
commit 5a0e2e630b
30 changed files with 4334 additions and 2 deletions
+64
View File
@@ -0,0 +1,64 @@
package main
import (
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"github.com/squid/rcs/backend/internal/api"
"github.com/squid/rcs/backend/internal/config"
"github.com/squid/rcs/backend/internal/db"
"github.com/squid/rcs/backend/internal/imgur"
"github.com/squid/rcs/backend/internal/web"
)
func main() {
cfg := config.Load()
if err := os.MkdirAll(cfg.ScreenshotDir, 0o755); err != nil {
log.Fatalf("create screenshot dir: %v", err)
}
if err := os.MkdirAll(filepath.Dir(cfg.DBPath), 0o755); err != nil {
log.Fatalf("create db dir: %v", err)
}
store, err := db.Open(cfg.DBPath)
if err != nil {
log.Fatalf("open db: %v", err)
}
defer store.Close()
imgurClient := imgur.New(cfg.ImgurClientID)
webUI, err := web.New(cfg, store, imgurClient)
if err != nil {
log.Fatalf("web ui: %v", err)
}
server := api.New(cfg, store, imgurClient, webUI)
fmt.Printf("RCS backend listening on http://%s\n", cfg.Addr)
fmt.Printf(" data dir: %s\n", cfg.DataDir)
fmt.Printf(" db: %s\n", cfg.DBPath)
if cfg.PublicBaseURL != "" {
fmt.Printf(" public: %s\n", cfg.PublicBaseURL)
}
if cfg.TrustProxy {
fmt.Println(" proxy: trusting X-Forwarded-* headers")
}
if cfg.APIKey != "" {
fmt.Println(" api key: enabled")
} else {
fmt.Println(" api key: disabled (open)")
}
if imgurClient.Enabled() {
fmt.Println(" imgur: enabled")
} else {
fmt.Println(" imgur: disabled (set IMGUR_CLIENT_ID)")
}
if err := http.ListenAndServe(cfg.Addr, server.Handler()); err != nil {
log.Fatal(err)
}
}