From ca82784d05a52c296d0d2a094ee2d2cafb1371bc Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 4 May 2026 08:59:43 +0000 Subject: [PATCH] Initial commit: AliasVault VPS deployment configuration --- .env.example | 91 +++++++++++++++++++++++++ README.md | 106 ++++++++++++++++++++++++++++++ docker-compose.vps.yml | 142 +++++++++++++++++++++++++++++++++++++++ setup.sh | 146 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 485 insertions(+) create mode 100644 .env.example create mode 100644 README.md create mode 100644 docker-compose.vps.yml create mode 100644 setup.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..aea26a8 --- /dev/null +++ b/.env.example @@ -0,0 +1,91 @@ +# ---------------------------------------------------------------------------- +# AliasVault configuration file for VPS +# +# 1. Kopiere diese Datei nach .env im selben Verzeichnis wie docker-compose.vps.yml +# cp .env.example .env +# 2. Passe die Werte entsprechend an (insbesondere HOSTNAME und Passwörter) +# 3. Starte mit: docker-compose -f docker-compose.vps.yml up -d +# ---------------------------------------------------------------------------- + +# =========================================== +# NETWORK PORTS +# =========================================== + +# Ports für den Reverse-Proxy - Ändere falls notwendig (z.B. 8080:80, 8443:443) +HTTP_PORT=80 +HTTPS_PORT=443 + +# SMTP Ports - falls du einen eigenen Mailserver betreibst, passe diese an +SMTP_PORT=25 +SMTP_TLS_PORT=587 + +# Redirect von HTTP zu HTTPS aktivieren (empfohlen) +FORCE_HTTPS_REDIRECT=true + +# =========================================== +# EMAIL SERVER CONFIGURATION +# =========================================== + +# Private Email-Domains, die der Server akzeptieren soll (kommagetrennt) +# Beispiel: PRIVATE_EMAIL_DOMAINS=meinedomain.com,beispiel.org +# Leer lassen, um die Funktion zu deaktivieren +PRIVATE_EMAIL_DOMAINS= + +# Private Email-Domains, die in der UI versteckt werden sollen +HIDDEN_PRIVATE_EMAIL_DOMAINS= + +# Hostname für SMTP (EHLO) - sollte mit PTR-DNS deiner IP übereinstimmen +# Beispiel: SMTP_ADVERTISED_HOSTNAME=mail.deinedomain.com +SMTP_ADVERTISED_HOSTNAME= + +# SMTP TLS aktivieren (STARTTLS) +# Benötigt TLS-Zertifikate in ./certificates/smtp/ +SMTP_TLS_ENABLED=false + +# =========================================== +# Let's Encrypt configuration +# =========================================== + +# Let's Encrypt aktivieren (für automatische SSL-Zertifikate) +# Benötigt HOSTNAME (öffentliche Domain) und offene Ports 80/443 +LETSENCRYPT_ENABLED=false + +# Öffentlicher Hostname für Let's Encrypt +# Beispiel: aliasvault.deinedomain.com +HOSTNAME= + +# =========================================== +# Optional configuration settings +# =========================================== + +# Öffentliche Registrierung erlauben +PUBLIC_REGISTRATION_ENABLED=true + +# IP-Logging für Auth-Versuche (letztes Oktett wird anonymisiert) +IP_LOGGING_ENABLED=true + +# Support-Email-Adresse (in der Web-App angezeigt) +SUPPORT_EMAIL= + +# Maximale Upload-Größe in MB (für Vault-Sync) +MAX_UPLOAD_SIZE_MB=100 + +# IP-Beschränkung für /admin Endpoint +# - Leer = keine Beschränkung +# - "private" = nur lokale/RFC1918-Adressen +# - CIDR-Liste = z.B. "192.168.1.0/24,10.0.0.0/8" +ADMIN_IP_ALLOWLIST= + +# Vertrauenswürdige Upstream-Proxies für X-Forwarded-For Header +# - Leer = RFC1918 vertrauen +# - "none" = keine Proxies vertrauen +# - CIDR-Liste = spezifische Proxies +TRUSTED_PROXIES= + +# =========================================== +# WEITERE EINSTELLUNGEN +# =========================================== + +# PostgreSQL Passwort - in ./secrets/postgres_password setzen +# Dieses Passwort muss in einer Datei ./secrets/postgres_password gespeichert werden +# Beispiel: echo "dein_starkes_passwort" > ./secrets/postgres_password \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..84523e6 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# AliasVault VPS Deployment + +Dieses Repository enthält die optimierte Docker Compose-Konfiguration für die Bereitstellung von AliasVault auf einem VPS. + +## 🚀 Schnellstart + +```bash +# 1. Repository klonen +git clone https://git.schoettler-mk.de/schoettik/aliasvault-vps.git /opt/aliasvault +cd /opt/aliasvault + +# 2. .env-Datei erstellen (basierend auf Beispiel) +cp .env.example .env + +# 3. Secrets-Verzeichnis erstellen +mkdir -p secrets +echo "dein_starkes_postgres_passwort" > secrets/postgres_password +chmod 600 secrets/postgres_password + +# 4. Zertifikate-Verzeichnis erstellen (falls benötigt) +mkdir -p certificates/{ssl,letsencrypt/www,smtp} + +# 5. Container starten +docker-compose -f docker-compose.vps.yml up -d +``` + +## 📁 Dateistruktur + +- `docker-compose.vps.yml` – Optimierte Docker Compose-Datei für VPS +- `.env.example` – Konfigurationsvorlage (deutsch) +- `README.md` – Diese Datei + +## ⚙️ Konfiguration + +### Wichtige `.env` Einstellungen + +**Für öffentlichen Zugang:** +```env +HOSTNAME=aliasvault.deinedomain.com +LETSENCRYPT_ENABLED=true +FORCE_HTTPS_REDIRECT=true +``` + +**Für lokalen/privaten Zugang:** +```env +ADMIN_IP_ALLOWLIST=private +LETSENCRYPT_ENABLED=false +``` + +**Email-Funktionen (optional):** +```env +PRIVATE_EMAIL_DOMAINS=deinedomain.com +SMTP_TLS_ENABLED=true +SMTP_ADVERTISED_HOSTNAME=mail.deinedomain.com +``` + +## 🔧 Verwaltung + +**Container starten:** +```bash +docker-compose -f docker-compose.vps.yml up -d +``` + +**Container stoppen:** +```bash +docker-compose -f docker-compose.vps.yml down +``` + +**Logs anzeigen:** +```bash +docker-compose -f docker-compose.vps.yml logs -f +``` + +**Updates durchführen:** +```bash +docker-compose -f docker-compose.vps.yml pull +docker-compose -f docker-compose.vps.yml up -d --force-recreate +``` + +## 🔒 Sicherheit + +1. **Passwort ändern:** PostgreSQL-Passwort in `secrets/postgres_password` ändern +2. **Ports prüfen:** Standard-Ports 80/443 müssen öffentlich erreichbar sein (oder anpassen) +3. **Firewall:** UFW oder firewalld konfigurieren +4. **Backups:** Regelmäßige Backups der Docker Volumes einrichten +5. **Updates:** Regelmäßige Updates der Container durchführen + +## 📦 Docker Volumes + +Die Daten werden in folgenden Volumes gespeichert: +- `postgres_data` – PostgreSQL-Datenbank +- `database_data` – AliasVault-Datenbank +- `logs_data` – Logdateien + +## 🚨 Wichtige Hinweise + +- **Port 25** wird für SMTP benötigt – muss auf dem VPS verfügbar sein +- **Let's Encrypt** benötigt öffentliche DNS-Einträge und erreichbare Ports 80/443 +- **SMTP TLS** erfordert manuelle Zertifikatsbereitstellung in `certificates/smtp/` +- **Backup-Strategie** für die Volumes implementieren + +## ❓ Hilfe + +- [Offizielle AliasVault Dokumentation](https://docs.aliasvault.net) +- [AliasVault GitHub Repository](https://github.com/aliasvault/aliasvault) +- [Docker Compose Dokumentation](https://docs.docker.com/compose/) \ No newline at end of file diff --git a/docker-compose.vps.yml b/docker-compose.vps.yml new file mode 100644 index 0000000..9e9f710 --- /dev/null +++ b/docker-compose.vps.yml @@ -0,0 +1,142 @@ +version: '3.8' + +services: + postgres: + image: ghcr.io/aliasvault/postgres:latest + container_name: aliasvault-postgres + volumes: + - postgres_data:/var/lib/postgresql/data:rw + - ./secrets:/secrets:ro + env_file: + - .env + restart: unless-stopped + environment: + POSTGRES_DB: aliasvault + POSTGRES_USER: aliasvault + POSTGRES_PASSWORD_FILE: /secrets/postgres_password + healthcheck: + test: ["CMD-SHELL", "pg_isready -U aliasvault"] + interval: 5s + timeout: 5s + retries: 5 + start_period: 10s + networks: + - aliasvault-network + + client: + image: ghcr.io/aliasvault/client:latest + container_name: aliasvault-client + volumes: + - ./logs/msbuild:/apps/server/msbuild-logs:rw + expose: + - "3000" + restart: unless-stopped + env_file: + - .env + networks: + - aliasvault-network + + api: + image: ghcr.io/aliasvault/api:latest + container_name: aliasvault-api + expose: + - "3001" + volumes: + - database_data:/database:rw + - logs_data:/logs:rw + - ./secrets:/secrets:ro + restart: unless-stopped + env_file: + - .env + depends_on: + postgres: + condition: service_healthy + networks: + - aliasvault-network + + admin: + image: ghcr.io/aliasvault/admin:latest + container_name: aliasvault-admin + expose: + - "3002" + volumes: + - database_data:/database:rw + - logs_data:/logs:rw + - ./secrets:/secrets:ro + restart: unless-stopped + env_file: + - .env + depends_on: + postgres: + condition: service_healthy + networks: + - aliasvault-network + + smtp: + image: ghcr.io/aliasvault/smtp:latest + container_name: aliasvault-smtp + ports: + - "${SMTP_PORT:-25}:25" + - "${SMTP_TLS_PORT:-587}:587" + volumes: + - database_data:/database:rw + - logs_data:/logs:rw + - ./secrets:/secrets:ro + - ./certificates/smtp:/certificates/smtp:ro + restart: unless-stopped + env_file: + - .env + depends_on: + postgres: + condition: service_healthy + networks: + - aliasvault-network + + task-runner: + image: ghcr.io/aliasvault/task-runner:latest + container_name: aliasvault-task-runner + volumes: + - database_data:/database:rw + - logs_data:/logs:rw + - ./secrets:/secrets:ro + restart: unless-stopped + env_file: + - .env + depends_on: + postgres: + condition: service_healthy + networks: + - aliasvault-network + + reverse-proxy: + image: ghcr.io/aliasvault/reverse-proxy:latest + container_name: aliasvault-reverse-proxy + ports: + - "${HTTP_PORT:-80}:80" + - "${HTTPS_PORT:-443}:443" + volumes: + - ./certificates/ssl:/etc/nginx/ssl:rw + - ./certificates/letsencrypt:/etc/nginx/ssl-letsencrypt:rw + - ./certificates/letsencrypt/www:/var/www/certbot:rw + depends_on: + - admin + - client + - api + - smtp + restart: unless-stopped + env_file: + - .env + networks: + - aliasvault-network + +volumes: + postgres_data: + driver: local + database_data: + driver: local + logs_data: + driver: local + +networks: + aliasvault-network: + driver: bridge \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..13728ca --- /dev/null +++ b/setup.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +# AliasVault VPS Setup Script +# https://git.schoettler-mk.de/schoettik/aliasvault-vps + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} AliasVault VPS Setup Script${NC}" +echo -e "${GREEN}========================================${NC}" + +# Prüfe, ob Docker installiert ist +if ! command -v docker &> /dev/null; then + echo -e "${RED}Docker ist nicht installiert.${NC}" + echo "Installiere Docker mit:" + echo " curl -fsSL https://get.docker.com | sh" + exit 1 +fi + +# Prüfe, ob Docker Compose installiert ist +if ! command -v docker-compose &> /dev/null; then + echo -e "${RED}Docker Compose ist nicht installiert.${NC}" + echo "Installiere Docker Compose mit:" + echo " sudo apt-get install docker-compose" + echo " oder" + echo " sudo pip install docker-compose" + exit 1 +fi + +# Installation Directory +INSTALL_DIR="${1:-/opt/aliasvault}" +echo -e "${YELLOW}Installationsverzeichnis: ${INSTALL_DIR}${NC}" + +# Repository URL (kann angepasst werden) +REPO_URL="https://git.schoettler-mk.de/schoettik/aliasvault-vps.git" + +# Frage nach Bestätigung +read -p "AliasVault in ${INSTALL_DIR} installieren? (j/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Jj]$ ]]; then + echo -e "${YELLOW}Abgebrochen.${NC}" + exit 0 +fi + +# Verzeichnis erstellen +echo -e "${YELLOW}Erstelle Installationsverzeichnis...${NC}" +sudo mkdir -p "${INSTALL_DIR}" +sudo chown -R $(id -u):$(id -g) "${INSTALL_DIR}" +cd "${INSTALL_DIR}" + +# Repository klonen oder Dateien kopieren +echo -e "${YELLOW}Lade Konfigurationsdateien herunter...${NC}" +if [[ -f "docker-compose.vps.yml" ]]; then + echo -e "${YELLOW}Dateien existieren bereits. Überspringe Download.${NC}" +else + # Versuche Git Clone, falls nicht klappt, kopiere lokale Dateien + if command -v git &> /dev/null; then + git clone "${REPO_URL}" . + else + echo -e "${RED}Git nicht verfügbar. Lade Dateien manuell herunter.${NC}" + echo "Bitte Repository manuell klonen oder Dateien kopieren." + exit 1 + fi +fi + +# .env-Datei erstellen +if [[ ! -f ".env" ]]; then + echo -e "${YELLOW}Erstelle .env-Datei aus Vorlage...${NC}" + if [[ -f ".env.example" ]]; then + cp .env.example .env + echo -e "${GREEN}.env-Datei erstellt. Bitte bearbeite: ${INSTALL_DIR}/.env${NC}" + else + echo -e "${RED}.env.example nicht gefunden.${NC}" + exit 1 + fi +else + echo -e "${YELLOW}.env-Datei existiert bereits.${NC}" +fi + +# Secrets-Verzeichnis erstellen +echo -e "${YELLOW}Erstelle Secrets-Verzeichnis...${NC}" +mkdir -p secrets + +# PostgreSQL Passwort setzen +if [[ ! -f "secrets/postgres_password" ]]; then + echo -e "${YELLOW}Erstelle PostgreSQL Passwort...${NC}" + echo "Bitte gib ein starkes PostgreSQL-Passwort ein (Enter für automatische Generierung):" + read -s POSTGRES_PASSWORD + if [[ -z "$POSTGRES_PASSWORD" ]]; then + POSTGRES_PASSWORD=$(openssl rand -base64 32 2>/dev/null || date +%s | sha256sum | base64 | head -c 32) + echo -e "${YELLOW}Automatisch generiertes Passwort:${NC}" + echo " $POSTGRES_PASSWORD" + fi + echo "$POSTGRES_PASSWORD" > secrets/postgres_password + chmod 600 secrets/postgres_password + echo -e "${GREEN}PostgreSQL Passwort gespeichert: ${INSTALL_DIR}/secrets/postgres_password${NC}" +else + echo -e "${YELLOW}PostgreSQL Passwort existiert bereits.${NC}" +fi + +# Zertifikate-Verzeichnis erstellen +echo -e "${YELLOW}Erstelle Zertifikate-Verzeichnisse...${NC}" +mkdir -p certificates/{ssl,letsencrypt/www,smtp} + +# Container starten +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Starten der AliasVault Container...${NC}" +echo -e "${GREEN}========================================${NC}" + +if sudo docker-compose -f docker-compose.vps.yml up -d; then + echo -e "${GREEN}✅ AliasVault Container erfolgreich gestartet!${NC}" + + # Zeige Status + echo "" + echo -e "${YELLOW}Container-Status:${NC}" + sudo docker-compose -f docker-compose.vps.yml ps + + echo "" + echo -e "${GREEN}📋 Nächste Schritte:${NC}" + echo "1. Bearbeite die .env-Datei: ${INSTALL_DIR}/.env" + echo "2. Konfiguriere DNS-Einträge für deine Domain (falls Let's Encrypt)" + echo "3. Öffne ${INSTALL_DIR}/README.md für weitere Informationen" + echo "" + echo -e "${GREEN}🔗 Erreichbare Services:${NC}" + echo "- Web Interface: http://localhost (oder deine Domain)" + echo "- Admin Interface: http://localhost/admin" + echo "- SMTP Server: localhost:25 (oder ${SMTP_PORT:-587} für TLS)" + echo "" + echo -e "${GREEN}⚡ Verwaltung:${NC}" + echo " Status: sudo docker-compose -f docker-compose.vps.yml ps" + echo " Logs: sudo docker-compose -f docker-compose.vps.yml logs -f" + echo " Stoppen: sudo docker-compose -f docker-compose.vps.yml down" + echo " Updates: sudo docker-compose -f docker-compose.vps.yml pull && sudo docker-compose -f docker-compose.vps.yml up -d" +else + echo -e "${RED}❌ Fehler beim Starten der Container.${NC}" + echo "Überprüfe die Logs: sudo docker-compose -f docker-compose.vps.yml logs" + exit 1 +fi + +echo "" +echo -e "${GREEN}✅ Installation abgeschlossen!${NC}" \ No newline at end of file