Create basic server
Includes app config and some initialization
This commit is contained in:
parent
343f67dc97
commit
16473c97b7
|
@ -0,0 +1,81 @@
|
|||
package writefreely
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/gorilla/sessions"
|
||||
"github.com/writeas/web-core/log"
|
||||
"github.com/writeas/writefreely/config"
|
||||
)
|
||||
|
||||
const (
|
||||
staticDir = "static/"
|
||||
)
|
||||
|
||||
type app struct {
|
||||
router *mux.Router
|
||||
cfg *config.Config
|
||||
keys *keychain
|
||||
sessionStore *sessions.CookieStore
|
||||
}
|
||||
|
||||
var shttp = http.NewServeMux()
|
||||
|
||||
func Serve() {
|
||||
log.Info("Initializing...")
|
||||
|
||||
log.Info("Loading configuration...")
|
||||
cfg, err := config.Load()
|
||||
if err != nil {
|
||||
log.Error("Unable to load configuration: %v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
app := &app{
|
||||
cfg: cfg,
|
||||
}
|
||||
|
||||
// Load keys
|
||||
log.Info("Loading encryption keys...")
|
||||
err = initKeys(app)
|
||||
if err != nil {
|
||||
log.Error("\n%s\n", err)
|
||||
}
|
||||
|
||||
// Initialize modules
|
||||
r := mux.NewRouter()
|
||||
handler := NewHandler(app.sessionStore)
|
||||
|
||||
// Handle app routes
|
||||
initRoutes(handler, r, app.cfg)
|
||||
|
||||
// Handle static files
|
||||
fs := http.FileServer(http.Dir(staticDir))
|
||||
shttp.Handle("/", fs)
|
||||
r.PathPrefix("/").Handler(fs)
|
||||
|
||||
// Handle shutdown
|
||||
c := make(chan os.Signal, 2)
|
||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
<-c
|
||||
log.Info("Shutting down...")
|
||||
shutdown(app)
|
||||
log.Info("Done.")
|
||||
os.Exit(0)
|
||||
}()
|
||||
|
||||
// Start web application server
|
||||
http.Handle("/", r)
|
||||
log.Info("Serving on http://localhost:%d\n", app.cfg.Server.Port)
|
||||
log.Info("---")
|
||||
http.ListenAndServe(fmt.Sprintf(":%d", app.cfg.Server.Port), nil)
|
||||
}
|
||||
|
||||
func shutdown(app *app) {
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
writefreely
|
|
@ -0,0 +1,9 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/writeas/writefreely"
|
||||
)
|
||||
|
||||
func main() {
|
||||
writefreely.Serve()
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
const (
|
||||
configFile = "config.ini"
|
||||
)
|
||||
|
||||
type (
|
||||
ServerCfg struct {
|
||||
Host string `ini:"host"`
|
||||
Port int `ini:"port"`
|
||||
}
|
||||
|
||||
DatabaseCfg struct {
|
||||
Type string `ini:"type"`
|
||||
User string `ini:"username"`
|
||||
Pass string `ini:"password"`
|
||||
Host string `ini:"host"`
|
||||
Port int `ini:"port"`
|
||||
}
|
||||
|
||||
AppCfg struct {
|
||||
MultiUser bool `ini:"multiuser"`
|
||||
OpenSignups bool `ini:"open_signups"`
|
||||
Federation bool `ini:"federation"`
|
||||
|
||||
Name string `ini:"site_name"`
|
||||
|
||||
JSDisabled bool `ini:"disable_js"`
|
||||
|
||||
// User registration
|
||||
MinUsernameLen int `ini:"min_username_len"`
|
||||
}
|
||||
|
||||
Config struct {
|
||||
Server ServerCfg `ini:"server"`
|
||||
Database DatabaseCfg `ini:"database"`
|
||||
App AppCfg `ini:"app"`
|
||||
}
|
||||
)
|
||||
|
||||
func New() *Config {
|
||||
return &Config{
|
||||
Server: ServerCfg{
|
||||
Host: "http://localhost:8080",
|
||||
Port: 8080,
|
||||
},
|
||||
Database: DatabaseCfg{
|
||||
Type: "mysql",
|
||||
Host: "localhost",
|
||||
},
|
||||
App: AppCfg{
|
||||
Federation: true,
|
||||
MinUsernameLen: 3,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func Load() (*Config, error) {
|
||||
cfg, err := ini.Load(configFile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Parse INI file
|
||||
uc := &Config{}
|
||||
err = cfg.MapTo(uc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return uc, nil
|
||||
}
|
||||
|
||||
func Save(uc *Config) error {
|
||||
cfg := ini.Empty()
|
||||
err := ini.ReflectFrom(cfg, uc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return cfg.SaveTo(configFile)
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package writefreely
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
type keychain struct {
|
||||
cookieAuthKey, cookieKey []byte
|
||||
}
|
||||
|
||||
func initKeys(app *app) error {
|
||||
var err error
|
||||
app.keys = &keychain{}
|
||||
|
||||
app.keys.cookieAuthKey, err = ioutil.ReadFile("keys/cookies_auth.aes256")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app.keys.cookieKey, err = ioutil.ReadFile("keys/cookies_enc.aes256")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package writefreely
|
||||
|
||||
import (
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/writeas/web-core/log"
|
||||
"github.com/writeas/writefreely/config"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func initRoutes(handler *Handler, r *mux.Router, cfg *config.Config) {
|
||||
isSingleUser := !cfg.App.MultiUser
|
||||
|
||||
// Write.as router
|
||||
hostSubroute := cfg.Server.Host[strings.Index(cfg.Server.Host, "://")+3:]
|
||||
if isSingleUser {
|
||||
hostSubroute = "{domain}"
|
||||
} else {
|
||||
if strings.HasPrefix(hostSubroute, "localhost") {
|
||||
hostSubroute = "localhost"
|
||||
}
|
||||
}
|
||||
|
||||
if isSingleUser {
|
||||
log.Info("Adding %s routes (single user)...", hostSubroute)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Primary app routes
|
||||
log.Info("Adding %s routes (multi-user)...", hostSubroute)
|
||||
}
|
Loading…
Reference in New Issue