From e357babf6db975196bb6a5d24e1eb89b35a42eca Mon Sep 17 00:00:00 2001 From: Marc Fokkert Date: Wed, 26 Jul 2023 21:01:51 +0200 Subject: [PATCH] Initial commit --- .docker/ca.pem | 35 +++++++++++++++ .docker/cert.pem | 30 +++++++++++++ .docker/key.pem | 51 ++++++++++++++++++++++ .gitignore | 36 +++++++++++++++ .idea/$CACHE_FILE$ | 60 +++++++++++++++++++++++++ .idea/.gitignore | 8 ++++ .idea/azureSettings.xml | 6 +++ .idea/dataSources.xml | 11 +++++ .idea/git_toolbox_prj.xml | 15 +++++++ .idea/jpa-buddy.xml | 6 +++ .idea/misc.xml | 9 ++++ .idea/modules.xml | 8 ++++ .idea/qnap-containers.iml | 9 ++++ .idea/vcs.xml | 6 +++ .terraform.lock.hcl | 23 ++++++++++ README.md | 11 +++++ _disabled/rhasspy.tf | 51 ++++++++++++++++++++++ _disabled/unifi-video.tf | 36 +++++++++++++++ airsonic.tf | 61 ++++++++++++++++++++++++++ docker-qnap.tf | 30 +++++++++++++ dockerx.bat | 6 +++ env.bat | 3 ++ freshrss.tf | 44 +++++++++++++++++++ ginlong-mqtt.tf | 37 ++++++++++++++++ gitea.tf | 51 ++++++++++++++++++++++ grafana.tf | 28 ++++++++++++ home-assistant.tf | 49 +++++++++++++++++++++ kodi.tf | 32 ++++++++++++++ mariadb.tf | 41 +++++++++++++++++ mosquitto.tf | 49 +++++++++++++++++++++ mqtt-exporter.tf | 37 ++++++++++++++++ nginx-lb-certbot.tf | 44 +++++++++++++++++++ nginx-lb.tf | 55 +++++++++++++++++++++++ node-red.tf | 37 ++++++++++++++++ ofelia.tf | 31 +++++++++++++ photoprism.tf | 45 +++++++++++++++++++ pihole.tf | 33 ++++++++++++++ prometheus.tf | 41 +++++++++++++++++ prometheus.yml | 5 +++ rssbridge.tf | 27 ++++++++++++ ru-torrent.tf | 43 ++++++++++++++++++ smokeping.tf | 46 ++++++++++++++++++++ syncthing.tf | 39 +++++++++++++++++ traccar.tf | 43 ++++++++++++++++++ unifi.tf | 33 ++++++++++++++ wireguard.tf | 52 ++++++++++++++++++++++ youless-exporter.tf | 25 +++++++++++ youless-exporter/Dockerfile | 6 +++ youless-exporter/package-lock.json | 70 ++++++++++++++++++++++++++++++ youless-exporter/package.json | 18 ++++++++ youless-exporter/src/main.ts | 57 ++++++++++++++++++++++++ zigbee2mqtt.tf | 52 ++++++++++++++++++++++ 52 files changed, 1681 insertions(+) create mode 100644 .docker/ca.pem create mode 100644 .docker/cert.pem create mode 100644 .docker/key.pem create mode 100644 .gitignore create mode 100644 .idea/$CACHE_FILE$ create mode 100644 .idea/.gitignore create mode 100644 .idea/azureSettings.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/git_toolbox_prj.xml create mode 100644 .idea/jpa-buddy.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/qnap-containers.iml create mode 100644 .idea/vcs.xml create mode 100644 .terraform.lock.hcl create mode 100644 README.md create mode 100644 _disabled/rhasspy.tf create mode 100644 _disabled/unifi-video.tf create mode 100644 airsonic.tf create mode 100644 docker-qnap.tf create mode 100644 dockerx.bat create mode 100644 env.bat create mode 100644 freshrss.tf create mode 100644 ginlong-mqtt.tf create mode 100644 gitea.tf create mode 100644 grafana.tf create mode 100644 home-assistant.tf create mode 100644 kodi.tf create mode 100644 mariadb.tf create mode 100644 mosquitto.tf create mode 100644 mqtt-exporter.tf create mode 100644 nginx-lb-certbot.tf create mode 100644 nginx-lb.tf create mode 100644 node-red.tf create mode 100644 ofelia.tf create mode 100644 photoprism.tf create mode 100644 pihole.tf create mode 100644 prometheus.tf create mode 100644 prometheus.yml create mode 100644 rssbridge.tf create mode 100644 ru-torrent.tf create mode 100644 smokeping.tf create mode 100644 syncthing.tf create mode 100644 traccar.tf create mode 100644 unifi.tf create mode 100644 wireguard.tf create mode 100644 youless-exporter.tf create mode 100644 youless-exporter/Dockerfile create mode 100644 youless-exporter/package-lock.json create mode 100644 youless-exporter/package.json create mode 100644 youless-exporter/src/main.ts create mode 100644 zigbee2mqtt.tf diff --git a/.docker/ca.pem b/.docker/ca.pem new file mode 100644 index 0000000..dbac43e --- /dev/null +++ b/.docker/ca.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +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 +7C91omWFHonwe1Um85K6uT0= +-----END CERTIFICATE----- diff --git a/.docker/cert.pem b/.docker/cert.pem new file mode 100644 index 0000000..368ba95 --- /dev/null +++ b/.docker/cert.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFHTCCAwWgAwIBAgIUY+qiNCXKlSWPUzSklKNgaqQxJy0wDQYJKoZIhvcNAQEL +BQAwWjEaMBgGA1UEAxMRQ29udGFpbmVyIFN0YXRpb24xDTALBgNVBAoTBFFOQVAx +DzANBgNVBAgTBlRhaXBlaTEPMA0GA1UEBxMGVGFpcGVpMQswCQYDVQQGEwJUVzAe +Fw0yMjEyMDkxMTA4MDNaFw0yMzEyMDkxMTA4MDNaMBExDzANBgNVBAMTBmNsaWVu +dDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALGbnInYbVxbv4j3Vl7/ +Ezu3P97Sp3A3TXSJ2DnLW7dEjFdtmhSixPitsXFUGStkmu5R93VZiFQvD2mnAU5S +ccDVNFCwE9mlGqtwF3MVy0qpu8akb6f4Ix2B6ThbLAsPs0x6HWf9e4mdGJ5x1EP1 +hdWB8MQIaZqYjeFztTnDrN7eSXGuJMdBOmIWdtZi2bjwqpW866TNDsmD0yvF1CGC +shUlWmo9yeAPDIk3y27fqCgAihItJDnENJAaG6qvn9TVS1xUEhhLnKM1jrKcXLnd +iZzrV4ipfxSDhmzy6/ouuzoYbDNau9E/YlaXzEym3726CFmeSvNLcFKgvGvqV4UM +rknGF1G2oq1lFxwgyKmGZlzT1VLFNour6c2EiEG6pQ1osoTMOj9+z4SqZY0QYdMy +0/aGzULFuDdE7k0+S4F5h/dsnNigPNmMDGahCkNaVIKu6BvNN+bF0tgvrUDVi3CG +GJnmzPDCL/D3mwXTh7JduxvGw/3bGagnJPY2a6EOlgA5SrIO/cDKx07PiG3Y4k7u +iTL4jPIXVqBGBatfSRCNPHIIYX1VLy0qDE+HRFqQK0Th7fzuhlUX7dQz4MS+WcPm +ro0POO62itnVgPTJp2f9eU+w/K/fwBNZMMC50OklCJ68RWBC2UpL7fB22P9iFCtw +m5hSYLLP5i71O/FH7BKQ1zSZAgMBAAGjJDAiMBMGA1UdJQQMMAoGCCsGAQUFBwMC +MAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAROvoRhu6FOY4J2wUiKYQ ++dm5pzw5/zTmvgrNdC0MXUJmye+hmcoJ6vUSjlqKZEnoLbb5wFECdUzzEcgirnFI +3EiYQXq8mm3h6pqW0FpxGNf+eLqmDaN/6ZZapMNN8xjuP6u+FSFhrXemjXe2RXkA +H4aZ9lIEFSp1kOxAWP5FMHdI4V1A2QEReqzmCizIqvRUIjhU0Ix6sKqjOBuJRlgz +mEEL+DWpbAF18ILxmdAHtnbetsexifM+z/zlJjoOFdbZ9DP964xCxF+mPzEkr2fO +KPNxA5VDd5z+iABuDowZ9Lb44qUm2SNj6Aef0M92c0mnw1IIb/BgebUPKckw3xrq +DW/L33v1EnvUCC/YlGqloABWNTHZ6ZUJYttNNwJMRnd+vratYVhYj3LL8R1s6a6G +7Up2o01CLG6iBL5Zdcb+ZL4sOCo+oTgcjijLyeqm/YF3GEDHEZlRZ+9kjKrg32e9 ++Ott8p3xqTR0yBp/FbjVcN57ZERYpVfNoD2HMzQVTu7gX0l/TBvMaz8b6GYuE/0P +deHZtUa6IfJH6KDY5arWuAWYuPbh00Sz4xizBKVDXHXo414+sGpcDnR0cwyG2iRF +waZJGE84kVbU8ZzcNCb4gPZGV9pP825yi2z1k1Ku+oG8jacL9mwtCxVi/msvecH5 +FnsblROOuUf2GeaPZlqb998= +-----END CERTIFICATE----- diff --git a/.docker/key.pem b/.docker/key.pem new file mode 100644 index 0000000..05dcb95 --- /dev/null +++ b/.docker/key.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33ebf5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +youless-exporter/node_modules \ No newline at end of file diff --git a/.idea/$CACHE_FILE$ b/.idea/$CACHE_FILE$ new file mode 100644 index 0000000..6bc2fe2 --- /dev/null +++ b/.idea/$CACHE_FILE$ @@ -0,0 +1,60 @@ + + + + + + + + + Class structureJava + + + Code maturityJava + + + Google Web Toolkit + + + JUnitJava + + + Java + + + Java 5Java language level migration aidsJava + + + Java 7Java language level migration aidsJava + + + Java 8Java language level migration aidsJava + + + Java language level migration aidsJava + + + JavadocJava + + + Numeric issuesJava + + + PerformanceJava + + + Spring + + + Spring AOPSpring + + + TestNGJava + + + Threading issuesJava + + + + + + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/azureSettings.xml b/.idea/azureSettings.xml new file mode 100644 index 0000000..448ab9e --- /dev/null +++ b/.idea/azureSettings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..13e3709 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,11 @@ + + + + + mariadb + true + org.mariadb.jdbc.Driver + jdbc:mariadb://192.168.2.72:3306 + + + \ No newline at end of file diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 0000000..02b915b --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1e19273 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..85d8ac9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/qnap-containers.iml b/.idea/qnap-containers.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/qnap-containers.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000..db21461 --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,23 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/kreuzwerker/docker" { + version = "2.15.0" + constraints = "2.15.0" + hashes = [ + "h1:NkSDvVnpey6pAcrq1uYnOH7nr4m/mJ5lw5f62ieXcyE=", + "zh:0241e5c7b66c14aa54e367dfe380fbde8388d3254cbe8a70717c12f71897e82b", + "zh:0f162f0a01ffe9eec32e78dfc2a5b05a373230c41f041439efa3f4b68903fdcb", + "zh:1c222c1425fbb0367154bcb8e4d87b19d6eae133fbb341f73102fa3b300f34bf", + "zh:679206433e31d8fa69d95167af6d2cd762218e89811b735ee20bd8da19f97854", + "zh:a16baab045bc7a709a9767816304cc5548aa2ee0b72c0eee49e3826e6a46a3fd", + "zh:a29c4e304a6a7faf5b651a61a91a1aa2e837591cff049fbe1c747b6319e43956", + "zh:bed7a69dbb9a024aecfac840ca2ac2f1527062f3d9c8c718e4e81d464b5ad329", + "zh:c22aa10806de216b6aa0b36a2c1114a9fdaa5b47925aaad3333de3ce24cc52c9", + "zh:d034295663d8a39035fd6fdf0488b72544b13f48acaee797af967343248676f8", + "zh:d9001dfeac0db1799d8ab9d04be090522529baae0dba7f7e82b71f2168f05582", + "zh:d9f3eb7ef8f256eb9148d72bd4a00e34f3be5570484598e26b603cbdc5eed923", + "zh:ef573f1e0f000127fa9f569c8ee320f03ba1d302a6fbf9aac8300efa6fc6f4b2", + "zh:ef7e246b4205202161b4119c10a1282f74243e029508184132731f9f6f6d9f4c", + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8d7b2d --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Instructions + +Terraform cannot create a qnet network, so we do it manually and then import into Terraform. + +``` +dockerx.bat network create -d qnet --ipam-driver=qnet --ipam-opt=iface=eth0 --subnet=192.168.2.0/24 --gateway=192.168.2.1 terraform-static-eth1-shared +``` + +``` +terraform import docker_network.bridge f9cf6469837bece2c688b65787869af240fcffa95d9d5d3a71a0c4da119e5edc +``` diff --git a/_disabled/rhasspy.tf b/_disabled/rhasspy.tf new file mode 100644 index 0000000..d01c4c6 --- /dev/null +++ b/_disabled/rhasspy.tf @@ -0,0 +1,51 @@ +data "docker_registry_image" "rhasspy" { + name = "rhasspy/rhasspy" +} + +resource "docker_image" "rhasspy" { + name = data.docker_registry_image.rhasspy.name + pull_triggers = [data.docker_registry_image.rhasspy.sha256_digest] +} + +resource "docker_container" "rhasspy" { + image = docker_image.rhasspy.latest + name = "rhasspy" + + command = [ + "--profile", "en", + "--user-profiles", "/profiles" + ] + + + mounts { + target = "/config" + source = "/share/appdata/rhasspy" + type = "bind" + } + + mounts { + target = "/etc/localtime" + source = "/etc/localtime" + type = "bind" + read_only = true + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.118" + } + + devices { + host_path = "/dev/snd" + container_path = "/dev/snd" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/_disabled/unifi-video.tf b/_disabled/unifi-video.tf new file mode 100644 index 0000000..492394e --- /dev/null +++ b/_disabled/unifi-video.tf @@ -0,0 +1,36 @@ +data "docker_registry_image" "unifi-video" { + name = "pducharme/unifi-video-controller" +} + +resource "docker_image" "unifi-video" { + name = data.docker_registry_image.unifi-video.name + pull_triggers = [data.docker_registry_image.unifi-video.sha256_digest] +} + +resource "docker_container" "unifi-video" { + image = docker_image.unifi-video.latest + name = "unifi-video" + + mounts { + target = "/var/lib/unifi-video" + source = "/share/appdata/unifi-video/data" + type = "bind" + } + + mounts { + target = "/var/lib/unifi-video/videos" + source = "/share/appdata/unifi-video/videos" + type = "bind" + } + + capabilities { + add = ["SYS_ADMIN", "DAC_READ_SEARCH"] + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.71" + } +} diff --git a/airsonic.tf b/airsonic.tf new file mode 100644 index 0000000..2abcf3e --- /dev/null +++ b/airsonic.tf @@ -0,0 +1,61 @@ +resource "docker_image" "airsonic" { + name = "airsonicadvanced/airsonic-advanced:latest" +} + +resource "docker_container" "airsonic" { + image = docker_image.airsonic.latest + name = "airsonic" + + restart = "always" + + // Untested + depends_on = [ + docker_container.mariadb + ] + + env = [ + "spring_datasource_url=jdbc:mariadb://192.168.2.127:3306/airsonic", + "spring_datasource_username=airsonic", + "spring_datasource_password=3qpMTTfHid5hSaagEvu2", + ] + + mounts { + target = "/var/music" + source = "/share/appdata/airsonic/music" + type = "bind" + } + + mounts { + target = "/var/podcasts" + source = "/share/appdata/airsonic/podcasts" + type = "bind" + } + + mounts { + target = "/var/playlists" + source = "/share/appdata/airsonic/playlists" + type = "bind" + } + + mounts { + target = "/var/airsonic" + source = "/share/appdata/airsonic/data" + type = "bind" + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.83" + } + + networks_advanced { + name = docker_network.mariadb.name + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/docker-qnap.tf b/docker-qnap.tf new file mode 100644 index 0000000..5e9cd54 --- /dev/null +++ b/docker-qnap.tf @@ -0,0 +1,30 @@ +terraform { + required_providers { + docker = { + source = "kreuzwerker/docker" + version = "2.15.0" + } + } +} + +provider "docker" { + host = "tcp://192.168.2.64:2376" + cert_path = pathexpand(".docker") +} + +resource "docker_network" "bridge" { + name = "terraform-static-eth1-shared" + driver = "qnet" + ipam_driver = "qnet" + internal = false + attachable = false + ingress = false + ipv6 = false + + ipam_config { + aux_address = {} + subnet = "192.168.2.0/24" + gateway = "192.168.2.1" + } +} + diff --git a/dockerx.bat b/dockerx.bat new file mode 100644 index 0000000..5d18fdd --- /dev/null +++ b/dockerx.bat @@ -0,0 +1,6 @@ +docker ^ + --tlsverify ^ + -H=192.168.2.64:2376 ^ + --tlscacert=.docker\ca.pem ^ + --tlscert=.docker\cert.pem ^ + --tlskey=.docker\key.pem %* diff --git a/env.bat b/env.bat new file mode 100644 index 0000000..66714cc --- /dev/null +++ b/env.bat @@ -0,0 +1,3 @@ +SET DOCKER_CERT_PATH=c:\Dev\qnap-containers\.docker +SET DOCKER_HOST=tcp://192.168.2.64:2376 +SET DOCKER_TLS=1 \ No newline at end of file diff --git a/freshrss.tf b/freshrss.tf new file mode 100644 index 0000000..9e57f70 --- /dev/null +++ b/freshrss.tf @@ -0,0 +1,44 @@ + + + + resource "docker_image" "freshrss" { + name = "freshrss/freshrss:latest" + } + + resource "docker_container" "freshrss" { + image = docker_image.freshrss.latest + name = "freshrss" + restart = "always" + + env = [ + "TZ=Europe/Paris", + "CRON_MIN=1,31", + "OIDC_ENABLED=0", + "FRESHRSS_INSTALL=--api_enabled --base_url https://freshrss.xz1.nl --db-base freshrss --db-host 192.168.2.127 --db-password utquCzXEnrjFU2BbDqYT --db-type mysql --db-user freshrss --default_user admin --language en", + "FRESHRSS_USER=--api_password CmZpTF3pUYz7rVtFrDTQ --email freshrss@xz1.nl --language en --password CmZpTF3pUYz7rVtFrDTQ --user admin" + ] + + mounts { + target = "/var/www/FreshRSS/data" + source = "/share/appdata/freshrss/data" + type = "bind" + } + + mounts { + target = "/var/www/FreshRSS/extensions" + source = "/share/appdata/freshrss/extensions" + type = "bind" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.129" + } + } diff --git a/ginlong-mqtt.tf b/ginlong-mqtt.tf new file mode 100644 index 0000000..12a1ce5 --- /dev/null +++ b/ginlong-mqtt.tf @@ -0,0 +1,37 @@ +data "docker_registry_image" "ginlong-mqtt" { + name = "rescla/ginlong-mqtt" +} + +resource "docker_image" "ginlong-mqtt" { + name = data.docker_registry_image.ginlong-mqtt.name + pull_triggers = [data.docker_registry_image.ginlong-mqtt.sha256_digest] +} + +resource "docker_network" "ginlong-mqtt" { + name = "ginlong-mqtt" +} + +resource "docker_container" "ginlong-mqtt" { + image = docker_image.ginlong-mqtt.latest + name = "ginlong-mqtt" + + mounts { + target = "/config.ini" + source = "/share/appdata/ginlong-mqtt/config.ini" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.122" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/gitea.tf b/gitea.tf new file mode 100644 index 0000000..2bb09e7 --- /dev/null +++ b/gitea.tf @@ -0,0 +1,51 @@ +resource "docker_image" "gitea" { + name = "gitea/gitea:latest-rootless" +} + +resource "docker_container" "gitea" { + image = docker_image.gitea.latest + name = "gitea" + restart = "always" +# user = "1000:1000" + + env = [ + "GITEA__database__DB_TYPE=mysql", + "GITEA__database__HOST=192.168.2.127:3306", + "GITEA__database__NAME=gitea", + "GITEA__database__USER=gitea", + "GITEA__database__PASSWD=3uM4kBGaNQDo3tsRa9Nh", +# "USER_UID=1000", +# "USER_GID=1000" + ] + + mounts { + target = "/var/lib/gitea" + source = "/share/appdata/gitea/data" + type = "bind" + } + + mounts { + target = "/etc/gitea" + source = "/share/appdata/gitea/config" + type = "bind" + } + + mounts { + target = "/etc/localtime" + source = "/etc/localtime" + type = "bind" + read_only = true + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.131" + } +} diff --git a/grafana.tf b/grafana.tf new file mode 100644 index 0000000..97bb67a --- /dev/null +++ b/grafana.tf @@ -0,0 +1,28 @@ +resource "docker_image" "grafana" { + name = "grafana/grafana:latest" +} + +resource "docker_container" "grafana" { + image = docker_image.grafana.latest + name = "grafana" + + restart = "always" + + mounts { + target = "/var/lib/grafana" + source = "/share/appdata/grafana" + type = "bind" + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.79" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/home-assistant.tf b/home-assistant.tf new file mode 100644 index 0000000..f0c2c61 --- /dev/null +++ b/home-assistant.tf @@ -0,0 +1,49 @@ +data "docker_registry_image" "home-assistant" { + name = "homeassistant/home-assistant" +} + +resource "docker_image" "home-assistant" { + name = data.docker_registry_image.home-assistant.name + pull_triggers = [data.docker_registry_image.home-assistant.sha256_digest] +} + +resource "docker_container" "home-assistant" { + image = docker_image.home-assistant.latest + name = "home-assistant" + hostname = "hass" + + mounts { + target = "/config" + source = "/share/appdata/home-assistant" + type = "bind" + } + + restart = "always" + + // Untested + depends_on = [ + docker_container.mariadb + ] + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.70" + } + + networks_advanced { + name = docker_network.mariadb.name + } + +# devices { +# container_path = "/dev/ttyACM0" +# host_path = "/dev/ttyACM0" +# permissions = "rwm" +# } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/kodi.tf b/kodi.tf new file mode 100644 index 0000000..83da695 --- /dev/null +++ b/kodi.tf @@ -0,0 +1,32 @@ +resource "docker_image" "kodi" { + name = "linuxserver/kodi-headless:latest" +} + + +resource "docker_container" "kodi" { + image = docker_image.kodi.latest + name = "kodi" + restart = "always" + + env = [ + "TZ=europe/amsterdam", + ] + + mounts { + target = "/config/.kodi" + source = "/share/appdata/kodi" + type = "bind" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.128" + } +} diff --git a/mariadb.tf b/mariadb.tf new file mode 100644 index 0000000..ef2f8db --- /dev/null +++ b/mariadb.tf @@ -0,0 +1,41 @@ +data "docker_registry_image" "mariadb" { + name = "mariadb:10.6" +} + +resource "docker_image" "mariadb" { + name = data.docker_registry_image.mariadb.name + pull_triggers = [data.docker_registry_image.mariadb.sha256_digest] +} + +resource "docker_network" "mariadb" { + name = "mariadb" +} + +resource "docker_container" "mariadb" { + image = docker_image.mariadb.latest + name = "mariadb" + + mounts { + target = "/var/lib/mysql" + source = "/share/appdata/mariadb" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.mariadb.name + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.127" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/mosquitto.tf b/mosquitto.tf new file mode 100644 index 0000000..aa18532 --- /dev/null +++ b/mosquitto.tf @@ -0,0 +1,49 @@ +data "docker_registry_image" "mosquitto" { + name = "eclipse-mosquitto:2" +} + +resource "docker_image" "mosquitto" { + name = data.docker_registry_image.mosquitto.name + pull_triggers = [data.docker_registry_image.mosquitto.sha256_digest] +} + +resource "docker_network" "mosquitto" { + name = "mosquitto" +} + +resource "docker_container" "mosquitto" { + image = docker_image.mosquitto.latest + name = "mosquitto" + + mounts { + target = "/mosquitto/config" + source = "/share/appdata/mosquitto/config" + type = "bind" + } + + mounts { + target = "/mosquitto/data" + source = "/share/appdata/mosquitto/data" + type = "bind" + } + + mounts { + target = "/mosquitto/log" + source = "/share/appdata/mosquitto/log" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.125" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/mqtt-exporter.tf b/mqtt-exporter.tf new file mode 100644 index 0000000..1860e8e --- /dev/null +++ b/mqtt-exporter.tf @@ -0,0 +1,37 @@ +data "docker_registry_image" "mqtt-exporter" { + name = "fhemberger/mqtt_exporter:1.2.1" +} + +resource "docker_image" "mqtt-exporter" { + name = data.docker_registry_image.mqtt-exporter.name + pull_triggers = [data.docker_registry_image.mqtt-exporter.sha256_digest] +} + +resource "docker_network" "mqtt-exporter" { + name = "mqtt-exporter" +} + +resource "docker_container" "mqtt-exporter" { + image = docker_image.mqtt-exporter.latest + name = "mqtt-exporter" + + mounts { + target = "/usr/src/app/conf" + source = "/share/appdata/mqtt-exporter" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.123" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/nginx-lb-certbot.tf b/nginx-lb-certbot.tf new file mode 100644 index 0000000..1b88f8a --- /dev/null +++ b/nginx-lb-certbot.tf @@ -0,0 +1,44 @@ +data "docker_registry_image" "nginx-lb-certbot" { + name = "certbot/certbot:latest" +} + +resource "docker_image" "nginx-lb-certbot" { + name = data.docker_registry_image.nginx-lb-certbot.name + pull_triggers = [data.docker_registry_image.nginx-lb-certbot.sha256_digest] +} + +resource "docker_network" "nginx-lb-certbot" { + name = "nginx-lb-certbot" +} + +resource "docker_container" "nginx-lb-certbot" { + image = docker_image.nginx-lb-certbot.latest + name = "nginx-lb-certbot" + + mounts { + target = "/etc/letsencrypt" + source = "/share/appdata/nginx-lb/certs" + type = "bind" + } + + mounts { + target = "/var/www/acme-challenge-root" + source = "/share/appdata/nginx-lb/certbot" + type = "bind" + } + + # Triggered by ofelia + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + #command = ["certonly", "--webroot", "--email", "info@xz1.nl", "-w", "/var/www/acme-challenge-root", "-d", "photoprism.xz1.nl", "--agree-tos"] + #command = ["certonly", "--webroot", "--email", "info@xz1.nl", "-w", "/var/www/acme-challenge-root", "-d", "airsonic.xz1.nl", "--agree-tos"] + #command = ["certonly", "--webroot", "--email", "info@xz1.nl", "-w", "/var/www/acme-challenge-root", "-d", "hass.xz1.nl", "--agree-tos"] + #command = ["certonly", "--webroot", "--email", "info@xz1.nl", "-w", "/var/www/acme-challenge-root", "-d", "freshrss.xz1.nl", "--agree-tos"] + command = ["renew"] +} diff --git a/nginx-lb.tf b/nginx-lb.tf new file mode 100644 index 0000000..32ee071 --- /dev/null +++ b/nginx-lb.tf @@ -0,0 +1,55 @@ +data "docker_registry_image" "nginx-lb" { + name = "nginx:alpine" +} + +resource "docker_image" "nginx-lb" { + name = data.docker_registry_image.nginx-lb.name + pull_triggers = [data.docker_registry_image.nginx-lb.sha256_digest] +} + +resource "docker_network" "nginx-lb" { + name = "nginx-lb" +} + +resource "docker_container" "nginx-lb" { + image = docker_image.nginx-lb.latest + name = "nginx-lb" + + mounts { + target = "/etc/nginx/nginx.conf" + source = "/share/appdata/nginx-lb/nginx.conf" + type = "bind" + } + + mounts { + target = "/etc/nginx/config" + source = "/share/appdata/nginx-lb/conf" + type = "bind" + } + + mounts { + target = "/etc/nginx/certs" + source = "/share/appdata/nginx-lb/certs" + type = "bind" + } + + mounts { + target = "/var/www/acme-challenge-root" + source = "/share/appdata/nginx-lb/certbot" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.115" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/node-red.tf b/node-red.tf new file mode 100644 index 0000000..31785c4 --- /dev/null +++ b/node-red.tf @@ -0,0 +1,37 @@ +data "docker_registry_image" "node-red" { + name = "nodered/node-red:latest-12" +} + +resource "docker_image" "node-red" { + name = data.docker_registry_image.node-red.name + pull_triggers = [data.docker_registry_image.node-red.sha256_digest] +} + +resource "docker_container" "node-red" { + image = docker_image.node-red.latest + name = "node-red" + + mounts { + target = "/data" + source = "/share/appdata/node-red" + type = "bind" + } + + env = [ + "TZ=Europe/Amsterdam" + ] + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.124" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/ofelia.tf b/ofelia.tf new file mode 100644 index 0000000..4960b5e --- /dev/null +++ b/ofelia.tf @@ -0,0 +1,31 @@ +## Job scheduler for ofelia + +resource "docker_image" "ofelia" { + name = "mcuadros/ofelia:latest" +} + +resource "docker_container" "ofelia" { + image = docker_image.ofelia.latest + name = "ofelia" + restart = "always" + + mounts { + target = "/var/run/docker.sock" + source = "/var/run/docker.sock" + type = "bind" + read_only = true + } + + mounts { + target = "/etc/ofelia" + source = "/share/appdata/ofelia" + type = "bind" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/photoprism.tf b/photoprism.tf new file mode 100644 index 0000000..1497371 --- /dev/null +++ b/photoprism.tf @@ -0,0 +1,45 @@ +resource "docker_image" "photoprism" { + name = "photoprism/photoprism:latest" +} + +resource "docker_container" "photoprism" { + image = docker_image.photoprism.latest + name = "photoprism" + + restart = "always" + + env = [ + "PHOTOPRISM_UPLOAD_NSFW=true", + "PHOTOPRISM_ADMIN_PASSWORD=UAmpojHADcS5aB" + ] + + mounts { + target = "/photoprism/originals/camera" + source = "/share/appdata/syncthing/Camera" + type = "bind" + } + + mounts { + target = "/photoprism/originals/capture-one-variants" + source = "/share/CaptureOne/Variants" + type = "bind" + } + + mounts { + target = "/photoprism/storage" + source = "/share/appdata/photoprism/storage" + type = "bind" + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.116" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/pihole.tf b/pihole.tf new file mode 100644 index 0000000..97d1ef0 --- /dev/null +++ b/pihole.tf @@ -0,0 +1,33 @@ +## Job scheduler for pihole + +resource "docker_image" "pihole" { + name = "pihole/pihole:latest" +} + +resource "docker_container" "pihole" { + image = docker_image.pihole.latest + name = "pihole" + restart = "always" + + mounts { + target = "/etc-pihole" + source = "/share/appdata/pi-hole" + type = "bind" + } + + capabilities { + add = ["NET_ADMIN"] + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.114" + } +} diff --git a/prometheus.tf b/prometheus.tf new file mode 100644 index 0000000..8983c86 --- /dev/null +++ b/prometheus.tf @@ -0,0 +1,41 @@ +data "docker_registry_image" "prometheus" { + name = "prom/prometheus:latest" +} + +resource "docker_image" "prometheus" { + name = data.docker_registry_image.prometheus.name + pull_triggers = [data.docker_registry_image.prometheus.sha256_digest] +} + +resource "docker_container" "prometheus" { + image = docker_image.prometheus.latest + name = "prometheus" + + command = ["--config.file=/etc/prometheus/prometheus.yml","--storage.tsdb.path=/prometheus", "--web.console.libraries=/usr/share/prometheus/console_libraries","--web.console.templates=/usr/share/prometheus/consoles", "--storage.tsdb.retention.time=2y"] + + mounts { + target = "/etc/prometheus" + source = "/share/appdata/prometheus/config" + type = "bind" + } + + mounts { + target = "/prometheus" + source = "/share/appdata/prometheus/data" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.80" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/prometheus.yml b/prometheus.yml new file mode 100644 index 0000000..d291d08 --- /dev/null +++ b/prometheus.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: youless + scrape_interval: 1s + static_configs: + - targets: ['192.168.2.82:4202'] diff --git a/rssbridge.tf b/rssbridge.tf new file mode 100644 index 0000000..aa8649f --- /dev/null +++ b/rssbridge.tf @@ -0,0 +1,27 @@ +resource "docker_image" "rss-bridge" { + name = "rssbridge/rss-bridge:latest" +} + +resource "docker_container" "rss-bridge" { + image = docker_image.rss-bridge.latest + name = "rss-bridge" + restart = "always" + + mounts { + target = "/config" + source = "/share/appdata/rssbridge" + type = "bind" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.130" + } +} diff --git a/ru-torrent.tf b/ru-torrent.tf new file mode 100644 index 0000000..5a75bd6 --- /dev/null +++ b/ru-torrent.tf @@ -0,0 +1,43 @@ +data "docker_registry_image" "ru-torrent" { + name = "linuxserver/rutorrent" +} + +resource "docker_image" "ru-torrent" { + name = data.docker_registry_image.ru-torrent.name + pull_triggers = [data.docker_registry_image.ru-torrent.sha256_digest] +} + +resource "docker_network" "ru-torrent" { + name = "ru-torrent" +} + +resource "docker_container" "ru-torrent" { + image = docker_image.ru-torrent.latest + name = "ru-torrent" + + mounts { + target = "/config" + source = "/share/appdata/ru-torrent" + type = "bind" + } + + mounts { + target = "/downloads" + source = "/share/Download" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.121" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/smokeping.tf b/smokeping.tf new file mode 100644 index 0000000..aa73885 --- /dev/null +++ b/smokeping.tf @@ -0,0 +1,46 @@ +data "docker_registry_image" "smokeping" { + name = "linuxserver/smokeping:latest" +} + +resource "docker_image" "smokeping" { + name = data.docker_registry_image.smokeping.name + pull_triggers = [data.docker_registry_image.smokeping.sha256_digest] +} + +resource "docker_network" "smokeping" { + name = "smokeping" +} + +resource "docker_container" "smokeping" { + image = docker_image.smokeping.latest + name = "smokeping" + env = [ + "TZ=Europe/Amsterdam" + ] + + mounts { + target = "/config" + source = "/share/appdata/smokeping/config" + type = "bind" + } + + mounts { + target = "/data" + source = "/share/appdata/smokeping/data" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.126" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/syncthing.tf b/syncthing.tf new file mode 100644 index 0000000..9f9518b --- /dev/null +++ b/syncthing.tf @@ -0,0 +1,39 @@ +data "docker_registry_image" "syncthing" { + name = "linuxserver/syncthing:latest" +} + +resource "docker_image" "syncthing" { + name = data.docker_registry_image.syncthing.name + pull_triggers = [data.docker_registry_image.syncthing.sha256_digest] +} + +resource "docker_container" "syncthing" { + image = docker_image.syncthing.latest + name = "syncthing" + + mounts { + target = "/config" + source = "/share/appdata/syncthing" + type = "bind" + } + + restart = "always" + + ports { + internal = 8384 + external = 8384 + } + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.119" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts, + ports + ] + } +} diff --git a/traccar.tf b/traccar.tf new file mode 100644 index 0000000..67f104e --- /dev/null +++ b/traccar.tf @@ -0,0 +1,43 @@ +data "docker_registry_image" "traccar" { + name = "traccar/traccar" +} + +resource "docker_image" "traccar" { + name = data.docker_registry_image.traccar.name + pull_triggers = [data.docker_registry_image.traccar.sha256_digest] +} + +resource "docker_container" "traccar" { + image = docker_image.traccar.latest + name = "traccar" + + mounts { + target = "/opt/traccar/logs" + source = "/share/appdata/traccar/logs" + type = "bind" + } + + mounts { + target = "/opt/traccar/conf/traccar.xml" + source = "/share/appdata/traccar/traccar.xml" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.113" + } + + networks_advanced { + name = docker_network.mariadb.name + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/unifi.tf b/unifi.tf new file mode 100644 index 0000000..706efe6 --- /dev/null +++ b/unifi.tf @@ -0,0 +1,33 @@ +data "docker_registry_image" "unifi" { + name = "jacobalberty/unifi" +} + +resource "docker_image" "unifi" { + name = data.docker_registry_image.unifi.name + pull_triggers = [data.docker_registry_image.unifi.sha256_digest] +} + +resource "docker_container" "unifi" { + image = docker_image.unifi.latest + name = "unifi" + + mounts { + target = "/unifi" + source = "/share/appdata/unifi" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.67" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/wireguard.tf b/wireguard.tf new file mode 100644 index 0000000..d38bd90 --- /dev/null +++ b/wireguard.tf @@ -0,0 +1,52 @@ +data "docker_registry_image" "wireguard" { + name = "masipcat/wireguard-go:latest" +} + +resource "docker_image" "wireguard" { + name = data.docker_registry_image.wireguard.name + pull_triggers = [data.docker_registry_image.wireguard.sha256_digest] +} + +resource "docker_network" "wireguard" { + name = "wireguard" +} + +resource "docker_container" "wireguard" { + image = docker_image.wireguard.latest + name = "wireguard" + + capabilities { + add = ["NET_ADMIN"] + } + + env = [ + "TZ=Europe/Amsterdam", + "PEERS=1" + ] + + mounts { + target = "/etc/wireguard" + source = "/share/appdata/wireguard" + type = "bind" + } + + mounts { + target = "/dev/net/tun" + source = "/dev/net/tun" + type = "bind" + } + + restart = "always" + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.120" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/youless-exporter.tf b/youless-exporter.tf new file mode 100644 index 0000000..3b964a2 --- /dev/null +++ b/youless-exporter.tf @@ -0,0 +1,25 @@ + +resource "docker_image" "youless-exporter" { + name = "youless-exporter:latest" +} + +resource "docker_container" "youless-exporter" { + image = docker_image.youless-exporter.latest + name = "youless-exporter" + + restart = "always" + + command = ["npm", "run", "start"] + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.82" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +} diff --git a/youless-exporter/Dockerfile b/youless-exporter/Dockerfile new file mode 100644 index 0000000..f3bd831 --- /dev/null +++ b/youless-exporter/Dockerfile @@ -0,0 +1,6 @@ +FROM node:12 +COPY . / +CMD npm run start + + + diff --git a/youless-exporter/package-lock.json b/youless-exporter/package-lock.json new file mode 100644 index 0000000..e9718b7 --- /dev/null +++ b/youless-exporter/package-lock.json @@ -0,0 +1,70 @@ +{ + "name": "youless-exporter", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ts-node": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/youless-exporter/package.json b/youless-exporter/package.json new file mode 100644 index 0000000..5bfcce7 --- /dev/null +++ b/youless-exporter/package.json @@ -0,0 +1,18 @@ +{ + "name": "youless-exporter", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "ts-node src/main.ts" + }, + "author": "", + "license": "ISC", + "dependencies": { + "ts-node": "^8.10.2", + "typescript": "^3.9.7" + }, + "devDependencies": { + "@types/node": "^14.0.27" + } +} diff --git a/youless-exporter/src/main.ts b/youless-exporter/src/main.ts new file mode 100644 index 0000000..dc0b7a3 --- /dev/null +++ b/youless-exporter/src/main.ts @@ -0,0 +1,57 @@ +import * as http from 'http'; + +const port = 4202; +const youlessUri = 'http://192.168.2.68/a' + +const server = http.createServer((req, res) => { + + http.request(youlessUri, response => { + let str = '' + response.on('data', function (chunk) { + str += chunk; + }); + + response.on('end', function () { + const parser = new Parser(str); + + res.end(parser.toPrometheusFormat()) + }); + }).end(); + +}) + +server.listen(port) + + +class Parser { + public kWhTotal: number = null; + public currentPowerWatt: number = null; + + constructor( + private input: string + ) { + this.parse(); + } + + public toPrometheusFormat(): string { + return [ + `kwh_total ${this.kWhTotal}`, + `current_power_watt ${this.currentPowerWatt}` + ].join('\n') + } + + private parse() { + const lines = this.input.split('\n') + .map(line => line.trim()) + .map(line => line.split(' ')) + + if (lines.length === 0) { + return; + } + + this.kWhTotal = parseFloat(lines[0][0]?.replace(',', '.')); + this.currentPowerWatt = parseInt(lines[1][0]) + } + + +} diff --git a/zigbee2mqtt.tf b/zigbee2mqtt.tf new file mode 100644 index 0000000..cef61a2 --- /dev/null +++ b/zigbee2mqtt.tf @@ -0,0 +1,52 @@ +data "docker_registry_image" "zigbee-2-mqtt" { + name = "koenkk/zigbee2mqtt" +} + +resource "docker_image" "zigbee-2-mqtt" { + name = data.docker_registry_image.zigbee-2-mqtt.name + pull_triggers = [data.docker_registry_image.zigbee-2-mqtt.sha256_digest] +} + +resource "docker_container" "zigbee-2-mqtt" { + image = docker_image.zigbee-2-mqtt.latest + name = "zigbee-2-mqtt" + + mounts { + target = "/app/data" + source = "/share/appdata/zigbee2mqtt" + type = "bind" + } + + mounts { + target = "/run/udev" + source = "/run/udev" + type = "bind" + read_only = true + } + + + env = [ + "TZ=Europe/Amsterdam" + ] + + restart = "always" + + + networks_advanced { + name = docker_network.bridge.name + ipv4_address = "192.168.2.117" + } + + devices { + container_path = "/dev/ttyACM0" + host_path = "/dev/ttyACM0" + permissions = "rwm" + } + + lifecycle { + ignore_changes = [ + ulimit, + log_opts + ] + } +}