snapshot remaining files
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -36,6 +36,10 @@ openvpn-server/pki/
|
|||||||
openvpn-server/*.ovpn
|
openvpn-server/*.ovpn
|
||||||
pgadmin/
|
pgadmin/
|
||||||
rsnapshot/var/
|
rsnapshot/var/
|
||||||
|
seafile/seafile-data/
|
||||||
|
seafile/seafile-server-*
|
||||||
|
seafile/seahub-data/
|
||||||
seafile/database/
|
seafile/database/
|
||||||
seafile/server/
|
seafile/server/
|
||||||
inverter/data/
|
inverter/data/
|
||||||
|
grafana/
|
||||||
|
|||||||
1077
collectd/etc/collectd.conf
Normal file
1077
collectd/etc/collectd.conf
Normal file
File diff suppressed because it is too large
Load Diff
5
collectd/etc/collectd.conf.d/btrfs-data.conf
Normal file
5
collectd/etc/collectd.conf.d/btrfs-data.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#LoadPlugin exec
|
||||||
|
#
|
||||||
|
#<Plugin "exec">
|
||||||
|
# Exec nobody "/host/usr/local/bin/btrfs-data"
|
||||||
|
#</Plugin>
|
||||||
6
collectd/etc/collectd.conf.d/df.conf
Normal file
6
collectd/etc/collectd.conf.d/df.conf
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<Plugin df>
|
||||||
|
MountPoint "/media/docker"
|
||||||
|
MountPoint "/media/scratch"
|
||||||
|
FSType "ext4"
|
||||||
|
IgnoreSelected false
|
||||||
|
</Plugin>
|
||||||
6
collectd/etc/collectd.conf.d/du-data.conf
Normal file
6
collectd/etc/collectd.conf.d/du-data.conf
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LoadPlugin exec
|
||||||
|
|
||||||
|
<Plugin "exec">
|
||||||
|
Exec nobody "/host/usr/local/bin/du-data"
|
||||||
|
</Plugin>
|
||||||
|
|
||||||
5
collectd/etc/collectd.conf.d/power-data.conf
Normal file
5
collectd/etc/collectd.conf.d/power-data.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
LoadPlugin exec
|
||||||
|
|
||||||
|
<Plugin "exec">
|
||||||
|
Exec collectd "/host/usr/local/bin/power-data"
|
||||||
|
</Plugin>
|
||||||
6
collectd/etc/collectd.conf.d/speedtest-data.conf
Normal file
6
collectd/etc/collectd.conf.d/speedtest-data.conf
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LoadPlugin exec
|
||||||
|
|
||||||
|
<Plugin "exec">
|
||||||
|
Exec nobody "/host/usr/local/bin/speedtest-data"
|
||||||
|
</Plugin>
|
||||||
|
|
||||||
180
collectd/usr/local/bin/btrfs-data
Executable file
180
collectd/usr/local/bin/btrfs-data
Executable file
@@ -0,0 +1,180 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Imports
|
||||||
|
#
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import commands
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Misc
|
||||||
|
#
|
||||||
|
#sys.tracebacklimit = 0
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Global variables
|
||||||
|
#
|
||||||
|
size_data_total = 0
|
||||||
|
size_data_exclusive = 0
|
||||||
|
size_snapshot_total = 0
|
||||||
|
size_snapshot_exclusive = 0
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Methods
|
||||||
|
#
|
||||||
|
def get_subvol_list(path):
|
||||||
|
command = "btrfs subvolume list -t %s" % (path)
|
||||||
|
status, output = commands.getstatusoutput(command)
|
||||||
|
|
||||||
|
if status is not 0:
|
||||||
|
raise Exception(command)
|
||||||
|
|
||||||
|
# Every line contains the following values: subvol_id, gen, toplevel, path
|
||||||
|
return output.splitlines()[2:]
|
||||||
|
|
||||||
|
|
||||||
|
def get_id_root(name, path):
|
||||||
|
lines = get_subvol_list(path)
|
||||||
|
|
||||||
|
# Filter lines where toplevel == 5
|
||||||
|
subvol_ids = filter(lambda x: int(x.split()[2]) == 5, lines)
|
||||||
|
|
||||||
|
# Try to retrieve the subvol_id for the root subvolume (if any)
|
||||||
|
if len(subvol_ids) == 1:
|
||||||
|
# The path contains a btrfs filesystem without subvolume for data
|
||||||
|
return int(subvol_ids[0].split()[0])
|
||||||
|
else:
|
||||||
|
# The path contains a btrfs filesystem with multiple subvolumes for data
|
||||||
|
try:
|
||||||
|
return int(filter(lambda x: x.split()[3] == name, subvol_ids)[0].split()[0])
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Volume not found, root is probably the btrfs default (5)
|
||||||
|
return 5
|
||||||
|
|
||||||
|
def get_id_subvolumes(path, subvol_id):
|
||||||
|
lines = get_subvol_list(path)
|
||||||
|
lines = filter(lambda x: int(x.split()[2]) == subvol_id, lines)
|
||||||
|
return list(map(lambda x: int(x.split()[0]), lines))
|
||||||
|
|
||||||
|
|
||||||
|
def get_disk_usage(name, path):
|
||||||
|
id_root = get_id_root(name, path)
|
||||||
|
id_subvolumes = get_id_subvolumes(path, id_root)
|
||||||
|
|
||||||
|
command = "btrfs qgroup show --raw %s" % (path)
|
||||||
|
status, output = commands.getstatusoutput(command)
|
||||||
|
|
||||||
|
if status is not 0:
|
||||||
|
raise Exception(command)
|
||||||
|
|
||||||
|
lines = output.splitlines()[2:]
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
global size_data_total
|
||||||
|
global size_data_exclusive
|
||||||
|
global size_snapshot_total
|
||||||
|
global size_snapshot_exclusive
|
||||||
|
|
||||||
|
# Total data volume in subvolume
|
||||||
|
size_data_total = 0
|
||||||
|
|
||||||
|
# Total data volume in snapshots
|
||||||
|
# -> this variable is useless
|
||||||
|
size_snapshot_total = 0
|
||||||
|
|
||||||
|
# Data exclusively in subvolume
|
||||||
|
# -> data that is not (yet) incorporated in a snapshot
|
||||||
|
size_data_exclusive = 0
|
||||||
|
|
||||||
|
|
||||||
|
# Data exclusively available in snapshots
|
||||||
|
# -> data that was removed from volume
|
||||||
|
size_snapshot_exclusive = 0
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
split = line.split()
|
||||||
|
subvol_id = int(split[0].split("/")[1])
|
||||||
|
size_total = float(split[1])
|
||||||
|
size_exclusive = float(split[2])
|
||||||
|
|
||||||
|
if subvol_id == id_root:
|
||||||
|
size_data_total = size_total
|
||||||
|
size_data_exclusive = size_exclusive
|
||||||
|
elif subvol_id in id_subvolumes:
|
||||||
|
size_snapshot_total += size_total
|
||||||
|
size_snapshot_exclusive += size_exclusive
|
||||||
|
|
||||||
|
def rescan_quota(path):
|
||||||
|
command = "btrfs quota rescan %s" % (path)
|
||||||
|
status, output = commands.getstatusoutput(command)
|
||||||
|
if status is not 0:
|
||||||
|
Exception(command)
|
||||||
|
|
||||||
|
def print_human_readable(name):
|
||||||
|
global size_data_total
|
||||||
|
global size_data_exclusive
|
||||||
|
global size_snapshot_exclusive
|
||||||
|
size_data_total = size_data_total / (1024*1e6)
|
||||||
|
size_data_exclusive = size_data_exclusive / (1024*1e6)
|
||||||
|
size_snapshot_exclusive = size_snapshot_exclusive / (1024*1e6)
|
||||||
|
print "%10s: %6.1f Gb, %6.1f Gb, %6.1f Gb" % (name, size_data_total, size_data_exclusive, size_snapshot_exclusive)
|
||||||
|
|
||||||
|
def print_rrd(name):
|
||||||
|
timestamp = int(time.time())
|
||||||
|
print("PUTVAL {}/exec-btrfs_{}/gauge-data_total {}:{:.1f}".format(hostname, name, timestamp, size_data_total))
|
||||||
|
print("PUTVAL {}/exec-btrfs_{}/gauge-data_exclusive {}:{:.1f}".format(hostname, name, timestamp, size_data_exclusive))
|
||||||
|
print("PUTVAL {}/exec-btrfs_{}/gauge-snapshot_total {}:{:.1f}".format(hostname, name, timestamp, size_snapshot_total))
|
||||||
|
print("PUTVAL {}/exec-btrfs_{}/gauge-snapshot_exclusive {}:{:.1f}".format(hostname, name, timestamp, size_snapshot_exclusive))
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Volumes to scan
|
||||||
|
#
|
||||||
|
hostname = "sepia"
|
||||||
|
interval = 10
|
||||||
|
volumes = list()
|
||||||
|
|
||||||
|
# 275 GB SSD
|
||||||
|
volumes.append(["@", "/host/root/"])
|
||||||
|
volumes.append(["@home", "/host/root/home"])
|
||||||
|
volumes.append(["opt", "/host/root/opt"])
|
||||||
|
|
||||||
|
# 2x 4TB HDD
|
||||||
|
volumes.append(["data", "/host/root/media/data"])
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Command line arguments
|
||||||
|
#
|
||||||
|
parser = argparse.ArgumentParser(description='Get BTRFS disk usage')
|
||||||
|
parser.add_argument('-s', action='store_true', help='print in human readable format')
|
||||||
|
args = parser.parse_args()
|
||||||
|
human_readable = args.s
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Main
|
||||||
|
#
|
||||||
|
if (human_readable):
|
||||||
|
for (name, path) in volumes:
|
||||||
|
get_disk_usage(name, path)
|
||||||
|
print_human_readable(name)
|
||||||
|
else:
|
||||||
|
# RRD mode
|
||||||
|
while True:
|
||||||
|
for (name, path) in volumes:
|
||||||
|
get_disk_usage(name, path)
|
||||||
|
|
||||||
|
print_rrd(name)
|
||||||
|
|
||||||
|
sys.stdout.flush()
|
||||||
|
time.sleep(interval)
|
||||||
|
#rescan_quota(path)
|
||||||
25
collectd/usr/local/bin/du-data
Executable file
25
collectd/usr/local/bin/du-data
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
COLLECTION=sepia
|
||||||
|
INTERVAL=90
|
||||||
|
|
||||||
|
DIRS=$(cat <<LIST
|
||||||
|
/host/root/media/data/Inverter
|
||||||
|
/host/root/media/data/Monique
|
||||||
|
/host/root/media/data/Music
|
||||||
|
/host/root/media/data/Peter
|
||||||
|
/host/root/media/data/Photographs
|
||||||
|
/host/root/media/data/Raw
|
||||||
|
/host/root/media/data/Sanne
|
||||||
|
/host/root/media/data/Wii
|
||||||
|
LIST
|
||||||
|
)
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
SECONDS=0
|
||||||
|
for DIR in $DIRS; do
|
||||||
|
SIZE=$(du -cs $DIR | tail -1 | awk '{print $1}')
|
||||||
|
NAME=$(echo $DIR | sed 's/.//' | tr / - )
|
||||||
|
echo "PUTVAL $COLLECTION/exec-du-$NAME/gauge-size interval=$INTERVAL N:$SIZE"
|
||||||
|
done
|
||||||
|
sleep $((INTERVAL-$SECONDS))
|
||||||
|
done
|
||||||
69
collectd/usr/local/bin/power-data
Executable file
69
collectd/usr/local/bin/power-data
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Imports
|
||||||
|
#
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import argparse
|
||||||
|
import pylikwid
|
||||||
|
|
||||||
|
#
|
||||||
|
# Configuration
|
||||||
|
#
|
||||||
|
hostname = "sepia"
|
||||||
|
cpuid = 0
|
||||||
|
pinfo = pylikwid.getpowerinfo()
|
||||||
|
domainid = pinfo.get("domains").get("PKG").get("ID")
|
||||||
|
measurement_duration = 5
|
||||||
|
measurement_interval = 15
|
||||||
|
dinfo = pinfo.get("domains")
|
||||||
|
domain_names = dinfo.keys()
|
||||||
|
domain_ids = [domain['ID'] for domain in dinfo.values()]
|
||||||
|
|
||||||
|
#
|
||||||
|
# Command line arguments
|
||||||
|
#
|
||||||
|
parser = argparse.ArgumentParser(description='Get CPU power consumption')
|
||||||
|
parser.add_argument('-s', action='store_true', help='print in human readable format')
|
||||||
|
args = parser.parse_args()
|
||||||
|
human_readable = args.s
|
||||||
|
|
||||||
|
#
|
||||||
|
# Methods
|
||||||
|
#
|
||||||
|
def get_power():
|
||||||
|
start = list()
|
||||||
|
end = list()
|
||||||
|
power = list()
|
||||||
|
for domain_id in domain_ids:
|
||||||
|
e_start = pylikwid.startpower(cpuid, domain_id)
|
||||||
|
start.append(e_start)
|
||||||
|
time.sleep(measurement_duration)
|
||||||
|
for domain_id in domain_ids:
|
||||||
|
e_stop = pylikwid.stoppower(cpuid, domain_id)
|
||||||
|
end.append(e_stop)
|
||||||
|
for events in zip(start, end, domain_ids):
|
||||||
|
joules = pylikwid.getpower(events[0], events[1], events[2])
|
||||||
|
power.append(joules / measurement_duration)
|
||||||
|
|
||||||
|
return dict(zip(domain_names, power))
|
||||||
|
|
||||||
|
def print_rrd(measurements):
|
||||||
|
timestamp = int(time.time())
|
||||||
|
for measurement in measurements.items():
|
||||||
|
name = measurement[0].lower()
|
||||||
|
power = measurement[1]
|
||||||
|
print("PUTVAL {}/exec-power/gauge-{} {}:{:.1f}".format(hostname, name, timestamp, power))
|
||||||
|
|
||||||
|
#
|
||||||
|
# Main
|
||||||
|
#
|
||||||
|
if (human_readable):
|
||||||
|
print get_power()
|
||||||
|
else:
|
||||||
|
while True:
|
||||||
|
power = get_power()
|
||||||
|
print_rrd(power)
|
||||||
|
sys.stdout.flush()
|
||||||
|
time.sleep(measurement_interval)
|
||||||
12
collectd/usr/local/bin/speedtest-data
Executable file
12
collectd/usr/local/bin/speedtest-data
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
SPEEDTEST=/sbin/speedtest-cli
|
||||||
|
COLLECTION=sepia
|
||||||
|
INTERVAL=900
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
SECONDS=0
|
||||||
|
RESULT=($($SPEEDTEST | grep Mbit | cut -d' ' -f 2))
|
||||||
|
echo "PUTVAL $COLLECTION/exec-speedtest/gauge-download interval=$INTERVAL N:${RESULT[0]}"
|
||||||
|
echo "PUTVAL $COLLECTION/exec-speedtest/gauge-upload interval=$INTERVAL N:${RESULT[1]}"
|
||||||
|
sleep $((INTERVAL-$SECONDS))
|
||||||
|
done
|
||||||
5
esphome/.gitignore
vendored
Normal file
5
esphome/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Gitignore settings for ESPHome
|
||||||
|
# This is an example and may include too much for your use-case.
|
||||||
|
# You can modify this file to suit your needs.
|
||||||
|
/.esphome/
|
||||||
|
/secrets.yaml
|
||||||
135
esphome/hub.yaml
Normal file
135
esphome/hub.yaml
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
esphome:
|
||||||
|
name: hub
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
|
||||||
|
# Enable logging
|
||||||
|
logger:
|
||||||
|
|
||||||
|
# Enable Home Assistant API
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: "7/wHBQqTb27jygfGGgRutGYrEMP1AX4gCIK9drLavVU="
|
||||||
|
|
||||||
|
ota:
|
||||||
|
password: "0bd5b8ad22ef5e32c535261ea979e27e"
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- ssid: "DD-WRT"
|
||||||
|
password: "qwerty123"
|
||||||
|
- ssid: "H369AC68342 2.4"
|
||||||
|
password: "6A6277E455C9"
|
||||||
|
|
||||||
|
|
||||||
|
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "Hub Fallback Hotspot"
|
||||||
|
password: "uJTE4dJxhcBO"
|
||||||
|
|
||||||
|
captive_portal:
|
||||||
|
|
||||||
|
# mqtt:
|
||||||
|
# id: mqtt_client
|
||||||
|
# broker: rik.veenboer.xyz
|
||||||
|
# username: test
|
||||||
|
# password: F0fLd9PWRMlVKffpgREIHpeH
|
||||||
|
# discovery: False # Only if you use the HA API usually
|
||||||
|
# topic_prefix: herderin
|
||||||
|
|
||||||
|
esp32_ble_tracker:
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
# Sanne
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:5A:18:A7
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (18:A7)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (18:A7)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (18:A7)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (18:A7)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:AC:64:AE
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (64:AE)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (64:AE)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (64:AE)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (64:AE)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:B4:1E:43
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (1E:43)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (1E:43)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (1E:43)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (1E:43)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:99:34:DC
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (34:DC)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (34:DC)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (34:DC)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (34:DC)"
|
||||||
|
|
||||||
|
# Herderin
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:9F:94:13
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (94:13)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (94:13)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (94:13)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (94:13)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:A1:EA:D2
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (EA:D2)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (EA:D2)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (EA:D2)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (EA:D2)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:FD:26:B5
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (26:B5)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (26:B5)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (26:B5)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (26:B5)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:51:BB:0D
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (BB:0D)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (BB:0D)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (BB:0D)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (BB:0D)"
|
||||||
|
|
||||||
88
esphome/sanne.yaml
Normal file
88
esphome/sanne.yaml
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
esphome:
|
||||||
|
name: hub
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
|
||||||
|
# Enable logging
|
||||||
|
logger:
|
||||||
|
|
||||||
|
# Enable Home Assistant API
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: "7/wHBQqTb27jygfGGgRutGYrEMP1AX4gCIK9drLavVU="
|
||||||
|
|
||||||
|
ota:
|
||||||
|
password: "0bd5b8ad22ef5e32c535261ea979e27e"
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
networks:
|
||||||
|
- ssid: "DD-WRT"
|
||||||
|
password: "qwerty123"
|
||||||
|
- ssid: "H369AC68342 2.4"
|
||||||
|
password: "6A6277E455C9"
|
||||||
|
|
||||||
|
|
||||||
|
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "Hub Fallback Hotspot"
|
||||||
|
password: "uJTE4dJxhcBO"
|
||||||
|
|
||||||
|
captive_portal:
|
||||||
|
|
||||||
|
mqtt:
|
||||||
|
id: mqtt_client
|
||||||
|
broker: rik.veenboer.xyz
|
||||||
|
username: test
|
||||||
|
password: F0fLd9PWRMlVKffpgREIHpeH
|
||||||
|
discovery: False # Only if you use the HA API usually
|
||||||
|
topic_prefix: sanne
|
||||||
|
|
||||||
|
esp32_ble_tracker:
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:5A:18:A7
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (18:A7)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (18:A7)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (18:A7)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (18:A7)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:AC:64:AE
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (64:AE)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (64:AE)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (64:AE)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (64:AE)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:B4:1E:43
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (1E:43)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (1E:43)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (1E:43)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (1E:43)"
|
||||||
|
|
||||||
|
- platform: atc_mithermometer
|
||||||
|
mac_address: A4:C1:38:99:34:DC
|
||||||
|
temperature:
|
||||||
|
name: "ATC Temperature (34:DC)"
|
||||||
|
humidity:
|
||||||
|
name: "ATC Humidity (34:DC)"
|
||||||
|
battery_level:
|
||||||
|
name: "ATC Battery-Level (34:DC)"
|
||||||
|
battery_voltage:
|
||||||
|
name: "ATC Battery-Voltage (34:DC)"
|
||||||
1
homeassistant/automations.yaml
Normal file
1
homeassistant/automations.yaml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
28
homeassistant/configuration.yaml
Normal file
28
homeassistant/configuration.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
# Loads default set of integrations. Do not remove.
|
||||||
|
default_config:
|
||||||
|
|
||||||
|
# Load frontend themes from the themes folder
|
||||||
|
frontend:
|
||||||
|
themes: !include_dir_merge_named themes
|
||||||
|
|
||||||
|
# Text to speech
|
||||||
|
tts:
|
||||||
|
- platform: google_translate
|
||||||
|
|
||||||
|
automation: !include automations.yaml
|
||||||
|
script: !include scripts.yaml
|
||||||
|
scene: !include scenes.yaml
|
||||||
|
|
||||||
|
http:
|
||||||
|
use_x_forwarded_for: true
|
||||||
|
trusted_proxies:
|
||||||
|
- 172.0.0.0/8
|
||||||
|
|
||||||
|
mqtt:
|
||||||
|
sensor:
|
||||||
|
!include mqtt.yaml
|
||||||
|
|
||||||
|
ltss:
|
||||||
|
db_url: postgresql://homeassistant:homeassistant@192.168.2.150:6543/homeassistant
|
||||||
|
chunk_time_interval: 2592000000000
|
||||||
67
homeassistant/mqtt.yaml
Normal file
67
homeassistant/mqtt.yaml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
- object_id: atc_temperature_18a7
|
||||||
|
unique_id: atc_temperature_18a7
|
||||||
|
state_topic: "sanne/sensor/atc_temperature_18a7/state"
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
- object_id: atc_humidity_18a7
|
||||||
|
unique_id: atc_humidity_18a7
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
state_topic: "sanne/sensor/atc_humidity_18a7/state"
|
||||||
|
- object_id: atc_battery-voltage_18a7
|
||||||
|
unique_id: atc_battery-voltage_18a7
|
||||||
|
state_topic: "sanne/sensor/atc_battery-voltage_18a7/state"
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
- object_id: atc_battery-level_18a7
|
||||||
|
unique_id: atc_battery-level_18a7
|
||||||
|
state_topic: "sanne/sensor/atc_battery-level_18a7/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
|
||||||
|
- object_id: atc_temperature_64ae
|
||||||
|
unique_id: atc_temperature_64ae
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
state_topic: "sanne/sensor/atc_temperature_64ae/state"
|
||||||
|
- object_id: atc_humidity_64ae
|
||||||
|
unique_id: atc_humidity_64ae
|
||||||
|
state_topic: "sanne/sensor/atc_humidity_64ae/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
- object_id: atc_battery-voltage_64ae
|
||||||
|
unique_id: atc_battery-voltage_64ae
|
||||||
|
state_topic: "sanne/sensor/atc_battery-voltage_64ae/state"
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
- object_id: atc_battery-level_64ae
|
||||||
|
unique_id: atc_battery-level_64ae
|
||||||
|
state_topic: "sanne/sensor/atc_battery-level_64ae/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
|
||||||
|
- object_id: atc_temperature_1e43
|
||||||
|
unique_id: atc_temperature_1e43
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
state_topic: "sanne/sensor/atc_temperature_1e43/state"
|
||||||
|
- object_id: atc_humidity_1e43
|
||||||
|
unique_id: atc_humidity_1e43
|
||||||
|
state_topic: "sanne/sensor/atc_humidity_1e43/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
- object_id: atc_battery-voltage_1e43
|
||||||
|
unique_id: atc_battery-voltage_1e43
|
||||||
|
state_topic: "sanne/sensor/atc_battery-voltage_1e43/state"
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
- object_id: atc_battery-level_1e43
|
||||||
|
unique_id: atc_battery-level_1e43
|
||||||
|
state_topic: "sanne/sensor/atc_battery-level_1e43/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
|
||||||
|
- object_id: atc_temperature_34dc
|
||||||
|
unique_id: atc_temperature_34dc
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
state_topic: "sanne/sensor/atc_temperature_34dc/state"
|
||||||
|
- object_id: atc_humidity_34dc
|
||||||
|
unique_id: atc_humidity_34dc
|
||||||
|
state_topic: "sanne/sensor/atc_humidity_34dc/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
- object_id: atc_battery-voltage_34dc
|
||||||
|
unique_id: atc_battery-voltage_34dc
|
||||||
|
state_topic: "sanne/sensor/atc_battery-voltage_34dc/state"
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
- object_id: atc_battery-level_34dc
|
||||||
|
unique_id: atc_battery-level_34dc
|
||||||
|
state_topic: "sanne/sensor/atc_battery-level_34dc/state"
|
||||||
|
unit_of_measurement: "%"
|
||||||
0
homeassistant/scenes.yaml
Normal file
0
homeassistant/scenes.yaml
Normal file
0
homeassistant/scripts.yaml
Normal file
0
homeassistant/scripts.yaml
Normal file
31
openvpn-server/openvpn.conf
Normal file
31
openvpn-server/openvpn.conf
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
server 192.168.255.0 255.255.255.0
|
||||||
|
verb 3
|
||||||
|
key /etc/openvpn/pki/private/herderin.veenboer.xyz.key
|
||||||
|
ca /etc/openvpn/pki/ca.crt
|
||||||
|
cert /etc/openvpn/pki/issued/herderin.veenboer.xyz.crt
|
||||||
|
dh /etc/openvpn/pki/dh.pem
|
||||||
|
tls-auth /etc/openvpn/pki/ta.key
|
||||||
|
key-direction 0
|
||||||
|
keepalive 10 60
|
||||||
|
persist-key
|
||||||
|
persist-tun
|
||||||
|
|
||||||
|
proto tcp
|
||||||
|
# Rely on Docker to do port mapping, internally always 1194
|
||||||
|
port 443
|
||||||
|
dev tun0
|
||||||
|
status /tmp/openvpn-status.log
|
||||||
|
|
||||||
|
user nobody
|
||||||
|
group nogroup
|
||||||
|
comp-lzo no
|
||||||
|
|
||||||
|
### Route Configurations Below
|
||||||
|
route 192.168.254.0 255.255.255.0
|
||||||
|
|
||||||
|
### Push Configurations Below
|
||||||
|
push "block-outside-dns"
|
||||||
|
push "dhcp-option DNS 192.168.2.150"
|
||||||
|
push "comp-lzo no"
|
||||||
|
|
||||||
|
port-share host 444
|
||||||
25
openvpn-server/ovpn_env.sh
Normal file
25
openvpn-server/ovpn_env.sh
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
declare -x OVPN_AUTH=
|
||||||
|
declare -x OVPN_CIPHER=
|
||||||
|
declare -x OVPN_CLIENT_TO_CLIENT=
|
||||||
|
declare -x OVPN_CN=herderin.veenboer.xyz
|
||||||
|
declare -x OVPN_COMP_LZO=0
|
||||||
|
declare -x OVPN_DEFROUTE=1
|
||||||
|
declare -x OVPN_DEVICE=tun
|
||||||
|
declare -x OVPN_DEVICEN=0
|
||||||
|
declare -x OVPN_DISABLE_PUSH_BLOCK_DNS=0
|
||||||
|
declare -x OVPN_DNS=1
|
||||||
|
declare -x OVPN_DNS_SERVERS=([0]="8.8.8.8" [1]="8.8.4.4")
|
||||||
|
declare -x OVPN_ENV=/etc/openvpn/ovpn_env.sh
|
||||||
|
declare -x OVPN_EXTRA_CLIENT_CONFIG=()
|
||||||
|
declare -x OVPN_EXTRA_SERVER_CONFIG=()
|
||||||
|
declare -x OVPN_FRAGMENT=
|
||||||
|
declare -x OVPN_KEEPALIVE='10 60'
|
||||||
|
declare -x OVPN_MTU=
|
||||||
|
declare -x OVPN_NAT=0
|
||||||
|
declare -x OVPN_PORT=1194
|
||||||
|
declare -x OVPN_PROTO=tcp
|
||||||
|
declare -x OVPN_PUSH=()
|
||||||
|
declare -x OVPN_ROUTES=([0]="192.168.254.0/24")
|
||||||
|
declare -x OVPN_SERVER=192.168.255.0/24
|
||||||
|
declare -x OVPN_SERVER_URL=tcp://herderin.veenboer.xyz
|
||||||
|
declare -x OVPN_TLS_CIPHER=
|
||||||
9
openvpn-server/setup.sh
Executable file
9
openvpn-server/setup.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
OVPN_DATA=/opt/openvpn-server
|
||||||
|
VERSION=2.4
|
||||||
|
CLIENTNAME=herderin
|
||||||
|
docker run -v /$OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn:$VERSION ovpn_genconfig -u tcp://$CLIENTNAME.veenboer.xyz
|
||||||
|
docker run -v /$OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn:$VERSION ovpn_initpki
|
||||||
|
docker run -v /$OVPN_DATA:/etc/openvpn -d -p 443:443/tcp --cap-add=NET_ADMIN kylemanna/openvpn:$VERSION
|
||||||
|
docker run -v /$OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full $CLIENTNAME nopass
|
||||||
|
docker run -v /$OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn:$VERSION ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn
|
||||||
3
seafile/conf/ccnet.conf
Normal file
3
seafile/conf/ccnet.conf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[General]
|
||||||
|
SERVICE_URL = https://herderin.veenboer.xyz/seafile
|
||||||
|
|
||||||
1
seafile/conf/conf
Symbolic link
1
seafile/conf/conf
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/seafile/conf
|
||||||
16
seafile/conf/gunicorn.conf.py
Normal file
16
seafile/conf/gunicorn.conf.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
daemon = True
|
||||||
|
workers = 5
|
||||||
|
|
||||||
|
# default localhost:8000
|
||||||
|
bind = "0.0.0.0:8000"
|
||||||
|
|
||||||
|
# Pid
|
||||||
|
pids_dir = '/opt/haiwen/pids'
|
||||||
|
pidfile = os.path.join(pids_dir, 'seahub.pid')
|
||||||
|
|
||||||
|
# for file upload, we need a longer timeout value (default is only 30s, too short)
|
||||||
|
timeout = 1200
|
||||||
|
|
||||||
|
limit_request_line = 8190
|
||||||
3
seafile/conf/seafile.conf
Normal file
3
seafile/conf/seafile.conf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[fileserver]
|
||||||
|
port=8082
|
||||||
|
max_download_dir_size=8192
|
||||||
10
seafile/conf/seahub_settings.py
Normal file
10
seafile/conf/seahub_settings.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
SECRET_KEY = "by-t3pizx0b7b^x#4q8be4b@4n1g8vxle#bl@+gq8*x!2jt*g7"
|
||||||
|
SERVE_STATIC = False
|
||||||
|
MEDIA_URL = '/seafmedia/'
|
||||||
|
COMPRESS_URL = MEDIA_URL
|
||||||
|
STATIC_URL = MEDIA_URL + 'assets/'
|
||||||
|
SITE_ROOT = '/seafile/'
|
||||||
|
LOGIN_URL = '/seafile/accounts/login/'
|
||||||
|
FILE_SERVER_ROOT = 'https://herderin.veenboer.xyz/seafhttp'
|
||||||
|
SERVICE_URL = 'https://herderin.veenboer.xyz/seafile'
|
||||||
1
seafile/version
Normal file
1
seafile/version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
9.0.4
|
||||||
Reference in New Issue
Block a user