<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TECHDOC – High Availability IT &amp; Automation</title>
	<atom:link href="https://www.techdoc.at/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.techdoc.at</link>
	<description>Proxmox, OPNsense, Linux &#38; WordPress für kleine Unternehmen</description>
	<lastBuildDate>Wed, 07 Oct 2026 12:14:30 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.techdoc.at/wp-content/uploads/2026/01/cropped-cropped-TechdocLogo2026-32x32.png</url>
	<title>TECHDOC – High Availability IT &amp; Automation</title>
	<link>https://www.techdoc.at</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>pihole &#8211; LXC auf PvE</title>
		<link>https://www.techdoc.at/pihole-lxc-auf-pve/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pihole-lxc-auf-pve</link>
					<comments>https://www.techdoc.at/pihole-lxc-auf-pve/#respond</comments>
		
		<dc:creator><![CDATA[Michael Schneider]]></dc:creator>
		<pubDate>Sat, 27 Jun 2026 16:54:18 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://www.techdoc.at/?p=479</guid>

					<description><![CDATA[Pihole Installation Für den Anfang ok aber wird dann nach einiger Zeit auf (2) Hide domains and clients umgestellt, da [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="903" height="687" src="https://www.techdoc.at/wp-content/uploads/2026/06/image.png" alt="" class="wp-image-480" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image.png 903w, https://www.techdoc.at/wp-content/uploads/2026/06/image-300x228.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-768x584.png 768w" sizes="(max-width: 903px) 100vw, 903px" /></figure>



<pre class="wp-block-code"><code>apt update &amp;&amp; apt upgrade -y &amp;&amp; apt install curl</code></pre>



<div class="wp-block-uagb-advanced-heading uagb-block-944244e6"><h2 class="uagb-heading-text">Pihole Installation</h2></div>



<pre class="wp-block-code"><code>curl -sSL https://install.pi-hole.net | bash</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-1.png" alt="" class="wp-image-483" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-1.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-1-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-1-768x527.png 768w" sizes="(max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-2.png" alt="" class="wp-image-484" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-2.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-2-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-2-768x527.png 768w" sizes="(max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-3.png" alt="" class="wp-image-485" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-3.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-3-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-3-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-4.png" alt="" class="wp-image-486" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-4.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-4-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-4-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-5.png" alt="" class="wp-image-487" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-5.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-5-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-5-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-6.png" alt="" class="wp-image-488" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-6.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-6-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-6-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<p class="wp-block-paragraph">Für den Anfang ok aber wird dann nach einiger Zeit auf (2) Hide domains and clients umgestellt, da ein absolut Anonymer Service wichtig ist.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-7.png" alt="" class="wp-image-489" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-7.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-7-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-7-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="818" height="561" src="https://www.techdoc.at/wp-content/uploads/2026/06/image-8.png" alt="" class="wp-image-491" srcset="https://www.techdoc.at/wp-content/uploads/2026/06/image-8.png 818w, https://www.techdoc.at/wp-content/uploads/2026/06/image-8-300x206.png 300w, https://www.techdoc.at/wp-content/uploads/2026/06/image-8-768x527.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></figure>



<p class="wp-block-paragraph">Adminpasswort am besten gleich ändern.</p>



<pre class="wp-block-code"><code>pihole -a -p</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.techdoc.at/pihole-lxc-auf-pve/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>usrv01 &#8211; Ubuntu Server 01</title>
		<link>https://www.techdoc.at/usrv01-ubuntu-server-01/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usrv01-ubuntu-server-01</link>
					<comments>https://www.techdoc.at/usrv01-ubuntu-server-01/#respond</comments>
		
		<dc:creator><![CDATA[Michael Schneider]]></dc:creator>
		<pubDate>Sat, 23 May 2026 14:23:23 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://www.techdoc.at/?p=432</guid>

					<description><![CDATA[Die ersten Schritte für jede VM Als erstes bekommt jede VM eine statische IP Adresse: Passwordless Login Ich habe einen [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Die ersten Schritte für jede VM</h2>



<p class="wp-block-paragraph">Als erstes bekommt jede VM eine statische IP Adresse:</p>



<pre class="wp-block-code"><code>sudo nano /etc/netplan/50-cloud-init.yaml</code></pre>



<pre class="wp-block-code"><code>network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: false
      addresses:
        - 10.10.0.10/24
      routes:
        - to: default
          via: 10.10.0.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4</code></pre>



<pre class="wp-block-code"><code>sudo chmod 600 /etc/netplan/50-cloud-init.yaml
sudo rm -r /etc/netplan/00-installer-config.yaml
sudo netplan apply</code></pre>



<h2 class="wp-block-heading">Passwordless Login</h2>



<p class="wp-block-paragraph">Ich habe einen SSH Key auf meinem Notebook erstellt um mich ohne Passwort auf meinen Servern einzuloggen.</p>



<pre class="wp-block-code"><code>scp -R id_ed25519.pub mschneider@10.10.0.10:/home/mschneider/</code></pre>



<p class="wp-block-paragraph"> Auf meiner PVE Maschine einloggen.</p>



<pre class="wp-block-code"><code>mkdir -p ~/.ssh
cat id_ed25519.pub &gt;&gt; .ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys</code></pre>



<p class="wp-block-paragraph">Auf PVE VIM installieren und einige SSH Einstellungen durchführen</p>



<pre class="wp-block-code"><code>sudo vim /etc/ssh/sshd_config</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="577" height="289" src="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png" alt="" class="wp-image-424" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png 577w, https://www.techdoc.at/wp-content/uploads/2026/05/grafik-300x150.png 300w" sizes="auto, (max-width: 577px) 100vw, 577px" /></figure>



<p class="wp-block-paragraph">Zum kopieren</p>



<pre class="wp-block-code"><code>PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys</code></pre>



<pre class="wp-block-code"><code>sudo apt install -y ca-certificates curl gnupg</code></pre>



<h2 class="wp-block-heading">Updates durchführen</h2>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade -y</code></pre>



<h2 class="wp-block-heading">Docker installieren</h2>



<pre class="wp-block-code"><code>sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb &#91;arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</code></pre>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo usermod -aG docker mschneider</code></pre>



<h2 class="wp-block-heading">4TB Datastorage einrichten</h2>



<p class="wp-block-paragraph">Mit diesen Befehlen wird nachgesehen welchen Laufwerksnamen der 4TB Storage hat und ein Filesystem damit erstellt.</p>



<pre class="wp-block-code"><code>lsblk</code></pre>



<pre class="wp-block-code"><code>sudo mkfs.ext4 /dev/sdb</code></pre>



<p class="wp-block-paragraph">Ein Mount Verzeichnis und automatischer Mount wird nun erstellt.</p>



<pre class="wp-block-code"><code>sudo mkdir -p /mnt/nextcloud-data
sudo mount /dev/sdb /mnt/nextcloud-data</code></pre>



<p class="wp-block-paragraph">Die UUID kopieren</p>



<pre class="wp-block-code"><code>sudo blkid /dev/sdb</code></pre>



<pre class="wp-block-code"><code>sudo nano /etc/fstab</code></pre>



<p class="wp-block-paragraph">Folgende Zeile mit der UUID versehen und in die FSTAB schreiben</p>



<pre class="wp-block-code"><code>UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /mnt/nextcloud-data  ext4  defaults  0  2</code></pre>



<p class="wp-block-paragraph">Kontrolliert kann es mit folgenden Befehl werden.</p>



<pre class="wp-block-code"><code>df -h | grep nextcloud</code></pre>



<h2 class="wp-block-heading">Nextcloud Data Verzeichnis erstellen</h2>



<p class="wp-block-paragraph">Nun wird alles für Docker vorbereitet.</p>



<pre class="wp-block-code"><code>sudo mkdir -p /mnt/nextcloud-data/data
sudo mkdir -p /mnt/nextcloud-data/db

sudo chown -R mschneider:mschneider /mnt/nextcloud-data</code></pre>



<p class="wp-block-paragraph">Docker Compose Verzeichnis erstellen</p>



<pre class="wp-block-code"><code>mkdir -p ~/nextcloud
nano ~/nextcloud/docker-compose.yml</code></pre>



<pre class="wp-block-code"><code>services:
  db:
    image: mariadb:10.11
    container_name: nextcloud-db
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - /mnt/nextcloud-data/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootPasswortAendern
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloudPasswortAendern

  redis:
    image: redis:alpine
    container_name: nextcloud-redis
    restart: always

  app:
    image: nextcloud:latest
    container_name: nextcloud-app
    restart: always
    ports:
      - "8080:80"
    volumes:
      - /mnt/nextcloud-data/data:/var/www/html
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloudPasswortAendern
      - REDIS_HOST=redis
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.techdoc.at 10.10.0.10
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=adminPasswortAendern
    depends_on:
      - db
      - redis</code></pre>



<h2 class="wp-block-heading">Nextcloud verwalten</h2>



<p class="wp-block-paragraph">Nun wird Nextcloud gestartet</p>



<pre class="wp-block-code"><code>cd ~/nextcloud
docker compose up -d</code></pre>



<p class="wp-block-paragraph">Logs auslesen</p>



<pre class="wp-block-code"><code>docker compose logs -f</code></pre>



<pre class="wp-block-code"><code>docker compose logs db</code></pre>



<pre class="wp-block-code"><code>docker compose logs app</code></pre>



<p class="wp-block-paragraph">Docker abdrehen</p>



<pre class="wp-block-code"><code>docker compose down</code></pre>



<h2 class="wp-block-heading">Traefik einrichten</h2>



<p class="wp-block-paragraph">Traefik einrichten um Letsencrypt und HA Proxy funktionen für Docker zu haben</p>



<pre class="wp-block-code"><code>cd ~/nextcloud</code></pre>



<p class="wp-block-paragraph">Nextcloud stoppen da wir verwaltung zukünftig nur über Traefik läuft.</p>



<pre class="wp-block-code"><code>docker compose down</code></pre>



<p class="wp-block-paragraph">Alle Daten löschen da noch nichts eingerichtet wurde.</p>



<pre class="wp-block-code"><code>sudo rm -rf /mnt/nextcloud-data/db/*
sudo rm -rf /mnt/nextcloud-data/data/*
sudo mv docker-compose.yml ..</code></pre>



<p class="wp-block-paragraph">Nun wird eine neue Datei erstellt.</p>



<pre class="wp-block-code"><code>sudo vi docker-compose.yml</code></pre>



<p class="wp-block-paragraph">Hier müssen folgende Werte angepasst werden.<br><code>deine@email.at</code> → deine echte Email für Let&#8217;s Encrypt <br><code>rootPasswortAendern</code> → sicheres Passwort <br><code>nextcloudPasswortAendern</code> → sicheres Passwort <br><code>adminPasswortAendern</code> → dein Nextcloud Admin Passwort</p>



<pre class="wp-block-code"><code>services:
  traefik:
    image: traefik:v2.11
    container_name: traefik
    restart: always
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=deine@email.at"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik-letsencrypt:/letsencrypt
    networks:
      - proxy

  db:
    image: mariadb:10.11
    container_name: nextcloud-db
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - /mnt/nextcloud-data/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootPasswortAendern
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloudPasswortAendern
    networks:
      - internal

  redis:
    image: redis:alpine
    container_name: nextcloud-redis
    restart: always
    networks:
      - internal

  app:
    image: nextcloud:latest
    container_name: nextcloud-app
    restart: always
    volumes:
      - /mnt/nextcloud-data/data:/var/www/html
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloudPasswortAendern
      - REDIS_HOST=redis
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.techdoc.at
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=adminPasswortAendern
      - OVERWRITEPROTOCOL=https
      - OVERWRITECLIURL=https://cloud.techdoc.at
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.rule=Host(`cloud.techdoc.at`)"
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
      - "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
      - "traefik.http.routers.nextcloud.middlewares=nextcloud-headers"
      - "traefik.http.middlewares.nextcloud-headers.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.nextcloud-headers.headers.stsIncludeSubdomains=true"
    depends_on:
      - db
      - redis
      - traefik
    networks:
      - proxy
      - internal

volumes:
  traefik-letsencrypt:

networks:
  proxy:
    external: false
  internal:
    external: false</code></pre>



<p class="wp-block-paragraph">Nun den Service starten</p>



<pre class="wp-block-code"><code>docker compose up -d</code></pre>



<p class="wp-block-paragraph">Die Logs kontrollieren</p>



<pre class="wp-block-code"><code>docker compose logs -f traefik</code></pre>



<h2 class="wp-block-heading">CronJob und Logrotate einrichten</h2>



<p class="wp-block-paragraph">Für die Firma Gapart verwalte ich eine WordPress Seite mit Woocommerce die auf meinem Webspace läuft. Damit alles reibungslos und automatisiert funktioniert, erstelle ich einen CronJob dafür.</p>



<p class="wp-block-paragraph">Ebenso habe ich auch für meine Nextcloud Instanz einen Cronjob erstellt.</p>



<pre class="wp-block-code"><code>mkdir ~/bin
vi ~/bin/gapart-cron.sh</code></pre>



<pre class="wp-block-code"><code>#!/bin/bash
LOG=/var/log/gapart-cron.log

CODE=$(/usr/bin/curl -sS -m 60 -o /dev/null -w '%{http_code}' \
       "https://gapart.shop/wp-cron.php?doing_wp_cron")

echo "$(date '+%Y-%m-%d %H:%M') $CODE" &gt;&gt; "$LOG"</code></pre>



<pre class="wp-block-code"><code>chmod +x ~/bin/gapart-cron.sh</code></pre>



<pre class="wp-block-code"><code>crontab -e</code></pre>



<pre class="wp-block-code"><code>*/5 * * * * docker exec -u www-data nextcloud-app php /var/www/html/cron.php
*/15 * * * * /home/mschneider/bin/gapart-cron.sh
0 2 * * * /opt/malenohneende/ftp-optimize.sh
</code></pre>



<pre class="wp-block-code"><code>sudo touch /var/log/gapart-cron.log &amp;&amp; sudo chown mschneider:mschneider /var/log/gapart-cron.log

sudo chmod 666 -R /var/log/gapart-cron.log</code></pre>



<pre class="wp-block-code"><code>sudo vim /etc/logrotate.d/gapart</code></pre>



<pre class="wp-block-code"><code>/var/log/gapart-cron.log /var/log/gapart-backup.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
}</code></pre>



<pre class="wp-block-code"><code>sudo vim /etc/logrotate.d/maleohneende</code></pre>



<pre class="wp-block-code"><code>/var/log/malenohneende-ftp.log /var/log/malenohneende-ftp-backup.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
}</code></pre>



<h2 class="wp-block-heading">Maleohneende FTP</h2>



<pre class="wp-block-code"><code>sudo apt install libheif-examples imagemagick</code></pre>



<pre class="wp-block-code"><code>sudo mkdir -p /opt/malenohneende</code></pre>



<pre class="wp-block-code"><code>sudo vim /opt/malenohneende/ftp-optimize.sh</code></pre>



<pre class="wp-block-code"><code>#!/bin/bash
# ============================================================
#  Naechtliche Bildoptimierung fuer malenohneende.at  (SICHER v2)
#
#  Ablauf pro Bild, streng nacheinander:
#    1. Datei vom Server herunterladen (rclone prueft Integritaet)
#    2. HEIC-&gt;JPG konvertieren und/oder verkleinern+komprimieren
#    3. In eine TEMP-Datei am Server hochladen
#    4. Groesse lokal vs. hochgeladen exakt vergleichen
#    5. NUR bei exakter Uebereinstimmung serverseitig umbenennen
#       -&gt; Die Live-Datei wird erst im letzten, schnellen Schritt
#          ersetzt. Ein Abbruch kann sie nie zerstoeren.
#
#  Empfohlen: rclone-Remote "webspace" als SFTP (stabiler als FTPS).
#  Voraussetzung: ImageMagick + libheif
#    sudo apt install imagemagick libheif-examples
#
#  Cron (taeglich 02:00):
#    0 2 * * * /opt/malenohneende/ftp-optimize.sh
# ============================================================

set -u

# ===================== KONFIGURATION =====================
WEB_REMOTE="webspace"
WEB_BASE="wp-content/uploads"
WORKDIR="/opt/malenohneende"
STATE="$WORKDIR/state"
LOG="/var/log/malenohneende-ftp.log"
LOCK="/tmp/malenohneende-ftp.lock"
MAX="2000x2000&gt;"
QUALI=85
KATEGORIEN="uebermich aquarell oelpastellen tinteumonochrom maltechnikdetails verschiedenes"
# =========================================================

if command -v magick &gt;/dev/null 2&gt;&amp;1; then IM="magick"; else IM="convert"; fi
log(){ echo "$(date '+%F %T')  $*" &gt;&gt; "$LOG"; }

# Remote-Dateigroesse in Bytes ermitteln
remote_size(){
  rclone size "$WEB_REMOTE:$1" --json 2&gt;/dev/null | grep -o '"bytes":&#91;0-9]*' | grep -o '&#91;0-9]*$'
}

# Sicherer Upload mit Groessenpruefung: local -&gt; temp -&gt; (Vergleich) -&gt; rename
safe_upload(){
  local lf="$1" ziel="$2" tmpz="${2}.uptmp"
  local localsize remotesize

  localsize=$(stat -c%s "$lf" 2&gt;/dev/null)
  if &#91; -z "$localsize" ] || &#91; "$localsize" -le 0 ]; then
    log "  !! lokale Datei leer/fehlt, Upload abgebrochen: $lf"; return 1
  fi

  # 1) Upload in Temp-Datei
  if ! rclone copyto "$lf" "$WEB_REMOTE:$tmpz" 2&gt;&gt;"$LOG"; then
    rclone deletefile "$WEB_REMOTE:$tmpz" 2&gt;/dev/null; return 1
  fi

  # 2) Groesse vergleichen (vollstaendig angekommen?)
  remotesize=$(remote_size "$tmpz")
  if &#91; -z "$remotesize" ] || &#91; "$remotesize" != "$localsize" ]; then
    log "  !! Groesse ungleich (lokal $localsize / remote ${remotesize:-0}) – Upload verworfen"
    rclone deletefile "$WEB_REMOTE:$tmpz" 2&gt;/dev/null; return 1
  fi

  # 3) Erst jetzt serverseitig umbenennen (ersetzt Original in einem Schritt)
  if ! rclone moveto "$WEB_REMOTE:$tmpz" "$WEB_REMOTE:$ziel" 2&gt;&gt;"$LOG"; then
    rclone deletefile "$WEB_REMOTE:$tmpz" 2&gt;/dev/null; return 1
  fi
  return 0
}

exec 9&gt;"$LOCK"; flock -n 9 || { log "Lauf uebersprungen (Lock aktiv)"; exit 0; }

log "=== FTP-Optimierung gestartet ==="
mkdir -p "$WORKDIR" "$STATE"

for kat in $KATEGORIEN; do
  statefile="$STATE/$kat.processed"; touch "$statefile"
  tmp="$WORKDIR/tmp/$kat"; mkdir -p "$tmp"

  liste="$(rclone lsf --format "ps" --separator "|" "$WEB_REMOTE:$WEB_BASE/$kat" 2&gt;&gt;"$LOG")" \
    || { log "  $kat: Auflisten fehlgeschlagen"; continue; }

  printf '%s\n' "$liste" | while IFS='|' read -r name size; do
    &#91; -z "$name" ] &amp;&amp; continue
    case "$name" in */) continue ;; esac
    case "$name" in *.uptmp) continue ;; esac
    endung_lc="$(printf '%s' "${name##*.}" | tr 'A-Z' 'a-z')"
    case "$endung_lc" in jpg|jpeg|png|webp|heic|heif) ;; *) continue ;; esac

    # ---- HEIC/HEIF ----
    if &#91; "$endung_lc" = "heic" ] || &#91; "$endung_lc" = "heif" ]; then
      rclone copyto "$WEB_REMOTE:$WEB_BASE/$kat/$name" "$tmp/$name" 2&gt;&gt;"$LOG" || { log "  DL-Fehler: $name"; continue; }
      ziel="$tmp/${name%.*}.jpg"; zielname="$(basename "$ziel")"
      if ! $IM "$tmp/$name" -auto-orient -quality "$QUALI" "$ziel" 2&gt;&gt;"$LOG"; then
        command -v heif-convert &gt;/dev/null 2&gt;&amp;1 &amp;&amp; heif-convert -q "$QUALI" "$tmp/$name" "$ziel" &gt;&gt;"$LOG" 2&gt;&amp;1
      fi
      if &#91; -f "$ziel" ]; then
        mogrify -auto-orient -resize "$MAX" -quality "$QUALI" -strip "$ziel" 2&gt;&gt;"$LOG"
        if safe_upload "$ziel" "$WEB_BASE/$kat/$zielname"; then
          rclone deletefile "$WEB_REMOTE:$WEB_BASE/$kat/$name" 2&gt;&gt;"$LOG"
          newsize=$(stat -c%s "$ziel")
          awk -F'|' -v n="$zielname" '$1!=n' "$statefile" &gt; "$statefile.tmp" 2&gt;/dev/null; mv "$statefile.tmp" "$statefile" 2&gt;/dev/null
          echo "$zielname|$newsize" &gt;&gt; "$statefile"
          log "  HEIC-&gt;JPG + optimiert: $kat/$zielname"
        else
          log "  !! Upload-Fehler (HEIC), Original bleibt unangetastet: $kat/$name"
        fi
      else
        log "  !! HEIC-Konvertierung fehlgeschlagen: $name (libheif?)"
      fi
      rm -f "$tmp/$name" "$ziel"; continue
    fi

    # ---- JPG/PNG/WebP ----
    if awk -F'|' -v n="$name" -v s="$size" '$1==n &amp;&amp; $2==s{f=1} END{exit !f}' "$statefile"; then
      continue
    fi
    rclone copyto "$WEB_REMOTE:$WEB_BASE/$kat/$name" "$tmp/$name" 2&gt;&gt;"$LOG" || { log "  DL-Fehler: $name"; continue; }
    mogrify -auto-orient -resize "$MAX" -quality "$QUALI" -strip "$tmp/$name" 2&gt;&gt;"$LOG"
    if safe_upload "$tmp/$name" "$WEB_BASE/$kat/$name"; then
      newsize=$(stat -c%s "$tmp/$name")
      awk -F'|' -v n="$name" '$1!=n' "$statefile" &gt; "$statefile.tmp" 2&gt;/dev/null; mv "$statefile.tmp" "$statefile" 2&gt;/dev/null
      echo "$name|$newsize" &gt;&gt; "$statefile"
      log "  optimiert: $kat/$name"
    else
      log "  !! Upload-Fehler, Original bleibt unangetastet: $kat/$name"
    fi
    rm -f "$tmp/$name"
  done
done

log "=== FTP-Optimierung beendet ==="
exit 0</code></pre>



<pre class="wp-block-code"><code>sudo touch /var/log/malenohneende-ftp.log &amp;&amp; sudo chown mschneider:mschneider /var/log/malenohneende-ftp.log

sudo chmod 666 -R /var/log/malenohneende-ftp.log

sudo chown -R mschneider:mschneider /opt/malenohneende
sudo chmod 755 /opt/malenohneende
chmod +x /opt/malenohneende/ftp-optimize.sh</code></pre>



<pre class="wp-block-code"><code>sudo apt install rclone

rclone config</code></pre>



<h2 class="wp-block-heading">Passbolt Instanzen</h2>



<h3 class="wp-block-heading">Techdoc Passbolt</h3>



<pre class="wp-block-code"><code>mkdir -p ~/passbolt-techdoc</code></pre>



<pre class="wp-block-code"><code>vi ~/passbolt-techdoc/docker-compose.yml</code></pre>



<pre class="wp-block-code"><code>services:
  passbolt-techdoc-db:
    image: mariadb:10.11
    container_name: passbolt-techdoc-db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootPasswortAendern
      - MYSQL_DATABASE=passbolt
      - MYSQL_USER=passbolt
      - MYSQL_PASSWORD=dbPasswortAendern
    volumes:
      - passbolt-techdoc-db:/var/lib/mysql
    networks:
      - passbolt-techdoc

  passbolt-techdoc:
    image: passbolt/passbolt:latest-ce
    container_name: passbolt-techdoc
    restart: always
    depends_on:
      - passbolt-techdoc-db
    environment:
      - APP_FULL_BASE_URL=https://passbolt.techdoc.at
      - DATASOURCES_DEFAULT_HOST=passbolt-techdoc-db
      - DATASOURCES_DEFAULT_DATABASE=passbolt
      - DATASOURCES_DEFAULT_USERNAME=passbolt
      - DATASOURCES_DEFAULT_PASSWORD=dbPasswortAendern
      - EMAIL_TRANSPORT_DEFAULT_HOST=smtp.easyname.com
      - EMAIL_TRANSPORT_DEFAULT_PORT=465
      - EMAIL_TRANSPORT_DEFAULT_TLS=false
      - EMAIL_TRANSPORT_DEFAULT_USERNAME=office@techdoc.at
      - EMAIL_TRANSPORT_DEFAULT_PASSWORD=deinEmailPasswort
      - EMAIL_DEFAULT_FROM=office@techdoc.at
      - EMAIL_DEFAULT_FROM_NAME=Passbolt TechDoc
    volumes:
      - passbolt-techdoc-gpg:/etc/passbolt/gpg
      - passbolt-techdoc-jwt:/etc/passbolt/jwt
    command:
      &#91;
        "/usr/bin/wait-for.sh",
        "-t",
        "0",
        "passbolt-techdoc-db:3306",
        "--",
        "/docker-entrypoint.sh",
      ]
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.passbolt-techdoc.rule=Host(`passbolt.techdoc.at`)"
      - "traefik.http.routers.passbolt-techdoc.entrypoints=websecure"
      - "traefik.http.routers.passbolt-techdoc.tls.certresolver=letsencrypt"
      - "traefik.http.services.passbolt-techdoc.loadbalancer.server.port=80"
      - "traefik.http.services.passbolt-techdoc.loadbalancer.server.scheme=http"
    networks:
      - passbolt-techdoc
      - nextcloud

