more work on refining config loading, and packaging

This commit is contained in:
Torkel Ödegaard 2015-04-09 17:18:04 +02:00
parent d1767144a8
commit 4c6d7630cd
9 changed files with 179 additions and 203 deletions

View File

@ -28,6 +28,7 @@ var (
version string = "v1" version string = "v1"
race bool race bool
workingDir string workingDir string
serverBinaryName string = "grafana-server"
) )
const minGoVersion = 1.3 const minGoVersion = 1.3
@ -71,7 +72,7 @@ func main() {
//verifyGitRepoIsClean() //verifyGitRepoIsClean()
//grunt("release", "--pkgVer="+version) //grunt("release", "--pkgVer="+version)
createPackage("deb", "default") createPackage("deb", "default")
createPackage("rpm", "sysconfig") //createPackage("rpm", "sysconfig")
case "latest": case "latest":
makeLatestDistCopies() makeLatestDistCopies()
@ -110,37 +111,42 @@ func readVersionFromPackageJson() {
} }
func createPackage(packageType string, defaultPath string) { func createPackage(packageType string, defaultPath string) {
installRoot := "/opt/grafana" homeDir := "/usr/share/grafana"
configRoot := "/etc/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") packageRoot, _ := ioutil.TempDir("", "grafana-linux-pack")
packageConfDir := filepath.Join("packaging", packageType) packageConfDir := filepath.Join("packaging", packageType)
afterInstallScript := filepath.Join(packageConfDir, "control/postinst") postintSrc := filepath.Join(packageConfDir, "control/postinst")
initdscript := filepath.Join(packageConfDir, "init.d/grafana") initdScriptSrc := filepath.Join(packageConfDir, "init.d/grafana-server")
defaultScript := filepath.Join(packageConfDir, defaultPath, "grafana") defaultFileSrc := filepath.Join(packageConfDir, defaultPath, "grafana-server")
systemdServiceFile := filepath.Join(packageConfDir, "systemd/grafana.service") systemdFileSrc := filepath.Join(packageConfDir, "systemd/grafana-server.service")
packageInstallRoot := filepath.Join(packageRoot, installRoot) // create directories
configDir := filepath.Join(packageRoot, configRoot) runError("mkdir", "-p", filepath.Join(packageRoot, homeDir))
runError("mkdir", "-p", filepath.Join(packageRoot, configDir))
runError("mkdir", "-p", packageInstallRoot)
runError("mkdir", "-p", configDir)
runError("mkdir", "-p", filepath.Join(packageRoot, "/etc/init.d")) runError("mkdir", "-p", filepath.Join(packageRoot, "/etc/init.d"))
runError("mkdir", "-p", filepath.Join(packageRoot, "/etc/", defaultPath)) 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/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 // copy init.d script
runError("cp", "-p", initdscript, filepath.Join(packageRoot, "/etc/init.d/grafana")) runError("cp", "-p", initdScriptSrc, filepath.Join(packageRoot, initdScriptPath))
// copy environment file // copy environment var file
runError("cp", "-p", defaultScript, filepath.Join(packageRoot, "etc", defaultPath, "grafana")) runError("cp", "-p", defaultFileSrc, filepath.Join(packageRoot, defaultFilePath))
// copy systemd file // 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 // 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 // copy sample ini file to /etc/opt/grafana
configFile := filepath.Join(configDir, "grafana.ini") runError("cp", "conf/sample.ini", filepath.Join(packageRoot, configFilePath))
runError("cp", "conf/sample.ini", configFile)
args := []string{ args := []string{
"-s", "dir", "-s", "dir",
@ -151,8 +157,11 @@ func createPackage(packageType string, defaultPath string) {
"--url", "http://grafana.org", "--url", "http://grafana.org",
"--license", "Apache 2.0", "--license", "Apache 2.0",
"--maintainer", "contact@grafana.org", "--maintainer", "contact@grafana.org",
"--config-files", filepath.Join(configRoot, "grafana.ini"), "--config-files", configFilePath,
"--after-install", afterInstallScript, "--config-files", initdScriptPath,
"--config-files", defaultFilePath,
"--config-files", systemdServiceFilePath,
"--after-install", postintSrc,
"--name", "grafana", "--name", "grafana",
"--version", version, "--version", version,
"-p", "./dist", "-p", "./dist",
@ -209,7 +218,7 @@ func test(pkg string) {
} }
func build(pkg string, tags []string) { func build(pkg string, tags []string) {
binary := "./bin/grafana-server" binary := "./bin/" + serverBinaryName
if goos == "windows" { if goos == "windows" {
binary += ".exe" binary += ".exe"
} }

View File

@ -1,101 +1,131 @@
app_name = Grafana ##################### Grafana Configuration Example #####################
app_mode = production #
# Everything has defaults so you only need to uncomment things you want to
# change
; app_mode = production
#################################### Paths ####################################
[paths] [paths]
; data_path # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is useD)
; 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
data = data data = data
#
# Directory where grafana can store logs
#
logs = data/log logs = data/log
#################################### Server ####################################
[server] [server]
; protocol (http or https) # Protocol (http or https)
protocol = http 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 = http_addr =
; the http port to use
# The http port to use
http_port = 3000 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 domain = localhost
; the full public facing url
# The full public facing url
root_url = %(protocol)s://%(domain)s:%(http_port)s/ root_url = %(protocol)s://%(domain)s:%(http_port)s/
# Log web requests
router_logging = false router_logging = false
; the path relative home path where frontend assets are located
# the path relative working path
static_root_path = public static_root_path = public
; enable gzip
# enable gzip
enable_gzip = false enable_gzip = false
; https certs & key file
# https certs & key file
cert_file = cert_file =
cert_key = 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] [analytics]
# Server reporting, sends usage counters to stats.grafana.org every 24 hours. # Server reporting, sends usage counters to stats.grafana.org every 24 hours.
# No ip addresses are being tracked, only simple counters to track # No ip addresses are being tracked, only simple counters to track
# running instances, dashboard and error counts. It is very helpful to us. # running instances, dashboard and error counts. It is very helpful to us.
# Change this option to false to disable reporting. # Change this option to false to disable reporting.
reporting_enabled = true 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 = google_analytics_ua_id =
[database] #################################### Security ####################################
; 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 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 admin_password = admin
; used for signing # used for signing
secret_key = SW2YcwTIb9zpOOhoPsMm secret_key = SW2YcwTIb9zpOOhoPsMm
; Auto-login remember days # Auto-login remember days
login_remember_days = 7 login_remember_days = 7
cookie_username = grafana_user cookie_username = grafana_user
cookie_remember_name = grafana_remember cookie_remember_name = grafana_remember
#################################### Users ####################################
[users] [users]
; disable user signup / registration # disable user signup / registration
allow_sign_up = true allow_sign_up = true
; Allow non admin users to create organizations # Allow non admin users to create organizations
allow_org_create = true allow_org_create = true
# Set to true to automatically assign new users to the default organization (id 1) # Set to true to automatically assign new users to the default organization (id 1)
auto_assign_org = true 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 auto_assign_org_role = Viewer
#################################### Anonymous Auth ##########################
[auth.anonymous] [auth.anonymous]
; enable anonymous access # enable anonymous access
enabled = false 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. org_name = Main Org.
; specify role for unauthenticated users # specify role for unauthenticated users
org_role = Viewer org_role = Viewer
#################################### Github Auth ##########################
[auth.github] [auth.github]
enabled = false enabled = false
client_id = some_id client_id = some_id
@ -103,9 +133,10 @@ client_secret = some_secret
scopes = user:email scopes = user:email
auth_url = https://github.com/login/oauth/authorize auth_url = https://github.com/login/oauth/authorize
token_url = https://github.com/login/oauth/access_token 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 ; allowed_domains = mycompany.com othercompany.com
#################################### Google Auth ##########################
[auth.google] [auth.google]
enabled = false enabled = false
client_id = some_client_id 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 scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
auth_url = https://accounts.google.com/o/oauth2/auth auth_url = https://accounts.google.com/o/oauth2/auth
token_url = https://accounts.google.com/o/oauth2/token 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 ; allowed_domains = mycompany.com othercompany.com
#################################### Logging ##########################
[log] [log]
; Either "console", "file", default is "console" # Either "console", "file", default is "console"
; Use comma to separate multiple modes, e.g. "console, file" # Use comma to separate multiple modes, e.g. "console, file"
mode = 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 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 level = Info
; For "console" mode only # For "console" mode only
[log.console] [log.console]
level = level =
; For "file" mode only # For "file" mode only
[log.file] [log.file]
level = level =
; This enables automated log rotate(switch of following options), default is true ; 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 ; Expired days of log file(delete after max days), default is 7
max_days = 7 max_days = 7
#################################### AMPQ Event Publisher ##########################
[event_publisher] [event_publisher]
enabled = false enabled = false
rabbitmq_url = amqp://localhost/ rabbitmq_url = amqp://localhost/

View File

@ -1,107 +1,38 @@
##################### Grafana Configuration Example #####################
# Sample grafana config for deb & rpm packages # Sample grafana config for deb & rpm packages
# You only need to specify overrides here # 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) #################################### Paths ####################################
; this option is passed via command line args, override this option in /etc/default/grafana [paths]
; defaults to /opt/grafana/data # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is useD)
data_path = #
;data = /var/lib/grafana
#
# Directory where grafana can store logs
#
;logs = /var/log/grafana
[server] [server]
; protocol (http or https) ; protocol (http or https)
protocol = http ;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 = ;http_addr =
; the http port to use ; the http port to use
http_port = 3000 ;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 ;domain = localhost
; the full public facing url ; the full public facing url
root_url = %(protocol)s://%(domain)s:%(http_port)s/ ;root_url = %(protocol)s://%(domain)s:%(http_port)s/
router_logging = false ;router_logging = false
; the path relative to grafana process working directory ; the path relative home path where frontend assets are located
static_root_path = public ;static_root_path = public
enable_gzip = false ; enable gzip
;enable_gzip = false
; https certs & key file ; https certs & key file
cert_file = ;cert_file =
cert_key = ;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 =

View File

@ -30,12 +30,12 @@ case "$1" in
"$GRAFANA_USER" "$GRAFANA_USER"
fi fi
# Set user permissions on /var/log/grafana, /opt/grafana/data # Set user permissions on /var/log/grafana, /var/lib/grafana
mkdir -p /var/log/grafana /opt/grafana/data mkdir -p /var/log/grafana /var/lib/grafana
chown -R $GRAFANA_USER:$GRAFANA_GROUP /var/log/grafana /opt/grafana/data chown -R $GRAFANA_USER:$GRAFANA_GROUP /var/log/grafana /var/lib/grafana
chmod 755 /var/log/grafana /opt/grafana/data 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/* chown -Rh root:root /etc/grafana/*
chmod 755 /etc/grafana chmod 755 /etc/grafana
find /etc/grafana -type f -exec chmod 644 {} ';' find /etc/grafana -type f -exec chmod 644 {} ';'

View File

@ -1,14 +1,17 @@
GRAFANA_USER=grafana GRAFANA_USER=grafana
GRAFANA_GROUP=grafana GRAFANA_GROUP=grafana
GRAFANA_HOME=/usr/share/grafana
LOG_DIR=/var/log/grafana LOG_DIR=/var/log/grafana
GRAFANA_HOME=/opt/grafana
DATA_DIR=/opt/grafana/data DATA_DIR=/var/lib/grafana
WORK_DIR=/opt/grafana
MAX_OPEN_FILES=10000 MAX_OPEN_FILES=10000
CONF_DIR=/etc/grafana CONF_DIR=/etc/grafana
CONF_FILE=/etc/grafana/grafana.ini CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true RESTART_ON_UPGRADE=true

View File

@ -20,9 +20,9 @@
# 3. Centos with initscripts package installed # 3. Centos with initscripts package installed
PATH=/bin:/usr/bin:/sbin:/usr/sbin PATH=/bin:/usr/bin:/sbin:/usr/sbin
NAME=grafana NAME=grafana-server
DESC="Grafana Server" DESC="Grafana Server"
DEFAULT=/etc/default/$NAME DEFAULT=/etc/default/grafana-server
if [ `id -u` -ne 0 ]; then if [ `id -u` -ne 0 ]; then
echo "You need root privileges to run this script" echo "You need root privileges to run this script"
@ -37,11 +37,11 @@ fi
GRAFANA_USER=grafana GRAFANA_USER=grafana
GRAFANA_GROUP=grafana GRAFANA_GROUP=grafana
GRAFANA_HOME=/opt/$NAME GRAFANA_HOME=/usr/share/grafana
CONF_DIR=/etc/$NAME CONF_DIR=/etc/grafana
WORK_DIR=$GRAFANA_HOME WORK_DIR=$GRAFANA_HOME
DATA_DIR=$GRAFANA_HOME/data DATA_DIR=/var/lib/grafana
LOG_DIR=/var/log/$NAME LOG_DIR=/var/log/grafana
CONF_FILE=$CONF_DIR/grafana.ini CONF_FILE=$CONF_DIR/grafana.ini
MAX_OPEN_FILES=10000 MAX_OPEN_FILES=10000
@ -51,8 +51,8 @@ if [ -f "$DEFAULT" ]; then
fi fi
PID_FILE=/var/run/$NAME.pid PID_FILE=/var/run/$NAME.pid
DAEMON=$GRAFANA_HOME/bin/grafana DAEMON=/usr/bin/grafana-server
DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} --default-data-path=${DATA_DIR} --default-log-path=${LOG_DIR} web" DAEMON_OPTS="--pidfile=${PID_FILE} --config=${CONF_FILE} cfg:default.paths.data=${DATA_DIR} cfg:default.paths.logs=${LOG_DIR}"
# Check DAEMON exists # Check DAEMON exists
test -x $DAEMON || exit 0 test -x $DAEMON || exit 0

View File

@ -9,10 +9,10 @@ EnvironmentFile=/etc/default/grafana
User=grafana User=grafana
Group=grafana Group=grafana
Type=simple Type=simple
ExecStart=/opt/grafana/bin/grafana \ ExecStart=/usr/bin/grafana-server \
--config=$CONF_FILE \ --config=${CONF_FILE} \
--default-log-path=$LOG_DIR \ cfg:default.paths.data=${LOG_DIR} \
--default-path-data=$DATA_DIR \ cfg:default.paths.data=${DATA_DIR} \
LimitNOFILE=10000 LimitNOFILE=10000
TimeoutStopSec=20 TimeoutStopSec=20