From 3f826ef752d35002f3eb412bcab070484a9ffdc9 Mon Sep 17 00:00:00 2001 From: anima Date: Sun, 2 Feb 2025 12:40:13 +0100 Subject: [PATCH] inital version --- compose.yml | 207 +++++++++++++++++++++++ env.sample | 62 +++++++ grafana/default.dashboard.yml | 7 + grafana/default.source.yml | 15 ++ grafana/icinga2-default.json | 308 ++++++++++++++++++++++++++++++++++ 5 files changed, 599 insertions(+) create mode 100644 compose.yml create mode 100644 env.sample create mode 100644 grafana/default.dashboard.yml create mode 100644 grafana/default.source.yml create mode 100644 grafana/icinga2-default.json diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..544c1a4 --- /dev/null +++ b/compose.yml @@ -0,0 +1,207 @@ +services: +##### ICINGAWEB2 ##### + icingaweb2: + image: git.ao-it.net/docker/icingaweb2:latest + hostname: icingaweb2 + depends_on: + - db_icingaweb + restart: always + volumes: + - ./files/icingaweb2:/data + ports: + - 8080:8080 + networks: + - icinga + environment: + ## icingaweb2 general + - ICINGAWEB2_DB_RESOURCE_NAME=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db} + - ICINGAWEB2_DEFAULT_ADMIN_USER=${ICINGAWEB_DEFAULT_ADMIN_USER:-icingaadmin} + - ICINGAWEB2_DEFAULT_ADMIN_PASS=${ICINGAWEB_DEFAULT_ADMIN_PASS:-icingaadmin} + ## icingaweb2: conf.ini + - ICINGAWEB2_CONF__logging__log=php + - ICINGAWEB2_CONF__logging__level=ERROR + - ICINGAWEB2_CONF__logging__application=icingaweb2 + - ICINGAWEB2_CONF__global__config_backend=db + - ICINGAWEB2_CONF__global__config_resource=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db} + ## icingaweb2: resources.ini + ### user & resource db for icingaweb2 + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__type=db + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__db=mysql + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__host=${ICINGAWEB_DB_HOST:-db_icingaweb} + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__dbname=${ICINGAWEB_DB:-icingaweb} + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__username=${ICINGAWEB_DB_USER:-icingaweb} + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__password=${ICINGAWEB_DB_PASS:-icingaweb} + - ICINGAWEB2_RESOURCES__${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}__charset=utf8mb4 + ### module: icingadb db resource + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__type=db + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__db=mysql + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__host=${ICINGA_DB_HOST:-db_icinga} + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__dbname=${ICINGA_DB:-icingadb} + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__username=${ICINGA_DB_USER:-icingadb} + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__password=${ICINGA_DB_PASS:-icingadb} + - ICINGAWEB2_RESOURCES__${ICINGAWDB_RESOURCE_NAME:-icingadb}__charset=utf8mb4 + ## icingaweb2: authencitation.ini + - ICINGAWEB2_AUTH__icingaweb2__backend=db + - ICINGAWEB2_AUTH__icingaweb2__resource=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db} + ## icingaweb2: groups.ini + - ICINGAWEB2_GROUPS__icingaweb2__backend=db + - ICINGAWEB2_GROUPS__icingaweb2__resource=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db} + ## icingaweb2: roles.ini + - ICINGAWEB2_ROLES__${ICINGAWEB_DEFAULT_ADMIN_ROLE:-Administrators}__groups=${ICINGAWEB_DEFAULT_ADMIN_ROLE:-Administrators} + - ICINGAWEB2_ROLES__${ICINGAWEB_DEFAULT_ADMIN_ROLE:-Administrators}__permissions="*" + - ICINGAWEB2_ROLES__${ICINGAWEB_DEFAULT_ADMIN_ROLE:-Administrators}__users=${ICINGAWEB_DEFAULT_ADMIN_USER:-icingaadmin} + ## module: icingadb + ### icingadb: conf.ini + - ICINGAWEB2_ICINGADB_CONF__icingadb__resource=icingadb + ### icingadb: redis.ini + - ICINGAWEB2_ICINGADB_REDIS__redis1__host=${ICINGADB_REDIS_HOST:-db_redis} + - ICINGAWEB2_ICINGADB_REDIS__redis1__port=${ICINGADB_REDIS_PORT:-6379} + ### icingadb: commandtransports.ini + - ICINGAWEB2_ICINGADB_CMD__icinga2__transport=${ICINGADB_CMD_TYPE:-api} + - ICINGAWEB2_ICINGADB_CMD__icinga2__host=${ICINGA_API_HOST:-icinga2} + - ICINGAWEB2_ICINGADB_CMD__icinga2__port=${ICINGA_API_PORT:-5665} + - ICINGAWEB2_ICINGADB_CMD__icinga2__username=${ICINGA_API_ICINGAWEB_USER:-icingaweb} + - ICINGAWEB2_ICINGADB_CMD__icinga2__password=${ICINGA_API_ICINGAWEB_PASS:-icingaweb} + ## module: grafana + ### grafana: conf.ini + - ICINGAWEB2_GRAFANA_CONF__grafana__host=${GRAFANA_HOST:-grafana}:${GRAFANA_PORT:-3000} + - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboard=${GRAFANA_DASHBOARD_NAME:-icinga2-default} + - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboarduid=${GRAFANA_DASHBOARD_UID:-icinga2-default} + - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboardpanelid=1 + - ICINGAWEB2_GRAFANA_CONF__grafana__defaultorgid=1 + - ICINGAWEB2_GRAFANA_CONF__grafana__timerange=12h + - ICINGAWEB2_GRAFANA_CONF__grafana__shadows="1" + - ICINGAWEB2_GRAFANA_CONF__grafana__accessmode=iframe + + db_icingaweb: + image: mariadb:latest + hostname: ${ICINGAWEB_DB_HOST:-db_icingaweb} + restart: always + volumes: + - ./files/dbs/icingaweb:/var/lib/mysql + networks: + - icinga + environment: + MARIADB_RANDOM_ROOT_PASSWORD: yes + MARIADB_DATABASE: ${ICINGAWEB_DB:-icingaweb} + MARIADB_USER: ${ICINGAWEB_DB_USER:-icingaweb} + MARIADB_PASSWORD: ${ICINGAWEB_DB_PASS:-icingaweb} + + grafana: + image: grafana/grafana:latest + hostname: grafana + depends_on: + - icingaweb2 + restart: always + #user: '0' + ports: + - ${GRAFANA_PORT:-3000}:3000 + networks: + - icinga + volumes: + - ./grafana/default.source.yml:/etc/grafana/provisioning/datasources/default.yml + - ./grafana/default.dashboard.yml:/etc/grafana/provisioning/dashboards/default.yml + - ./grafana/icinga2-default.json:/var/lib/grafana/dashboards/${GRAFANA_DASHBOARD_FILE:-icinga2-default.json} + environment: + ## required configs + GF_AUTH_ANONYMOUS_ENABLED: true + GF_SECURITY_ALLOW_EMBEDDING: true + GF_AUTH_ANONYMOUS_ORG_ROLE: Viewer + GF_AUTH_ANONYMOUS_HIDE_VERSION: true + ## user settings + GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-grafanaadmin} + GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASS:-grafanaadmin} + ## default data source + GRAFANA_DEFAULT_SOURCE_NAME: ${ICINGA_INFLUX_HOST:-db_influxdb} + GRAFANA_DEFAULT_SOURCE_UID: ${ICINGA_INFLUX_HOST:-db_influxdb} + GRAFANA_DEFAULT_SOURCE_DB: ${ICINGA_INFLUX_DB:-icinga} + GRAFANA_DEFAULT_SOURCE_HOST: ${ICINGA_INFLUX_HOST:-db_influxdb} + GRAFANA_DEFAULT_SOURCE_PORT: ${ICINGA_INFLUX_PORT:-8086} + GRAFANA_DEFAULT_SOURCE_USER: ${ICINGA_INFLUX_USER:-icinga} + GRAFANA_DEFAULT_SOURCE_PASS: ${ICINGA_INFLUX_PASS:-icinga} + ## default dashboard + GRAFANA_DEFAULT_DASHBOARD_NAME: ${GRAFANA_DASHBOARD_NAME:-icinga2-default} + GRAFANA_DEFAULT_DASHBOARD_FILE: ${GRAFANA_DASHBOARD_FILE:-icinga2-default.json} + +##### ICINGA2 ##### + db_icinga: + image: mariadb + hostname: ${ICINGA_DB_HOST:-db_icinga} + restart: always + volumes: + - ./files/dbs/icinga:/var/lib/mysql + networks: + - icinga + environment: + MARIADB_RANDOM_ROOT_PASSWORD: yes + MARIADB_DATABASE: ${ICINGA_DB:-icingadb} + MARIADB_USER: ${ICINGA_DB_USER:-icingadb} + MARIADB_PASSWORD: ${ICINGA_DB_PASS:-icingadb} + + db_redis: + image: redis + hostname: ${ICINGADB_REDIS_HOST:-db_redis} + restart: always + networks: + - icinga + + # sync handler between icingadb (db_icinga) and redis (db_redis) + icingadb: + image: icinga/icingadb + depends_on: + - db_redis + - db_icinga + restart: always + networks: + - icinga + environment: + - ICINGADB_REDIS_HOST=${ICINGADB_REDIS_HOST:-db_redis} + - ICINGADB_REDIS_PORT=${ICINGADB_REDIS_PORT:-6379} + - ICINGADB_DATABASE_HOST=${ICINGA_DB_HOST:-db_icinga} + - ICINGADB_DATABASE_PORT=${ICINGA_DB_PORT:-3306} + - ICINGADB_DATABASE_DATABASE=${ICINGA_DB:-icingadb} + - ICINGADB_DATABASE_USER=${ICINGA_DB_USER:-icingadb} + - ICINGADB_DATABASE_PASSWORD=${ICINGA_DB_PASS:-icingadb} + + db_influxdb: + image: influxdb:1.8 + hostname: ${ICINGA_INFLUX_HOST:-db_influxdb} + restart: always + networks: + - icinga + volumes: + - ./files/dbs/influx:/vol01/Docker/monitoring + environment: + - INFLUXDB_DB=${ICINGA_INFLUX_DB:-icinga} + - INFLUXDB_USER=${ICINGA_INFLUX_USER:-icinga} + - INFLUXDB_ADMIN_ENABLED=true + - INFLUXDB_ADMIN_USER=${INFLUX_ADMIN_USER:-icinga} + - INFLUXDB_ADMIN_PASSWORD=${INFLUX_ADMIN_PASS:-icinga} + + icinga2: + image: git.ao-it.net/docker/icinga2:latest + hostname: ${ICINGA_API_HOST:-icinga2} + depends_on: + - db_redis + restart: always + volumes: + - ./files/icinga2:/data + ports: + - 5665:5665 # only need if you plan to use api from other sources as icingaweb2 + networks: + - icinga + #- backend + environment: + # REMOVE VARS HERE IF YOU EDIT THE CONFIG DIRECTLY!! + # The variables are primarily for the initial setup, later editing is recommended directly in the icinga config. + # Empty or non-existent vars do not change anything + ICINGA2_API_USER_ROOT_PASS: ${API_ROOT_PASS:-changeME!} # only on fist init! set api user root password + ICINGA2_API_USER_ICINGAWEB_PASS: ${ICINGA_API_ICINGAWEB_PASS:-icingaweb} # only on first init! create api user icingaweb and set password + ICINGA2_ICINGADB_REDIS_HOST: ${ICINGADB_REDIS_HOST:-db_redis} + ICINGA2_ICINGADB_REDIS_PORT: ${ICINGADB_REDIS_PORT:-6379} + ICINGA2_INFLUXDB_HOST: ${ICINGA_INFLUX_HOST:-db_influxdb} + ICINGA2_INFLUXDB_PORT: ${ICINGA_INFLUX_PORT:-8086} + ICINGA2_INFLUXDB_DB: ${ICINGA_INFLUX_DB:-icinga} + +networks: + icinga: \ No newline at end of file diff --git a/env.sample b/env.sample new file mode 100644 index 0000000..0ec8289 --- /dev/null +++ b/env.sample @@ -0,0 +1,62 @@ +# icinga environment + +### icinga +API_ROOT_PASS=changeME! + +### icingaweb db connection +ICINGAWEB_DB_RESOURCE_NAME=icingaweb_db +ICINGAWEB_DB=icingaweb +ICINGAWEB_DB_HOST=db_icingaweb +ICINGAWEB_DB_USER=icingaweb +ICINGAWEB_DB_PASS=icingaweb + +### icingaweb inital login +ICINGAWEB_DEFAULT_ADMIN_ROLE=Administrators +ICINGAWEB_DEFAULT_ADMIN_USER=icingaadmin +ICINGAWEB_DEFAULT_ADMIN_PASS=icingaadmin + +### influxdb admin +INFLUX_ADMIN_USER=icinga +INFLUX_ADMIN_PASS=icinga + +### icingadb SQL connection +ICINGAWDB_RESOURCE_NAME=icingadb +ICINGA_DB=icingadb +ICINGA_DB_HOST=db_icinga +ICINGA_DB_PORT=3306 +ICINGA_DB_USER=icingadb +ICINGA_DB_PASS=icingadb + +### icingadb redis connection +ICINGADB_REDIS_HOST=redis +ICINGADB_REDIS_PORT=6379 + +### icingadb command transport +ICINGADB_CMD_TYPE=api +ICINGA_API_HOST=icinga2 +ICINGA_API_PORT=5665 +ICINGA_API_ICINGAWEB_USER=icingaweb +ICINGA_API_ICINGAWEB_PASS=icingaweb + +## grafana settings +### host settings +#> GRAFANA_HOST must be change else you dont have graphs +#> GRAFANA_HOST must be a network address what your client can reach +GRAFANA_HOST='' # to get ip: $(hostname -I | awk '{print $1}') # sets first ip of system, can be wrong! +GRAFANA_PORT=3000 + +### user settings +GRAFANA_ADMIN_USER=grafanaadmin +GRAFANA_ADMIN_PASS=grafanaadmin + +### default dashboard +GRAFANA_DASHBOARD_NAME=icinga2-default +GRAFANA_DASHBOARD_UID=icinga2-default # must be change in icinga2-default.json too +GRAFANA_DASHBOARD_FILE=icinga2-default.json + +### default data source +ICINGA_INFLUX_HOST=db_influxdb # must be change in icinga2-default.json too +ICINGA_INFLUX_PORT=8086 +ICINGA_INFLUX_USER=icinga +ICINGA_INFLUX_DB=icinga +ICINGA_INFLUX_PASS=icinga \ No newline at end of file diff --git a/grafana/default.dashboard.yml b/grafana/default.dashboard.yml new file mode 100644 index 0000000..12a9cf6 --- /dev/null +++ b/grafana/default.dashboard.yml @@ -0,0 +1,7 @@ +apiVersion: 1 + +providers: + - name: $GRAFANA_DEFAULT_DASHBOARD_NAME + type: file + options: + path: /var/lib/grafana/dashboards/$GRAFANA_DEFAULT_DASHBOARD_FILE \ No newline at end of file diff --git a/grafana/default.source.yml b/grafana/default.source.yml new file mode 100644 index 0000000..270b5f6 --- /dev/null +++ b/grafana/default.source.yml @@ -0,0 +1,15 @@ +apiVersion: 1 + +datasources: + - name: $GRAFANA_DEFAULT_SOURCE_NAME + type: influxdb + uid: $GRAFANA_DEFAULT_SOURCE_UID + access: proxy + user: $GRAFANA_DEFAULT_SOURCE_USER + url: http://$GRAFANA_DEFAULT_SOURCE_HOST:$GRAFANA_DEFAULT_SOURCE_PORT + isDefault: true + jsonData: + dbName: $GRAFANA_DEFAULT_SOURCE_DB + httpMode: GET + secureJsonData: + password: $GRAFANA_DEFAULT_SOURCE_PASS \ No newline at end of file diff --git a/grafana/icinga2-default.json b/grafana/icinga2-default.json new file mode 100644 index 0000000..70f3edb --- /dev/null +++ b/grafana/icinga2-default.json @@ -0,0 +1,308 @@ +{ + "__inputs": [ + { + "name": "DS_ICINGA2", + "label": "Icinga2", + "value": "db_influxdb", + "description": "", + "type": "datasource", + "pluginId": "influxdb", + "pluginName": "InfluxDB" + }, + { + "name": "VAR_HOSTNAME", + "type": "constant", + "label": "hostname", + "value": "null", + "description": "" + }, + { + "name": "VAR_SERVICE", + "type": "constant", + "label": "service", + "value": "null", + "description": "" + }, + { + "name": "VAR_COMMAND", + "type": "constant", + "label": "command", + "value": "null", + "description": "" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "4.6.3" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "influxdb", + "name": "InfluxDB", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Show all metrics from a Icinga2 service or host", + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "id": null, + "links": [], + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "db_influxdb", + "fill": 1, + "id": 1, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 1, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_metric", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "metric" + ], + "type": "tag" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$command$/", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "hostname", + "operator": "=~", + "value": "/^$hostname$/" + }, + { + "condition": "AND", + "key": "service", + "operator": "=~", + "value": "/^$service$/" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$service", + "tooltip": { + "shared": true, + "sort": 1, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Default", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "Icinga2", + "influxdb" + ], + "templating": { + "list": [ + { + "current": { + "value": "${VAR_HOSTNAME}", + "text": "${VAR_HOSTNAME}" + }, + "hide": 2, + "label": null, + "name": "hostname", + "options": [ + { + "value": "${VAR_HOSTNAME}", + "text": "${VAR_HOSTNAME}" + } + ], + "query": "${VAR_HOSTNAME}", + "type": "custom" + }, + { + "current": { + "value": "${VAR_SERVICE}", + "text": "${VAR_SERVICE}" + }, + "hide": 2, + "label": null, + "name": "service", + "options": [ + { + "value": "${VAR_SERVICE}", + "text": "${VAR_SERVICE}" + } + ], + "query": "${VAR_SERVICE}", + "type": "custom" + }, + { + "current": { + "value": "${VAR_COMMAND}", + "text": "${VAR_COMMAND}" + }, + "hide": 2, + "label": null, + "name": "command", + "options": [ + { + "value": "${VAR_COMMAND}", + "text": "${VAR_COMMAND}" + } + ], + "query": "${VAR_COMMAND}", + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "icinga2-default", + "uid": "icinga2-default", + "version": 3 +} \ No newline at end of file