2025-12-11 11:04:05 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
#############################
|
|
|
|
|
# CONFIG
|
|
|
|
|
#############################
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
# Use the CURRENT directory
|
|
|
|
|
BASE_DIR="$(pwd)"
|
2025-12-11 11:04:05 +00:00
|
|
|
DOMAIN_DEFAULT="https://vaultwarden.rozic-dev.com"
|
|
|
|
|
TZ_DEFAULT="Europe/Ljubljana"
|
|
|
|
|
|
|
|
|
|
#############################
|
|
|
|
|
# FUNCTIONS
|
|
|
|
|
#############################
|
|
|
|
|
|
|
|
|
|
choose_docker_compose_cmd() {
|
|
|
|
|
if command -v docker &>/dev/null && docker compose version &>/dev/null; then
|
|
|
|
|
echo "docker compose"
|
|
|
|
|
elif command -v docker-compose &>/dev/null; then
|
|
|
|
|
echo "docker-compose"
|
|
|
|
|
else
|
|
|
|
|
echo "Error: docker compose or docker-compose not found in PATH." >&2
|
|
|
|
|
exit 1
|
2025-12-11 11:12:19 +00:00
|
|
|
}
|
2025-12-11 11:04:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
generate_admin_token() {
|
|
|
|
|
if command -v openssl &>/dev/null; then
|
|
|
|
|
openssl rand -hex 32
|
|
|
|
|
else
|
|
|
|
|
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#############################
|
2025-12-11 11:12:19 +00:00
|
|
|
# MAIN START
|
2025-12-11 11:04:05 +00:00
|
|
|
#############################
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
echo ">>> Running install inside: ${BASE_DIR}"
|
2025-12-11 11:04:05 +00:00
|
|
|
|
|
|
|
|
#############################
|
|
|
|
|
# .env FILE
|
|
|
|
|
#############################
|
|
|
|
|
|
|
|
|
|
if [[ -f .env ]]; then
|
2025-12-11 11:12:19 +00:00
|
|
|
echo ">>> .env already exists → loading values."
|
2025-12-11 11:04:05 +00:00
|
|
|
# shellcheck disable=SC1091
|
|
|
|
|
source .env
|
2025-12-11 11:12:19 +00:00
|
|
|
: "${ADMIN_TOKEN:?ADMIN_TOKEN missing in .env}"
|
|
|
|
|
: "${DOMAIN:?DOMAIN missing in .env}"
|
|
|
|
|
: "${TZ:?TZ missing in .env}"
|
|
|
|
|
|
2025-12-11 11:04:05 +00:00
|
|
|
else
|
|
|
|
|
echo ">>> Creating .env file..."
|
|
|
|
|
|
|
|
|
|
ADMIN_TOKEN=$(generate_admin_token)
|
|
|
|
|
DOMAIN="${DOMAIN_DEFAULT}"
|
|
|
|
|
TZ="${TZ_DEFAULT}"
|
|
|
|
|
|
|
|
|
|
cat > .env <<EOF
|
|
|
|
|
ADMIN_TOKEN=${ADMIN_TOKEN}
|
|
|
|
|
DOMAIN=${DOMAIN}
|
|
|
|
|
TZ=${TZ}
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
echo ">>> .env created."
|
2025-12-11 11:12:19 +00:00
|
|
|
echo " ADMIN_TOKEN: ${ADMIN_TOKEN}"
|
2025-12-11 11:04:05 +00:00
|
|
|
echo " DOMAIN: ${DOMAIN}"
|
|
|
|
|
echo " TZ: ${TZ}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
#############################
|
|
|
|
|
# docker-compose.yml
|
|
|
|
|
#############################
|
|
|
|
|
|
|
|
|
|
echo ">>> Writing docker-compose.yml..."
|
|
|
|
|
|
|
|
|
|
cat > docker-compose.yml <<'EOF'
|
2025-12-11 11:03:34 +00:00
|
|
|
version: "3.9"
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
vaultwarden:
|
|
|
|
|
image: vaultwarden/server:latest
|
|
|
|
|
container_name: vaultwarden
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
environment:
|
|
|
|
|
- DOMAIN=${DOMAIN}
|
|
|
|
|
- TZ=${TZ}
|
|
|
|
|
- WEBSOCKET_ENABLED=true
|
|
|
|
|
- SIGNUPS_ALLOWED=false
|
|
|
|
|
- ADMIN_TOKEN=${ADMIN_TOKEN}
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
# Optional logging
|
2025-12-11 11:03:34 +00:00
|
|
|
- LOG_FILE=/data/vaultwarden.log
|
|
|
|
|
- LOG_LEVEL=info
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
- ./vw-data:/data
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
- traefik_default
|
|
|
|
|
|
|
|
|
|
labels:
|
|
|
|
|
- "traefik.enable=true"
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
# MAIN HTTPS ROUTER
|
2025-12-11 11:03:34 +00:00
|
|
|
- "traefik.http.routers.vaultwarden.rule=Host(`vaultwarden.rozic-dev.com`)"
|
|
|
|
|
- "traefik.http.routers.vaultwarden.entrypoints=web,websecure"
|
|
|
|
|
- "traefik.http.routers.vaultwarden.middlewares=redirect-to-https"
|
|
|
|
|
- "traefik.http.routers.vaultwarden.tls=true"
|
|
|
|
|
- "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt"
|
|
|
|
|
- "traefik.http.services.vaultwarden.loadbalancer.server.port=80"
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
# WEBSOCKET ROUTER
|
2025-12-11 11:03:34 +00:00
|
|
|
- "traefik.http.routers.vaultwarden-ws.rule=Host(`vaultwarden.rozic-dev.com`) && Path(`/notifications/hub`)"
|
|
|
|
|
- "traefik.http.routers.vaultwarden-ws.entrypoints=web,websecure"
|
|
|
|
|
- "traefik.http.routers.vaultwarden-ws.middlewares=redirect-to-https"
|
|
|
|
|
- "traefik.http.routers.vaultwarden-ws.tls=true"
|
|
|
|
|
- "traefik.http.routers.vaultwarden-ws.tls.certresolver=letsencrypt"
|
|
|
|
|
- "traefik.http.services.vaultwarden-ws.loadbalancer.server.port=3012"
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
traefik_default:
|
|
|
|
|
external: true
|
2025-12-11 11:04:05 +00:00
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
echo ">>> docker-compose.yml created."
|
|
|
|
|
|
|
|
|
|
#############################
|
|
|
|
|
# START CONTAINER
|
|
|
|
|
#############################
|
|
|
|
|
|
|
|
|
|
DC_CMD=$(choose_docker_compose_cmd)
|
2025-12-11 11:12:19 +00:00
|
|
|
echo ">>> Using: ${DC_CMD}"
|
2025-12-11 11:04:05 +00:00
|
|
|
|
|
|
|
|
echo ">>> Pulling images..."
|
|
|
|
|
${DC_CMD} pull
|
|
|
|
|
|
|
|
|
|
echo ">>> Starting Vaultwarden..."
|
|
|
|
|
${DC_CMD} up -d
|
|
|
|
|
|
2025-12-11 11:12:19 +00:00
|
|
|
echo ">>> Installation completed!"
|
|
|
|
|
echo "URL: ${DOMAIN}"
|
|
|
|
|
echo "Admin: ${DOMAIN}/admin"
|
|
|
|
|
echo "Admin token (also saved in .env): ${ADMIN_TOKEN}"
|
|
|
|
|
echo "Data directory: ${BASE_DIR}/vw-data"
|