Diff
1diff --git a/server/backend/sqlite/db.go b/server/backend/sqlite/db.go
2index a8fe46bb499183946fbea1827cfbe51d05094c54..a7f971890281eb19cf2ed67c163586b7fecabcfc 100644
3--- a/server/backend/sqlite/db.go
4+++ b/server/backend/sqlite/db.go
5@@ -44,6 +44,48 @@ func (d *SqliteBackend) init() error {
6 return err
7 }
8
9+ var init bool
10+ if err := tx.Get(&init, "SELECT value FROM settings WHERE key = 'init'"); err != nil && !errors.Is(err, sql.ErrNoRows) {
11+ return err
12+ }
13+
14+ // Create default user.
15+ if !init {
16+ r, err := tx.Exec("INSERT OR IGNORE INTO user (username, admin, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP);", "admin", true)
17+ if err != nil {
18+ return err
19+ }
20+ userID, err := r.LastInsertId()
21+ if err != nil {
22+ return err
23+ }
24+
25+ // Add initial keys
26+ for _, k := range d.cfg.InitialAdminKeys {
27+ pk, _, err := backend.ParseAuthorizedKey(k)
28+ if err != nil {
29+ logger.Error("error parsing initial admin key, skipping", "key", k, "err", err)
30+ continue
31+ }
32+
33+ stmt, err := tx.Prepare(`INSERT INTO public_key (user_id, public_key, updated_at)
34+ VALUES (?, ?, CURRENT_TIMESTAMP);`)
35+ if err != nil {
36+ return err
37+ }
38+
39+ defer stmt.Close() // nolint: errcheck
40+ if _, err := stmt.Exec(userID, backend.MarshalAuthorizedKey(pk)); err != nil {
41+ return err
42+ }
43+ }
44+ }
45+
46+ // set init flag
47+ if _, err := tx.Exec("INSERT OR IGNORE INTO settings (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP)", "init", true); err != nil {
48+ return err
49+ }
50+
51 return nil
52 })
53 }