Initial commit

This commit is contained in:
Marc Fokkert
2023-07-26 21:01:51 +02:00
commit e357babf6d
52 changed files with 1681 additions and 0 deletions

35
.docker/ca.pem Normal file
View File

@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
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
7C91omWFHonwe1Um85K6uT0=
-----END CERTIFICATE-----

30
.docker/cert.pem Normal file
View File

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

51
.docker/key.pem Normal file
View File

@@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

36
.gitignore vendored Normal file
View File

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

60
.idea/$CACHE_FILE$ generated Normal file
View File

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State />
<State>
<id>Class structureJava</id>
</State>
<State>
<id>Code maturityJava</id>
</State>
<State>
<id>Google Web Toolkit</id>
</State>
<State>
<id>JUnitJava</id>
</State>
<State>
<id>Java</id>
</State>
<State>
<id>Java 5Java language level migration aidsJava</id>
</State>
<State>
<id>Java 7Java language level migration aidsJava</id>
</State>
<State>
<id>Java 8Java language level migration aidsJava</id>
</State>
<State>
<id>Java language level migration aidsJava</id>
</State>
<State>
<id>JavadocJava</id>
</State>
<State>
<id>Numeric issuesJava</id>
</State>
<State>
<id>PerformanceJava</id>
</State>
<State>
<id>Spring</id>
</State>
<State>
<id>Spring AOPSpring</id>
</State>
<State>
<id>TestNGJava</id>
</State>
<State>
<id>Threading issuesJava</id>
</State>
</expanded-state>
</profile-state>
</entry>
</component>
</project>

8
.idea/.gitignore generated vendored Normal file
View File

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

6
.idea/azureSettings.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AzureSettings">
<option name="appInsights" value="rO0ABXVyAEtbTGNvbS5taWNyb3NvZnQuYXBwbGljYXRpb25pbnNpZ2h0cy5wcmVmZXJlbmNlLkFwcGxpY2F0aW9uSW5zaWdodHNSZXNvdXJjZTvCzxEP0C2HbAIAAHhwAAAAAA==" />
</component>
</project>

11
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="192.168.2.72" uuid="20d2dc6c-6cf7-4314-aa42-aef8ffa8d1f0">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://192.168.2.72:3306</jdbc-url>
</data-source>
</component>
</project>

15
.idea/git_toolbox_prj.xml generated Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GitToolBoxProjectSettings">
<option name="commitMessageIssueKeyValidationOverride">
<BoolValueOverride>
<option name="enabled" value="true" />
</BoolValueOverride>
</option>
<option name="commitMessageValidationEnabledOverride">
<BoolValueOverride>
<option name="enabled" value="true" />
</BoolValueOverride>
</option>
</component>
</project>

6
.idea/jpa-buddy.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JpaBuddyIdeaProjectConfig">
<option name="renamerInitialized" value="true" />
</component>
</project>

9
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectType">
<option name="id" value="jpab" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/qnap-containers.iml" filepath="$PROJECT_DIR$/.idea/qnap-containers.iml" />
</modules>
</component>
</project>

9
.idea/qnap-containers.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

23
.terraform.lock.hcl generated Normal file
View File

@@ -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",
]
}

11
README.md Normal file
View File

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

51
_disabled/rhasspy.tf Normal file
View File

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

36
_disabled/unifi-video.tf Normal file
View File

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

61
airsonic.tf Normal file
View File

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

30
docker-qnap.tf Normal file
View File

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

6
dockerx.bat Normal file
View File

@@ -0,0 +1,6 @@
docker ^
--tlsverify ^
-H=192.168.2.64:2376 ^
--tlscacert=.docker\ca.pem ^
--tlscert=.docker\cert.pem ^
--tlskey=.docker\key.pem %*

3
env.bat Normal file
View File

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

44
freshrss.tf Normal file
View File

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

37
ginlong-mqtt.tf Normal file
View File

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

51
gitea.tf Normal file
View File

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

28
grafana.tf Normal file
View File

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

49
home-assistant.tf Normal file
View File

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

32
kodi.tf Normal file
View File

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

41
mariadb.tf Normal file
View File

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

49
mosquitto.tf Normal file
View File

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

37
mqtt-exporter.tf Normal file
View File

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

44
nginx-lb-certbot.tf Normal file
View File

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

55
nginx-lb.tf Normal file
View File

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

37
node-red.tf Normal file
View File

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

31
ofelia.tf Normal file
View File

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

45
photoprism.tf Normal file
View File

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

33
pihole.tf Normal file
View File

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

41
prometheus.tf Normal file
View File

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

5
prometheus.yml Normal file
View File

@@ -0,0 +1,5 @@
scrape_configs:
- job_name: youless
scrape_interval: 1s
static_configs:
- targets: ['192.168.2.82:4202']

27
rssbridge.tf Normal file
View File

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

43
ru-torrent.tf Normal file
View File

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

46
smokeping.tf Normal file
View File

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

39
syncthing.tf Normal file
View File

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

43
traccar.tf Normal file
View File

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

33
unifi.tf Normal file
View File

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

52
wireguard.tf Normal file
View File

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

25
youless-exporter.tf Normal file
View File

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

View File

@@ -0,0 +1,6 @@
FROM node:12
COPY . /
CMD npm run start

70
youless-exporter/package-lock.json generated Normal file
View File

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

View File

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

View File

@@ -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])
}
}

52
zigbee2mqtt.tf Normal file
View File

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