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
|
||||
|
||||
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
|
||||
|
||||
### 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 <repository-url> 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.
|
||||
|
||||
|
|
|
|||
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