repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / cmd / pgs / standalone
Eric Bower  ·  2026-01-25

main.go

 1package main
 2
 3import (
 4	"os"
 5	"strings"
 6
 7	"github.com/picosh/pico/pkg/apps/pgs"
 8	pgsdb "github.com/picosh/pico/pkg/apps/pgs/db"
 9	"github.com/picosh/pico/pkg/shared"
10	"github.com/picosh/pico/pkg/shared/storage"
11	"golang.org/x/crypto/ssh"
12)
13
14func main() {
15	dbURL := shared.GetEnv("DATABASE_URL", "./data/pgs.sqlite3")
16	logger := shared.CreateLogger("pgs-standalone", false)
17	dbpool, err := pgsdb.NewSqliteDB(dbURL, logger)
18	if err != nil {
19		panic(err)
20	}
21	adapter := storage.GetStorageTypeFromEnv()
22	st, err := storage.NewStorage(logger, adapter)
23	if err != nil {
24		panic(err)
25	}
26	pubsub := pgs.NewPubsubChan()
27	defer func() {
28		_ = pubsub.Close()
29	}()
30	cfg := pgs.NewPgsConfig(logger, dbpool, st, pubsub)
31	killCh := make(chan error)
32
33	// first time user experience flow
34	args := os.Args
35	if len(args) > 1 && args[1] == "init" {
36		if len(args) < 4 {
37			panic("must provide username and pubkey")
38		}
39
40		userName := args[2]
41		pubkeyRaw := strings.Join(args[3:], " ")
42		key, comment, _, _, err := ssh.ParseAuthorizedKey([]byte(pubkeyRaw))
43		if err != nil {
44			logger.Error("parse pubkey", "err", err)
45			return
46		}
47		pubkey := shared.KeyForKeyText(key)
48		logger.Info("init cli", "userName", userName, "pubkey", pubkey)
49
50		err = dbpool.RegisterAdmin(userName, pubkey, comment)
51		if err != nil {
52			panic(err)
53		}
54		logger.Info("Admin user created. You can now start using pgs!")
55		return
56	}
57
58	go pgs.StartApiServer(cfg)
59	pgs.StartSshServer(cfg, killCh)
60}