From 2fbf5de38864c1a42796def86fdecbebc4c1434a Mon Sep 17 00:00:00 2001 From: fds2610 Date: Wed, 25 Mar 2026 13:25:34 +0100 Subject: [PATCH] =?UTF-8?q?install.sh=20zugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++- install.sh | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 308 insertions(+), 5 deletions(-) create mode 100755 install.sh diff --git a/README.md b/README.md index 446fecf..e39fbb8 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Self-hosted Buchhaltungs- und Steueranwendung für deutsche Freiberufler und Kle ## Tech Stack +Dieses Projekt wurden mit Unterstützung von [Claude Code](https://claude.ai/code) entwickelt. + ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) ![HTML](https://img.shields.io/badge/HTML-E34F26?logo=html5&logoColor=white) ![CSS](https://img.shields.io/badge/CSS-1572B6?logo=css3&logoColor=white) @@ -37,14 +39,38 @@ Self-hosted Buchhaltungs- und Steueranwendung für deutsche Freiberufler und Kle ## Installation -### 1. Repository klonen +### Automatische Installation + +Das Script `install.sh` übernimmt die gesamte Installation: es erkennt die Linux-Distribution, installiert git, curl und Docker, klont das Repository in das gewünschte Verzeichnis und legt die `.env`-Datei an. + +Das Script muss **vor** dem Klonen des Repositories heruntergeladen werden – es erledigt das Klonen selbst: + +```bash +curl -fsSL https://codeberg.org/fds2610/Steuerkram/raw/branch/main/install.sh -o install.sh +sudo bash install.sh +``` + +> Das Script muss als root ausgeführt werden, da es Pakete installiert und ggf. den Docker-Dienst aktiviert. Mit `sudo bash install.sh` funktioniert das ohne dauerhaft als root angemeldet zu sein. + +Nach der Installation die `.env`-Datei im gewählten Installationsverzeichnis anpassen (siehe Hinweis am Ende des Scripts) und anschließend die Container starten: + +```bash +cd /opt/Steuerkram # oder das gewählte Verzeichnis +docker compose up -d +``` + +--- + +### Manuelle Installation + +#### 1. Repository klonen ```bash git clone steuerkram cd steuerkram ``` -### 2. Zugangsdaten anpassen +#### 2. Zugangsdaten anpassen Öffne `docker-compose.yml` und ändere die folgenden Umgebungsvariablen im `web`-Service: @@ -57,7 +83,7 @@ environment: Außerdem die Datenbankpasswörter in beiden Services (`web` und `db`) aufeinander abstimmen, falls gewünscht. -### 3. Container starten +#### 3. Container starten ```bash docker compose up -d @@ -68,7 +94,7 @@ Beim ersten Start werden automatisch: - der SKR03-Kontenrahmen eingespielt (`migrations/002_seed_skr03.sql`) - das Docker-Image mit PHP-Abhängigkeiten (mPDF) gebaut -### 4. Anwendung aufrufen +#### 4. Anwendung aufrufen ``` http://localhost:8080 @@ -76,7 +102,7 @@ http://localhost:8080 Login mit den in Schritt 2 gesetzten Zugangsdaten. -### 5. Firmendaten hinterlegen +#### 5. Firmendaten hinterlegen Nach dem ersten Login unter **Einstellungen** Firmendaten, Logo und ELSTER-Steuernummer eintragen. Diese Angaben erscheinen auf Ausgangsrechnungen und im EÜR-Export. diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..abed3ae --- /dev/null +++ b/install.sh @@ -0,0 +1,277 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ──────────────────────────────────────────────────────────────────────────────── +# Steuerkram – Installationsscript +# +# Ablauf: +# 1. Root-Check – bricht ab, wenn nicht als root ausgeführt +# 2. Verzeichnis-Abfrage – fragt nach dem Zielpfad, schlägt /opt/Steuerkram vor +# 3. Distribution erkennen – liest /etc/os-release, unterstützt Debian/Ubuntu, +# Fedora, RHEL/CentOS/Alma/Rocky, Arch, openSUSE, Alpine +# 4. Asahi Linux erkennen – prüft VARIANT_ID, PRETTY_NAME und den Kernel-String +# (uname -r | grep asahi) +# 5. git + curl installieren – per distributionseigenem Paketmanager +# 6. Docker installieren: +# - Asahi Linux → verlinktes Gist-Script (siliconuy) +# - Debian/Ubuntu → offizielles get.docker.com-Script +# - Fedora/RHEL → Docker-CE-Repo via dnf config-manager +# - Arch/openSUSE/Alpine → jeweiliger Paketmanager +# 7. Docker Compose prüfen – Plugin oder Standalone, installiert bei Bedarf nach +# 8. Docker-Dienst – systemctl enable --now docker +# 9. Repository klonen – git clone nach dem gewählten Pfad +# (oder git pull falls bereits vorhanden) +# 10. .env anlegen – kopiert .env.example → .env (wenn noch nicht vorhanden) +# 11. Abschluss-Hinweis – zeigt den genauen Pfad zur .env und welche Werte +# geändert werden müssen +# ──────────────────────────────────────────────────────────────────────────────── + +REPO_URL="https://codeberg.org/fds2610/Steuerkram.git" +DEFAULT_INSTALL_DIR="/opt/Steuerkram" + +# ── Farben ────────────────────────────────────────────────────────────────────── +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BOLD='\033[1m' +NC='\033[0m' + +info() { echo -e "${GREEN}[INFO]${NC} $*"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } +error() { echo -e "${RED}[FEHLER]${NC} $*" >&2; exit 1; } +heading() { echo -e "\n${BOLD}$*${NC}"; } + +# ── Root-Check ────────────────────────────────────────────────────────────────── +if [[ $EUID -ne 0 ]]; then + error "Dieses Script muss als root ausgeführt werden (sudo $0)." +fi + +# ── Installationsverzeichnis ──────────────────────────────────────────────────── +heading "Steuerkram – Installation" +echo "" +read -r -p "Installationsverzeichnis [${DEFAULT_INSTALL_DIR}]: " INSTALL_DIR +INSTALL_DIR="${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}" +info "Installiere nach: ${INSTALL_DIR}" + +# ── Distribution erkennen ─────────────────────────────────────────────────────── +heading "Distribution erkennen" + +detect_distro() { + if [[ -f /etc/os-release ]]; then + # shellcheck source=/dev/null + source /etc/os-release + echo "${ID,,}" + elif command -v lsb_release &>/dev/null; then + lsb_release -si | tr '[:upper:]' '[:lower:]' + else + error "Konnte die Distribution nicht ermitteln." + fi +} + +DISTRO="$(detect_distro)" +info "Erkannte Distribution: ${DISTRO}" + +# Asahi Linux erkennen (Fedora-Basis auf Apple-Silicon) +IS_ASAHI=false +if [[ -f /etc/os-release ]]; then + source /etc/os-release + if grep -qi "asahi" <<< "${VARIANT_ID:-}${VARIANT:-}${ID_LIKE:-}${PRETTY_NAME:-}"; then + IS_ASAHI=true + fi +fi +# Alternativ: Kernel-String prüfen +if uname -r | grep -qi "asahi"; then + IS_ASAHI=true +fi + +if [[ "$IS_ASAHI" == "true" ]]; then + info "Asahi Linux erkannt." +fi + +# ── Paketmanager & Basis-Pakete ───────────────────────────────────────────────── +heading "Basis-Pakete installieren (git, curl)" + +install_base_packages() { + case "$DISTRO" in + debian|ubuntu|linuxmint|pop|elementary|kali|raspbian) + apt-get update -qq + apt-get install -y git curl + ;; + fedora|asahi) + dnf install -y git curl + ;; + centos|rhel|almalinux|rocky) + dnf install -y git curl || yum install -y git curl + ;; + arch|manjaro|endeavouros|garuda) + pacman -Sy --noconfirm git curl + ;; + opensuse*|sles) + zypper install -y git curl + ;; + alpine) + apk add --no-cache git curl + ;; + *) + warn "Unbekannte Distribution '${DISTRO}'. Versuche apt-get …" + apt-get update -qq && apt-get install -y git curl || \ + error "Paketinstallation fehlgeschlagen. Bitte git und curl manuell installieren." + ;; + esac +} + +install_base_packages +info "git und curl installiert." + +# ── Docker installieren ───────────────────────────────────────────────────────── +heading "Docker installieren" + +if command -v docker &>/dev/null; then + info "Docker ist bereits installiert: $(docker --version)" + DOCKER_INSTALLED=true +else + DOCKER_INSTALLED=false +fi + +install_docker() { + if [[ "$IS_ASAHI" == "true" ]]; then + # Asahi Linux: spezielles Installations-Script (kein x86-Docker-Repo verfügbar) + info "Asahi Linux: verwende Community-Script für Docker auf ARM64/Asahi …" + curl -fsSL https://gist.githubusercontent.com/siliconuy/e86617aca69b6b21d705fd745346b222/raw \ + -o /tmp/install-docker-asahi.sh + bash /tmp/install-docker-asahi.sh + rm -f /tmp/install-docker-asahi.sh + else + case "$DISTRO" in + debian|ubuntu|linuxmint|pop|elementary|kali|raspbian) + # Offizielles Docker-Script + curl -fsSL https://get.docker.com -o /tmp/get-docker.sh + sh /tmp/get-docker.sh + rm -f /tmp/get-docker.sh + ;; + fedora) + dnf install -y dnf-plugins-core + dnf config-manager --add-repo \ + https://download.docker.com/linux/fedora/docker-ce.repo + dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + ;; + centos|rhel|almalinux|rocky) + dnf install -y dnf-plugins-core + dnf config-manager --add-repo \ + https://download.docker.com/linux/centos/docker-ce.repo + dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + ;; + arch|manjaro|endeavouros|garuda) + pacman -Sy --noconfirm docker docker-compose + ;; + opensuse*|sles) + zypper install -y docker docker-compose + ;; + alpine) + apk add --no-cache docker docker-compose + ;; + *) + warn "Docker-Installation für '${DISTRO}' nicht bekannt. Versuche offizielles Script …" + curl -fsSL https://get.docker.com -o /tmp/get-docker.sh + sh /tmp/get-docker.sh + rm -f /tmp/get-docker.sh + ;; + esac + fi +} + +if [[ "$DOCKER_INSTALLED" == "false" ]]; then + install_docker + info "Docker installiert: $(docker --version)" +fi + +# ── Docker Compose prüfen ─────────────────────────────────────────────────────── +heading "Docker Compose prüfen" + +if docker compose version &>/dev/null 2>&1; then + info "Docker Compose (Plugin) verfügbar: $(docker compose version)" +elif command -v docker-compose &>/dev/null; then + info "docker-compose (standalone) verfügbar: $(docker-compose --version)" +else + warn "Docker Compose nicht gefunden – versuche nachzuinstallieren …" + case "$DISTRO" in + debian|ubuntu|linuxmint|pop|elementary|kali|raspbian) + apt-get install -y docker-compose-plugin || \ + apt-get install -y docker-compose + ;; + fedora|centos|rhel|almalinux|rocky) + dnf install -y docker-compose-plugin || \ + dnf install -y docker-compose + ;; + arch|manjaro|endeavouros|garuda) + pacman -Sy --noconfirm docker-compose + ;; + opensuse*|sles) + zypper install -y docker-compose + ;; + alpine) + apk add --no-cache docker-compose + ;; + esac + info "Docker Compose installiert." +fi + +# ── Docker-Dienst starten & aktivieren ───────────────────────────────────────── +heading "Docker-Dienst aktivieren" + +if command -v systemctl &>/dev/null; then + systemctl enable --now docker + info "Docker-Dienst gestartet und für Autostart aktiviert." +fi + +# ── Repository klonen ─────────────────────────────────────────────────────────── +heading "Repository klonen" + +if [[ -d "${INSTALL_DIR}/.git" ]]; then + info "Repository existiert bereits in ${INSTALL_DIR} – führe git pull aus." + git -C "${INSTALL_DIR}" pull +else + if [[ -d "${INSTALL_DIR}" ]] && [[ -n "$(ls -A "${INSTALL_DIR}" 2>/dev/null)" ]]; then + error "Verzeichnis ${INSTALL_DIR} existiert und ist nicht leer. Bitte ein leeres Verzeichnis wählen." + fi + mkdir -p "${INSTALL_DIR}" + git clone "${REPO_URL}" "${INSTALL_DIR}" + info "Repository geklont nach ${INSTALL_DIR}." +fi + +# ── .env anlegen ──────────────────────────────────────────────────────────────── +heading ".env einrichten" + +ENV_FILE="${INSTALL_DIR}/.env" +ENV_EXAMPLE="${INSTALL_DIR}/.env.example" + +if [[ ! -f "${ENV_FILE}" ]]; then + if [[ -f "${ENV_EXAMPLE}" ]]; then + cp "${ENV_EXAMPLE}" "${ENV_FILE}" + info ".env aus .env.example erstellt." + else + warn ".env.example nicht gefunden – .env muss manuell angelegt werden." + fi +else + info ".env existiert bereits und wird nicht überschrieben." +fi + +# ── Abschluss-Hinweis ─────────────────────────────────────────────────────────── +echo "" +echo -e "${BOLD}════════════════════════════════════════════════════════════════${NC}" +echo -e "${GREEN}${BOLD} Installation abgeschlossen!${NC}" +echo -e "${BOLD}════════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${YELLOW}${BOLD}Wichtig: Bitte passe jetzt die Konfigurationsdatei an:${NC}" +echo "" +echo -e " ${BOLD}${ENV_FILE}${NC}" +echo "" +echo " Folgende Werte sollten geändert werden:" +echo " DB_PASS – Datenbankpasswort" +echo " AUTH_USER – Benutzername für den Web-Zugang" +echo " AUTH_PASS – Passwort für den Web-Zugang" +echo " APP_SECRET – Zufälliger geheimer Schlüssel" +echo "" +echo " Danach die Anwendung starten:" +echo -e " ${BOLD}cd ${INSTALL_DIR} && docker compose up -d${NC}" +echo ""