Direkt zum Hauptinhalt

Installation Docker

Beschreibung:

Installation mit Docker und self signed Zertifikat (Auch wenn es nur 7 Tage gültig ist, neustart webserver verlängert das ganze)
Dazu erstellen wir im Anschluss ein systemd Dienst der alle 6 Tage , Also vor Ablauf, Vorsicht ist die Mutter der Porzelankiste, den Conatiner neustartet. Man kann natürlich auch Lets encrypt verwenden, dazu die Caddyfile anpassen mit Domain und tls email.
Dann braucht man den Timer nicht mehr. Siehe dazu Buch Caddy

Vorrausetzungen:

apt install curl docker.io docker-compose

Installation:

Verzeichnisse Erstellen

mkdir -p /root/rei3/caddy_data
mkdir -p /root/rei3/caddy_config
mkdir -p /root/rei3/data_db
mkdir -p /root/rei3/data_app/temp
mkdir -p /root/rei3/data_app/transfer
mkdir -p /root/rei3/data_app/files
mkdir -p /root/rei3/data_app/backup
mkdir -p /root/rei3/data_app/certificates

Unsere Docker Compose Datei

nano /root/rei3/docker-compose.yml

Inhalt:

version: '3.3'

services:
    r3_db:
        container_name: r${R3_VERSION:-3.8.6}_db
        environment:
            POSTGRES_DB: ${R3_DB_NAME:-app}
            POSTGRES_USER: ${R3_DB_USER:-app}
            POSTGRES_PASSWORD: ${R3_DB_PASS:-app}
        image: postgres:latest
        restart: always
        volumes:
            - ./data_db:/var/lib/postgresql/data
    r3:
        build:
            context: https://github.com/r3-team/r3_docker.git#main
            args:
                r3_version: ${R3_VERSION:-3.8.6}
                r3_db_host: r3_db
                r3_db_name: ${R3_DB_NAME:-app}
                r3_db_user: ${R3_DB_USER:-app}
                r3_db_pass: ${R3_DB_PASS:-app}
                r3_os_arch: x64
                im_policy: /etc/ImageMagick-6/policy.xml
        container_name: r${R3_VERSION:-3.8.6}_app
        image: "r3/${R3_VERSION:-3.8.6}"
        depends_on:
            - r3_db
        #ports:
        #    - "14000:80"
        restart: always
        volumes:
            - ./data_app:/opt/r3/data
            - ./data_app/backup:/opt/r3/backup
            
    caddy:
      image: caddy:latest
      container_name: caddy-reverse-proxy
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - ./Caddyfile:/etc/caddy/Caddyfile
        - ./caddy_data:/data
        - ./caddy_config:/config
      restart: unless-stopped

Nun die Caddy File

nano /root/rei3/Caddyfile
Inhalt für Selbst signiertes Zertifikat

Es muss ein DNS vergeben sein, diesen zum beispiel in die hosts Datei eintragen. Besser natürlich man hat einen Router wo man noch DNS Einträge erweitern kann.

rei3.local.lan {
    reverse_proxy http://r3:80
    tls internal
}
Inhalt für Letsencrypt,wenn man es erst testen möchte mit Staging einfach den Kommentar entfernen.
example.com {
    reverse_proxy http://r3:80
    tls <deine_emailadresse> {
        #ca https://acme-staging-v02.api.letsencrypt.org/directory
    }
}

Container starten

cd /root/rei3
dcoker-compose up -d

Da das Image gebaut wird, dauert das eine weile ca 1-5 Minuten.
Sollte der Build Prozess bei den Updates vom Betriebssystem hängen bleiben mit srg+c abbrechen und nochmal starten.
Er macht da weiter wo aufgehört wurde.

Hat man ein Selbstsigniertes Zertifikat, Timer anlegen

Timer anlegen, siehe Buch Caddy -> Caddy Timer anlegen
Als docker name im script nehmen

caddy-reverse-proxy


rei3 Updaten

Wenn es ein Update gibt sagt rei3 das in der GUI, dort dann auf Download klicken

Auswahl_311.png

Unten rechts in der Ecke steht unsere installierte Version

Auswahl_314.png

Dann runterscrollen bis Docker und amd64 auswählen, falls Ihr arm64 habt dann natürlich arm 64 aber ist hier eigentlich auch egal, weil wir nur Versionsnummern austauschen.

Auswahl_312.png

Jetzt lädt er nur eine neue Docker compose Datei herunter.
Hier interessiert uns nur die Versionsnummer. In unserem Beispiel Version 3.9
Installiert ist Version 3.8 sonst gäbe es ja keine Update Benachrichtigung

Auswahl_313.png

Da es immer mühselig ist, alles per Hand zu ändern hier ein Update python script, was auch gleich den Container neubaut.

nano /root/rei3/update_rei3.py