volumes:
  passbolt-techdoc-db:
  passbolt-techdoc-gpg:
  passbolt-techdoc-jwt:

networks:
  passbolt-techdoc:
    name: passbolt-techdoc
  nextcloud:
    external: true</code></pre>



<pre class="wp-block-code"><code>cd ~/passbolt-techdoc &amp;&amp; docker compose up -d</code></pre>



<pre class="wp-block-code"><code>docker exec -it passbolt-techdoc su -s /bin/bash -c \
  "/usr/share/php/passbolt/bin/cake passbolt register_user \
  -u office@techdoc.at -f Michael -l Schneider -r admin" www-data</code></pre>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Gapart Passbolt</h3>



<pre class="wp-block-code"><code>mkdir -p ~/passbolt-gapart</code></pre>



<pre class="wp-block-code"><code>vi ~/passbolt-gapart/docker-compose.yml</code></pre>



<pre class="wp-block-code"><code>services:
  passbolt-gapart-db:
    image: mariadb:10.11
    container_name: passbolt-gapart-db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootPasswortAendern
      - MYSQL_DATABASE=passbolt
      - MYSQL_USER=passbolt
      - MYSQL_PASSWORD=dbPasswortAendern
    volumes:
      - passbolt-gapart-db:/var/lib/mysql
    networks:
      - passbolt-gapart

  passbolt-gapart:
    image: passbolt/passbolt:latest-ce
    container_name: passbolt-gapart
    restart: always
    depends_on:
      - passbolt-gapart-db
    environment:
      - APP_FULL_BASE_URL=https://gapart-passbolt.techdoc.at
      - DATASOURCES_DEFAULT_HOST=passbolt-gapart-db
      - DATASOURCES_DEFAULT_DATABASE=passbolt
      - DATASOURCES_DEFAULT_USERNAME=passbolt
      - DATASOURCES_DEFAULT_PASSWORD=dbPasswortAendern
      - EMAIL_TRANSPORT_DEFAULT_HOST=smtp.easyname.com
      - EMAIL_TRANSPORT_DEFAULT_PORT=465
      - EMAIL_TRANSPORT_DEFAULT_TLS=false
      - EMAIL_TRANSPORT_DEFAULT_USERNAME=office@techdoc.at
      - EMAIL_TRANSPORT_DEFAULT_PASSWORD=deinEmailPasswort
      - EMAIL_DEFAULT_FROM=office@techdoc.at
      - EMAIL_DEFAULT_FROM_NAME=Passbolt Gapart
    volumes:
      - passbolt-gapart-gpg:/etc/passbolt/gpg
      - passbolt-gapart-jwt:/etc/passbolt/jwt
    command:
      &#91;
        "/usr/bin/wait-for.sh",
        "-t",
        "0",
        "passbolt-gapart-db:3306",
        "--",
        "/docker-entrypoint.sh",
      ]
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.passbolt-gapart.rule=Host(`gapart-passbolt.techdoc.at`)"
      - "traefik.http.routers.passbolt-gapart.entrypoints=websecure"
      - "traefik.http.routers.passbolt-gapart.tls.certresolver=letsencrypt"
      - "traefik.http.services.passbolt-gapart.loadbalancer.server.port=80"
      - "traefik.http.services.passbolt-gapart.loadbalancer.server.scheme=http"
    networks:
      - passbolt-gapart
      - nextcloud

