commit 6c8bbaf8acdd4b72258948bd797b0d20153cecb5 Author: fzirker Date: Sat Jan 9 20:40:51 2021 +0100 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ec07101 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +indent_style = space +indent_size = 3 +tab_width = 3 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 120 + +[*.{yml,yaml}] +indent_size = 2 +tab_width = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8682eff --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +**/.vscode/* \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b8d2095 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Florian Zirker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a8572b1 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# homeserver + diff --git a/heimdall/docker-compose.yaml b/heimdall/docker-compose.yaml new file mode 100644 index 0000000..daf24f5 --- /dev/null +++ b/heimdall/docker-compose.yaml @@ -0,0 +1,27 @@ +version: "3.3" + +services: + + app: + image: linuxserver/heimdall:version-2.2.2 + environment: + - PUID=1000 + - PGID=1000 + - TZ=Europe/Berlin + volumes: + - ${VOLUMES_PATH}/heimdall:/config + expose: + - "80" + networks: + - web + labels: + - "traefik.enable=true" + - "traefik.http.routers.heimdall.rule=Host(`heimdall.${DOMAIN}`)" + - "traefik.http.routers.heimdall.entrypoints=web" + - "traefik.http.services.heimdall.loadbalancer.server.port=80" + - "docker.group=selfhost" + restart: unless-stopped + +networks: + web: + external: true diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml new file mode 100644 index 0000000..4ad1e13 --- /dev/null +++ b/monitoring/docker-compose.yml @@ -0,0 +1,100 @@ +version: "3.3" +services: + + grafana: + image: grafana/grafana + restart: unless-stopped + expose: + - "3000" + networks: + - web + - monitoring + labels: + - "traefik.enable=true" + - "traefik.http.routers.monitoring.rule=Host(`monitoring.${DOMAIN}`)" + - "traefik.http.routers.monitoring.entrypoints=web" + - "traefik.http.services.monitoring.loadbalancer.server.port=3000" + - "traefik.docker.network=web" + - "docker.group=monitoring" + restart: unless-stopped + environment: + - GF_DEFAULT_INSTANCE_NAME=monitoring.${DOMAIN} + - GF_SERVER_ROOT_URL=http://monitoring.${DOMAIN} + - GF_SERVER_DOMAIN=monitoring.${DOMAIN} + - GF_SERVER_SERVE_FROM_SUB_PATH=true + - GF_SECURITY_DISABLE_GRAVATAR=true + - GF_AUTH_ANONYMOUS_ENABLED=true + - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer + - GF_DATABASE_TYPE=postgres + - GF_DATABASE_HOST=grafanadb:5432 + - GF_DATABASE_SSL_MODE=disable + - GF_DATABASE_NAME=grafana + - GF_DATABASE_USER=${POSTGRES_USER} + - GF_DATABASE_PASSWORD=${POSTGRES_PASSWORD} + - GF_INSTALL_PLUGINS=flant-statusmap-panel + depends_on: + - influxdb + - grafanadb + + + grafanadb: + image: postgres + volumes: + - ${VOLUMES_PATH}/grafanadb:/var/lib/postgresql/data + networks: + - monitoring + restart: unless-stopped + environment: + - POSTGRES_DB=grafana + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + labels: + - "docker.group=monitoring" + + + # influxdb to store time based data. Adress is drax.fzirker.lan:8086 + influxdb: + image: influxdb + restart: unless-stopped + ports: + - 8086:8086 + networks: + - web + - monitoring + environment: + - INFLUXDB_MONITOR_STORE_ENABLED=false + volumes: + - ${VOLUMES_PATH}/influxdb/:/var/lib/influxdb + - ${PWD}/influxdb.conf:/etc/influxdb/influxdb.conf:ro + labels: + - "docker.group=monitoring" + + + ################################################################## + # here starts data collection + + telegraf: + image: telegraf + restart: unless-stopped + environment: + - HOST_MOUNT_PREFIX=/hostfs + - HOST_PROC=/hostfs/proc + - HOST_SYS=/hostfs/sys + - HOST_ETC=/hostfs/etc + - HOST_VAR=/hostfs/var + - HOST_RUN=/hostfs/run + volumes: + - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/run/utmp:/var/run/utmp:ro + - /:/hostfs:ro + network_mode: "host" + labels: + - "docker.group=monitoring" + depends_on: + - influxdb + +networks: + monitoring: + web: + external: true diff --git a/monitoring/influxdb.conf b/monitoring/influxdb.conf new file mode 100644 index 0000000..9244c34 --- /dev/null +++ b/monitoring/influxdb.conf @@ -0,0 +1,12 @@ +[meta] + dir = "/var/lib/influxdb/meta" + +[data] + dir = "/var/lib/influxdb/data" + wal-dir = "/var/lib/influxdb/wal" + max-concurrent-compactions = 1 + +[monitor] + store-enabled = false + store-database = "_internal" + store-interval = "10s" diff --git a/monitoring/start-influxdb-shell.sh b/monitoring/start-influxdb-shell.sh new file mode 100644 index 0000000..df97df4 --- /dev/null +++ b/monitoring/start-influxdb-shell.sh @@ -0,0 +1 @@ +docker run --rm --link=monitoring_influxdb_1 -it --net monitoring_monitoring influxdb influx -host influxdb diff --git a/monitoring/telegraf/telegraf.conf b/monitoring/telegraf/telegraf.conf new file mode 100644 index 0000000..b969ba6 --- /dev/null +++ b/monitoring/telegraf/telegraf.conf @@ -0,0 +1,557 @@ +# Telegraf Configuration +# +# Telegraf is entirely plugin driven. All metrics are gathered from the +# declared inputs, and sent to the declared outputs. +# +# Plugins must be declared in here to be active. +# To deactivate a plugin, comment out the name and any variables. +# +# Use 'telegraf -config telegraf.conf -test' to see what metrics a config +# file would generate. +# +# Environment variables can be used anywhere in this config file, simply surround +# them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), +# for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR}) + +# Config Sample under https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf + +# Global tags can be specified here in key="value" format. +[global_tags] + # datacenter + dc="fzirker.lan" + +# Configuration for telegraf agent +[agent] + ## Default data collection interval for all inputs + interval = "10s" + ## Rounds collection interval to 'interval' + ## ie, if interval="10s" then always collect on :00, :10, :20, etc. + round_interval = true + + ## Telegraf will send metrics to outputs in batches of at most + ## metric_batch_size metrics. + ## This controls the size of writes that Telegraf sends to output plugins. + metric_batch_size = 1000 + + ## Maximum number of unwritten metrics per output. Increasing this value + ## allows for longer periods of output downtime without dropping metrics at the + ## cost of higher maximum memory usage. + metric_buffer_limit = 10000 + + ## Collection jitter is used to jitter the collection by a random amount. + ## Each plugin will sleep for a random time within jitter before collecting. + ## This can be used to avoid many plugins querying things like sysfs at the + ## same time, which can have a measurable effect on the system. + collection_jitter = "0s" + + ## Default flushing interval for all outputs. Maximum flush_interval will be + ## flush_interval + flush_jitter + flush_interval = "10s" + ## Jitter the flush interval by a random amount. This is primarily to avoid + ## large write spikes for users running a large number of telegraf instances. + ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s + flush_jitter = "0s" + + ## By default or when set to "0s", precision will be set to the same + ## timestamp order as the collection interval, with the maximum being 1s. + ## ie, when interval = "10s", precision will be "1s" + ## when interval = "250ms", precision will be "1ms" + ## Precision will NOT be used for service inputs. It is up to each individual + ## service input to set the timestamp at the appropriate precision. + ## Valid time units are "ns", "us" (or "µs"), "ms", "s". + precision = "" + + ## Override default hostname, if empty use os.Hostname() + hostname = "" + ## If set to true, do no set the "host" tag in the telegraf agent. + omit_hostname = false + + +############################################################################### +# OUTPUT PLUGINS # +############################################################################### + +# Configuration for sending metrics to InfluxDB +[[outputs.influxdb]] + ## The full HTTP or UDP URL for your InfluxDB instance. + ## + ## Multiple URLs can be specified for a single cluster, only ONE of the + ## urls will be written to each interval. + # urls = ["unix:///var/run/influxdb.sock"] + # urls = ["udp://127.0.0.1:8089"] + # urls = ["http://127.0.0.1:8086"] + urls = ["http://drax.fzirker.lan:8086"] # required + + +############################################################################### +# INPUT PLUGINS # +############################################################################### + + +# Read metrics about cpu usage +[[inputs.cpu]] + ## Whether to report per-cpu stats or not + percpu = true + ## Whether to report total system cpu stats or not + totalcpu = true + ## If true, collect raw CPU time metrics. + collect_cpu_time = false + ## If true, compute and report the sum of all non-idle CPU states. + report_active = false + + +# Read metrics about disk usage by mount point +[[inputs.disk]] + ## By default stats will be gathered for all mount points. + ## Set mount_points will restrict the stats to only the specified mount points. + mount_points = ["/hostfs", "/hostfs/mnt/sdcard"] + + ## Ignore mount points by filesystem type. + ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] + +[[inputs.disk]] + # Festplatte lange schlafen lassen :) + interval = "12h" + mount_points = ["/hostfs/mnt/wdhdd"] + + +# Read metrics about disk IO by device +[[inputs.diskio]] + ## By default, telegraf will gather stats for all devices including + ## disk partitions. + ## Setting devices will restrict the stats to the specified devices. + # devices = ["sda", "sdb", "vd*"] + ## Uncomment the following line if you need disk serial numbers. + # skip_serial_number = false + # + ## On systems which support it, device metadata can be added in the form of + ## tags. + ## Currently only Linux is supported via udev properties. You can view + ## available properties for a device by running: + ## 'udevadm info -q property -n /dev/sda' + ## Note: Most, but not all, udev properties can be accessed this way. Properties + ## that are currently inaccessible include DEVTYPE, DEVNAME, and DEVPATH. + # device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"] + # + ## Using the same metadata source as device_tags, you can also customize the + ## name of the device via templates. + ## The 'name_templates' parameter is a list of templates to try and apply to + ## the device. The template may contain variables in the form of '$PROPERTY' or + ## '${PROPERTY}'. The first template which does not contain any variables not + ## present for the device is used as the device name tag. + ## The typical use case is for LVM volumes, to get the VG/LV name instead of + ## the near-meaningless DM-0 name. + # name_templates = ["$ID_FS_LABEL","$DM_VG_NAME/$DM_LV_NAME"] + + +# Get kernel statistics from /proc/stat +[[inputs.kernel]] + # no configuration + + +# Read metrics about memory usage +[[inputs.mem]] + # no configuration + + +# Get the number of processes and group them by status +[[inputs.processes]] + # no configuration + + +# Read metrics about swap memory usage +[[inputs.swap]] + # no configuration + + +# Read metrics about system load & uptime +[[inputs.system]] + ## Uncomment to remove deprecated metrics. + # fielddrop = ["uptime_format"] + + + +# Read metrics about docker containers +[[inputs.docker]] + ## Docker Endpoint + ## To use TCP, set endpoint = "tcp://[ip]:[port]" + ## To use environment variables (ie, docker-machine), set endpoint = "ENV" + endpoint = "unix:///var/run/docker.sock" + + ## Set to true to collect Swarm metrics(desired_replicas, running_replicas) + gather_services = false + + ## Only collect metrics for these containers, collect all if empty + container_names = [] + + ## Set the source tag for the metrics to the container ID hostname, eg first 12 chars + source_tag = false + + ## Containers to include and exclude. Globs accepted. + ## Note that an empty array for both will include all containers + container_name_include = [] + container_name_exclude = [] + + ## Container states to include and exclude. Globs accepted. + ## When empty only containers in the "running" state will be captured. + ## example: container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] + ## example: container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] + # container_state_include = [] + # container_state_exclude = [] + + ## Timeout for docker list, info, and stats commands + timeout = "5s" + + ## Whether to report for each container per-device blkio (8:0, 8:1...) and + ## network (eth0, eth1, ...) stats or not + perdevice = true + + ## Whether to report for each container total blkio and network stats or not + total = false + + ## Which environment variables should we use as a tag + ##tag_env = ["JAVA_HOME", "HEAP_SIZE"] + + ## docker labels to include and exclude as tags. Globs accepted. + ## Note that an empty array for both will include all labels as tags + docker_label_include = [] + docker_label_exclude = [] + + ## Optional TLS Config + # tls_ca = "/etc/telegraf/ca.pem" + # tls_cert = "/etc/telegraf/cert.pem" + # tls_key = "/etc/telegraf/key.pem" + ## Use TLS but skip chain & host verification + # insecure_skip_verify = false + + +# # Monitor disks' temperatures using hddtemp +# [[inputs.hddtemp]] +# ## By default, telegraf gathers temps data from all disks detected by the +# ## hddtemp. +# ## +# ## Only collect temps from the selected disks. +# ## +# ## A * as the device name will return the temperature values of all disks. +# ## +# # address = "127.0.0.1:7634" +# # devices = ["sda", "*"] + + +# HTTP/HTTPS request given an address a method and a timeout +[[inputs.http_response]] + ## Deprecated in 1.12, use 'urls' + ## Server address (default http://localhost) + # address = "http://localhost" + + ## List of urls to query. + urls = [ + "https://florianzirker.de", + "https://cloud.florianzirker.de/login", + "https://wallabag.florianzirker.de/login", + "https://www.feuerwehr-kapsweyer.de", + "http://portainer.fzirker.lan", + "http://gpxviewer.fzirker.lan", + "http://traefik.fzirker.lan/dashboard/", + "http://heimdall.fzirker.lan", + "http://monitoring.fzirker.lan/login", + #"http://solarmaxpi.zirker.lan" + ] + interval = "60s" + + ## Set http_proxy (telegraf uses the system wide proxy settings if it's is not set) + # http_proxy = "http://localhost:8888" + + ## Set response_timeout (default 5 seconds) + response_timeout = "10s" + + ## HTTP Request Method + method = "GET" + + ## Whether to follow redirects from the server (defaults to false) + follow_redirects = false + + ## Optional HTTP Request Body + # body = ''' + # {'fake':'data'} + # ''' + + ## Optional substring or regex match in body of the response + # response_string_match = "\"service_status\": \"up\"" + # response_string_match = "ok" + # response_string_match = "\".*_status\".?:.?\"up\"" + + ## Optional TLS Config + # tls_ca = "/etc/telegraf/ca.pem" + # tls_cert = "/etc/telegraf/cert.pem" + # tls_key = "/etc/telegraf/key.pem" + ## Use TLS but skip chain & host verification + # insecure_skip_verify = false + + ## HTTP Request Headers (all values must be strings) + # [inputs.http_response.headers] + # Host = "github.com" + + ## Interface to use when dialing an address + # interface = "eth0" + +# # Collect statistics about itself +# [[inputs.internal]] +# ## If true, collect telegraf memory stats. +# # collect_memstats = true + + +# # Read metrics about network interface usage +[[inputs.net]] +## By default, telegraf gathers stats from any up interface (excluding loopback) +## Setting interfaces will tell it to gather these explicit interfaces, +## regardless of status. +## +interfaces = ["enx001e0636be71"] +## +## On linux systems telegraf also collects protocol stats. +## Setting ignore_protocol_stats to true will skip reporting of protocol metrics. +## +# ignore_protocol_stats = false +## + + +# # Read TCP metrics such as established, time wait and sockets counts. +[[inputs.netstat]] + # no configuration + + +# Collect kernel snmp counters and network interface statistics +[[inputs.nstat]] + ## file paths for proc files. If empty default paths will be used: + ## /proc/net/netstat, /proc/net/snmp, /proc/net/snmp6 + ## These can also be overridden with env variables, see README. + proc_net_netstat = "/proc/net/netstat" + proc_net_snmp = "/proc/net/snmp" + proc_net_snmp6 = "/proc/net/snmp6" + ## dump metrics with 0 values too + dump_zeros = true + + +# Ping given url(s) and return statistics +[[inputs.ping]] + ## Hosts to send ping packets to. + urls = [ + "fritz-box.fzirker.lan", + "wlan-ap.fzirker.lan", + "drax.fzirker.lan", + "florianzirker.de", + "t-online.de", + "8.8.8.8", # dns of google + "4.2.2.2", # dns of level3 + "example.com" + ] + + interval = "60s" + + ## Method used for sending pings, can be either "exec" or "native". When set + ## to "exec" the systems ping command will be executed. When set to "native" + ## the plugin will send pings directly. + ## + ## While the default is "exec" for backwards compatibility, new deployments + ## are encouraged to use the "native" method for improved compatibility and + ## performance. + method = "native" + + ## Number of ping packets to send per interval. Corresponds to the "-c" + ## option of the ping command. + count = 4 + + ## Time to wait between sending ping packets in seconds. Operates like the + ## "-i" option of the ping command. + ping_interval = 1.0 + + ## If set, the time to wait for a ping response in seconds. Operates like + ## the "-W" option of the ping command. + # timeout = 1.0 + + ## If set, the total ping deadline, in seconds. Operates like the -w option + ## of the ping command. + # deadline = 10 + + ## Interface or source address to send ping from. Operates like the -I or -S + ## option of the ping command. + # interface = "" + + ## Specify the ping executable binary. + # binary = "ping" + + ## Arguments for ping command. When arguments is not empty, the command from + ## the binary option will be used and other options (ping_interval, timeout, + ## etc) will be ignored. + # arguments = ["-c", "3"] + + ## Use only IPv6 addresses when resolving a hostname. + # ipv6 = false + + +# # Monitor process cpu and memory usage +# [[inputs.procstat]] +# ## PID file to monitor process +# pid_file = "/var/run/nginx.pid" +# ## executable name (ie, pgrep ) +# # exe = "nginx" +# ## pattern as argument for pgrep (ie, pgrep -f ) +# # pattern = "nginx" +# ## user as argument for pgrep (ie, pgrep -u ) +# # user = "nginx" +# ## Systemd unit name +# # systemd_unit = "nginx.service" +# ## CGroup name or path +# # cgroup = "systemd/system.slice/nginx.service" +# +# ## Windows service name +# # win_service = "" +# +# ## override for process_name +# ## This is optional; default is sourced from /proc//status +# # process_name = "bar" +# +# ## Field name prefix +# # prefix = "" +# +# ## When true add the full cmdline as a tag. +# # cmdline_tag = false +# +# ## Add PID as a tag instead of a field; useful to differentiate between +# ## processes whose tags are otherwise the same. Can create a large number +# ## of series, use judiciously. +# # pid_tag = false +# +# ## Method to use when finding process IDs. Can be one of 'pgrep', or +# ## 'native'. The pgrep finder calls the pgrep executable in the PATH while +# ## the native finder performs the search directly in a manor dependent on the +# ## platform. Default is 'pgrep' +# # pid_finder = "pgrep" + + +# # Read metrics from storage devices supporting S.M.A.R.T. +# [[inputs.smart]] +# ## Optionally specify the path to the smartctl executable +# # path = "/usr/bin/smartctl" +# +# ## On most platforms smartctl requires root access. +# ## Setting 'use_sudo' to true will make use of sudo to run smartctl. +# ## Sudo must be configured to to allow the telegraf user to run smartctl +# ## without a password. +# # use_sudo = false +# +# ## Skip checking disks in this power mode. Defaults to +# ## "standby" to not wake up disks that have stoped rotating. +# ## See --nocheck in the man pages for smartctl. +# ## smartctl version 5.41 and 5.42 have faulty detection of +# ## power mode and might require changing this value to +# ## "never" depending on your disks. +# # nocheck = "standby" +# +# ## Gather all returned S.M.A.R.T. attribute metrics and the detailed +# ## information from each drive into the 'smart_attribute' measurement. +# # attributes = false +# +# ## Optionally specify devices to exclude from reporting. +# # excludes = [ "/dev/pass6" ] +# +# ## Optionally specify devices and device type, if unset +# ## a scan (smartctl --scan) for S.M.A.R.T. devices will +# ## done and all found will be included except for the +# ## excluded in excludes. +# # devices = [ "/dev/ada0 -d atacam" ] +# +# ## Timeout for the smartctl command to complete. +# # timeout = "30s" + + +# # Sysstat metrics collector +# [[inputs.sysstat]] +# ## Path to the sadc command. +# # +# ## Common Defaults: +# ## Debian/Ubuntu: /usr/lib/sysstat/sadc +# ## Arch: /usr/lib/sa/sadc +# ## RHEL/CentOS: /usr/lib64/sa/sadc +# sadc_path = "/usr/lib/sa/sadc" # required +# +# ## Path to the sadf command, if it is not in PATH +# # sadf_path = "/usr/bin/sadf" +# +# ## Activities is a list of activities, that are passed as argument to the +# ## sadc collector utility (e.g: DISK, SNMP etc...) +# ## The more activities that are added, the more data is collected. +# # activities = ["DISK"] +# +# ## Group metrics to measurements. +# ## +# ## If group is false each metric will be prefixed with a description +# ## and represents itself a measurement. +# ## +# ## If Group is true, corresponding metrics are grouped to a single measurement. +# # group = true +# +# ## Options for the sadf command. The values on the left represent the sadf +# ## options and the values on the right their description (which are used for +# ## grouping and prefixing metrics). +# ## +# ## Run 'sar -h' or 'man sar' to find out the supported options for your +# ## sysstat version. +# [inputs.sysstat.options] +# -C = "cpu" +# -B = "paging" +# -b = "io" +# -d = "disk" # requires DISK activity +# "-n ALL" = "network" +# "-P ALL" = "per_cpu" +# -q = "queue" +# -R = "mem" +# -r = "mem_util" +# -S = "swap_util" +# -u = "cpu_util" +# -v = "inode" +# -W = "swap" +# -w = "task" +# # -H = "hugepages" # only available for newer linux distributions +# # "-I ALL" = "interrupts" # requires INT activity +# +# ## Device tags can be used to add additional tags for devices. +# ## For example the configuration below adds a tag vg with value rootvg for +# ## all metrics with sda devices. +# # [[inputs.sysstat.device_tags.sda]] +# # vg = "rootvg" + + +# Gather systemd units state +# [[inputs.systemd_units]] +# ## Set timeout for systemctl execution +# # timeout = "1s" +# # +# ## Filter for a specific unit type, default is "service", other possible +# ## values are "socket", "target", "device", "mount", "automount", "swap", +# ## "timer", "path", "slice" and "scope ": + # unittype = "service" + +# # Read metrics about temperature +[[inputs.temp]] + # no configuration + + +# # Reads metrics from a SSL certificate +[[inputs.x509_cert]] + ## List certificate sources + #sources = ["/etc/ssl/certs/ssl-cert-snakeoil.pem", "tcp://example.org:443"] + sources = ["https://florianzirker.de:443", "https://cloud.florianzirker.de:443", "https://wallabag.florianzirker.de:443", "https://gitea.florianzirker.de:443", "https://meet.florianzirker.de:443", "https://www.feuerwehr-kapsweyer.de:443"] + + ## Timeout for SSL connection + # timeout = "5s" + + ## Pass a different name into the TLS request (Server Name Indication) + ## example: server_name = "myhost.example.org" + # server_name = "" + + ## Optional TLS Config + # tls_ca = "/etc/telegraf/ca.pem" + # tls_cert = "/etc/telegraf/cert.pem" + # tls_key = "/etc/telegraf/key.pem" diff --git a/monitoring/test-telegraf.sh b/monitoring/test-telegraf.sh new file mode 100644 index 0000000..0dce934 --- /dev/null +++ b/monitoring/test-telegraf.sh @@ -0,0 +1,19 @@ +# call this script like "./test-telegraf.sh net:cpu" + +docker run \ + --rm \ + --volume $(pwd)/telegraf/telegraf.conf:/telegraf.conf \ + --volume /:/hostfs:ro \ + --volume /var/run/utmp:/var/run/utmp:ro \ + --volume /var/run/docker.sock:/var/run/docker.sock:ro \ + -e HOST_ETC=/hostfs/etc \ + -e HOST_PROC=/hostfs/proc \ + -e HOST_SYS=/hostfs/sys \ + -e HOST_VAR=/hostfs/var \ + -e HOST_RUN=/hostfs/run \ + -e HOST_MOUNT_PREFIX=/hostfs \ + telegraf \ + telegraf \ + --config /telegraf.conf \ + --input-filter $1 \ + --test diff --git a/portainer/docker-compose.yaml b/portainer/docker-compose.yaml new file mode 100644 index 0000000..2c281b5 --- /dev/null +++ b/portainer/docker-compose.yaml @@ -0,0 +1,25 @@ +version: "3.3" + +services: + + app: + image: portainer/portainer-ce + volumes: + - ${VOLUMES_PATH}/portainer:/data + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + expose: + - "9000" + networks: + - web + labels: + - "traefik.enable=true" + - "traefik.http.routers.portainer.rule=Host(`portainer.${DOMAIN}`)" + - "traefik.http.routers.portainer.entrypoints=web" + - "traefik.http.services.portainer.loadbalancer.server.port=9000" + - "docker.group=selfhost" + restart: unless-stopped + +networks: + web: + external: true diff --git a/proxy/docker-compose.yaml b/proxy/docker-compose.yaml new file mode 100644 index 0000000..a110574 --- /dev/null +++ b/proxy/docker-compose.yaml @@ -0,0 +1,46 @@ +version: "3.3" + +services: + + traefik: + image: "traefik:v2.2" + restart: always + command: + - "--api.insecure=true" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.web.address=:80" + ports: + - "80:80" + - "443:443" + networks: + - web + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN}`)" + - "traefik.http.routers.traefik.entrypoints=web" + - "traefik.http.services.traefik.loadbalancer.server.port=8080" + - "docker.group=selfhost" + extra_hosts: + - host.docker.internal:172.17.0.1 + + + whoami: + image: containous/whoami + networks: + - web + labels: + - "traefik.enable=true" + - "traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)" + - "traefik.http.routers.whoami.entrypoints=web" + - "traefik.http.services.whoami.loadbalancer.server.port=80" + - "docker.group=selfhost" + restart: unless-stopped + + +networks: + web: + external: true + diff --git a/smartHome/docker-compose.yaml b/smartHome/docker-compose.yaml new file mode 100644 index 0000000..ae7381e --- /dev/null +++ b/smartHome/docker-compose.yaml @@ -0,0 +1,46 @@ +version: "3.3" + +services: + + homeassistant: + image: homeassistant/odroid-xu-homeassistant + volumes: + - ${VOLUMES_PATH}/homeassistent:/config + environment: + - TZ=Europe/Berlin + restart: unless-stopped + network_mode: host + labels: + - "traefik.enable=true" + - "traefik.http.routers.hassi.rule=Host(`hassi.${DOMAIN}`)" + - "traefik.http.routers.hassi.entrypoints=web" + - "traefik.http.services.hassi.loadbalancer.server.port=8123" + - "docker.group=selfhost" + + deconz: + image: marthoc/deconz + network_mode: host + privileged: true + restart: unless-stopped + volumes: + - ${VOLUMES_PATH}/deCONZ:/root/.local/share/dresden-elektronik/deCONZ + - /etc/localtime:/etc/localtime:ro + devices: + - /dev/ttyACM0 + environment: + - DECONZ_DEVICE=/dev/ttyACM0 + - DECONZ_WEB_PORT=8080 + - DECONZ_WS_PORT=8443 + - DEBUG_INFO=1 + - DEBUG_APS=0 + - DEBUG_ZCL=0 + - DEBUG_ZDP=0 + - DEBUG_OTAU=0 + - TZ=Europe/Berlin + - UDEV=1 + labels: + - "traefik.enable=true" + - "traefik.http.routers.deconz.rule=Host(`deconz.${DOMAIN}`)" + - "traefik.http.routers.deconz.entrypoints=web" + - "traefik.http.services.deconz.loadbalancer.server.port=8080" + - "docker.group=selfhost" diff --git a/start-all.sh b/start-all.sh new file mode 100644 index 0000000..3302ade --- /dev/null +++ b/start-all.sh @@ -0,0 +1,21 @@ +#/bin/bash/ + +cd proxy/ +docker-compose up -d +cd .. + +cd heimdall/ +docker-compose up -d +cd .. + +cd portainer/ +docker-compose up -d +cd .. + +cd smartHome/ +docker-compose up -d +cd .. + +cd monitoring/ +docker-compose up -d +cd .. diff --git a/stop-all.sh b/stop-all.sh new file mode 100644 index 0000000..198643c --- /dev/null +++ b/stop-all.sh @@ -0,0 +1,21 @@ +#/bin/bash/ + +cd proxy/ +docker-compose down +cd .. + +cd heimdall/ +docker-compose down +cd .. + +cd portainer/ +docker-compose down +cd .. + +cd smartHome/ +docker-compose down +cd .. + +cd monitoring/ +docker-compose down +cd ..