diff --git a/Dockerfile b/Dockerfile index bda9a1c69..4000cedc9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM photoprism/development:20190626 +FROM photoprism/development:20190629 # Set up project directory WORKDIR "/go/src/github.com/photoprism/photoprism" diff --git a/docker/demo/Dockerfile b/docker/demo/Dockerfile index 0faa3141b..4c41d7d43 100644 --- a/docker/demo/Dockerfile +++ b/docker/demo/Dockerfile @@ -4,7 +4,7 @@ FROM photoprism/photoprism:latest as build ENV TF_CPP_MIN_LOG_LEVEL 2 RUN mkdir -p /srv/photoprism/photos/import && \ - wget -qO- https://dl.photoprism.org/fixtures/demo.tar.gz | tar xvz -C /srv/photoprism/photos/import + wget -qO- https://dl.photoprism.org/fixtures/demo.tar.gz | tar xvz -C Pictures/Import # Import example photos RUN photoprism import diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 2ac3c5125..4ce48439f 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -43,7 +43,6 @@ RUN apt-get update && apt-get upgrade && \ wget \ git \ mysql-client \ - libgtk-3-bin \ tzdata \ gconf-service \ chromium-browser \ @@ -58,15 +57,14 @@ RUN add-apt-repository ppa:pmjdebruijn/darktable-release && \ apt-get upgrade && \ apt-get dist-upgrade -# Install TensorFlow C library +# Install & configure TensorFlow for C +ENV LD_LIBRARY_PATH /root/.local/lib:/usr/local/lib:/usr/lib:/lib +ENV TF_CPP_MIN_LOG_LEVEL 0 RUN curl -L \ "https://dl.photoprism.org/tensorflow/linux/libtensorflow-linux-avx-1.14.0.tar.gz" | \ tar -C "/usr" -xz RUN ldconfig -# Show TensorFlow debug log -ENV TF_CPP_MIN_LOG_LEVEL 0 - # Install NodeJS RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN apt-get update && \ @@ -94,7 +92,7 @@ RUN set -eux; \ # Configure Go environment ENV GOPATH /go ENV GOBIN $GOPATH/bin -ENV PATH $GOBIN:/usr/local/go/bin:$PATH +ENV PATH $GOBIN:/usr/local/go/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV GO111MODULE on RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" @@ -108,16 +106,11 @@ RUN env GO111MODULE=off /usr/local/go/bin/go get -u golang.org/x/tools/cmd/goimp RUN env GO111MODULE=off /usr/local/go/bin/go get -u github.com/kyoh86/richgo RUN echo "alias go=richgo" > /root/.bash_aliases -# Configure broadwayd (HTML5 display server) -# Command: broadwayd -p 8080 -a 0.0.0.0 :5 -ENV GDK_BACKEND broadway -ENV BROADWAY_DISPLAY :5 - # Set up project directory WORKDIR "/go/src/github.com/photoprism/photoprism" -# Expose HTTP port plus 4000 for TiDB, 8080 for broadwayd and 9515 for chromedriver -EXPOSE 80 2342 4000 8080 9515 +# Expose HTTP port 2342 plus 4000 for TiDB and 9515 for chromedriver +EXPOSE 2342 4000 9515 # Keep container running (services can be started manually using a terminal) CMD tail -f /dev/null diff --git a/docker/photoprism/Dockerfile b/docker/photoprism/Dockerfile index 8224ce87b..f35a27352 100644 --- a/docker/photoprism/Dockerfile +++ b/docker/photoprism/Dockerfile @@ -1,21 +1,17 @@ -FROM photoprism/development:20190626 as build +FROM photoprism/development:20190629 as build # Set up project directory WORKDIR "/go/src/github.com/photoprism/photoprism" COPY . . # Build PhotoPrism -RUN make all install +RUN make dep build-js install # Base base image as photoprism/development FROM ubuntu:18.04 # Set environment variables ENV DEBIAN_FRONTEND noninteractive -ENV TF_CPP_MIN_LOG_LEVEL 2 -ENV PHOTOPRISM_CONFIG_FILE /srv/photoprism/config/photoprism.yml - -WORKDIR /srv/photoprism # Install additional distribution packages RUN apt-get update && apt-get install -y --no-install-recommends \ @@ -30,15 +26,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Copy built binaries and assets to this image +# Copy dependencies COPY --from=build /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list /etc/apt/sources.list.d/pmjdebruijn-ubuntu-darktable-release-bionic.list COPY --from=build /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg /etc/apt/trusted.gpg.d/pmjdebruijn_ubuntu_darktable-release.gpg -COPY --from=build /usr/local/bin/photoprism /usr/local/bin/photoprism COPY --from=build /usr/lib/libtensorflow.so /usr/lib/libtensorflow.so COPY --from=build /usr/lib/libtensorflow_framework.so /usr/lib/libtensorflow_framework.so -COPY --from=build /srv/photoprism /srv/photoprism - -# Configure dynamic linker run-time bindings RUN ldconfig # Install darktable (RAW to JPEG converter) @@ -47,12 +39,36 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +# Create and configure photoprism user +RUN useradd -ms /bin/bash photoprism +USER photoprism + +WORKDIR /home/photoprism +ENV PATH /home/photoprism/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV TF_CPP_MIN_LOG_LEVEL 2 +ENV PHOTOPRISM_CONFIG_FILE /home/photoprism/.config/photoprism/photoprism.yml + +# Copy assets to /home/photoprism +COPY --chown=photoprism --from=build /root/.local/bin/photoprism /home/photoprism/.local/bin/photoprism +COPY --chown=photoprism --from=build /root/.local/share/photoprism /home/photoprism/.local/share/photoprism +COPY --chown=photoprism --from=build /root/.config/photoprism /home/photoprism/.config/photoprism + +# Create directories +RUN mkdir -p /home/photoprism/.cache/photoprism \ + /home/photoprism/Pictures/Originals \ + /home/photoprism/Pictures/Import \ + /home/photoprism/Pictures/Export + +# Fix permissions +USER root +RUN chown -R photoprism:photoprism /home/photoprism +USER photoprism + # Show photoprism version RUN photoprism -v -# Expose HTTP & TiDB port -EXPOSE 80 -EXPOSE 4000 +# Expose http and database ports +EXPOSE 2342 4000 -# Start PhotoPrism server +# Run server CMD photoprism start diff --git a/docker/photoprism/docker-compose.yml b/docker/photoprism/docker-compose.yml index dbe0fc1b8..8d42f3f62 100644 --- a/docker/photoprism/docker-compose.yml +++ b/docker/photoprism/docker-compose.yml @@ -1,22 +1,22 @@ version: '3.3' # Example docker-compose config file for production use +# Container image on Docker Hub: https://hub.docker.com/r/photoprism/photoprism/ +# To keep photoprism running, add "restart: always" +# # Usage: docker-compose up services: - photoprism: # change if needed - image: photoprism/photoprism:latest # use pre-built image from docker hub: https://hub.docker.com/r/photoprism/photoprism/ - restart: always + photoprism: + image: photoprism/photoprism:latest ports: - - 2342:80 # left side is your local port (change if port 2342 is already used or you want to use port 80) + - 2342:2342 # [local port]:[container port] volumes: - - "~/Photos:/srv/photoprism/photos" # change ~/Photos to whatever directory you want to use on your local computer - - "photoprism-cache:/srv/photoprism/cache" # keep this (thumbnail cache) - - "photoprism-database:/srv/photoprism/database" # keep this (database files) - environment: - PHOTOPRISM_IMPORT_PATH: /srv/photoprism/photos/Import # ~/Photos/Import (files to be imported to originals) - PHOTOPRISM_EXPORT_PATH: /srv/photoprism/photos/Export # ~/Photos/Export (files exported from originals) - PHOTOPRISM_ORIGINALS_PATH: /srv/photoprism/photos/Originals # ~/Photos/Originals (original jpeg, raw and meta files) + - "~/Pictures/Originals:/home/photoprism/Pictures/Originals" # [local path]:[container path] + - "~/Pictures/Import:/home/photoprism/Pictures/Import" # [local path]:[container path] (optional) + - "~/Pictures/Export:/home/photoprism/Pictures/Export" # [local path]:[container path] (optional) + - "photoprism-cache:/home/photoprism/.cache/photoprism" # keep thumbnail cache + - "photoprism-database:/home/photoprism/.local/share/photoprism/resources/database" # keep database files volumes: # keep this photoprism-cache: diff --git a/internal/commands/start.go b/internal/commands/start.go index c4b9c204b..437fc3da3 100644 --- a/internal/commands/start.go +++ b/internal/commands/start.go @@ -102,7 +102,7 @@ func startAction(ctx *cli.Context) error { signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit - log.Info("Shutting down...") + log.Info("shutting down...") conf.Shutdown() cancel() err := dctx.Release() diff --git a/internal/config/flags.go b/internal/config/flags.go index 72d1dd3c6..1b9fde45d 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -31,6 +31,7 @@ var GlobalFlags = []cli.Flag{ cli.StringFlag{ Name: "config-path", Usage: "config `PATH`", + Value: "~/.config/photoprism", EnvVar: "PHOTOPRISM_CONFIG_PATH", }, cli.StringFlag{ @@ -41,31 +42,31 @@ var GlobalFlags = []cli.Flag{ cli.StringFlag{ Name: "originals-path", Usage: "originals `PATH`", - Value: "/srv/photoprism/photos/originals", + Value: "~/Pictures/Originals", EnvVar: "PHOTOPRISM_ORIGINALS_PATH", }, cli.StringFlag{ Name: "import-path", Usage: "import `PATH`", - Value: "/srv/photoprism/photos/import", + Value: "~/Pictures/Import", EnvVar: "PHOTOPRISM_IMPORT_PATH", }, cli.StringFlag{ Name: "export-path", Usage: "export `PATH`", - Value: "/srv/photoprism/photos/export", + Value: "~/Pictures/Export", EnvVar: "PHOTOPRISM_EXPORT_PATH", }, cli.StringFlag{ Name: "cache-path", Usage: "cache `PATH`", - Value: "/srv/photoprism/cache", + Value: "~/.cache/photoprism", EnvVar: "PHOTOPRISM_CACHE_PATH", }, cli.StringFlag{ Name: "assets-path", Usage: "assets `PATH`", - Value: "/srv/photoprism", + Value: "~/.local/share/photoprism", EnvVar: "PHOTOPRISM_ASSETS_PATH", }, cli.StringFlag{ @@ -83,7 +84,7 @@ var GlobalFlags = []cli.Flag{ cli.IntFlag{ Name: "http-port, p", Usage: "HTTP server port", - Value: 80, + Value: 2342, EnvVar: "PHOTOPRISM_HTTP_PORT", }, cli.StringFlag{ @@ -156,13 +157,13 @@ var GlobalFlags = []cli.Flag{ Name: "daemon-pid-path", Usage: "File path to store daemon PID", EnvVar: "PHOTOPRISM_DAEMON_PID_PATH", - Value: "/srv/photoprism/photoprism.pid", + Value: "~/.local/share/photoprism/photoprism.pid", }, cli.StringFlag{ Name: "daemon-log-path", Usage: "File path for daemon logs.", EnvVar: "PHOTOPRISM_DAEMON_LOG_PATH", - Value: "/srv/photoprism/photoprism.log", + Value: "~/.local/share/photoprism/photoprism.log", }, cli.BoolFlag{ Name: "daemonize, d", diff --git a/internal/tidb/init.go b/internal/tidb/init.go index 59297f116..ae2a17ac2 100644 --- a/internal/tidb/init.go +++ b/internal/tidb/init.go @@ -8,42 +8,44 @@ import ( ) func InitDatabase(port uint, password string) error { - log.Info("init database: trying login without password") + log.Info("initializing database...") db, err := sql.Open("mysql", fmt.Sprintf("root:@tcp(localhost:%d)/", port)) defer db.Close() if err != nil { - log.Debugf("init database: %s", err) - log.Debug("init database: login as root with password") + log.Debug(err.Error()) + log.Debug("database login as root with password") db, err = sql.Open("mysql", fmt.Sprintf("root:%s@tcp(localhost:%d)/", password, port)) } if err != nil { - log.Error(err) + log.Error(err.Error()) return err } - log.Debug("init database: login was successful") + log.Debug("set database password") _, err = db.Exec(fmt.Sprintf("SET PASSWORD FOR 'root'@'%%' = '%s'", password)) if err != nil { - log.Error(err) + log.Error(err.Error()) } else { - log.Debug("init database: FLUSH PRIVILEGES") + log.Debug("flush database privileges") _, err = db.Exec("FLUSH PRIVILEGES") } - log.Debug("init database: CREATE DATABASE IF NOT EXISTS photoprism") + log.Debug("create database if not exists") _, err = db.Exec("CREATE DATABASE IF NOT EXISTS photoprism") if err != nil { - log.Error(err) + log.Error(err.Error()) } + log.Info("database created") + return nil } diff --git a/scripts/docker-push.sh b/scripts/docker-push.sh index 15b30f61d..f3fabb22d 100755 --- a/scripts/docker-push.sh +++ b/scripts/docker-push.sh @@ -1,13 +1,11 @@ #!/usr/bin/env bash if [[ -z $DOCKER_PASSWORD ]] || [[ -z $DOCKER_USERNAME ]]; then - echo "DOCKER_PASSWORD and DOCKER_USERNAME not set in your environment"; - exit 1 + docker login +else + echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin fi -echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - - if [[ -z $1 ]] || [[ -z $2 ]]; then echo "Please provide a container image name and version" 1>&2 exit 1 @@ -16,4 +14,4 @@ else docker push photoprism/$1:latest docker push photoprism/$1:$2 echo "Done" -fi \ No newline at end of file +fi