An atproto PDS written in Go

Use Turso for a database #1

open opened by willdot.net targeting main from turso-db
Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:dadhhalkfcq3gucaq25hjqon/sh.tangled.repo.pull/3miih645jsu22
+39 -7
Diff #0
+6
cmd/cocoon/main.go
··· 54 54 Usage: "PostgreSQL connection string (required if db-type is postgres)", 55 55 EnvVars: []string{"COCOON_DATABASE_URL", "DATABASE_URL"}, 56 56 }, 57 + &cli.StringFlag{ 58 + Name: "turso-token", 59 + Usage: "Token for a cloud Turso instance", 60 + EnvVars: []string{"COCOON_TURSO_TOKEN", "TURSO_TOKEN"}, 61 + }, 57 62 &cli.StringFlag{ 58 63 Name: "did", 59 64 EnvVars: []string{"COCOON_DID"}, ··· 218 223 DbName: cmd.String("db-name"), 219 224 DbType: cmd.String("db-type"), 220 225 DatabaseURL: cmd.String("database-url"), 226 + TursoToken: cmd.String("turso-token"), 221 227 Did: cmd.String("did"), 222 228 Hostname: cmd.String("hostname"), 223 229 RotationKeyPath: cmd.String("rotation-key-path"),
+4
go.mod
··· 29 29 github.com/multiformats/go-multihash v0.2.3 30 30 github.com/prometheus/client_golang v1.23.2 31 31 github.com/samber/slog-echo v1.16.1 32 + github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc 32 33 github.com/urfave/cli/v2 v2.27.6 33 34 github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e 34 35 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b ··· 41 42 require ( 42 43 github.com/Azure/go-autorest v14.2.0+incompatible // indirect 43 44 github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect 45 + github.com/antlr4-go/antlr/v4 v4.13.0 // indirect 44 46 github.com/beorn7/perks v1.0.1 // indirect 45 47 github.com/cespare/xxhash/v2 v2.3.0 // indirect 48 + github.com/coder/websocket v1.8.12 // indirect 46 49 github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect 47 50 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect 48 51 github.com/earthboundkid/versioninfo/v2 v2.24.1 // indirect ··· 124 127 go.uber.org/multierr v1.11.0 // indirect 125 128 go.uber.org/zap v1.26.0 // indirect 126 129 go.yaml.in/yaml/v2 v2.4.2 // indirect 130 + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect 127 131 golang.org/x/net v0.43.0 // indirect 128 132 golang.org/x/sync v0.16.0 // indirect 129 133 golang.org/x/sys v0.35.0 // indirect
+8 -2
go.sum
··· 7 7 github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b/go.mod h1:4+EPqMRApwwE/6yo6CxiHoSnBzjRr3jsqer7frxP8y4= 8 8 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= 9 9 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= 10 + github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= 11 + github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= 10 12 github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= 11 13 github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= 12 14 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= ··· 26 28 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= 27 29 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 28 30 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 31 + github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= 32 + github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= 29 33 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 30 34 github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= 31 35 github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= ··· 330 334 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 331 335 github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= 332 336 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= 337 + github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc h1:lzi/5fg2EfinRlh3v//YyIhnc4tY7BTqazQGwb1ar+0= 338 + github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc/go.mod h1:08inkKyguB6CGGssc/JzhmQWwBgFQBgjlYFjxjRh7nU= 333 339 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 334 340 github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= 335 341 github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= ··· 386 392 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 387 393 golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= 388 394 golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= 389 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 390 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 395 + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= 396 + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= 391 397 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 392 398 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 393 399 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+3 -3
identity/identity.go
··· 82 82 return maybeDidFromTxt, nil 83 83 } 84 84 85 - if maybeDidFromWeb, err := ResolveHandleFromWellKnown(ctx, cli, handle); err == nil { 85 + maybeDidFromWeb, err := ResolveHandleFromWellKnown(ctx, cli, handle) 86 + if err == nil { 86 87 return maybeDidFromWeb, nil 87 88 } 88 - 89 - return "", fmt.Errorf("handle could not be resolved") 89 + return "", fmt.Errorf("resolve well known: %w", err) 90 90 } 91 91 92 92 func DidToDocUrl(did string) (string, error) {
+18 -2
server/server.go
··· 4 4 "bytes" 5 5 "context" 6 6 "crypto/ecdsa" 7 + "database/sql" 7 8 "embed" 8 9 "errors" 9 10 "fmt" ··· 44 45 "github.com/labstack/echo/v4" 45 46 "github.com/labstack/echo/v4/middleware" 46 47 slogecho "github.com/samber/slog-echo" 48 + _ "github.com/tursodatabase/libsql-client-go/libsql" 47 49 "gorm.io/driver/postgres" 48 50 "gorm.io/driver/sqlite" 49 51 "gorm.io/gorm" ··· 97 99 DbName string 98 100 DbType string 99 101 DatabaseURL string 102 + TursoToken string 100 103 Version string 101 104 Did string 102 105 Hostname string ··· 349 352 return nil, fmt.Errorf("failed to connect to postgres: %w", err) 350 353 } 351 354 logger.Info("connected to PostgreSQL database") 355 + case "turso": 356 + primaryUrl := args.DatabaseURL 357 + authToken := args.TursoToken 358 + 359 + db, err := sql.Open("libsql", fmt.Sprintf("%s?authToken=%s", primaryUrl, authToken)) 360 + gdb, err = gorm.Open(sqlite.New(sqlite.Config{ 361 + Conn: db, 362 + }), &gorm.Config{}) 363 + if err != nil { 364 + return nil, fmt.Errorf("failed to connect to postgres: %w", err) 365 + } 366 + logger.Info("connected to PostgreSQL database") 367 + 352 368 default: 353 369 gdb, err = gorm.Open(sqlite.Open(args.DbName), &gorm.Config{}) 354 370 if err != nil { ··· 658 674 func (s *Server) doBackup() { 659 675 logger := s.logger.With("name", "doBackup") 660 676 661 - if s.dbType == "postgres" { 662 - logger.Info("skipping S3 backup - PostgreSQL backups should be handled externally (pg_dump, managed database backups, etc.)") 677 + if s.dbType == "postgres" || s.dbType == "turso" { 678 + logger.Info("skipping S3 backup - PostgreSQL or Turso backups should be handled externally (pg_dump, managed database backups, etc.)") 663 679 return 664 680 } 665 681

History

1 round 0 comments
sign up or login to add to the discussion
willdot.net submitted #0
1 commit
expand
Implement turso as a database
no conflicts, ready to merge
expand 0 comments