Skip to main content

Primary links

  • Home
  • AI
  • Kubernetes
  • Incus
  • Ansible
  • Terraform
  • OpenStack
  • Virtualization
  • Linux
  • SmartHome
  • HowTo

Misc

  • Linux
  • Hardware
  • Programming
  • Databases
  • CLI
  • Multimedia
  • Plugins
  • Windows

Cloud

  • OpenStack
  • cloud-config
  • nextcloud

Virtualization

  • Virtualization
  • Docker
  • KVM
  • Kubernetes
  • LXC
  • LXD
  • QEMU
  • VMware
  • VirtualBox
  • multipass
  • podman
  • vagrant
  • XEN
  • Incus

Network

  • DNS
  • Firewall
  • Linux
  • OpenvSwitch
  • SSL
  • VLAN
  • VPN
  • iPXE
  • namespaces
  • nmcli
  • tcpdump

Storage

  • CEPH
  • DRBD
  • LVM
  • S3
  • ZFS
  • btrfs

Automation / CI/CD

  • Install
  • Ansible
  • GitLab
  • LLM
  • Preseed
  • Puppet
  • Terraform
  • Ubuntu autoinstall

Monitoring / Visualisation

  • Grafana
  • Icinga
  • Prometheus
  • Monitoring
  • ELK
  • mermaid

Terraform: OpenStack

OpenStack Providery
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs

# Configure the OpenStack Provider
provider "openstack" {
  user_name   = "admin"
  tenant_name = "admin"
  password    = "pwd"
  auth_url    = "http://myauthurl:5000/v2.0"
  region      = "RegionOne"
}

# cloud.yaml
provider "openstack" {
  cloud      = "dev-foo"
}

Router
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/networking_router_v2

resource "openstack_networking_router_v2" "router_1" {
  name       = "foo-router"
  external_network_id = "88934cac-8d55-40d5-8ff9-bde65011741d"
}

resource "openstack_networking_router_interface_v2" "terraform" {
  router_id = openstack_networking_router_v2.router_1.id
  subnet_id = openstack_networking_subnet_v2.subnet_1.id
}

Compute
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_instance_v2

resource "openstack_compute_instance_v2" "basic" {
  name            = "basic"
  image_id        = "ad091b52-742f-469e-8f3c-fd81cadf0743"
  flavor_id       = "3"
  key_pair        = "my_key_pair_name"
  security_groups = ["default"]

  metadata = {
    this = "that"
  }

  network {
    name = "my_network"
  }
}

Image

data "openstack_images_image_v2" "image_ubuntu_2204" {
  name = "Ubuntu 22.04"
  most_recent = true
}

Floating IP
# network
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/networking_floatingip_v2
# compute
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_floatingip_v2

resource "openstack_networking_floatingip_v2" "fip_1" {
  pool = "public"
}

resource "openstack_compute_floatingip_associate_v2" "fip_1" {
  floating_ip = openstack_networking_floatingip_v2.fip_1.address
  instance_id = openstack_compute_instance_v2.bastion.id
}

openstack-check.tf

RustDesk - free TeamViewer alternative

Install
https://github.com/rustdesk/rustdesk/releases/latest

