# Funktion zur sicheren Passworteingabe mit Bestätigung
function prompt_for_password() {
local password password_confirm
# Falls PAPERLESS_PASSWORD eingegeben wird, zusätzliche Erklärung ausgeben
if [[ "$1" == "PAPERLESS_PASSWORD" ]]; then
echo -e "\n
Hinweis: Dieses Passwort wird für den Linux-Benutzer 'paperless' und den Samba-Server verwendet." echo -e "Es wird für den Zugriff auf freigegebene Samba-Ordner benötigt.\n"
echo -e "\n
Bitte geben Sie das Passwort für **$1** ein:" echo -e "\n
Bitte bestätigen Sie das Passwort:" if [[ "$password" == "$password_confirm" ]]; then
echo -e "\n
Passwort erfolgreich gesetzt für **$1**.\n" echo -e "\n
Die Passwörter stimmen nicht überein. Bitte erneut eingeben.\n" # Funktion zur Eingabe des Admin-Benutzernamens mit Standardwert
function prompt_for_admin_user() {
echo -e "\n
Bitte geben Sie den **Admin-Benutzernamen** ein (Standard: paperless):" ADMIN_USER="${admin_user_input:-paperless}"
echo -e "\n
Admin-Benutzer wurde auf **'$ADMIN_USER'** gesetzt.\n" prompt_for_password "PAPERLESS_PASSWORD" PAPERLESS_PASSWORD
prompt_for_password "ADMIN_PASSWORD" ADMIN_PASSWORD
# Weitere Konfigurationen
SAMBA_PASSWORD="$PAPERLESS_PASSWORD"
# System aktualisieren und benötigte Pakete installieren
update_and_install_dependencies() {
echo "Aktualisiere Paketliste und installiere benötigte Pakete..."
sudo apt install -y apt-transport-https curl jq gnupg openssh-server samba samba-common-bin
# Docker-Repository hinzufügen
echo "Füge Docker GPG-Schlüssel und Repository hinzu..."
sudo mkdir -p /etc/apt/keyrings
if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
DOCKER_REPO="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable"
echo "$DOCKER_REPO" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Paperless-Benutzer und Gruppe anlegen
ensure_paperless_user_and_group() {
if ! getent group paperless &>/dev/null; then
echo "Erstelle Gruppe 'paperless' mit GID 1002..."
sudo groupadd -g 1002 paperless
if ! id -u paperless &>/dev/null; then
echo "Erstelle Benutzer 'paperless' mit UID 1002 und GID 1002..."
sudo useradd -m -s /bin/bash -u 1002 -g paperless paperless
echo "paperless:$PAPERLESS_PASSWORD" | sudo chpasswd
if ! command -v docker &>/dev/null; then
echo "Docker wird installiert..."
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
if ! groups paperless | grep -q "\bdocker\b"; then
echo "Füge Benutzer 'paperless' zur Docker-Gruppe hinzu..."
sudo usermod -aG docker paperless
# Backup der Original-Samba-Konfiguration
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo mkdir -p /data/paperless/{backup,restore}
sudo chown -R paperless:paperless /data/paperless/
sudo chmod -R 770 /data/paperless/
# Für den Share [consume] soll nur der Ordner /data/paperless/consume freigegeben werden:
if ! grep -q "^\[consume\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
comment = Paperless Daten
path = /data/paperless/consume
if ! grep -q "^\[backup\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
comment = Paperless Backup Daten
path = /data/paperless/backup
if ! grep -q "^\[restore\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
comment = Paperless Restore Daten
path = /data/paperless/restore
sudo systemctl restart smbd
echo "Samba Shares [consume], [backup] und [restore] wurden konfiguriert."
(echo "$SAMBA_PASSWORD"; echo "$SAMBA_PASSWORD") | sudo smbpasswd -a paperless -s
sudo systemctl restart smbd
# Docker-Compose-Datei erstellen
echo "Erstelle docker-compose.yml im Verzeichnis von 'paperless'..."
sudo mkdir -p /home/paperless
cat <<EOL | sudo tee /home/paperless/docker-compose.yml > /dev/null
- /data/paperless/redis/_data:/data
- /data/paperless/postgresql/_data:/var/lib/postgresql/data
POSTGRES_PASSWORD: $DB_PASSWORD
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: webserver
- /data/paperless/consume:/usr/src/paperless/consume
- /data/paperless/data:/usr/src/paperless/data
- /data/paperless/media:/usr/src/paperless/media
- /data/paperless/export:/usr/src/paperless/export
PAPERLESS_ADMIN_USER: $ADMIN_USER
PAPERLESS_ADMIN_PASSWORD: $ADMIN_PASSWORD
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
PAPERLESS_OCR_LANGUAGE: deu
PAPERLESS_TIME_ZONE: Europe/Berlin
PAPERLESS_CONSUMER_ENABLE_BARCODES: "true"
PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: "true"
PAPERLESS_CONSUMER_BARCODE_SCANNER: ZXING
PAPERLESS_EMAIL_TASK_CRON: '*/10 * * * *'
image: gotenberg/gotenberg:8.8
- "--chromium-disable-javascript=false"
- "--chromium-allow-list=.*"
image: ghcr.io/paperless-ngx/tika:latest
sudo docker compose up -d
update_and_install_dependencies
ensure_paperless_user_and_group
sudo chown -R paperless:paperless /data/paperless
# Lokale IP-Adresse ermitteln
LOCAL_IP=$(hostname -I | awk '{print $1}')
echo -e "\n
**Paperless ist jetzt bereit!**" echo -e "
**Zugriff im Browser:** http://$LOCAL_IP:8001\n" echo -e "
** Bitte einmal neu booten" #!/bin/bash
set -euo pipefail
# Funktion zur sicheren Passworteingabe mit Bestätigung
function prompt_for_password() {
local password password_confirm
# Falls PAPERLESS_PASSWORD eingegeben wird, zusätzliche Erklärung ausgeben
if [[ "$1" == "PAPERLESS_PASSWORD" ]]; then
echo -e "\n

Hinweis: Dieses Passwort wird für den Linux-Benutzer 'paperless' und den Samba-Server verwendet."
echo -e "Es wird für den Zugriff auf freigegebene Samba-Ordner benötigt.\n"
fi
while true; do
echo -e "\n

Bitte geben Sie das Passwort für **$1** ein:"
read -s password
echo -e "\n

Bitte bestätigen Sie das Passwort:"
read -s password_confirm
if [[ "$password" == "$password_confirm" ]]; then
echo -e "\n

Passwort erfolgreich gesetzt für **$1**.\n"
eval "$2='$password'"
break
else
echo -e "\n

Die Passwörter stimmen nicht überein. Bitte erneut eingeben.\n"
fi
done
}
# Funktion zur Eingabe des Admin-Benutzernamens mit Standardwert
function prompt_for_admin_user() {
echo -e "\n

Bitte geben Sie den **Admin-Benutzernamen** ein (Standard: paperless):"
read admin_user_input
ADMIN_USER="${admin_user_input:-paperless}"
echo -e "\n

Admin-Benutzer wurde auf **'$ADMIN_USER'** gesetzt.\n"
}
# Passwörter abfragen
prompt_for_password "PAPERLESS_PASSWORD" PAPERLESS_PASSWORD
prompt_for_admin_user
prompt_for_password "ADMIN_PASSWORD" ADMIN_PASSWORD
# Weitere Konfigurationen
SAMBA_PASSWORD="$PAPERLESS_PASSWORD"
DB_PASSWORD="paperless"
# System aktualisieren und benötigte Pakete installieren
update_and_install_dependencies() {
echo "Aktualisiere Paketliste und installiere benötigte Pakete..."
sudo apt update
sudo apt install -y apt-transport-https curl jq gnupg openssh-server samba samba-common-bin
}
# Docker-Repository hinzufügen
add_docker_repo() {
echo "Füge Docker GPG-Schlüssel und Repository hinzu..."
sudo mkdir -p /etc/apt/keyrings
if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
fi
. /etc/os-release
DOCKER_REPO="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable"
echo "$DOCKER_REPO" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
}
# Paperless-Benutzer und Gruppe anlegen
ensure_paperless_user_and_group() {
if ! getent group paperless &>/dev/null; then
echo "Erstelle Gruppe 'paperless' mit GID 1002..."
sudo groupadd -g 1002 paperless
fi
if ! id -u paperless &>/dev/null; then
echo "Erstelle Benutzer 'paperless' mit UID 1002 und GID 1002..."
sudo useradd -m -s /bin/bash -u 1002 -g paperless paperless
echo "paperless:$PAPERLESS_PASSWORD" | sudo chpasswd
fi
}
# Docker installieren
install_docker() {
if ! command -v docker &>/dev/null; then
echo "Docker wird installiert..."
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
fi
if ! groups paperless | grep -q "\bdocker\b"; then
echo "Füge Benutzer 'paperless' zur Docker-Gruppe hinzu..."
sudo usermod -aG docker paperless
fi
}
# Samba Konfiguration
configure_samba() {
# Backup der Original-Samba-Konfiguration
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo mkdir -p /data/paperless/{backup,restore}
sudo chown -R paperless:paperless /data/paperless/
sudo chmod -R 770 /data/paperless/
# Für den Share [consume] soll nur der Ordner /data/paperless/consume freigegeben werden:
if ! grep -q "^\[consume\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
[consume]
comment = Paperless Daten
path = /data/paperless/consume
browsable = yes
writable = yes
guest ok = no
create mask = 0770
directory mask = 0770
valid users = paperless
EOF
fi
# Share für Backup
if ! grep -q "^\[backup\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
[backup]
comment = Paperless Backup Daten
path = /data/paperless/backup
browsable = yes
writable = yes
guest ok = no
create mask = 0770
directory mask = 0770
valid users = paperless
EOF
fi
# Share für Restore
if ! grep -q "^\[restore\]" /etc/samba/smb.conf; then
sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF'
[restore]
comment = Paperless Restore Daten
path = /data/paperless/restore
browsable = yes
writable = yes
guest ok = no
create mask = 0770
directory mask = 0770
valid users = paperless
EOF
fi
sudo systemctl restart smbd
echo "Samba Shares [consume], [backup] und [restore] wurden konfiguriert."
(echo "$SAMBA_PASSWORD"; echo "$SAMBA_PASSWORD") | sudo smbpasswd -a paperless -s
sudo systemctl restart smbd
}
# Docker-Compose-Datei erstellen
deploy_containers() {
echo "Erstelle docker-compose.yml im Verzeichnis von 'paperless'..."
sudo mkdir -p /home/paperless
cat <<EOL | sudo tee /home/paperless/docker-compose.yml > /dev/null
services:
broker:
image: redis:7
container_name: broker
restart: unless-stopped
volumes:
- /data/paperless/redis/_data:/data
db:
image: postgres:16
container_name: db
restart: unless-stopped
volumes:
- /data/paperless/postgresql/_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: $DB_PASSWORD
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: webserver
restart: unless-stopped
depends_on:
- db
- broker
- gotenberg
- tika
ports:
- "8001:8000"
volumes:
- /data/paperless/consume:/usr/src/paperless/consume
- /data/paperless/data:/usr/src/paperless/data
- /data/paperless/media:/usr/src/paperless/media
- /data/paperless/export:/usr/src/paperless/export
environment:
PAPERLESS_ADMIN_USER: $ADMIN_USER
PAPERLESS_ADMIN_PASSWORD: $ADMIN_PASSWORD
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
PAPERLESS_OCR_LANGUAGE: deu
PAPERLESS_TIME_ZONE: Europe/Berlin
PAPERLESS_CONSUMER_ENABLE_BARCODES: "true"
PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: "true"
PAPERLESS_CONSUMER_BARCODE_SCANNER: ZXING
PAPERLESS_EMAIL_TASK_CRON: '*/10 * * * *'
USERMAP_UID: "1002"
USERMAP_GID: "1002"
gotenberg:
image: gotenberg/gotenberg:8.8
restart: unless-stopped
command:
- "gotenberg"
- "--chromium-disable-javascript=false"
- "--chromium-allow-list=.*"
tika:
image: ghcr.io/paperless-ngx/tika:latest
container_name: tika
restart: unless-stopped
EOL
cd /home/paperless
sudo docker compose up -d
}
# Hauptprogramm
update_and_install_dependencies
add_docker_repo
ensure_paperless_user_and_group
install_docker
configure_samba
deploy_containers
sleep 60
sudo chown -R paperless:paperless /data/paperless
# Lokale IP-Adresse ermitteln
LOCAL_IP=$(hostname -I | awk '{print $1}')
echo -e "\n

**Paperless ist jetzt bereit!**"
echo -e "

**Zugriff im Browser:** http://$LOCAL_IP:8001\n"
echo -e "

** Bitte einmal neu booten"