diff --git a/.gitignore b/.gitignore index fa94dcf74..55a0938df 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ *.dylib /*.zip /photoprism - +vendor/ # Test binary, build with `go test -c` *.test diff --git a/.travis.yml b/.travis.yml index b91b915f9..c83d3e833 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ services: before_script: - docker-compose -f docker-compose.travis.yml up --build -d - - sleep 15 - docker-compose exec photoprism /usr/local/go/bin/go run cmd/photoprism/photoprism.go migrate-db script: diff --git a/Dockerfile b/Dockerfile index 836b07b96..539831d9d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,32 +1,81 @@ -FROM tensorflow/tensorflow +FROM ubuntu:18.04 + +LABEL maintainer="Michael Mayer " + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + libfreetype6-dev \ + libhdf5-serial-dev \ + libpng-dev \ + libzmq3-dev \ + pkg-config \ + python \ + python-dev \ + rsync \ + software-properties-common \ + unzip \ + g++ \ + gcc \ + libc6-dev \ + gpg-agent \ + apt-utils \ + make \ + nano \ + wget \ + darktable \ + git \ + python3 \ + python-setuptools \ + python3-dev \ + mysql-client \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN add-apt-repository ppa:pmjdebruijn/darktable-release + +RUN apt-get update && apt-get install -y --no-install-recommends \ + darktable \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN apt-get upgrade -y + +RUN curl -O https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py && \ + rm get-pip.py + +# Install TensorFlow CPU version from central repo +RUN pip --no-cache-dir install \ + http://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.10.1-cp27-none-linux_x86_64.whl + +RUN pip --no-cache-dir install --upgrade \ + requests \ + Pillow \ + h5py \ + ipykernel \ + jupyter \ + keras_applications \ + keras_preprocessing \ + matplotlib \ + numpy \ + pandas \ + scipy \ + sklearn \ + && \ + python -m ipykernel.kernelspec # Install TensorFlow C library RUN curl -L \ - "https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-1.3.0.tar.gz" | \ + "https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-1.10.1.tar.gz" | \ tar -C "/usr/local" -xz RUN ldconfig + # Hide some warnings ENV TF_CPP_MIN_LOG_LEVEL 2 -RUN curl -L "https://download.opensuse.org/repositories/graphics:darktable:stable/xUbuntu_16.04/Release.key" | apt-key add - -RUN sh -c "echo 'deb http://download.opensuse.org/repositories/graphics:/darktable:/stable/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/darktable.list" - -# Install Go -RUN apt-get update && apt-get install -y --no-install-recommends \ - g++ \ - gcc \ - libc6-dev \ - make \ - pkg-config \ - nano \ - build-essential \ - wget \ - darktable \ - git \ - && rm -rf /var/lib/apt/lists/* - -RUN apt-get upgrade -y - # Install NPM (NodeJS) RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN apt-get install -y nodejs @@ -36,40 +85,21 @@ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update && apt-get install yarn -ENV GOLANG_VERSION 1.10 +ENV GOLANG_VERSION 1.11 RUN set -eux; \ \ - dpkgArch="$(dpkg --print-architecture)"; \ - case "${dpkgArch##*-}" in \ - amd64) goRelArch='linux-amd64'; goRelSha256='b5a64335f1490277b585832d1f6c7f8c6c11206cba5cd3f771dcb87b98ad1a33' ;; \ - armhf) goRelArch='linux-armv6l'; goRelSha256='6ff665a9ab61240cf9f11a07e03e6819e452a618a32ea05bbb2c80182f838f4f' ;; \ - arm64) goRelArch='linux-arm64'; goRelSha256='efb47e5c0e020b180291379ab625c6ec1c2e9e9b289336bc7169e6aa1da43fd8' ;; \ - i386) goRelArch='linux-386'; goRelSha256='2d26a9f41fd80eeb445cc454c2ba6b3d0db2fc732c53d7d0427a9f605bfc55a1' ;; \ - ppc64el) goRelArch='linux-ppc64le'; goRelSha256='a1e22e2fbcb3e551e0bf59d0f8aeb4b3f2df86714f09d2acd260c6597c43beee' ;; \ - s390x) goRelArch='linux-s390x'; goRelSha256='71cde197e50afe17f097f81153edb450f880267699f22453272d184e0f4681d7' ;; \ - *) goRelArch='src'; goRelSha256='f3de49289405fda5fd1483a8fe6bd2fa5469e005fd567df64485c4fa000c7f24'; \ - echo >&2; echo >&2 "warning: current architecture ($dpkgArch) does not have a corresponding Go binary release; will be building from source"; echo >&2 ;; \ - esac; \ - \ - url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ + url="https://golang.org/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz"; \ wget -O go.tgz "$url"; \ - echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ + echo "b3fcf280ff86558e0559e185b601c9eade0fd24c900b4c63cd14d1d38613e499 *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ - \ - if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ - fi; \ - \ export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH +ENV GOBIN $GOPATH/bin +ENV PATH $GOBIN:/usr/local/go/bin:$PATH +# ENV GO111MODULE on RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" @@ -84,9 +114,6 @@ RUN mkdir -p /model && \ unzip /model/inception.zip -d /model && \ chmod -R 777 /model -# Doesn't work properly at the moment (wait for stable release) -# RUN go get -u github.com/kardianos/govendor - # Using dep for the moment... RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh RUN mkdir -m 777 /go/pkg/dep @@ -101,9 +128,11 @@ COPY . . RUN cp config.example.yml ~/.photoprism -# RUN govendor sync +# Get dependencies and install RUN dep ensure +RUN go install cmd/photoprism/photoprism.go -# Build -# RUN govendor install +local -RUN go build cmd/photoprism/photoprism.go +EXPOSE 80 + +# Start PhotoPrism server +CMD photoprism start \ No newline at end of file diff --git a/Gopkg.lock b/Gopkg.lock index 72bdd224f..1461b32f6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -340,4 +340,4 @@ "github.com/urfave/cli", ] solver-name = "gps-cdcl" - solver-version = 1 \ No newline at end of file + solver-version = 1 diff --git a/cmd/photoprism/photoprism.go b/cmd/photoprism/photoprism.go index 9e6f3f8b3..58e23ad41 100644 --- a/cmd/photoprism/photoprism.go +++ b/cmd/photoprism/photoprism.go @@ -59,6 +59,8 @@ func main() { conf.CreateDirectories() + conf.MigrateDb() + fmt.Printf("Starting web server at port %d...\n", context.Int("port")) server.Start(context.String("ip"), context.Int("port"), conf) diff --git a/config.go b/config.go index 128e6ba69..05151d7fc 100644 --- a/config.go +++ b/config.go @@ -11,6 +11,7 @@ import ( "log" "os" "path" + "time" ) type Config struct { @@ -112,13 +113,23 @@ func (c *Config) ConnectToDatabase() error { db, err := gorm.Open(c.DatabaseDriver, c.DatabaseDsn) if err != nil || db == nil { - log.Fatal(err) + for i := 1; i <= 12; i++ { + time.Sleep(5 * time.Second) + + db, err = gorm.Open(c.DatabaseDriver, c.DatabaseDsn) + + if db != nil && err == nil { + break + } + } + + if err != nil || db == nil { + log.Fatal(err) + } } c.db = db - c.MigrateDb() - return err } diff --git a/docker-compose.travis.yml b/docker-compose.travis.yml index f4af7b2eb..cba22ebdc 100644 --- a/docker-compose.travis.yml +++ b/docker-compose.travis.yml @@ -3,6 +3,7 @@ version: '3.3' services: photoprism: build: . + command: tail -f /dev/null database: image: mysql:latest command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 diff --git a/docker-compose.yml b/docker-compose.yml index e91e3f99b..221e02db4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,12 +2,10 @@ version: '3.3' services: photoprism: - build: . + image: photoprism/photoprism + command: tail -f /dev/null ports: - 80:80 - - 8080:8080 - - 6006:6006 - - 8888:8888 volumes: - .:/go/src/github.com/photoprism/photoprism diff --git a/vendor/.gitignore b/vendor/.gitignore deleted file mode 100644 index 3f6ca7d81..000000000 --- a/vendor/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!.gitignore -!vendor.json \ No newline at end of file