RUSTDESK_RELEASE=$(curl -s https://api.github.com/repos/rustdesk/rustdesk/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
URL=https://github.com/rustdesk/rustdesk/releases/download/${RUSTDESK_RELEASE}/rustdesk-${RUSTDESK_RELEASE}-x86_64.deb
wget ${URL} -qP /tmp/
#sudo apt install -y libxdo3 curl
sudo dpkg -i /tmp/rustdesk-*-x86_64.deb
sudo apt --fix-broken -y install

Disable rustdesk service

sudo systemctl disable rustdesk.service

Install rustdesk with Ansible

- hosts: localhost
  tasks:
    - name: Install rustdesk
      become: true
      block:          
        - name: Get latest rustdesk version
          ansible.builtin.uri:
            url: https://api.github.com/repos/rustdesk/rustdesk/releases/latest
            return_content: yes
          register: rustdesk_version

        - name: Set rustdesk version
          ansible.builtin.set_fact:
            rustdesk_release: "{{ rustdesk_version.json.tag_name }}"      

        - name: Install rustdesk {{ rustdesk_release }} binary
          ansible.builtin.apt:
            deb: https://github.com/rustdesk/rustdesk/releases/download/{{ rustdesk_release }}/rustdesk-{{ rustdesk_release }}-x86_64.deb

        - name: Disable rustdesk service
          ansible.builtin.service:
            name: rustdesk
            enabled: no
            state: stopped

Links
https://rustdesk.com/
https://github.com/rustdesk/rustdesk

https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/

Flash LineageOS to Samsung Android phone

Samsung Galaxy Note 3 LTE (SM-N9005/P) hlte
https://download.lineageos.org/hlte

wget https://mirror.selfnet.de/lineageos/full/hlte/20200425/lineage-16.0-20200425-nightly-hlte-signed.zip -P /tmp

Samsung Galaxy Tab 2 7.0
https://forum.xda-developers.com/galaxy-tab-2/galaxy-tab-2-unified/rom-lineageos-14-1-t3661609
https://samfrew.com/de/download/Galaxy__Tab__2__7.0__WiFi__/355o/AUT/P3110XXDNE1/P3110AUTDNE1/
https://dl.twrp.me/p3110/twrp-3.1.1-0-p3110.img.html

Samsung GalaxyTab Pro SM-T520 LineageOS 17.1 on Android 10
https://forum.xda-developers.com/t/rom-sm-t520-sm-t900-unofficial-lineageos-17-1-android-10.4274047/

https://ava2.androidfilehost.com/dl/EZstcHbizmZt00wW1qfNXw/1650126526/12420606652095398156/twrp-3.2.1-0-n2awifi.img?
blob:https://mega.nz/e38a9ec3-035d-4a25-a1af-983be82f7462
https://netcologne.dl.sourceforge.net/project/opengapps/arm/20220215/open_gapps-arm-10.0-pico-20220215.zip

sudo apt install heimdall-flash

Vol- + Home + Power
heimdall flash --RECOVERY twrp-3.2.1-0-n2awifi.img --no-reboot
Vol+ + Home + Power

LineageOS 17.1 on Samsung Galaxy Tab PRO 10.1 / SM-T520 / n2awifi

Install Home Assistant on Android

# Download Tmux APK
https://f-droid.org/de/packages/com.termux/
https://f-droid.org/repo/com.termux_118.apk

Find router binding_host_id mismatch

ROUTER_ID=f2d3e40f-cea5-4a2b-bac7-eba0700f449c

# DB
openstack port list --device-owner network:router_gateway --router ${ROUTER_ID} -c id -f value | xargs openstack port show -c binding_host_id -f value

# active
openstack network agent list --router ${ROUTER_ID} --long -f json | jq -r '.[] | select(."HA State" == "active").Host'
ROUTER_IDS=$(openstack router list  -c ID -f value)
for ROUTER_ID in ${ROUTER_IDS}; do
    ROUTER_PORT_ID=$(openstack port list --device-owner network:router_gateway --router ${ROUTER_ID} -c id -f value)
    ROUTER_NODE_DB=""
    if [ ! -z ${ROUTER_PORT_ID} ]; then
        ROUTER_NODE_DB=$(openstack port show ${ROUTER_PORT_ID} -c binding_host_id -f value)    
    fi
    ROUTER_NODE_ACTIVE=$(openstack network agent list --router ${ROUTER_ID} --long -f json | jq -r '.[] | select(."HA State" == "active").Host')

    if [ ":${ROUTER_NODE_DB}:" != ":${ROUTER_NODE_ACTIVE}:" ]; then
        echo "ROUTER_ID: ${ROUTER_ID}"
        echo "ROUTER_NODE_DB: ${ROUTER_NODE_DB}"
        echo "ROUTER_NODE_ACTIVE: ${ROUTER_NODE_ACTIVE}"
        echo
    fi
done

Debug VPN script

#!/bin/bash

export DEBUG=@option.debug@
export VPN_CONNECTION_ID=$(echo @option.vpn_connection_id@ | sed -e 's/^[[:space:]]*//')

[ "${DEBUG}" == "yes" ] && set -x

source /etc/kolla/admin-openrc.sh
source /usr/local/pyenv/versions/osc/bin/activate

# check parameter
if [[ ! ${VPN_CONNECTION_ID//-/} =~ ^[[:xdigit:]]{32}$ ]]; then
#if [ -z "${VPN_CONNECTION_ID}" ]; then
    echo -e "\e[34mPlease specify the VPN ipsec site connection ID"
    openstack vpn ipsec site connection list --long

    exit
fi 


VPN_CONNECTION_JSON=$(openstack vpn ipsec site connection show ${VPN_CONNECTION_ID} -f json)

echo -e "\e[34mVPN Connection:"
openstack vpn ipsec site connection show "${VPN_CONNECTION_ID}" | grep -v "Pre-shared Key"

VPN_SERVICE_ID=$(echo ${VPN_CONNECTION_JSON} | jq -r '."VPN Service"')
echo -e "\n\e[34mVPN Service:"
openstack vpn service show ${VPN_SERVICE_ID}

LOCAL_ENDPOINT_GROUP_ID=$(echo ${VPN_CONNECTION_JSON} | jq -r '."Local Endpoint Group ID"')
echo -e "\n\e[34mLocal Endpoint:"
openstack vpn endpoint group show ${LOCAL_ENDPOINT_GROUP_ID}

LOCAL_ENDPOINT_TYPE=$(openstack vpn endpoint group show ${LOCAL_ENDPOINT_GROUP_ID} -f json | jq -r '.Type')
if [ "${LOCAL_ENDPOINT_TYPE}" == "subnet" ]; then
    echo -e "\n\e[34mLocal Endpoint subnets:"
    LOCAL_ENDPOINT_SUBNETS=$(openstack vpn endpoint group show ${LOCAL_ENDPOINT_GROUP_ID} -f json | jq -r '.Endpoints[]')
    for SUBNET in ${LOCAL_ENDPOINT_SUBNETS}; do
        openstack subnet show ${SUBNET}
    done
fi

PEER_ENDPOINT_GROUP_ID=$(echo ${VPN_CONNECTION_JSON} | jq -r '."Peer Endpoint Group ID"')
echo -e "\n\e[34mPeer Endpoint:"
openstack vpn endpoint group show ${PEER_ENDPOINT_GROUP_ID}

PEER_ENDPOINT_TYPE=$(openstack vpn endpoint group show ${PEER_ENDPOINT_GROUP_ID} -f json | jq -r '.Type')
if [ "${PEER_ENDPOINT_TYPE}" == "subnet" ]; then
    echo -e "\n\e[34mPeer Endpoint subnets:"
    PEER_ENDPOINT_SUBNETS=$(openstack vpn endpoint group show ${PEER_ENDPOINT_GROUP_ID} -f json | jq -r '.Endpoints[]')
    for SUBNET in ${PEER_ENDPOINT_SUBNETS}; do
        openstack subnet show ${SUBNET}
    done
fi

Ventoy ISO boot

Install
https://github.com/ventoy/Ventoy/releases/

URL=https://github.com/ventoy/Ventoy/releases/download/v1.1.09/ventoy-1.1.09-linux.tar.gz
DEV=/dev/sdX

wget ${URL} -qO /tmp/ventoy-linux.tar.gz
tar xzf /tmp/ventoy-linux.tar.gz -C /tmp/
chmod +x -R /tmp/ventoy-*/tool/x86_64
# sudo ln -s /usr/sbin/mkfs.exfat /usr/local/sbin/mkexfatfs
sudo /tmp/ventoy-*/Ventoy2Disk.sh -l -i ${DEV}

Copy ISOs

cp *.iso /media/*/Ventoy/

Links
https://www.ventoy.net/en/doc_start.html
https://netboot.xyz/docs/booting/iso

Home Assistant MQTT

Install MQTT broker (server) on Anroid
https://apkpure.com/mqtt-broker-app/server.com.mqtt/download

Create MQTT sensor
https://www.home-assistant.io/integrations/sensor.mqtt/

~/.homeassistant/configuration.yaml
/mnt/data/supervisor/homeassistant/configuration.yaml (on Raspery PI)

...
mqtt: !include inverter.yaml

~/.homeassistant/inverter.yaml

sensor:
sensor:
  - name: "All inverter AC power"       
    unique_id: "inverter_total_ac_power"
    state_topic: "inverter/total/P_AC"
    unit_of_measurement: "W"
  - name: "All inverter yield day"        
    unique_id: "inverter_total_yield_day"    
    state_topic: "inverter/total/YieldDay"
    unit_of_measurement: "Wh"

  - name: "Inverter AC Power"
    unique_id: "inverter_ac"
    state_topic: "inverter/HM/ch0/P_AC"
    unit_of_measurement: "Wh"
    device_class: "energy"
    state_class: "measurement"
  - name: "Inverter DC Power"
    unique_id: "inverter_dc"
    state_topic: "inverter/HM/ch0/P_DC"
    unit_of_measurement: "W"
    state_class: "measurement"
  - name: "Inverter DC Volt CH1"
    unique_id: "inverter_dc_volt_ch1"
    state_topic: "inverter/HM/ch1/U_DC"
    unit_of_measurement: "V"
    state_class: "measurement"
  - name: "Inverter DC Current CH1"
    unique_id: "inverter_dc_current_ch1"
    state_topic: "inverter/HM/ch1/I_DC"
    unit_of_measurement: "A"
    state_class: "measurement"
  - name: "Inverter DC Power CH1"
    unique_id: "inverter_dc_ch1"
    state_topic: "inverter/HM/ch1/P_DC"
    unit_of_measurement: "W"
    state_class: "measurement"

  - name: "Inverter DC Volt CH2" 
    unique_id: "inverter_dc_volt_ch2"
    state_topic: "inverter/HM/ch2/U_DC"  
    unit_of_measurement: "V"            
    state_class: "measurement"
  - name: "Inverter DC Current CH2"
    unique_id: "inverter_dc_current_ch2"
    state_topic: "inverter/HM/ch2/I_DC"      
    unit_of_measurement: "A"           
    state_class: "measurement"  
  - name: "Inverter DC Power CH2"
    unique_id: "inverter_dc_ch2"
    state_topic: "inverter/HM/ch2/P_DC"
    unit_of_measurement: "W"
    state_class: "measurement"
  - name: "Inverter Yield Day"
    unique_id: "inverter_yield_day"
    state_topic: "inverter/HM/ch0/YieldDay"
    unit_of_measurement: "Wh"
  - name: "Inverter Yield Total"
    unique_id: "inverter_yield_total"
    state_topic: "inverter/HM/ch0/YieldTotal"
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: "measurement"
  - name: "Inverter Temperature"
    unique_id: "inverter_temperature"
    state_topic: "inverter/HM/ch0/Temp"
    unit_of_measurement: "°C"
    icon: "mdi:thermometer"

Install mosquitto (MQTT broker) on Raspery PI OS as docker container

ahoy / Open DTU

Download esptoo
https://github.com/espressif/esptool/releases

#pip install esptool
#git clone git@github.com:marcelstoer/nodemcu-pyflasher.git
#git clone https://github.com/espressif/esptool.git /tmp/esptool

wget https://github.com/espressif/esptool/releases/download/v4.7.0/esptool-v4.7.0-linux-amd64.zip -q -O /tmp/esptool.zip
unzip /tmp/esptool.zip -d /tmp
chmod +x /tmp/esptool-linux-amd64/esptool

Download ahoy firmware
https://github.com/lumapu/ahoy/releases
https://fw.ahoydtu.de/fw/release/

# dev
#URL=https://nightly.link/lumapu/ahoy/workflows/compile_development/development03/ahoydtu_dev.zip

# stable
AHOY_RELEASE=0.8.156
URL=https://github.com/lumapu/ahoy/releases/download/ahoy_v${AHOY_RELEASE}/ahoy_v${AHOY_RELEASE}.zip

wget ${URL} -q -O /tmp/ahoydtu.zip

# extract
unzip /tmp/ahoydtu.zip -d /tmp

Flash Ahoy DTU

# get chip id
sudo  /tmp/esptool-linux-amd64/esptool   --port /dev/ttyUSB0   --baud 115200  chip_id | grep "Chip is"

# Flash firmware
# ESP8266 (Wemos D1 Mini / ESP8266EX)
AHOY_FW=/tmp/ESP8266/2*_esp8266-minimal.bin
# ESP32 (ESP32 WROOM32)
AHOY_FW=/tmp/ESP32/*_esp32-wroom32.bin
# opendtu-generic_esp32.factory.bin

sudo chmod 777  /dev/ttyUSB0

eval /tmp/esptool-linux-amd64/esptool \
  --port /dev/ttyUSB0 \
  --baud 115200 \
  --after hard_reset \
  write_flash \
  --flash_size detect \
  --flash_mode dio \
  --erase-all \
  0x00000 \
  "${AHOY_FW}"

# ESP32 (ESP32 WROOM32)
#/tmp/esptool/esptool.py --port /dev/ttyUSB0 --chip esp32 --before default_reset --after hard_reset   write_flash --flash_mode dout --flash_freq 40m --flash_size detect   0x1000 bootloader.bin   0x8000 partitions.bin   0x10000 230927_ahoy_0.7.60_963e618_esp32.bin


# esptool.py --port /dev/ttyUSB0 --chip esp32 --before default_reset --after hard_reset \
  write_flash --flash_mode dout --flash_freq 40m --flash_size detect \
  0x0 opendtu-generic*.factory.bin

Wiring ESP8266

Image copyright:AhoyDTU.de

Export server volume as image

SERVER_IDS="
dd799bc6-ded0-4f20-8f24-3e5af5250fd3
46562d71-ba00-47b7-872a-cd759abd014c
5e517453-c87f-4426-b705-96ffc9afe4ce
"

function save_image() {
    IMAGE_ID="${1}"
    IMAGE_NAME="${2}"

    echo "IMAGE_ID: ${IMAGE_ID}"
    openstack image set --private ${IMAGE_ID}    

    echo "Save image as ${IMAGE_NAME}.qcow2 ..."
    openstack image save ${IMAGE_ID} --file ${IMAGE_NAME}.qcow2

    openstack image show ${IMAGE_ID} -c size -f value
    ls -l ${IMAGE_NAME}.qcow2
    md5sum ${IMAGE_NAME}.qcow2 > ${IMAGE_NAME}.qcow2.md5sum

    openstack image show ${IMAGE_ID} -f json > ${IMAGE_NAME}.json

    echo "Delete image ${IMAGE_NAME}"
    openstack image delete ${IMAGE_ID}
}


for SERVER_ID in ${SERVER_IDS}; do
    echo "SERVER_ID: ${SERVER_ID}"
    SERVER_JSON=$(openstack server show ${SERVER_ID} -f json)

    SERVER_NAME=$(echo ${SERVER_JSON} | jq -r .name | tr " " "_")
    echo "SERVER_NAME: ${SERVER_NAME}"
    SERVER_STATUS=$(echo ${SERVER_JSON} | jq -r .status)
    echo "SERVER_STATUS: ${SERVER_STATUS}"
    SERVER_IMAGE=$(echo ${SERVER_JSON} | jq -r .image)
    echo "SERVER_IMAGE: ${SERVER_IMAGE}"

    openstack server show ${SERVER_ID} -f json > ${SERVER_ID}.json

    if [ "${SERVER_IMAGE}" != "N/A (booted from volume)" ]; then
        FLAVOR_ID=$(echo ${SERVER_JSON} | jq -r .flavor | cut -d "(" -f2 | cut -d")" -f1)
        FLAVOR_DISK=$(openstack flavor show ${FLAVOR_ID} -c disk -f value)
        echo "FLAVOR_DISK: ${FLAVOR_DISK}"

        IMAGE_NAME="${SERVER_ID}_image_$(date -I)"

        echo "Create image ${IMAGE_NAME} ..."
        IMAGE_ID=$(openstack server image create --wait --name ${IMAGE_NAME} ${SERVER_ID} -c id -f value)

        save_image "${IMAGE_ID}" "${IMAGE_NAME}"
    fi

Pagination

  • First page
  • Previous page
  • Page 1
  • Page 2
  • Page 3
  • Page 4
  • Page 5
  • Page 6
  • Page 7
  • Page 8
  • Page 9
  • …
  • Next page
  • Last page
Profiles GitHub StackOverflow LinkedIn Xing
Contact Imprint
© panticz 2026

Cookie-Einstellungen

Diese Website nutzt eingebettete Inhalte von Drittanbietern (z.B. YouTube, SoundCloud). Beim Laden dieser Inhalte werden Daten an die jeweiligen Anbieter übermittelt. Datenverarbeitungserklärung