From 4c6d7630cd398c95b85e6c2f8c9d30d881c10afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 9 Apr 2015 17:18:04 +0200 Subject: [PATCH] more work on refining config loading, and packaging --- build.go | 65 ++++---- conf/defaults.ini | 155 +++++++++++------- conf/sample.ini | 117 +++---------- packaging/deb/control/postinst | 10 +- .../deb/default/{grafana => grafana-server} | 11 +- .../deb/init.d/{grafana => grafana-server} | 16 +- ...grafana.service => grafana-server.service} | 8 +- .../rpm/init.d/{grafana => grafana-server} | 0 .../rpm/sysconfig/{grafana => grafana-server} | 0 9 files changed, 179 insertions(+), 203 deletions(-) rename packaging/deb/default/{grafana => grafana-server} (69%) rename packaging/deb/init.d/{grafana => grafana-server} (89%) rename packaging/deb/systemd/{grafana.service => grafana-server.service} (54%) rename packaging/rpm/init.d/{grafana => grafana-server} (100%) rename packaging/rpm/sysconfig/{grafana => grafana-server} (100%) diff --git a/build.go b/build.go index c3d61362c2a..5f22292ff5a 100644 --- a/build.go +++ b/build.go @@ -22,12 +22,13 @@ import ( ) var ( - versionRe = regexp.MustCompile(`-[0-9]{1,3}-g[0-9a-f]{5,10}`) - goarch string - goos string - version string = "v1" - race bool - workingDir string + versionRe = regexp.MustCompile(`-[0-9]{1,3}-g[0-9a-f]{5,10}`) + goarch string + goos string + version string = "v1" + race bool + workingDir string + serverBinaryName string = "grafana-server" ) const minGoVersion = 1.3 @@ -71,7 +72,7 @@ func main() { //verifyGitRepoIsClean() //grunt("release", "--pkgVer="+version) createPackage("deb", "default") - createPackage("rpm", "sysconfig") + //createPackage("rpm", "sysconfig") case "latest": makeLatestDistCopies() @@ -110,37 +111,42 @@ func readVersionFromPackageJson() { } func createPackage(packageType string, defaultPath string) { - installRoot := "/opt/grafana" - configRoot := "/etc/grafana" + homeDir := "/usr/share/grafana" + configDir := "/etc/grafana" + configFilePath := "/etc/grafana/grafana.ini" + defaultFilePath := filepath.Join("/etc/", defaultPath, "grafana-server") + grafanaServerBinPath := "/usr/bin/" + serverBinaryName + initdScriptPath := "/etc/init.d/grafana-server" + systemdServiceFilePath := "/usr/lib/systemd/system/grafana-server.service" packageRoot, _ := ioutil.TempDir("", "grafana-linux-pack") packageConfDir := filepath.Join("packaging", packageType) - afterInstallScript := filepath.Join(packageConfDir, "control/postinst") - initdscript := filepath.Join(packageConfDir, "init.d/grafana") - defaultScript := filepath.Join(packageConfDir, defaultPath, "grafana") - systemdServiceFile := filepath.Join(packageConfDir, "systemd/grafana.service") + postintSrc := filepath.Join(packageConfDir, "control/postinst") + initdScriptSrc := filepath.Join(packageConfDir, "init.d/grafana-server") + defaultFileSrc := filepath.Join(packageConfDir, defaultPath, "grafana-server") + systemdFileSrc := filepath.Join(packageConfDir, "systemd/grafana-server.service") - packageInstallRoot := filepath.Join(packageRoot, installRoot) - configDir := filepath.Join(packageRoot, configRoot) - - runError("mkdir", "-p", packageInstallRoot) - runError("mkdir", "-p", configDir) + // create directories + runError("mkdir", "-p", filepath.Join(packageRoot, homeDir)) + runError("mkdir", "-p", filepath.Join(packageRoot, configDir)) runError("mkdir", "-p", filepath.Join(packageRoot, "/etc/init.d")) runError("mkdir", "-p", filepath.Join(packageRoot, "/etc/", defaultPath)) runError("mkdir", "-p", filepath.Join(packageRoot, "/usr/lib/systemd/system")) + runError("mkdir", "-p", filepath.Join(packageRoot, "/usr/bin")) + // copy binary + runError("cp", "-p", filepath.Join(workingDir, "tmp/bin/"+serverBinaryName), grafanaServerBinPath) // copy init.d script - runError("cp", "-p", initdscript, filepath.Join(packageRoot, "/etc/init.d/grafana")) - // copy environment file - runError("cp", "-p", defaultScript, filepath.Join(packageRoot, "etc", defaultPath, "grafana")) + runError("cp", "-p", initdScriptSrc, filepath.Join(packageRoot, initdScriptPath)) + // copy environment var file + runError("cp", "-p", defaultFileSrc, filepath.Join(packageRoot, defaultFilePath)) // copy systemd file - runError("cp", "-p", systemdServiceFile, filepath.Join(packageRoot, "/usr/lib/systemd/system/grafana.service")) + runPrint("cp", "-p", systemdFileSrc, filepath.Join(packageRoot, systemdServiceFilePath)) // copy release files - runError("cp", "-a", filepath.Join(workingDir, "tmp")+"/.", packageInstallRoot) + runError("cp", "-a", filepath.Join(workingDir, "tmp")+"/.", filepath.Join(packageRoot, homeDir)) // copy sample ini file to /etc/opt/grafana - configFile := filepath.Join(configDir, "grafana.ini") - runError("cp", "conf/sample.ini", configFile) + runError("cp", "conf/sample.ini", filepath.Join(packageRoot, configFilePath)) args := []string{ "-s", "dir", @@ -151,8 +157,11 @@ func createPackage(packageType string, defaultPath string) { "--url", "http://grafana.org", "--license", "Apache 2.0", "--maintainer", "contact@grafana.org", - "--config-files", filepath.Join(configRoot, "grafana.ini"), - "--after-install", afterInstallScript, + "--config-files", configFilePath, + "--config-files", initdScriptPath, + "--config-files", defaultFilePath, + "--config-files", systemdServiceFilePath, + "--after-install", postintSrc, "--name", "grafana", "--version", version, "-p", "./dist", @@ -209,7 +218,7 @@ func test(pkg string) { } func build(pkg string, tags []string) { - binary := "./bin/grafana-server" + binary := "./bin/" + serverBinaryName if goos == "windows" { binary += ".exe" } diff --git a/conf/defaults.ini b/conf/defaults.ini index 8dddace471c..dd14e2e387b 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -1,101 +1,131 @@ -app_name = Grafana -app_mode = production +##################### Grafana Configuration Example ##################### +# +# Everything has defaults so you only need to uncomment things you want to +# change +; app_mode = production + +#################################### Paths #################################### [paths] -; data_path -; where rendered png images are temporarily stored -; file based sessions are stored here (if file based session is configured below) -; the database is stored here if sqlite3 database is used +# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is useD) +# data = data +# +# Directory where grafana can store logs +# logs = data/log +#################################### Server #################################### [server] -; protocol (http or https) +# Protocol (http or https) protocol = http -; the ip address to bind to, empty will bind to all interfaces + +# The ip address to bind to, empty will bind to all interfaces http_addr = -; the http port to use + +# The http port to use http_port = 3000 -; The public facing domain name used to access grafana from a browser + +# The public facing domain name used to access grafana from a browser domain = localhost -; the full public facing url + +# The full public facing url root_url = %(protocol)s://%(domain)s:%(http_port)s/ + +# Log web requests router_logging = false -; the path relative home path where frontend assets are located + +# the path relative working path static_root_path = public -; enable gzip + +# enable gzip enable_gzip = false -; https certs & key file + +# https certs & key file cert_file = cert_key = +#################################### Database #################################### +[database] +# Either "mysql", "postgres" or "sqlite3", it's your choice +type = sqlite3 +host = 127.0.0.1:3306 +name = grafana +user = root +password = + +# For "postgres" only, either "disable", "require" or "verify-full" +ssl_mode = disable + +# For "sqlite3" only, path relative to data_path setting +path = grafana.db + +#################################### Session #################################### +[session] +# Either "memory", "file", "redis", "mysql", default is "memory" +provider = file + +# Provider config options +# memory: not have any config yet +# file: session dir path, is relative to grafana data_path +# redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,grafana` +# mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1)/database_name` +provider_config = sessions + +# Session cookie name +cookie_name = grafana_sess + +# If you use session in https only, default is false +cookie_secure = false + +# Session life time, default is 86400 +session_life_time = 86400 + +#################################### Analytics #################################### [analytics] # Server reporting, sends usage counters to stats.grafana.org every 24 hours. # No ip addresses are being tracked, only simple counters to track # running instances, dashboard and error counts. It is very helpful to us. # Change this option to false to disable reporting. reporting_enabled = true -; Google Analytics universal tracking code, only enabled if you specify an id here + +# Google Analytics universal tracking code, only enabled if you specify an id here google_analytics_ua_id = -[database] -; Either "mysql", "postgres" or "sqlite3", it's your choice -type = sqlite3 -host = 127.0.0.1:3306 -name = grafana -user = root -password = -; For "postgres" only, either "disable", "require" or "verify-full" -ssl_mode = disable -; For "sqlite3" only, path relative to data_path setting -path = grafana.db - -[session] -; Either "memory", "file", "redis", "mysql", default is "memory" -provider = file -; Provider config options -; memory: not have any config yet -; file: session dir path, is relative to grafana data_path -; redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,grafana` -; mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1)/database_name` -provider_config = sessions -; Session cookie name -cookie_name = grafana_sess -; If you use session in https only, default is false -cookie_secure = false -; Session life time, default is 86400 -session_life_time = 86400 - +#################################### Security #################################### [security] -; default admin user, created on startup +# default admin user, created on startup admin_user = admin -; default admin password, can be changed before first start of grafana, or in profile settings +# default admin password, can be changed before first start of grafana, or in profile settings admin_password = admin -; used for signing +# used for signing secret_key = SW2YcwTIb9zpOOhoPsMm -; Auto-login remember days +# Auto-login remember days login_remember_days = 7 cookie_username = grafana_user cookie_remember_name = grafana_remember +#################################### Users #################################### [users] -; disable user signup / registration +# disable user signup / registration allow_sign_up = true -; Allow non admin users to create organizations +# Allow non admin users to create organizations allow_org_create = true # Set to true to automatically assign new users to the default organization (id 1) auto_assign_org = true -; Default role new users will be automatically assigned (if disabled above is set to true) +# Default role new users will be automatically assigned (if disabled above is set to true) auto_assign_org_role = Viewer +#################################### Anonymous Auth ########################## [auth.anonymous] -; enable anonymous access +# enable anonymous access enabled = false -; specify organization name that should be used for unauthenticated users +# specify organization name that should be used for unauthenticated users org_name = Main Org. -; specify role for unauthenticated users +# specify role for unauthenticated users org_role = Viewer +#################################### Github Auth ########################## [auth.github] enabled = false client_id = some_id @@ -103,9 +133,10 @@ client_secret = some_secret scopes = user:email auth_url = https://github.com/login/oauth/authorize token_url = https://github.com/login/oauth/access_token -; uncomment bellow to only allow specific email domains +# Uncomment bellow to only allow specific email domains ; allowed_domains = mycompany.com othercompany.com +#################################### Google Auth ########################## [auth.google] enabled = false client_id = some_client_id @@ -113,23 +144,24 @@ client_secret = some_client_secret scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email auth_url = https://accounts.google.com/o/oauth2/auth token_url = https://accounts.google.com/o/oauth2/token -; uncomment bellow to only allow specific email domains +# Uncomment bellow to only allow specific email domains ; allowed_domains = mycompany.com othercompany.com +#################################### Logging ########################## [log] -; Either "console", "file", default is "console" -; Use comma to separate multiple modes, e.g. "console, file" +# Either "console", "file", default is "console" +# Use comma to separate multiple modes, e.g. "console, file" mode = console, file -; Buffer length of channel, keep it as it is if you don't know what it is. +# Buffer length of channel, keep it as it is if you don't know what it is. buffer_len = 10000 -; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" +# Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" level = Info -; For "console" mode only +# For "console" mode only [log.console] level = -; For "file" mode only +# For "file" mode only [log.file] level = ; This enables automated log rotate(switch of following options), default is true @@ -143,6 +175,7 @@ daily_rotate = true ; Expired days of log file(delete after max days), default is 7 max_days = 7 +#################################### AMPQ Event Publisher ########################## [event_publisher] enabled = false rabbitmq_url = amqp://localhost/ diff --git a/conf/sample.ini b/conf/sample.ini index 8ab6628014b..53164d29dbc 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -1,107 +1,38 @@ +##################### Grafana Configuration Example ##################### + # Sample grafana config for deb & rpm packages # You only need to specify overrides here -# Defaults are in the /opt/grafana/current/conf/defaults.ini file -# This file is never ovewritten when upgrading grafana via deb or rpm package -app_mode = production +; app_mode = production -; data_path (used for sqlite3 db (if that is used), temp png images, and sessions (if file based sessions are used) -; this option is passed via command line args, override this option in /etc/default/grafana -; defaults to /opt/grafana/data -data_path = +#################################### Paths #################################### +[paths] +# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is useD) +# +;data = /var/lib/grafana +# +# Directory where grafana can store logs +# +;logs = /var/log/grafana [server] ; protocol (http or https) -protocol = http +;protocol = http ; the ip address to bind to, empty will bind to all interfaces -http_addr = +;http_addr = ; the http port to use -http_port = 3000 +;http_port = 3000 ; The public facing domain name used to access grafana from a browser -domain = localhost +;domain = localhost ; the full public facing url -root_url = %(protocol)s://%(domain)s:%(http_port)s/ -router_logging = false -; the path relative to grafana process working directory -static_root_path = public -enable_gzip = false +;root_url = %(protocol)s://%(domain)s:%(http_port)s/ +;router_logging = false +; the path relative home path where frontend assets are located +;static_root_path = public +; enable gzip +;enable_gzip = false ; https certs & key file -cert_file = -cert_key = +;cert_file = +;cert_key = -[analytics] -# Server reporting, sends usage counters to stats.grafana.org (https). -# No ip addresses are being tracked, only simple counters to track -# running instances, dashboard and error counts. It is very helpful to us. -# Change this option to false to disable reporting. -reporting_enabled = true -; Google Analytics universal tracking code, only enabled if you specify an id here -google_analytics_ua_id = - -[database] -; Either "mysql", "postgres" or "sqlite3", it's your choice -type = sqlite3 -host = 127.0.0.1:3306 -name = grafana -user = root -password = -; For "postgres" only, either "disable", "require" or "verify-full" -ssl_mode = disable -; For "sqlite3" only, path is relative to data_dir -path = grafana.db - -[session] -; Either "memory", "file", "redis", "mysql", default is "memory" -provider = file -; Provider config options -; memory: not have any config yet -; file: session file path, e.g. `sessions`, relative to data_dir -; redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,grafana` -; mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1)/database_name` -provider_config = sessions -; Session cookie name -cookie_name = grafana_sess -; If you use session in https only, default is false -cookie_secure = false -; Session life time, default is 86400 -session_life_time = 86400 - -[security] -; default admin user, created on startup -admin_user = admin -; default admin password, can be changed before first start of grafana, or in profile settings -admin_password = admin -; used for signing -secret_key = SW2YcwTIb9zpOOhoPsMm -; Auto-login remember days -login_remember_days = 7 -cookie_username = grafana_user -cookie_remember_name = grafana_remember - -[users] -; disable user signup / registration -allow_sign_up = true -; Allow non admin users to create organizations -allow_org_create = true -# Set to true to automatically assign new users to the default organization (id 1) -auto_assign_org = true -; Default role new users will be automatically assigned (if disabled above is set to true) -auto_assign_org_role = Viewer - -[auth.anonymous] -; enable anonymous access -enabled = false -; specify organization name that should be used for unauthenticated users -org_name = Main org. -; specify role for unauthenticated users -org_role = Viewer - -[log] -; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" -level = Info -mode = console, file -; root_path, this option is passed via command line args, -; override this option in /etc/default/grafana -; defaults to /var/log/grafana/ -root_path = diff --git a/packaging/deb/control/postinst b/packaging/deb/control/postinst index c52a5b384bd..ba8b9fed6cf 100755 --- a/packaging/deb/control/postinst +++ b/packaging/deb/control/postinst @@ -30,12 +30,12 @@ case "$1" in "$GRAFANA_USER" fi - # Set user permissions on /var/log/grafana, /opt/grafana/data - mkdir -p /var/log/grafana /opt/grafana/data - chown -R $GRAFANA_USER:$GRAFANA_GROUP /var/log/grafana /opt/grafana/data - chmod 755 /var/log/grafana /opt/grafana/data + # Set user permissions on /var/log/grafana, /var/lib/grafana + mkdir -p /var/log/grafana /var/lib/grafana + chown -R $GRAFANA_USER:$GRAFANA_GROUP /var/log/grafana /var/lib/grafana + chmod 755 /var/log/grafana /var/lib/grafana - # configuration files should not be modifiable by elasticsearch user, as this can be a security issue + # configuration files should not be modifiable by grafana user, as this can be a security issue chown -Rh root:root /etc/grafana/* chmod 755 /etc/grafana find /etc/grafana -type f -exec chmod 644 {} ';' diff --git a/packaging/deb/default/grafana b/packaging/deb/default/grafana-server similarity index 69% rename from packaging/deb/default/grafana rename to packaging/deb/default/grafana-server index 5ac33f55e60..b6ae590d5b3 100644 --- a/packaging/deb/default/grafana +++ b/packaging/deb/default/grafana-server @@ -1,14 +1,17 @@ - GRAFANA_USER=grafana + GRAFANA_GROUP=grafana +GRAFANA_HOME=/usr/share/grafana + LOG_DIR=/var/log/grafana -GRAFANA_HOME=/opt/grafana -DATA_DIR=/opt/grafana/data -WORK_DIR=/opt/grafana + +DATA_DIR=/var/lib/grafana + MAX_OPEN_FILES=10000 CONF_DIR=/etc/grafana + CONF_FILE=/etc/grafana/grafana.ini RESTART_ON_UPGRADE=true diff --git a/packaging/deb/init.d/grafana b/packaging/deb/init.d/grafana-server similarity index 89% rename from packaging/deb/init.d/grafana rename to packaging/deb/init.d/grafana-server index b29d971fa41..0233f02980a 100755 --- a/packaging/deb/init.d/grafana +++ b/packaging/deb/init.d/grafana-server @@ -20,9 +20,9 @@ # 3. Centos with initscripts package installed PATH=/bin:/usr/bin:/sbin:/usr/sbin -NAME=grafana +NAME=grafana-server DESC="Grafana Server" -DEFAULT=/etc/default/$NAME +DEFAULT=/etc/default/grafana-server if [ `id -u` -ne 0 ]; then echo "You need root privileges to run this script" @@ -37,11 +37,11 @@ fi GRAFANA_USER=grafana GRAFANA_GROUP=grafana -GRAFANA_HOME=/opt/$NAME -CONF_DIR=/etc/$NAME +GRAFANA_HOME=/usr/share/grafana +CONF_DIR=/etc/grafana WORK_DIR=$GRAFANA_HOME -DATA_DIR=$GRAFANA_HOME/data -LOG_DIR=/var/log/$NAME +DATA_DIR=/var/lib/grafana +LOG_DIR=/var/log/grafana CONF_FILE=$CONF_DIR/grafana.ini MAX_OPEN_FILES=10000 @@ -51,8 +51,8 @@ if [ -f "$DEFAULT" ]; then fi PID_FILE=/var/run/$NAME.pid -DAEMON=$GRAFANA_HOME/bin/grafana -DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} --default-data-path=${DATA_DIR} --default-log-path=${LOG_DIR} web" +DAEMON=/usr/bin/grafana-server +DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR}" # Check DAEMON exists test -x $DAEMON || exit 0 diff --git a/packaging/deb/systemd/grafana.service b/packaging/deb/systemd/grafana-server.service similarity index 54% rename from packaging/deb/systemd/grafana.service rename to packaging/deb/systemd/grafana-server.service index 98cd7b42f18..764de90d3fd 100644 --- a/packaging/deb/systemd/grafana.service +++ b/packaging/deb/systemd/grafana-server.service @@ -9,10 +9,10 @@ EnvironmentFile=/etc/default/grafana User=grafana Group=grafana Type=simple -ExecStart=/opt/grafana/bin/grafana \ - --config=$CONF_FILE \ - --default-log-path=$LOG_DIR \ - --default-path-data=$DATA_DIR \ +ExecStart=/usr/bin/grafana-server \ + --config=${CONF_FILE} \ + cfg:default.paths.data=${LOG_DIR} \ + cfg:default.paths.data=${DATA_DIR} \ LimitNOFILE=10000 TimeoutStopSec=20 diff --git a/packaging/rpm/init.d/grafana b/packaging/rpm/init.d/grafana-server similarity index 100% rename from packaging/rpm/init.d/grafana rename to packaging/rpm/init.d/grafana-server diff --git a/packaging/rpm/sysconfig/grafana b/packaging/rpm/sysconfig/grafana-server similarity index 100% rename from packaging/rpm/sysconfig/grafana rename to packaging/rpm/sysconfig/grafana-server