photoprism/internal/commands/start.go
Michael Mayer 7940786ce9 UX: Refactor config options to be more intuitive
Make sure to update your local config files when upgrading as
the name of some config values has changed. The default
config path has changed from "settings" to "config".
2020-12-18 09:11:42 +01:00

142 lines
3.1 KiB
Go

package commands
import (
"context"
"fmt"
"os"
"os/signal"
"strconv"
"syscall"
"time"
"github.com/photoprism/photoprism/internal/photoprism"
"github.com/photoprism/photoprism/internal/config"
"github.com/photoprism/photoprism/internal/server"
"github.com/photoprism/photoprism/internal/service"
"github.com/photoprism/photoprism/internal/workers"
"github.com/photoprism/photoprism/pkg/fs"
"github.com/photoprism/photoprism/pkg/txt"
"github.com/sevlyar/go-daemon"
"github.com/urfave/cli"
)
// StartCommand is used to register the start cli command
var StartCommand = cli.Command{
Name: "start",
Aliases: []string{"up"},
Usage: "Starts web server",
Flags: startFlags,
Action: startAction,
}
var startFlags = []cli.Flag{
cli.BoolFlag{
Name: "detach-server, d",
Usage: "detach from the console (daemon mode)",
EnvVar: "PHOTOPRISM_DETACH_SERVER",
},
cli.BoolFlag{
Name: "config, c",
Usage: "show config",
},
}
// startAction start the web server and initializes the daemon
func startAction(ctx *cli.Context) error {
conf := config.NewConfig(ctx)
service.SetConfig(conf)
if ctx.IsSet("config") {
fmt.Printf("NAME VALUE\n")
fmt.Printf("detach-server %t\n", conf.DetachServer())
fmt.Printf("http-host %s\n", conf.HttpHost())
fmt.Printf("http-port %d\n", conf.HttpPort())
fmt.Printf("http-mode %s\n", conf.HttpMode())
return nil
}
if conf.HttpPort() < 1 || conf.HttpPort() > 65535 {
log.Fatal("server port must be a number between 1 and 65535")
}
// pass this context down the chain
cctx, cancel := context.WithCancel(context.Background())
if err := conf.Init(); err != nil {
log.Fatal(err)
}
// initialize the database
conf.InitDb()
// check if daemon is running, if not initialize the daemon
dctx := new(daemon.Context)
dctx.LogFileName = conf.LogFilename()
dctx.PidFileName = conf.PIDFilename()
dctx.Args = ctx.Args()
if !daemon.WasReborn() && conf.DetachServer() {
conf.Shutdown()
cancel()
if pid, ok := childAlreadyRunning(conf.PIDFilename()); ok {
log.Infof("daemon already running with process id %v\n", pid)
return nil
}
child, err := dctx.Reborn()
if err != nil {
log.Fatal(err)
}
if child != nil {
if !fs.Overwrite(conf.PIDFilename(), []byte(strconv.Itoa(child.Pid))) {
log.Fatalf("failed writing process id to %s", txt.Quote(conf.PIDFilename()))
}
log.Infof("daemon started with process id %v\n", child.Pid)
return nil
}
}
if conf.ReadOnly() {
log.Infof("read-only mode enabled")
}
// start web server
go server.Start(cctx, conf)
if count, err := photoprism.RestoreAlbums(false); err != nil {
log.Errorf("restore: %s", err)
} else if count > 0 {
log.Infof("%d albums restored", count)
}
// start share & sync workers
workers.Start(conf)
// set up proper shutdown of daemon and web server
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
// stop share & sync workers
workers.Stop()
log.Info("shutting down...")
conf.Shutdown()
cancel()
err := dctx.Release()
if err != nil {
log.Error(err)
}
time.Sleep(3 * time.Second)
return nil
}