install.sh zugefügt
This commit is contained in:
parent
4f06a19c2c
commit
2fbf5de388
2 changed files with 308 additions and 5 deletions
36
README.md
36
README.md
|
|
@ -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.
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
@ -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
277
install.sh
Executable 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 ""
|
||||||
Loading…
Add table
Reference in a new issue