install.sh zugefügt

This commit is contained in:
fds2610 2026-03-25 13:25:34 +01:00
parent 4f06a19c2c
commit 2fbf5de388
2 changed files with 308 additions and 5 deletions

View file

@ -15,6 +15,8 @@ Self-hosted Buchhaltungs- und Steueranwendung für deutsche Freiberufler und Kle
## Tech Stack ## 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) ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white)
![HTML](https://img.shields.io/badge/HTML-E34F26?logo=html5&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) ![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 ## 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 ```bash
git clone <repository-url> steuerkram git clone <repository-url> steuerkram
cd steuerkram cd steuerkram
``` ```
### 2. Zugangsdaten anpassen #### 2. Zugangsdaten anpassen
Öffne `docker-compose.yml` und ändere die folgenden Umgebungsvariablen im `web`-Service: Ö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. Außerdem die Datenbankpasswörter in beiden Services (`web` und `db`) aufeinander abstimmen, falls gewünscht.
### 3. Container starten #### 3. Container starten
```bash ```bash
docker compose up -d docker compose up -d
@ -68,7 +94,7 @@ Beim ersten Start werden automatisch:
- der SKR03-Kontenrahmen eingespielt (`migrations/002_seed_skr03.sql`) - der SKR03-Kontenrahmen eingespielt (`migrations/002_seed_skr03.sql`)
- das Docker-Image mit PHP-Abhängigkeiten (mPDF) gebaut - das Docker-Image mit PHP-Abhängigkeiten (mPDF) gebaut
### 4. Anwendung aufrufen #### 4. Anwendung aufrufen
``` ```
http://localhost:8080 http://localhost:8080
@ -76,7 +102,7 @@ http://localhost:8080
Login mit den in Schritt 2 gesetzten Zugangsdaten. 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. Nach dem ersten Login unter **Einstellungen** Firmendaten, Logo und ELSTER-Steuernummer eintragen. Diese Angaben erscheinen auf Ausgangsrechnungen und im EÜR-Export.

277
install.sh Executable file
View file

@ -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 ""