64 lines
2.0 KiB
Go
64 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"time"
|
|
|
|
"gitea.entroia.com/Zayden-Jung/foundry-core/internal/auth"
|
|
"gitea.entroia.com/Zayden-Jung/foundry-core/internal/codex"
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/jackc/pgx/v5/stdlib"
|
|
)
|
|
|
|
func env(key, fallback string) string {
|
|
if value := os.Getenv(key); value != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) == 2 && os.Args[1] == "codex-worker" {
|
|
log.Fatal(codex.ServeWorker("/run/foundry-codex/worker.sock"))
|
|
}
|
|
origin, err := url.Parse(os.Getenv("PUBLIC_ORIGIN"))
|
|
if err != nil || origin.Scheme != "https" || origin.Hostname() == "" || origin.User != nil ||
|
|
(origin.Path != "" && origin.Path != "/") || origin.RawQuery != "" || origin.Fragment != "" {
|
|
log.Fatal("PUBLIC_ORIGIN must be an HTTPS origin")
|
|
}
|
|
var callbacks map[string]string
|
|
if err := json.Unmarshal([]byte(os.Getenv("FOUNDRY_PROJECTS")), &callbacks); err != nil || len(callbacks) == 0 {
|
|
log.Fatal("FOUNDRY_PROJECTS must configure at least one project")
|
|
}
|
|
id, secret, dsn := os.Getenv("GOOGLE_CLIENT_ID"), os.Getenv("GOOGLE_CLIENT_SECRET"), os.Getenv("DATABASE_URL")
|
|
if id == "" || secret == "" || dsn == "" {
|
|
log.Fatal("Google credentials and DATABASE_URL are required")
|
|
}
|
|
config, err := pgx.ParseConfig(dsn)
|
|
if err != nil {
|
|
log.Fatal("Invalid DATABASE_URL")
|
|
}
|
|
db := stdlib.OpenDB(*config)
|
|
defer db.Close()
|
|
handler, err := auth.New(db, callbacks, origin.ResolveReference(&url.URL{Path: "/auth/google/callback"}).String(), id, secret)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
mux := http.NewServeMux()
|
|
if err := codex.Register(mux, callbacks, os.Getenv("FOUNDRY_CODEX_SOCKET"), os.Getenv("FOUNDRY_CODEX_GRANTS")); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
mux.Handle("/", handler)
|
|
server := &http.Server{
|
|
Addr: net.JoinHostPort(env("HOST", "127.0.0.1"), env("PORT", "8080")),
|
|
Handler: mux, ReadHeaderTimeout: 5 * time.Second, ReadTimeout: 10 * time.Second,
|
|
WriteTimeout: 110 * time.Second, IdleTimeout: 60 * time.Second,
|
|
}
|
|
log.Fatal(server.ListenAndServe())
|
|
}
|