Inhalt

import sys
import os
import shutil
from datetime import datetime
import subprocess

def update_docker_compose(version):
    # Aktuelles Verzeichnis und Dateiname der docker-compose-Datei
    current_dir = os.path.dirname(os.path.abspath(__file__))
    compose_file = os.path.join(current_dir, "docker-compose.yml")
    
    # Sicherungskopie erstellen
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_file = os.path.join(current_dir, f"docker-compose_backup_{timestamp}.yml")
    shutil.copy2(compose_file, backup_file)
    print(f"Sicherungskopie erstellt: {backup_file}")
    
    # Datei lesen, den Platzhalter ersetzen und Datei überschreiben
    with open(compose_file, "r") as file:
        content = file.read()
    
    # Platzhalter ${R3_VERSION:-3.9} durch die neue Version ersetzen
    new_content = content.replace("${R3_VERSION:-3.9}", version)
    
    with open(compose_file, "w") as file:
        file.write(new_content)
    print(f"Version in {compose_file} aktualisiert auf: {version}")
    
    # Docker Compose up mit build-Option ausführen
    try:
        subprocess.run(["docker-compose", "up", "-d", "--build", "r3"], check=True, cwd=current_dir)
        print("Docker Compose erfolgreich gestartet.")
    except subprocess.CalledProcessError as e:
        print(f"Fehler beim Ausführen von docker-compose: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Verwendung: python3 update_rei3.py <neue_version>")
    else:
        version = sys.argv[1]
        update_docker_compose(version)

Aufruf

python3 update_rei3.py <neue_version>

python3 update_rei3.py 3.9

Ausgabe:

update_rei3.py

root@rei3:~/rei3# python3 update_rei3.py 3.9
Sicherungskopie erstellt: /root/rei3/docker-compose_backup_20241031_112811.yml
Version in /root/rei3/docker-compose.yml aktualisiert auf: 3.9
Building r3
Sending build context to Docker daemon  84.48kB
Step 1/14 : FROM debian:stable-slim
 ---> 9bd2141d306a
Step 2/14 : ARG r3_db_host
 ---> Using cache
 ---> 6c9382cac483
Step 3/14 : ARG r3_db_name
 ---> Using cache
 ---> ac65017e50ac
Step 4/14 : ARG r3_db_user
 ---> Using cache
 ---> 2efd660d7baf
Step 5/14 : ARG r3_db_pass
 ---> Using cache
 ---> 85f6f2ecedb2
Step 6/14 : ARG r3_os_arch
 ---> Using cache
 ---> 8d1396419d04
Step 7/14 : ARG r3_version
 ---> Using cache
 ---> 6c2caf18de04
Step 8/14 : ARG im_policy
 ---> Using cache
 ---> f6a53c97cf00
Step 9/14 : RUN bash -c 'mkdir -p /opt/r3/data/{certificates,files,temp,transfer}'     && apt-get update     && apt-get install imagemagick ghostscript postgresql-client ca-certificates -y     && update-ca-certificates     && if [ -f $im_policy ] ; then sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/g' $im_policy ; else echo no file $im_policy ; fi
 ---> Using cache
 ---> 2631019866f7
Step 10/14 : WORKDIR /opt/r3
 ---> Using cache
 ---> 6fa2dbec49b3
Step 11/14 : ADD https://rei3.de/downloads/REI3_${r3_version}_${r3_os_arch}_linux.tar.gz .
Downloading [==================================================>]  42.43MB/42.43MB

 ---> Using cache
 ---> 61817c301602
Step 12/14 : RUN tar -xvf REI3_${r3_version}_${r3_os_arch}_linux.tar.gz r3 config_template.json     && sed -i "s/localhost/${r3_db_host}/g" config_template.json     && sed -i "s/443/80/g" config_template.json     && sed -i "s/\"name\": \"app\"/\"name\": \"${r3_db_name}\"/g" config_template.json     && sed -i "s/\"user\": \"app\"/\"user\": \"${r3_db_user}\"/g" config_template.json     && sed -i "s/\"pass\": \"app\"/\"pass\": \"${r3_db_pass}\"/g" config_template.json     && chmod 755 r3 && chmod 644 config_template.json     && rm REI3_${r3_version}_${r3_os_arch}_linux.tar.gz
 ---> Using cache
 ---> a32ad090f258
Step 13/14 : EXPOSE 80
 ---> Using cache
 ---> 7adc2db45946
Step 14/14 : CMD ["/opt/r3/r3", "-run", "-http", "-config", "/opt/r3/data/config.json"]
 ---> Using cache
 ---> cd5271319881
Successfully built cd5271319881
Successfully tagged r3/3.8.6:latest
r3.8.6_db is up-to-date
r3.8.6_app is up-to-date
Docker Compose erfolgreich gestartet.