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}