1package main
2
3import (
4 "fmt"
5 "os"
6
7 "github.com/haileyok/cocoon/server"
8 _ "github.com/joho/godotenv/autoload"
9 "github.com/urfave/cli/v2"
10)
11
12var Version = "dev"
13
14func main() {
15 app := &cli.App{
16 Name: "cocoon",
17 Usage: "An atproto PDS",
18 Flags: []cli.Flag{
19 &cli.StringFlag{
20 Name: "addr",
21 Value: ":8080",
22 EnvVars: []string{"COCOON_ADDR"},
23 },
24 &cli.StringFlag{
25 Name: "db-name",
26 Value: "cocoon.db",
27 EnvVars: []string{"COCOON_DB_NAME"},
28 },
29 &cli.StringFlag{
30 Name: "did",
31 Required: true,
32 EnvVars: []string{"COCOON_DID"},
33 },
34 &cli.StringFlag{
35 Name: "hostname",
36 Required: true,
37 EnvVars: []string{"COCOON_HOSTNAME"},
38 },
39 &cli.StringFlag{
40 Name: "rotation-key-path",
41 Required: true,
42 EnvVars: []string{"COCOON_ROTATION_KEY_PATH"},
43 },
44 &cli.StringFlag{
45 Name: "jwk-path",
46 Required: true,
47 EnvVars: []string{"COCOON_JWK_PATH"},
48 },
49 &cli.StringFlag{
50 Name: "contact-email",
51 Required: true,
52 EnvVars: []string{"COCOON_CONTACT_EMAIL"},
53 },
54 &cli.StringSliceFlag{
55 Name: "relays",
56 Required: true,
57 EnvVars: []string{"COCOON_RELAYS"},
58 },
59 &cli.StringFlag{
60 Name: "smtp-user",
61 Required: false,
62 EnvVars: []string{"COCOON_SMTP_USER"},
63 },
64 &cli.StringFlag{
65 Name: "smtp-pass",
66 Required: false,
67 EnvVars: []string{"COCOON_SMTP_PASS"},
68 },
69 &cli.StringFlag{
70 Name: "smtp-host",
71 Required: false,
72 EnvVars: []string{"COCOON_SMTP_HOST"},
73 },
74 &cli.StringFlag{
75 Name: "smtp-port",
76 Required: false,
77 EnvVars: []string{"COCOON_SMTP_PORT"},
78 },
79 &cli.StringFlag{
80 Name: "smtp-email",
81 Required: false,
82 EnvVars: []string{"COCOON_SMTP_EMAIL"},
83 },
84 &cli.StringFlag{
85 Name: "smtp-name",
86 Required: false,
87 EnvVars: []string{"COCOON_SMTP_NAME"},
88 },
89 },
90 Commands: []*cli.Command{
91 run,
92 },
93 ErrWriter: os.Stdout,
94 Version: Version,
95 }
96
97 app.Run(os.Args)
98}
99
100var run = &cli.Command{
101 Name: "run",
102 Usage: "Start the cocoon PDS",
103 Flags: []cli.Flag{},
104 Action: func(cmd *cli.Context) error {
105 s, err := server.New(&server.Args{
106 Addr: cmd.String("addr"),
107 DbName: cmd.String("db-name"),
108 Did: cmd.String("did"),
109 Hostname: cmd.String("hostname"),
110 RotationKeyPath: cmd.String("rotation-key-path"),
111 JwkPath: cmd.String("jwk-path"),
112 ContactEmail: cmd.String("contact-email"),
113 Version: Version,
114 Relays: cmd.StringSlice("relays"),
115 SmtpUser: cmd.String("smtp-user"),
116 SmtpPass: cmd.String("smtp-pass"),
117 SmtpHost: cmd.String("smtp-host"),
118 SmtpPort: cmd.String("smtp-port"),
119 SmtpEmail: cmd.String("smtp-email"),
120 SmtpName: cmd.String("smtp-name"),
121 })
122 if err != nil {
123 fmt.Printf("error creating cocoon: %v", err)
124 return err
125 }
126
127 if err := s.Serve(cmd.Context); err != nil {
128 fmt.Printf("error starting cocoon: %v", err)
129 return err
130 }
131
132 return nil
133 },
134}