Monorepo for Tangled tangled.org
854
fork

Configure Feed

Select the types of activity you want to include in your feed.

configgy appview with envvars

also setup nixos module

Akshay 2faccd93 5df480c8

+112 -36
+2 -2
appview/auth/auth.go
··· 27 27 PDSEndpoint string 28 28 } 29 29 30 - func Make() (*Auth, error) { 31 - store := sessions.NewCookieStore([]byte(appview.SessionCookieSecret)) 30 + func Make(secret string) (*Auth, error) { 31 + store := sessions.NewCookieStore([]byte(secret)) 32 32 return &Auth{store}, nil 33 33 } 34 34
+24
appview/config.go
··· 1 + package appview 2 + 3 + import ( 4 + "context" 5 + 6 + "github.com/sethvargo/go-envconfig" 7 + ) 8 + 9 + type Config struct { 10 + CookieSecret string `env:"TANGLED_COOKIE_SECRET, default=00000000000000000000000000000000"` 11 + Hostname string `env:"TANGLED_HOSTNAME, default=0.0.0.0"` 12 + Port string `env:"TANGLED_PORT, default=3000"` 13 + DbPath string `env:"TANGLED_DB_PATH, default=appview.db"` 14 + } 15 + 16 + func LoadConfig(ctx context.Context) (*Config, error) { 17 + var cfg Config 18 + err := envconfig.Process(ctx, &cfg) 19 + if err != nil { 20 + return nil, err 21 + } 22 + 23 + return &cfg, nil 24 + }
-2
appview/consts.go
··· 1 1 package appview 2 2 3 3 const ( 4 - SessionCookieSecret = "TODO_CHANGE_ME" 5 4 SessionName = "appview-session" 6 5 SessionHandle = "handle" 7 6 SessionDid = "did" ··· 10 9 SessionRefreshJwt = "refreshJwt" 11 10 SessionExpiry = "expiry" 12 11 SessionAuthenticated = "authenticated" 13 - SqliteDbPath = "appview.db" 14 12 )
+6 -4
appview/state/state.go
··· 34 34 pages *pages.Pages 35 35 resolver *appview.Resolver 36 36 jc *jetstream.JetstreamClient 37 + config *appview.Config 37 38 } 38 39 39 - func Make() (*State, error) { 40 - db, err := db.Make(appview.SqliteDbPath) 40 + func Make(config *appview.Config) (*State, error) { 41 + db, err := db.Make(config.DbPath) 41 42 if err != nil { 42 43 return nil, err 43 44 } 44 45 45 - auth, err := auth.Make() 46 + auth, err := auth.Make(config.CookieSecret) 46 47 if err != nil { 47 48 return nil, err 48 49 } 49 50 50 - enforcer, err := rbac.NewEnforcer(appview.SqliteDbPath) 51 + enforcer, err := rbac.NewEnforcer(config.DbPath) 51 52 if err != nil { 52 53 return nil, err 53 54 } ··· 75 76 pgs, 76 77 resolver, 77 78 jc, 79 + config, 78 80 } 79 81 80 82 return state, nil
+10 -3
cmd/appview/main.go
··· 1 1 package main 2 2 3 3 import ( 4 + "context" 4 5 "fmt" 5 6 "log" 6 7 "log/slog" 7 8 "net/http" 8 9 "os" 9 10 11 + "github.com/sotangled/tangled/appview" 10 12 "github.com/sotangled/tangled/appview/state" 11 13 ) 12 14 13 15 func main() { 16 + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil))) 14 17 15 - slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil))) 18 + c, err := appview.LoadConfig(context.Background()) 19 + if err != nil { 20 + log.Println("failed to load config", "error", err) 21 + return 22 + } 16 23 17 - state, err := state.Make() 24 + state, err := state.Make(c) 18 25 19 26 if err != nil { 20 27 log.Fatal(err) 21 28 } 22 29 23 - addr := fmt.Sprintf("%s:%d", "localhost", 3000) 30 + addr := fmt.Sprintf("%s:%s", c.Hostname, c.Port) 24 31 25 32 log.Println("starting server on", addr) 26 33 log.Println(http.ListenAndServe(addr, state.Router()))
+70 -25
flake.nix
··· 43 43 }); 44 44 inherit (gitignore.lib) gitignoreSource; 45 45 in { 46 - overlays.default = final: prev: { 46 + overlays.default = final: prev: let 47 + goModHash = "sha256-ywhhGrv8KNqy9tCMCnA1PU/RQ/+0Xyitej1L48TcFvI="; 48 + buildCmdPackage = name: 49 + final.buildGoModule { 50 + pname = name; 51 + version = "0.1.0"; 52 + src = gitignoreSource ./.; 53 + subPackages = ["cmd/${name}"]; 54 + vendorHash = goModHash; 55 + env.CGO_ENABLED = 0; 56 + }; 57 + in { 47 58 indigo-lexgen = with final; 48 59 final.buildGoModule { 49 60 pname = "indigo-lexgen"; ··· 68 79 ''; 69 80 doCheck = false; 70 81 subPackages = ["cmd/appview"]; 71 - vendorHash = "sha256-ywhhGrv8KNqy9tCMCnA1PU/RQ/+0Xyitej1L48TcFvI="; 82 + vendorHash = goModHash; 72 83 env.CGO_ENABLED = 1; 73 84 stdenv = pkgsStatic.stdenv; 74 85 }; 86 + 75 87 knotserver = with final; 76 88 final.pkgsStatic.buildGoModule { 77 89 pname = "knotserver"; 78 90 version = "0.1.0"; 79 91 src = gitignoreSource ./.; 80 92 subPackages = ["cmd/knotserver"]; 81 - vendorHash = "sha256-ywhhGrv8KNqy9tCMCnA1PU/RQ/+0Xyitej1L48TcFvI="; 93 + vendorHash = goModHash; 82 94 env.CGO_ENABLED = 1; 83 95 }; 84 - repoguard = with final; 85 - final.pkgsStatic.buildGoModule { 86 - pname = "repoguard"; 87 - version = "0.1.0"; 88 - src = gitignoreSource ./.; 89 - subPackages = ["cmd/repoguard"]; 90 - vendorHash = "sha256-ywhhGrv8KNqy9tCMCnA1PU/RQ/+0Xyitej1L48TcFvI="; 91 - env.CGO_ENABLED = 0; 92 - }; 93 - keyfetch = with final; 94 - final.pkgsStatic.buildGoModule { 95 - pname = "keyfetch"; 96 - version = "0.1.0"; 97 - src = gitignoreSource ./.; 98 - subPackages = ["cmd/keyfetch"]; 99 - vendorHash = "sha256-ywhhGrv8KNqy9tCMCnA1PU/RQ/+0Xyitej1L48TcFvI="; 100 - env.CGO_ENABLED = 0; 101 - }; 96 + repoguard = buildCmdPackage "repoguard"; 97 + keyfetch = buildCmdPackage "keyfetch"; 102 98 }; 103 99 packages = forAllSystems (system: { 104 100 inherit (nixpkgsFor."${system}") indigo-lexgen appview knotserver repoguard keyfetch; ··· 123 119 pkgs.tailwindcss 124 120 ]; 125 121 shellHook = '' 126 - cp -f ${htmx-src} appview/pages/static/htmx.min.js 127 - cp -f ${lucide-src} appview/pages/static/lucide.min.js 128 - cp -f ${ia-fonts-src}/"iA Writer Quattro"/Static/*.ttf appview/pages/static/fonts/ 129 - cp -f ${ia-fonts-src}/"iA Writer Mono"/Static/*.ttf appview/pages/static/fonts/ 122 + cp -f ${htmx-src} appview/pages/static/htmx.min.js 123 + cp -f ${lucide-src} appview/pages/static/lucide.min.js 124 + cp -f ${ia-fonts-src}/"iA Writer Quattro"/Static/*.ttf appview/pages/static/fonts/ 125 + cp -f ${ia-fonts-src}/"iA Writer Mono"/Static/*.ttf appview/pages/static/fonts/ 130 126 ''; 131 127 }; 132 128 }); ··· 150 146 program = ''${air-watcher "knotserver"}/bin/run''; 151 147 }; 152 148 }); 149 + 150 + nixosModules.default = { 151 + config, 152 + pkgs, 153 + lib, 154 + ... 155 + }: 156 + with lib; { 157 + options = { 158 + services.tangled-appview = { 159 + enable = mkOption { 160 + type = types.bool; 161 + default = false; 162 + description = "Enable tangled appview"; 163 + }; 164 + port = mkOption { 165 + type = types.int; 166 + default = 3000; 167 + description = "Port to run the appview on"; 168 + }; 169 + cookie_secret = mkOption { 170 + type = types.str; 171 + default = "00000000000000000000000000000000"; 172 + description = "Cookie secret"; 173 + }; 174 + }; 175 + }; 176 + 177 + config = mkIf config.services.tangled-appview.enable { 178 + nixpkgs.overlays = [self.overlays.default]; 179 + systemd.services.tangled-appview = { 180 + description = "tangled appview service"; 181 + wantedBy = ["multi-user.target"]; 182 + 183 + serviceConfig = { 184 + ListenStream = "0.0.0.0:${toString config.services.tangled-appview.port}"; 185 + ExecStart = "${pkgs.tangled-appview}/bin/tangled-appview"; 186 + Restart = "always"; 187 + }; 188 + 189 + environment = { 190 + TANGLED_PORT = "${toString config.services.tangled-appview.port}"; 191 + TANGLED_HOST = "localhost"; 192 + TANGLED_DB_PATH = "appview.db"; 193 + TANGLED_COOKIE_SECRET = config.services.tangled-appview.cookie_secret; 194 + }; 195 + }; 196 + }; 197 + }; 153 198 }; 154 199 }