From 61d5e4e05d1bf677973283c901e8b08494823bfe Mon Sep 17 00:00:00 2001 From: mpl Date: Wed, 4 Jul 2018 21:04:21 +0200 Subject: [PATCH] misc/docker/synology: package Perkeep for Synology Fixes #986 Change-Id: I63b506944e3d71a3e864d9f4b37a1e0b1abd8b9c --- doc/synology.md | 29 ++++ misc/docker/synology/Dockerfile | 71 ++++++++++ misc/docker/synology/build_syno.go | 125 ++++++++++++++++++ misc/docker/synology/perkeep/INFO.sh | 14 ++ misc/docker/synology/perkeep/PACKAGE_ICON.PNG | Bin 0 -> 8541 bytes .../synology/perkeep/PACKAGE_ICON_256.PNG | Bin 0 -> 59367 bytes .../synology/perkeep/SynoBuildConf/build | 7 + .../synology/perkeep/SynoBuildConf/depends | 6 + .../synology/perkeep/SynoBuildConf/install | 55 ++++++++ misc/docker/synology/perkeep/scripts/postinst | 30 +++++ .../synology/perkeep/scripts/postuninst | 12 ++ .../synology/perkeep/scripts/postupgrade | 8 ++ misc/docker/synology/perkeep/scripts/preinst | 9 ++ .../docker/synology/perkeep/scripts/preuninst | 9 ++ .../synology/perkeep/scripts/preupgrade | 11 ++ .../perkeep/scripts/start-stop-status | 39 ++++++ 16 files changed, 425 insertions(+) create mode 100644 doc/synology.md create mode 100644 misc/docker/synology/Dockerfile create mode 100644 misc/docker/synology/build_syno.go create mode 100755 misc/docker/synology/perkeep/INFO.sh create mode 100755 misc/docker/synology/perkeep/PACKAGE_ICON.PNG create mode 100755 misc/docker/synology/perkeep/PACKAGE_ICON_256.PNG create mode 100644 misc/docker/synology/perkeep/SynoBuildConf/build create mode 100644 misc/docker/synology/perkeep/SynoBuildConf/depends create mode 100644 misc/docker/synology/perkeep/SynoBuildConf/install create mode 100755 misc/docker/synology/perkeep/scripts/postinst create mode 100755 misc/docker/synology/perkeep/scripts/postuninst create mode 100755 misc/docker/synology/perkeep/scripts/postupgrade create mode 100755 misc/docker/synology/perkeep/scripts/preinst create mode 100755 misc/docker/synology/perkeep/scripts/preuninst create mode 100755 misc/docker/synology/perkeep/scripts/preupgrade create mode 100755 misc/docker/synology/perkeep/scripts/start-stop-status diff --git a/doc/synology.md b/doc/synology.md new file mode 100644 index 000000000..eb79c3fd9 --- /dev/null +++ b/doc/synology.md @@ -0,0 +1,29 @@ +# Perkeep on Synology appliances + +## Installation + +To facilitate running Perkeep on Synology appliances, we try to provide packages (`.spk` files) that can be readily installed through the **Package Center**. They have been built for **DSM 6.2** but they should at least work for **DSM 6.1** as well. For now the packages have not been published in the Synology Package Center "market", so you need to download them manually among the ones we host: + +* [Perkeep-6281-latest.spk](https://storage.googleapis.com/perkeep-release/synology/Perkeep-armv5-b5c76a70e8c8d0b158a3dd19c261c0b2e62cd693.spk) +* [Perkeep-x64-latest.spk](https://storage.googleapis.com/perkeep-release/synology/Perkeep-x86_64-b5c76a70e8c8d0b158a3dd19c261c0b2e62cd693.spk) + +Before installing, as we use the admin user home directory to store data, you need to make sure user homes are enabled. To do that: go to **Control Panel** -> **User** -> **Advanced** tab -> **User Home**, and tick **Enable user home service**. + +As you have downloaded the package yourself, it has to be installed manually as well, which means clicking on the **Manual Install** button in the Package Center. Then follow the installation instruction. + +After the installation, the Perkeep server (perkeepd) can be started and stopped from the package page in the **Package Center**. + +## Configuration + +As a Synology comes with an HTTP server (nginx) already listening on standard ports (80 and 443), making Perkeep accessible on these ports requires configuring nginx accordingly, which we do not do for now. One of the simplest ways to do so, is to leave Perkeep listening on HTTP on a non-privileged port (like 3179, in the default configuration), and to add a reverse proxy to the nginx configuration: go to **Control Panel** -> **Application Portal** -> **Reverse Proxy** tab. For example, if your NAS domain is **example.com**, and you control the subdomains for it, you can make the source be **perkeep.example.com** (HTTPS, port 443), and the destination be **localhost** (HTTP, port 3179). + +For the same reason (not supported by default nginx configuration), websockets will not be working in Perkeep. +All of the nginx configuration is in `/etc/nginx`, but it is out of the scope of this document to explain it. + +The Perkeep configuration file is located at `/var/services/homes/admin/.config/perkeep/server-config.json`. You can use the **File Station** to download it, edit it, and upload it again to suit your needs. Or you can login with ssh and then use a console text editor to modify it. + +The data (blobs and index) are stored by default at `/var/services/homes/admin/var/perkeep`. + +The logs are at `/var/services/homes/admin/var/perkeep.log`. + +The script controlling the service is installed at `/var/packages/Perkeep/scripts/start-stop-status`. For easier debugging, you can use it to manually stop and start the server. diff --git a/misc/docker/synology/Dockerfile b/misc/docker/synology/Dockerfile new file mode 100644 index 000000000..780bbda24 --- /dev/null +++ b/misc/docker/synology/Dockerfile @@ -0,0 +1,71 @@ +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +FROM buildpack-deps:stretch-scm AS pkbuild + +MAINTAINER Perkeep Authors + +ENV DEBIAN_FRONTEND noninteractive + +# gcc for cgo, sqlite +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + gcc \ + libc6-dev \ + make \ + pkg-config \ + libsqlite3-dev + +ENV GOLANG_VERSION 1.10.2 +ARG perkeep_version=8b537a66307cf41a659786f1a898c77b46303601 + +WORKDIR /usr/local +RUN wget -O go.tgz https://dl.google.com/go/go$GOLANG_VERSION.linux-amd64.tar.gz +RUN echo "4b677d698c65370afa33757b6954ade60347aaca310ea92a63ed717d7cb0c2ff go.tgz" | sha256sum -c - +RUN tar -zxvf go.tgz + +ENV GOROOT /usr/local/go +ENV GOPATH /go +ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH + +RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" +WORKDIR $GOPATH/src +RUN git clone https://perkeep.googlesource.com/perkeep perkeep.org +WORKDIR $GOPATH/src/perkeep.org +RUN git reset --hard $perkeep_version + +ARG goarch=amd64 +RUN go run make.go -v -arch=$goarch -arm=5 + +#stage 2 + +FROM ubuntu:16.04 +ENV DEBIAN_FRONTEND noninteractive +RUN apt-get update && apt-get -y upgrade +RUN apt-get -y --no-install-recommends install ca-certificates git python3 xz-utils udev vim + +RUN mkdir -p /toolkit +WORKDIR /toolkit +RUN git clone https://github.com/SynologyOpenSource/pkgscripts-ng pkgscripts +WORKDIR /toolkit/pkgscripts +RUN git reset --hard 86409bbab301428b893bc3d099ba8ba29f22137d + +ARG dsm=6.2 +ARG arch=x64 +ENV BUILD_ENV ds.$arch-$dsm +RUN echo "Preparing to build for: $BUILD_ENV" +RUN ./EnvDeploy -v $dsm -p $arch +WORKDIR /toolkit/build_env/$BUILD_ENV + +WORKDIR /toolkit +ARG perkeep_version=8b537a66307cf41a659786f1a898c77b46303601 +RUN mkdir -p source +WORKDIR /toolkit/source +ADD perkeep perkeep +RUN sed -i s:version=SET_BY_DOCKER_BUILD:version=\"$perkeep_version\": perkeep/INFO.sh + +ARG gobin=/go/bin +COPY --from=pkbuild $gobin/pk* /toolkit/build_env/$BUILD_ENV/root/bin/ +COPY --from=pkbuild $gobin/perkeepd /toolkit/build_env/$BUILD_ENV/root/bin/ + +WORKDIR /toolkit diff --git a/misc/docker/synology/build_syno.go b/misc/docker/synology/build_syno.go new file mode 100644 index 000000000..dad5f76be --- /dev/null +++ b/misc/docker/synology/build_syno.go @@ -0,0 +1,125 @@ +/* +Copyright 2018 The Perkeep Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Command build_syno builds and packages Perkeep for Synology appliances. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" +) + +var ( + // TODO(mpl): include more arches. + flagArch = flag.String("arch", "x64", "Synology architecture to build for. Possible values are limited to x64 or 6281 for now.") + flagDsm = flag.String("dsm", "6.2", "DSM version to build for.") + flagPerkeepRev = flag.String("pkrev", "8b537a66307cf41a659786f1a898c77b46303601", "git revision of Perkeep to package") + flagNoCache = flag.Bool("nocache", false, "build docker image with --no-cache") +) + +var pwd string + +func main() { + flag.Parse() + if *flagArch != "x64" && *flagArch != "6281" { + log.Fatalf("unsupported architecture: %v", *flagArch) + } + + newCwd := filepath.Dir(flag.Arg(0)) + if err := os.Chdir(newCwd); err != nil { + log.Fatalf("error changing dir to %v: %v", newCwd, err) + } + var err error + pwd, err = os.Getwd() + if err != nil { + log.Fatalf("error getting current directory: %v", err) + } + + gobin := "/go/bin" + goarch := "amd64" + // TODO(mpl): figure out the correspondance between all the other arches and the + // values for the go vars. + if *flagArch == "6281" { + gobin = "/go/bin/linux_arm" + goarch = "arm" + } + + // docker build -t perkeep/synology --build-arg arch=x64 --build-arg dsm=6.2 --build-arg gobin=/go/bin --build-arg goarch=amd64 + args := []string{"build"} + if *flagNoCache { + args = append(args, "--no-cache") + } + args = append(args, "-t", "perkeep/synology", + "--build-arg", "arch="+*flagArch, + "--build-arg", "dsm="+*flagDsm, + "--build-arg", "gobin="+gobin, + "--build-arg", "goarch="+goarch, + "--build-arg", "perkeep_version="+*flagPerkeepRev, + ".") + cmd := exec.Command("docker", args...) + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("Error building synology image: %v, %s", err, out) + } + fmt.Println(string(out)) + + if err := os.MkdirAll(filepath.Join(pwd+"/out"), 0755); err != nil { + log.Fatalf("Error creating out dir: %v", err) + } + + // the actual building step (./pkgscripts/PkgCreate.py) can't be in the + // Dockerfile since it's doing higher privilege stuff like chroot and mounts. + // Which is why we run it as the last step, and in privileged mode. + + // TODO(mpl): we might be able to "just" run a furtherly modified version of + // perkeep/SynoBuildConf/install because at the end of the day, we've already built the + // binaries, and all we need to do is package them in an .spk. But that would require + // further understanding and rewriting of the various pieces involved, and I don't think + // it's worth spending time on it for now. + // Although if we manage that, another win is that then we can skip EnvDeploy, + // which means avoiding a heavy download. + + // For runPkgCreate, you need to fetch the GPG keys at + // https://drive.google.com/drive/folders/1P95Lk1U6nA6kaVaxKRPi4Dv2Het-CWlY?usp=sharing + // and add them to $HOME/keys/perkeep-synology , which is then mounted to the container. + runPkgCreate() +} + +// runPkgCreate runs the actual build/install step provided in the DSM toolkit: ./pkgscripts/PkgCreate.py +// It can't be run during the build stage (in the Dockerfile), because it does +// privileged operations (at least chroot) so it is run as a privileged container. +// It requires the GPG keys at +// https://drive.google.com/drive/folders/1P95Lk1U6nA6kaVaxKRPi4Dv2Het-CWlY?usp=sharing +func runPkgCreate() { + // To test the equivalent from the shell: + // docker run --rm -i -t --privileged -v $PWD/out:/toolkit/result_spk -v $HOME/keys/perkeep-synology:/toolkit/build_env/ds.6281-6.2/root/.gnupg perkeep/synology ./pkgscripts/PkgCreate.py -v 6.2 -p x64 -x0 -c --print-log --build-opt="-J" perkeep + build_env := "ds." + *flagArch + "-" + *flagDsm + // TODO(mpl): test discrete --cap-add flags when I have a docker that supports them. + cmd := exec.Command("docker", "run", "--rm", "--privileged", + "-v", filepath.Join(pwd+"/out")+":/toolkit/result_spk", + "-v", filepath.Join(os.Getenv("HOME"), "keys", "perkeep-synology")+":/toolkit/build_env/"+build_env+"/root/.gnupg", + "perkeep/synology", + "./pkgscripts/PkgCreate.py", "-p", *flagArch, "-v", *flagDsm, "-x0", "-c", "--print-log", `--build-opt="-J"`, "perkeep") + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("Error building synology package: %v, %s", err, out) + } + fmt.Println(string(out)) +} diff --git a/misc/docker/synology/perkeep/INFO.sh b/misc/docker/synology/perkeep/INFO.sh new file mode 100755 index 000000000..1fdb856aa --- /dev/null +++ b/misc/docker/synology/perkeep/INFO.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Copyright (c) 2000-2016 Synology Inc. All rights reserved. + +source /pkgscripts/include/pkg_util.sh + +package="Perkeep" +version=SET_BY_DOCKER_BUILD +displayname="Perkeep" +maintainer="Perkeep Authors " +arch="$(pkg_get_unified_platform)" +description="Perkeep lets you permanently keep your stuff, for life. See https://perkeep.org/doc/synology" +helpurl="https://perkeep.org/doc/synology" +[ "$(caller)" != "0 NULL" ] && return 0 +pkg_dump_info diff --git a/misc/docker/synology/perkeep/PACKAGE_ICON.PNG b/misc/docker/synology/perkeep/PACKAGE_ICON.PNG new file mode 100755 index 0000000000000000000000000000000000000000..f42c527018f35a212ec1021bb42c963b302bbc8d GIT binary patch literal 8541 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 Xpq)C_4tYa^00000NkvXXu0mjf9?r2W literal 0 HcmV?d00001 diff --git a/misc/docker/synology/perkeep/PACKAGE_ICON_256.PNG b/misc/docker/synology/perkeep/PACKAGE_ICON_256.PNG new file mode 100755 index 0000000000000000000000000000000000000000..8c44448e12a26e060df6d36f1a36cf4990e690a9 GIT binary patch literal 59367 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 INFO + cp INFO $PKG_DIR/INFO + + ### Create the final spk. + # pkg_make_spk + # Please put the result spk into /image/packages + # spk name functions: pkg_get_spk_name pkg_get_spk_unified_name pkg_get_spk_family_name + mkdir -p /image/packages + pkg_make_spk ${PKG_DIR} "/image/packages" $(pkg_get_spk_family_name) +} + +main() { + create_package_tgz + create_spk +} + +main "$@" diff --git a/misc/docker/synology/perkeep/scripts/postinst b/misc/docker/synology/perkeep/scripts/postinst new file mode 100755 index 000000000..c4608646f --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/postinst @@ -0,0 +1,30 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +### This script will be executed when package installed and upgraded. +### Actions after package installed. +### ex. create database, create symbolic link... + +# make sure it's only run during package installation +if test -z "$SYNOPKG_PKGDEST" +then + exit 1 +fi + +# according to the doc, the owner of the files is the user that will be used to +# run the service (even though that does not seem to be enough/working). +# user http should always exist, so we need not bother with creating a perkeep user. +chown http:http $SYNOPKG_PKGDEST/usr/bin/* +ln -sf $SYNOPKG_PKGDEST/usr/bin/perkeepd /usr/bin/ +ln -sf $SYNOPKG_PKGDEST/usr/bin/pk /usr/bin/ +ln -sf $SYNOPKG_PKGDEST/usr/bin/pk-get /usr/bin/ +ln -sf $SYNOPKG_PKGDEST/usr/bin/pk-put /usr/bin/ +ln -sf $SYNOPKG_PKGDEST/usr/bin/pk-mount /usr/bin/ +# we persist the conf, blobs, and log in the admin home. +# then users can view/modify the conf themselves in the file station. +mkdir -p /var/services/homes/admin/var + +echo "Please see https://perkeep.org/doc/synology for the next steps." > $SYNOPKG_TEMP_LOGFILE + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/postuninst b/misc/docker/synology/perkeep/scripts/postuninst new file mode 100755 index 000000000..5fc5152ed --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/postuninst @@ -0,0 +1,12 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +### This script will be executed when package uninstalled and upgraded. +### Actions after package uninstalled. +### ex. remove garbage files. + +cd /usr/bin +rm -f perkeepd pk pk-get pk-put pk-mount + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/postupgrade b/misc/docker/synology/perkeep/scripts/postupgrade new file mode 100755 index 000000000..0d6d9322f --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/postupgrade @@ -0,0 +1,8 @@ +#!/bin/sh +# Copyright (C) 2000-2016 Synology Inc. All rights reserved. + +### This script will be executed ONLY at package upgraded. +### Actions after package upgraded. +### ex. restore user settings. + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/preinst b/misc/docker/synology/perkeep/scripts/preinst new file mode 100755 index 000000000..55afb90b0 --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/preinst @@ -0,0 +1,9 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +### This script will be execute when package installed and upgraded. +### Actions before package installed. +### ex. check environment. + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/preuninst b/misc/docker/synology/perkeep/scripts/preuninst new file mode 100755 index 000000000..4c903f480 --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/preuninst @@ -0,0 +1,9 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +### This script will be executed when package uninstalled and upgraded. +### Actions before package uninstalled +### ex. backup package data. + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/preupgrade b/misc/docker/synology/perkeep/scripts/preupgrade new file mode 100755 index 000000000..db2d2f9ec --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/preupgrade @@ -0,0 +1,11 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +### This script will execute ONLY when package upgraded. +### Actions before package upgraded. +### ex. backup user settings for package upgrade. + +# TODO(mpl): figure out if anything to do for upgrades + +exit 0 diff --git a/misc/docker/synology/perkeep/scripts/start-stop-status b/misc/docker/synology/perkeep/scripts/start-stop-status new file mode 100755 index 000000000..fe408bc56 --- /dev/null +++ b/misc/docker/synology/perkeep/scripts/start-stop-status @@ -0,0 +1,39 @@ +#!/bin/sh +# Copyright 2018 The Perkeep Authors. +# Licensed under the Apache License, Version 2.0 + +# TODO(mpl): we can do better, and probably much better. Need to investigate the +# available tools. +# https://perkeep-review.googlesource.com/c/perkeep/+/17546/5/misc/docker/synology/perkeep/scripts/start-stop-status#11 + +case $1 in + start) + ### Start this package. + # The doc says the binary is run by the user that owns it (and if we have a + # conf/privilege file in pkg), but that's apparently a lie. So we do the su + # to another user (http, which should already exist) ourselves. + sudo -u admin HOME=/var/services/homes/admin perkeepd -openbrowser=false >> /var/services/homes/admin/var/perkeep.log 2>&1 & + exit 0 + ;; + stop) + ### Stop this package. + # Apparently pkill is not installed. + kill $(ps -u admin | grep -m 1 'perkeepd' | awk '{print $1}') + exit 0 + ;; + status) + ### Check package alive. + if test -z "$(ps -u admin | grep -m 1 'perkeepd')" + then + echo "Not running" + else + echo "Running" + fi + ;; + killall) + ;; + log) + exit 0 + ;; +esac +