mirror of
https://github.com/ghostersk/gowebmail.git
synced 2026-04-17 08:36:01 +01:00
fix embeding issue and sqlite db new database string
This commit is contained in:
@@ -31,6 +31,8 @@ A self-hosted, encrypted web email client written entirely in Go. Supports Gmail
|
|||||||
# 1. Clone / copy the project
|
# 1. Clone / copy the project
|
||||||
git clone https://github.com/ghostersk/gowebmail && cd gowebmail
|
git clone https://github.com/ghostersk/gowebmail && cd gowebmail
|
||||||
go build -o gowebmail ./cmd/server
|
go build -o gowebmail ./cmd/server
|
||||||
|
# if you want smaller exe ( strip down debuginformation):
|
||||||
|
go build -ldflags="-s -w" -o gowebmail ./cmd/server
|
||||||
./gowebmail
|
./gowebmail
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ func New(path string, encKey []byte) (*DB, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Enable WAL mode and foreign keys for performance and integrity
|
// Enable WAL mode and foreign keys for performance and integrity
|
||||||
dsn := fmt.Sprintf("%s?_journal_mode=WAL&_foreign_keys=on&_busy_timeout=5000", path)
|
// sqlite file path must start with `file:` for package mattn/go-sqlite3
|
||||||
|
dsn := fmt.Sprintf("file:%s?_journal_mode=WAL&_foreign_keys=on&_busy_timeout=5000", path)
|
||||||
sqlDB, err := sql.Open("sqlite3", dsn)
|
sqlDB, err := sql.Open("sqlite3", dsn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("open sqlite: %w", err)
|
return nil, fmt.Errorf("open sqlite: %w", err)
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
|
||||||
|
"github.com/ghostersk/gowebmail"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Renderer holds one compiled *template.Template per page name.
|
// Renderer holds one compiled *template.Template per page name.
|
||||||
@@ -16,11 +18,6 @@ type Renderer struct {
|
|||||||
templates map[string]*template.Template
|
templates map[string]*template.Template
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
tmplBase = "web/templates/base.html"
|
|
||||||
tmplDir = "web/templates"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewRenderer parses every page template paired with the base layout.
|
// NewRenderer parses every page template paired with the base layout.
|
||||||
// Call once at startup; fails fast if any template has a syntax error.
|
// Call once at startup; fails fast if any template has a syntax error.
|
||||||
func NewRenderer() (*Renderer, error) {
|
func NewRenderer() (*Renderer, error) {
|
||||||
@@ -30,19 +27,23 @@ func NewRenderer() (*Renderer, error) {
|
|||||||
"mfa.html",
|
"mfa.html",
|
||||||
"admin.html",
|
"admin.html",
|
||||||
}
|
}
|
||||||
|
templateFS, err := fs.Sub(gowebmail.WebFS, "web/templates")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("embed templates fs: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
r := &Renderer{templates: make(map[string]*template.Template, len(pages))}
|
r := &Renderer{templates: make(map[string]*template.Template, len(pages))}
|
||||||
|
|
||||||
for _, page := range pages {
|
for _, page := range pages {
|
||||||
pagePath := filepath.Join(tmplDir, page)
|
|
||||||
// New instance per page — base FIRST, then the page file.
|
// New instance per page — base FIRST, then the page file.
|
||||||
// This means the page's {{define}} blocks override the base's {{block}} defaults
|
// This means the page's {{define}} blocks override the base's {{block}} defaults
|
||||||
// without any other page's definitions being present in the same pool.
|
// without any other page's definitions being present in the same pool.
|
||||||
t, err := template.New("base").ParseFiles(tmplBase, pagePath)
|
t, err := template.ParseFS(templateFS, "base.html", page)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("renderer: parse %s: %w", page, err)
|
return nil, fmt.Errorf("renderer: parse %s: %w", page, err)
|
||||||
}
|
}
|
||||||
name := page[:len(page)-5] // strip ".html"
|
|
||||||
|
name := page[:len(page)-5]
|
||||||
r.templates[name] = t
|
r.templates[name] = t
|
||||||
log.Printf("renderer: loaded template %q", name)
|
log.Printf("renderer: loaded template %q", name)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user