+2
-2
appview/auth/auth.go
+2
-2
appview/auth/auth.go
+24
appview/config.go
+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
-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
+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
+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
+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
}