diff --git a/README.md b/README.md index 77dd5494de9cb48f1b43160245f03cda57228d2d..81cbe0d5ca64a37af257df04608be130a4c24605 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,10 @@ Make sure the full stack is up with: curl -H 'Accept: application/json' 'http://localhost:8080/status/' ``` +## Configuration + +See [configuration documentation](/docs/config.md). + ## Building a release To build a release of cozy-stack, a `build.sh` script can automate the work. The `release` option of this script will generate a binary with a name containing the version of the file, along with a SHA-256 sum of the binary. diff --git a/devtool/Dockerfile b/devtool/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b6c3cbc8a8be27166fbaf0fc83a1c193a097afb7 --- /dev/null +++ b/devtool/Dockerfile @@ -0,0 +1,79 @@ +FROM debian:jessie + +ENV COUCHDB_VERSION 2.0.0 +ENV COUCHDB_SRC_URL https://dist.apache.org/repos/dist/release/couchdb/source/2.0.0/apache-couchdb-$COUCHDB_VERSION.tar.gz +ENV COUCHDB_SRC_SHA256 ccaf3ce9cb06c50a73e091696e557e2a57c5ba02c5b299e1ac2f5b959ee96eca + +ENV GOLANG_VERSION 1.7.3 +ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz +ENV GOLANG_DOWNLOAD_SHA256 508028aac0654e993564b6e2014bf2d4a9751e3b286661b0b0040046cf18028e + +# CouchDB and CGo dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + ca-certificates \ + curl \ + libicu52 \ + libmozjs185-1.0 \ + erlang \ + libicu-dev \ + libmozjs185-dev \ + openssl \ + g++ \ + gcc \ + libc6-dev \ + make \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# CouchDB +RUN mkdir /usr/src/couchdb \ + && curl -fsSL "$COUCHDB_SRC_URL" -o couchdb.tar.gz \ + && echo "$COUCHDB_SRC_SHA256 couchdb.tar.gz" | sha256sum -c - \ + && tar -xzf couchdb.tar.gz -C /usr/src/couchdb --strip-components=1 \ + && rm couchdb.tar.gz \ + && cd /usr/src/couchdb \ + && ./configure --disable-docs \ + && make release \ + && mv ./rel/couchdb /usr/local + +ENV PATH $PATH:/usr/local/couchdb/bin + +# Go +RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ + && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ + && tar -xzf golang.tar.gz -C /usr/local \ + && rm golang.tar.gz + +ENV GOPATH /go +ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH + +RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" + +RUN go get github.com/mholt/caddy/caddy \ + && go get github.com/cozy/cozy-stack + +# Cleanup +RUN apt-get purge -y \ + erlang-dev \ + libicu-dev \ + libmozjs185-dev \ + && apt-get autoremove -y \ + && apt-get clean \ + && rm -rf /usr/src/couchdb + +COPY dev.sh /usr/bin +RUN chmod +x /usr/bin/dev.sh + +ENV COZY_DEV_HOST cozy.local +ENV COZY_DEV_PORT 8080 +ENV COZY_STACK_HOST localhost +ENV COZY_STACK_PORT 8081 +ENV COUCHDB_ENABLE 1 +ENV COUCHDB_HOST localhost +ENV COUCHDB_PORT 5984 + +RUN mkdir -p /data/cozy-app + +ENTRYPOINT ["/usr/bin/dev.sh"] +CMD ["-d /data/cozy-app"] diff --git a/devtool/dev.sh b/devtool/dev.sh new file mode 100755 index 0000000000000000000000000000000000000000..a3bbbb350830ca7aff49c43b5d25ae935b901ed3 --- /dev/null +++ b/devtool/dev.sh @@ -0,0 +1,257 @@ +#!/bin/sh + +[ -z ${COZY_DEV_HOST} ] && COZY_DEV_HOST="cozy.local" +[ -z ${COZY_DEV_PORT} ] && COZY_DEV_PORT="8080" +[ -z ${COZY_STACK_HOST} ] && COZY_STACK_HOST="localhost" +[ -z ${COZY_STACK_PORT} ] && COZY_STACK_PORT="8081" + +[ -z ${COUCHDB_HOST} ] && COUCHDB_HOST="localhost" +[ -z ${COUCHDB_PORT} ] && COUCHDB_PORT="5984" +[ -z ${COUCHDB_ENABLE} ] && COUCHDB_ENABLE="1" + +if [ -d ${COZY_STACK_PATH} ] && [ -f ${COZY_STACK_PATH}/cozy-stack ]; then + COZY_STACK_PATH="${COZY_STACK_PATH}/cozy-stack" +fi + +usage() { + echo "Usage: ${0} [-h] [-d <app path>] [–v <stack version>]" + + echo "\nEnvironment variables" + echo "\n COZY_DEV_HOST" + echo " specify the hostname or domain on which the dev server is listening" + echo " to incoming requests. default: dev.cozycloud.cc" + echo "\n COZY_DEV_PORT" + echo " specify the port on which the dev server is listening." + echo " default: 8080." + echo "\n COZY_STACK_PATH" + echo " specify the path of the cozy-stack binary folder or the binary" + echo " itself. default: \"\$GOPATH/bin\"." + echo "\n COZY_STACK_HOST" + echo " specify the hostname on which the cozy-stack is launched." + echo " default: localhost." + echo "\n COZY_STACK_PORT" + echo " specify the port on which the cozy-stack is listening." + echo " default: 8080." + echo "\n COUCHDB_ENABLE" + echo " specify whether or not this script should launch couchdb." + echo " default: 1" + echo "\n COUCHDB_HOST" + echo " specify the host of the couchdb database. default: localhost" + echo "\n COUCHDB_PORT" + echo " specify the port of the couchdb database. default: 5984" +} + +if [ -n "${COZY_STACK_PATH}" ] && [ ! -f "${COZY_STACK_PATH}" ]; then + echo_err "COZY_STACK_PATH=${COZY_STACK_PATH} file does not exist" + exit 1 +fi + +if [ "${COZY_STACK_PORT}" = "${COZY_DEV_PORT}" ]; then + echo_err "COZY_STACK_HOST and COZY_DEV_PORT are equal" + exit 1 +fi + +do_start() { + set -e + + if [ ! -f "${GOPATH}/bin/caddy" ]; then + if [ -z `command -v go` ]; then + echo_err "Executable \"go\" not found in \$PATH" + exit 1 + fi + printf "installing http server (caddy)... " + go get -x -u "github.com/mholt/caddy/caddy" + echo "ok" + fi + + if [ -n "${cozy_stack_version}" ]; then + echo_err "Not implemented... we do not have a release yet" + exit 1 + fi + + if [ -z "${COZY_STACK_PATH}" ]; then + COZY_STACK_PATH="${GOPATH}/bin/cozy-stack" + if [ ! -f "${COZY_STACK_PATH}" ]; then + printf "installing cozy-stack... " + go get -x -u "github.com/cozy/cozy-stack" + echo "ok" + fi + fi + + do_start_couchdb + do_start_proxy + check_hosts + + echo "" + echo "Go to http://app.${COZY_DEV_HOST}:${COZY_DEV_PORT}/" + echo "" + + ${COZY_STACK_PATH} serve \ + --port ${COZY_STACK_PORT} \ + --host ${COZY_STACK_HOST} \ + --couchdb-host ${COUCHDB_HOST} \ + --couchdb-port ${COUCHDB_PORT} +} + +cleanup() { + for tmpdir in "${TMPDIR}" "${TMP}" /var/tmp /tmp; do + test -d "${tmpdir}" && break + done + + pids=`find ${tmpdir} -iname cozy-stack-dev.couch*` + + for pidfile in ${pids}; do + pid=`cat "${pidfile}"` + if [ -n "${pid}" ]; then + echo "stopping couchdb" + kill -9 ${pid} 2>/dev/null 1>/dev/null || true + fi + rm "${pidfile}" + done +} + +do_start_couchdb() { + if [ "${COUCHDB_ENABLE}" = "0" ]; then + echo "skip couchdb" + return + fi + + printf "checking couchdb... " + + set +e + couch_test=`curl -s -XGET "${COUCHDB_HOST}:${COUCHDB_PORT}"` + if [ -n "${couch_test}" ]; then + couch_test=`echo "${couch_test}" | grep "\"version\":\s*\"2"` + if [ -z "${couch_test}" ]; then + echo_err "" + echo_err "couchdb v1 is running on ${COUCHDB_HOST}:${COUCHDB_PORT}" + echo_err "you need couchdb version >= 2" + exit 1 + else + echo "ok" + return + fi + fi + set -e + + if [ -z `command -v go` ]; then + echo_err "\nExecutable \"couchdb\" not found in \$PATH" + exit 1 + fi + + couch_pid=`mktemp -t cozy-stack-dev.couch.XXXX` || exit 1 + trap cleanup EXIT + + printf "none found, starting... " + couchdb 2> /dev/null 1> /dev/null & + echo ${!} > ${couch_pid} + wait_for "${COUCHDB_HOST}:${COUCHDB_PORT}" "couchdb" + echo "ok" + + for i in "_users" "_replicator" "_global_changes"; do + curl -s -XPUT "${COUCHDB_HOST}:${COUCHDB_PORT}/${i}" > /dev/null + done +} + +do_start_proxy() { + site_root=`realpath ${appdir}` + + check_not_running "${COZY_DEV_HOST}:${COZY_DEV_PORT}" "dev server" + check_not_running "${COZY_STACK_HOST}:${COZY_STACK_PORT}" "cozy-stack" + + caddy_file="\n\ +${COZY_DEV_HOST} { \n\ + proxy / ${COZY_STACK_HOST}:${COZY_STACK_PORT} \n\ + tls off \n\ +} \n\ +app.${COZY_DEV_HOST} { \n\ + root ${site_root} \n\ + tls off \n\ +} \n\ + " + + printf "starting caddy on \"${site_root}\"... " + echo ${caddy_file} | ${GOPATH}/bin/caddy \ + -quiet \ + -conf stdin \ + -port ${COZY_DEV_PORT} & + wait_for "${COZY_STACK_HOST}:${COZY_DEV_PORT}" "caddy" + echo "ok" +} + +wait_for() { + i="0" + while ! curl -s --max-time 1 -XGET ${1} > /dev/null; do + sleep 0.5 + i=$((i+1)) + if [ "${i}" -gt "10" ]; then + echo_err "could not listen to ${2} on ${1}" + exit 1 + fi + done +} + +check_not_running() { + printf "checking ${1}... " + if curl -s --max-time 1 -XGET ${1} > /dev/null; then + printf "\n" + echo_err "${2} is already running on ${1}" + exit 1 + fi + echo "ok" +} + +check_hosts() { + set +e + devhost=`cat /etc/hosts | grep ${COZY_DEV_HOST}` + apphost=`cat /etc/hosts | grep app.${COZY_DEV_HOST}` + if [ -z "${devhost}" ] || [ -z "${apphost}" ]; then + echo "" + echo_err "You should probaby add the following line in the /etc/hosts file:" + echo_err "127.0.0.1\t${COZY_DEV_HOST},app.${COZY_DEV_HOST}" + fi + set -e +} + +echo_err() { + >&2 echo "error: ${1}" +} + +while getopts ":hd:v:" optname; do + case "${optname}" in + "h") + usage + exit 0 + ;; + "d") + appdir=${OPTARG} + ;; + "v") + cozy_stack_version=${OPTARG} + ;; + ":") + echo_err "Option -${OPTARG} requires an argument" + echo_err "Type ${0} --help" + exit 1 + ;; + "?") + echo_err "Invalid option ${OPTARG}" + echo_err "Type ${0} --help" + exit 1 + ;; + esac +done + +if [ -z "${appdir}" ]; then + echo_err "Missing application directory argument -d" + echo_err "Type ${0} --help" + exit 1 +fi + +if [ ! -d ${appdir} ]; then + echo_err "Application directory ${1} does not exit" + exit 1 +fi + +do_start +exit 0 diff --git a/docs/config.md b/docs/config.md index 742617121de5e8875236e0d77a5cce2712b8e850..e077f072f367f7f73e35bfc8cdbf2d90c6533714 100644 --- a/docs/config.md +++ b/docs/config.md @@ -8,7 +8,7 @@ should be named `cozy.yaml` or `cozy.json` depending on the format of your chosing, and should be present in one of these directories (ordered by priority): -- `.cozy` +- `./.cozy` - `$HOME/.cozy` - `/etc/cozy`