Explorar o código

more work on refining config loading, and packaging

Torkel Ödegaard %!s(int64=10) %!d(string=hai) anos
pai
achega
4c6d7630cd

+ 37 - 28
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"
 	}

+ 86 - 53
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 =
 
-[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_ua_id =
-
+#################################### Database ####################################
 [database]
-; Either "mysql", "postgres" or "sqlite3", it's your choice
+# 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"
+
+# For "postgres" only, either "disable", "require" or "verify-full"
 ssl_mode = disable
-; For "sqlite3" only, path relative to data_path setting
+
+# For "sqlite3" only, path relative to data_path setting
 path = grafana.db
 
+#################################### Session ####################################
 [session]
-; Either "memory", "file", "redis", "mysql", default is "memory"
+# 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 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
+
+# Session cookie name
 cookie_name = grafana_sess
-; If you use session in https only, default is false
+
+# If you use session in https only, default is false
 cookie_secure = false
-; Session life time, default is 86400
+
+# 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_ua_id =
+
+#################################### 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/

+ 24 - 93
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 =
-
-[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
+;cert_file =
+;cert_key =
 
-[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 =
 

+ 5 - 5
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 {} ';'

+ 7 - 4
packaging/deb/default/grafana → 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

+ 8 - 8
packaging/deb/init.d/grafana → 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

+ 4 - 4
packaging/deb/systemd/grafana.service → 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
 

+ 0 - 0
packaging/rpm/init.d/grafana → packaging/rpm/init.d/grafana-server


+ 0 - 0
packaging/rpm/sysconfig/grafana → packaging/rpm/sysconfig/grafana-server