volumes:
  passbolt-gapart-db:
  passbolt-gapart-gpg:
  passbolt-gapart-jwt:

networks:
  passbolt-gapart:
    name: passbolt-gapart
  nextcloud:
    external: true</code></pre>



<pre class="wp-block-code"><code>cd ~/passbolt-gapart &amp;&amp; docker compose up -d</code></pre>



<pre class="wp-block-code"><code>docker exec -it passbolt-gapart su -s /bin/bash -c \
  "/usr/share/php/passbolt/bin/cake passbolt register_user \
  -u office@techdoc.at -f Michael -l Schneider -r admin" www-data</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.techdoc.at/usrv01-ubuntu-server-01/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>opnSense &#8211; Firewall</title>
		<link>https://www.techdoc.at/opnsense-firewall/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=opnsense-firewall</link>
					<comments>https://www.techdoc.at/opnsense-firewall/#respond</comments>
		
		<dc:creator><![CDATA[Michael Schneider]]></dc:creator>
		<pubDate>Sat, 23 May 2026 12:38:11 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://www.techdoc.at/?p=430</guid>

					<description><![CDATA[PortForwarding für usrv01 einrichten. Zuerst muss am externsten Router der Port 80 und 443 auf opnSense weitergeleitet werden. Danach unter [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">PortForwarding für usrv01 einrichten.</h2>



<p class="wp-block-paragraph">Zuerst muss am externsten Router der Port 80 und 443 auf opnSense weitergeleitet werden. Danach unter Firewall &gt; NAT &gt; Destination NAT folgendes einrichten.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="600" height="665" src="https://www.techdoc.at/wp-content/uploads/2026/05/grafik-26.png" alt="" class="wp-image-471" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/grafik-26.png 600w, https://www.techdoc.at/wp-content/uploads/2026/05/grafik-26-271x300.png 271w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<p class="wp-block-paragraph">Wichtig ist dabei, dass unten bei Firewall rule Erlauben ausgewählt wird.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="600" height="665" src="https://www.techdoc.at/wp-content/uploads/2026/05/grafik-27.png" alt="" class="wp-image-472" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/grafik-27.png 600w, https://www.techdoc.at/wp-content/uploads/2026/05/grafik-27-271x300.png 271w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<div class="wp-block-uagb-advanced-heading uagb-block-0d5baac5"><h2 class="uagb-heading-text">opnSense DNS, nach pihole Einrichtung, ändern</h2></div>



<p class="wp-block-paragraph">Unter System &gt; Einstellungen &gt; Allgemein alle DNS Server entfernen und den Pihole Server eintragen.<br></p>



<p class="wp-block-paragraph">Ursprünglicher Eintrag</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="790" src="https://www.techdoc.at/wp-content/uploads/2026/05/image-2-1024x790.png" alt="" class="wp-image-497" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/image-2-1024x790.png 1024w, https://www.techdoc.at/wp-content/uploads/2026/05/image-2-300x231.png 300w, https://www.techdoc.at/wp-content/uploads/2026/05/image-2-768x592.png 768w, https://www.techdoc.at/wp-content/uploads/2026/05/image-2-1536x1184.png 1536w, https://www.techdoc.at/wp-content/uploads/2026/05/image-2-2048x1579.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Neuer Eintrag</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="790" src="https://www.techdoc.at/wp-content/uploads/2026/05/image-3-1024x790.png" alt="" class="wp-image-498" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/image-3-1024x790.png 1024w, https://www.techdoc.at/wp-content/uploads/2026/05/image-3-300x231.png 300w, https://www.techdoc.at/wp-content/uploads/2026/05/image-3-768x592.png 768w, https://www.techdoc.at/wp-content/uploads/2026/05/image-3-1536x1184.png 1536w, https://www.techdoc.at/wp-content/uploads/2026/05/image-3-2048x1579.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Damit die Webseite, die bei Easyname liegt, und die Cloud, die im internen Netz liegt, für die Wifi Benutzer erreichbar bleiben, muss ein Override in OPNsense erstellt werden. Unter Dienste > Unbound > Überschreibungen folgendes Eintragen.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="402" src="https://www.techdoc.at/wp-content/uploads/2026/05/image-5-1024x402.png" alt="" class="wp-image-502" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/image-5-1024x402.png 1024w, https://www.techdoc.at/wp-content/uploads/2026/05/image-5-300x118.png 300w, https://www.techdoc.at/wp-content/uploads/2026/05/image-5-768x301.png 768w, https://www.techdoc.at/wp-content/uploads/2026/05/image-5-1536x602.png 1536w, https://www.techdoc.at/wp-content/uploads/2026/05/image-5.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.techdoc.at/opnsense-firewall/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>usrv02 &#8211; Ubuntu Server 02</title>
		<link>https://www.techdoc.at/usrv02-ubuntu-server-02/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usrv02-ubuntu-server-02</link>
					<comments>https://www.techdoc.at/usrv02-ubuntu-server-02/#respond</comments>
		
		<dc:creator><![CDATA[Michael Schneider]]></dc:creator>
		<pubDate>Sat, 23 May 2026 11:51:36 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://www.techdoc.at/?p=427</guid>

					<description><![CDATA[Passwordless Login Ich habe einen SSH Key auf meinem Notebook erstellt um mich ohne Passwort auf meinen Servern einzuloggen. Auf [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Passwordless Login</h2>



<p class="wp-block-paragraph">Ich habe einen SSH Key auf meinem Notebook erstellt um mich ohne Passwort auf meinen Servern einzuloggen.</p>



<pre class="wp-block-code"><code>scp -R id_ed25519.pub mschneider@192.168.68.252:/home/mschneider/</code></pre>



<p class="wp-block-paragraph"> Auf meiner PVE Maschine einloggen.</p>



<pre class="wp-block-code"><code>mkdir -p ~/.ssh
cat id_ed25519.pub &gt;&gt; .ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys</code></pre>



<p class="wp-block-paragraph">Auf PVE VIM installieren und einige SSH Einstellungen durchführen</p>



<pre class="wp-block-code"><code>sudo vim /etc/ssh/sshd_config</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="577" height="289" src="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png" alt="" class="wp-image-424" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png 577w, https://www.techdoc.at/wp-content/uploads/2026/05/grafik-300x150.png 300w" sizes="auto, (max-width: 577px) 100vw, 577px" /></figure>



<pre class="wp-block-code"><code>sudo systemctl restart sshd</code></pre>



<h2 class="wp-block-heading">Updates durchführen</h2>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade -y</code></pre>



<h2 class="wp-block-heading">Zuklappen erlauben und Standby deaktivieren.</h2>



<pre class="wp-block-code"><code>sudo vim /etc/systemd/logind.conf</code></pre>



<pre class="wp-block-code"><code>&#91;Login]
HandlePowerKey=ignore  
HandleLidSwitch=ignore 
HandleLidSwitchExternalPower=ignore 
HandleLidSwitchDocked=ignore</code></pre>



<pre class="wp-block-code"><code>sudo systemctl restart systemd-logind</code></pre>



<h2 class="wp-block-heading">Docker installieren</h2>



<pre class="wp-block-code"><code># Docker offiziell installieren:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb &#91;arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# User zur Docker-Gruppe hinzufügen:
sudo usermod -aG docker mschneider

# Neu einloggen damit Gruppe aktiv wird:
newgrp docker

# Prüfen:
docker --version</code></pre>



<h2 class="wp-block-heading">Checkmk installieren</h2>



<pre class="wp-block-code"><code># Verzeichnis erstellen:
mkdir -p ~/checkmk
cd ~/checkmk

# docker-compose.yml erstellen:
cat > docker-compose.yml &lt;&lt; 'EOF'
services:
  checkmk:
    image: checkmk/check-mk-raw:latest
    container_name: checkmk
    restart: always
    ports:
      - "8080:5000"
      - "8000:8000"
    volumes:
      - /var/checkmk:/omd/sites
    environment:
      - CMK_SITE_ID=monitoring
      - CMK_PASSWORD=deinPasswortAendern
    tmpfs:
      - /opt/omd/sites/monitoring/tmp:uid=1000,gid=1000
EOF</code></pre>



<pre class="wp-block-code"><code>docker compose up -d

# Logs beobachten (dauert beim ersten Start 1-2 Minuten):
docker compose logs -f checkmk</code></pre>



<p class="wp-block-paragraph">Um ein neues Passwort zu setzen und auch den User gleich zu entsperren.</p>



<pre class="wp-block-code"><code># Schritt 1: ! aus htpasswd entfernen:
docker exec -it checkmk sed -i 's/cmkadmin:!/cmkadmin:/' /omd/sites/monitoring/etc/htpasswd

# Schritt 2: locked=True in users.mk auf False setzen:
docker exec -it checkmk sed -i "s/'locked': True/'locked': False/" /omd/sites/monitoring/etc/check_mk/multisite.d/wato/users.mk

# Prüfen ob beide Änderungen geklappt haben:
docker exec -it checkmk cat /omd/sites/monitoring/etc/htpasswd
docker exec -it checkmk grep "locked" /omd/sites/monitoring/etc/check_mk/multisite.d/wato/users.mk

#Passwort neu setzen
docker exec -it checkmk su - monitoring -c "cmk-passwd cmkadmin"

# Neu starten:
docker exec -it checkmk omd restart monitoring</code></pre>



<div class="wp-block-uagb-buttons uagb-buttons__outer-wrap uagb-btn__default-btn uagb-btn-tablet__default-btn uagb-btn-mobile__default-btn uagb-block-cfc5953b"><div class="uagb-buttons__wrap uagb-buttons-layout-wrap ">
<div class="wp-block-uagb-buttons-child uagb-buttons__outer-wrap uagb-block-3a6adc4b wp-block-button"><div class="uagb-button__wrapper"><a class="uagb-buttons-repeater wp-block-button__link" aria-label="" href="http://192.168.68.252:8080/monitoring" rel="follow noopener" target="_self" role="button"><div class="uagb-button__link">Checkmk Link</div></a></div></div>
</div></div>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.techdoc.at/usrv02-ubuntu-server-02/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PVE &#8211; Proxmox Virtual Enviroment</title>
		<link>https://www.techdoc.at/pve-proxmox-virtual-enviroment/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pve-proxmox-virtual-enviroment</link>
					<comments>https://www.techdoc.at/pve-proxmox-virtual-enviroment/#respond</comments>
		
		<dc:creator><![CDATA[Michael Schneider]]></dc:creator>
		<pubDate>Sat, 23 May 2026 10:57:17 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://www.techdoc.at/?p=423</guid>

					<description><![CDATA[Da ich für meine Heiminfrastruktur PVE benutze werde ich hier, ein paar Einstellungen dokumentieren. Passwordless Login Ich habe einen SSH [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Da ich für meine Heiminfrastruktur PVE benutze werde ich hier, ein paar Einstellungen dokumentieren.</p>



<h2 class="wp-block-heading">Passwordless Login</h2>



<p class="wp-block-paragraph">Ich habe einen SSH Key auf meinem Notebook erstellt um mich ohne Passwort auf meinen Servern einzuloggen.</p>



<pre class="wp-block-code"><code>scp -R id_ed25519.pub root@192.168.68.254:/root/</code></pre>



<p class="wp-block-paragraph"> Auf meiner PVE Maschine einloggen.</p>



<pre class="wp-block-code"><code>mkdir -p ~/.ssh
cat id_ed25519.pub &gt;&gt; .ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys</code></pre>



<p class="wp-block-paragraph">Auf PVE VIM installieren und einige SSH Einstellungen durchführen</p>



<pre class="wp-block-code"><code>vim /etc/ssh/sshd_config</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="577" height="289" src="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png" alt="" class="wp-image-424" srcset="https://www.techdoc.at/wp-content/uploads/2026/05/grafik.png 577w, https://www.techdoc.at/wp-content/uploads/2026/05/grafik-300x150.png 300w" sizes="auto, (max-width: 577px) 100vw, 577px" /></figure>



<pre class="wp-block-code"><code>systemctl restart sshd</code></pre>



<h2 class="wp-block-heading">No subscription Meldung deaktivieren</h2>



<pre class="wp-block-code"><code>sed -i "s/Ext.Msg.show({/void({/g" \
  /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

systemctl restart pveproxy</code></pre>



<p class="wp-block-paragraph">Da es nach jedem Update neu überschrieben wird. Ein kleiner Fix</p>



<pre class="wp-block-code"><code>cat &gt; /etc/apt/apt.conf.d/99-pve-nag-fix &lt;&lt; 'EOF'
DPkg::Post-Invoke {
  "sed -i 's/Ext.Msg.show({/void({/g' \
  /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js || true";
  "systemctl restart pveproxy || true";
};
EOF</code></pre>



<h2 class="wp-block-heading">ZFS Dataset für Nextcloud einrichten</h2>



<p class="wp-block-paragraph">Mittels diesen Befehlen wird erstmal nur die aktuelle Speichergröße und die Gesundheit des ZFS ermittelt.</p>



<pre class="wp-block-code"><code>zpool list
zfs list</code></pre>



<p class="wp-block-paragraph">Nun wird der Dataset für Nextcloud erstellt.</p>



<pre class="wp-block-code"><code>zfs create -o quota=4T ZFS/nextcloud-data</code></pre>



<p class="wp-block-paragraph">Nun wird nochmal kontrolliert ob der Dataset erstellt wurde.</p>



<pre class="wp-block-code"><code>zfs list</code></pre>



<p class="wp-block-paragraph">ZFS Dataset als Storage in Proxmox registrieren</p>



<pre class="wp-block-code"><code>pvesm add zfspool nextcloud-storage \
  --pool ZFS \
  --content images \
  --nodes pve</code></pre>



<p class="wp-block-paragraph">Mit diesem Befehl können VMs und ihr<br>Status kontrolliert werden</p>



<pre class="wp-block-code"><code>qm list</code></pre>



<p class="wp-block-paragraph">Nun im neuen Dataset ein neues Disk Volume erstellen</p>



<pre class="wp-block-code"><code>pvesm alloc nextcloud-storage 101 vm-101-nextcloud 4000G</code></pre>



<p class="wp-block-paragraph">Nun wird der neue Storage der VM hinzugefügt</p>



<pre class="wp-block-code"><code>qm set 101 --scsi1 nextcloud-storage:vm-101-nextcloud</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.techdoc.at/pve-proxmox-virtual-enviroment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
