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"
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"
}

View File

@ -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/

View File

@ -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 =

View File

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

View File

@ -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

View File

@ -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

View File

@ -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