repos / pico

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

pico / cmd / pgs / standalone
Eric Bower  ·  2025-07-21

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