#!/bin/bash
# ============================================================================
# WebDAV Server Installation and Setup Script
# ============================================================================
set -e # Exit on error
# Colors for output
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
NC = '\033[0m' # No Color
# Functions
print_info( ) {
echo -e " ${ BLUE } ℹ ${ 1 } ${ NC } "
}
print_success( ) {
echo -e " ${ GREEN } ✓ ${ 1 } ${ NC } "
}
print_warning( ) {
echo -e " ${ YELLOW } ⚠ ${ 1 } ${ NC } "
}
print_error( ) {
echo -e " ${ RED } ✗ ${ 1 } ${ NC } "
}
print_header( ) {
echo ""
echo -e " ${ BLUE } ╔══════════════════════════════════════════════════════════════╗ ${ NC } "
echo -e " ${ BLUE } ║ WebDAV Server Installation Script ║ ${ NC } "
echo -e " ${ BLUE } ╚══════════════════════════════════════════════════════════════╝ ${ NC } "
echo ""
}
# Check if running as root
check_root( ) {
if [ " $EUID " -eq 0 ] ; then
print_warning "Running as root. It's recommended to run as a regular user."
read -p "Continue? (y/n) " -n 1 -r
echo
if [ [ ! $REPLY = ~ ^[ Yy] $ ] ] ; then
exit 1
fi
fi
}
# Check system requirements
check_requirements( ) {
print_info "Checking system requirements..."
# Check Python version
if command -v python3 & > /dev/null; then
PYTHON_VERSION = $( python3 --version | awk '{print $2}' )
print_success " Python $PYTHON_VERSION found "
else
print_error "Python 3 not found. Please install Python 3.8 or higher."
exit 1
fi
# Check pip
if command -v pip3 & > /dev/null; then
print_success "pip3 found"
else
print_warning "pip3 not found. Installing..."
python3 -m ensurepip --upgrade
fi
# Check git (optional)
if command -v git & > /dev/null; then
print_success "git found"
else
print_warning "git not found. Some features may be limited."
fi
}
# Install system dependencies
install_dependencies( ) {
print_info "Installing system dependencies..."
if [ -f /etc/debian_version ] ; then
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y python3-dev python3-venv build-essential libxml2-dev libxslt-dev
print_success "Dependencies installed (Debian/Ubuntu)"
elif [ -f /etc/redhat-release ] ; then
# RHEL/CentOS/Fedora
sudo yum install -y python3-devel gcc gcc-c++ libxml2-devel libxslt-devel
print_success "Dependencies installed (RHEL/CentOS/Fedora)"
else
print_warning "Unknown distribution. Please install python3-dev, build-essential manually."
fi
}
# Setup installation directory
setup_directory( ) {
print_info "Setting up installation directory..."
read -p "Installation directory [./webdav-server]: " INSTALL_DIR
INSTALL_DIR = ${ INSTALL_DIR :- ./webdav-server }
if [ -d " $INSTALL_DIR " ] ; then
print_warning " Directory $INSTALL_DIR already exists. "
read -p "Continue and potentially overwrite files? (y/n) " -n 1 -r
echo
if [ [ ! $REPLY = ~ ^[ Yy] $ ] ] ; then
exit 1
fi
else
mkdir -p " $INSTALL_DIR "
fi
cd " $INSTALL_DIR "
print_success " Using directory: $( pwd ) "
}
# Create virtual environment
setup_venv( ) {
print_info "Creating Python virtual environment..."
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip setuptools wheel
print_success "Virtual environment created"
}
# Install Python packages
install_packages( ) {
print_info "Installing Python packages..."
source venv/bin/activate
if [ -f requirements.txt ] ; then
pip install -r requirements.txt
print_success "Packages installed from requirements.txt"
else
print_warning "requirements.txt not found. Installing core packages..."
pip install aiohttp aiofiles aiohttp-session cryptography python-dotenv lxml gunicorn
print_success "Core packages installed"
fi
}
# Setup configuration
setup_config( ) {
print_info "Setting up configuration..."
if [ ! -f .env ] ; then
if [ -f .env.example ] ; then
cp .env.example .env
print_success "Created .env from .env.example"
else
print_warning ".env.example not found. Creating basic .env..."
cat > .env << EOF
HOST=0.0.0.0
PORT=8080
DB_PATH=./webdav.db
WEBDAV_ROOT=./webdav
AUTH_METHODS=basic,digest
JWT_SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))")
SESSION_TIMEOUT=3600
MAX_FILE_SIZE=104857600
LOG_LEVEL=INFO
EOF
print_success "Created basic .env file"
fi
else
print_warning ".env already exists. Skipping..."
fi
# Generate secret key if needed
if grep -q "your-secret-key-here" .env 2>/dev/null; then
SECRET_KEY = $( python3 -c "import secrets; print(secrets.token_hex(32))" )
if [ [ " $OSTYPE " = = "darwin" * ] ] ; then
# macOS
sed -i '' " s/your-secret-key-here-change-this-in-production/ $SECRET_KEY / " .env
else
# Linux
sed -i " s/your-secret-key-here-change-this-in-production/ $SECRET_KEY / " .env
fi
print_success "Generated new JWT secret key"
fi
}
# Create directory structure
create_directories( ) {
print_info "Creating directory structure..."
mkdir -p webdav/users
mkdir -p webdav/shared
mkdir -p logs
mkdir -p backups
print_success "Directory structure created"
}
# Initialize database
init_database( ) {
print_info "Initializing database..."
source venv/bin/activate
python3 << EOF
import asyncio
from main import Database, create_default_user
async def init():
db = Database('./webdav.db')
await create_default_user(db)
asyncio.run(init())
EOF
print_success "Database initialized"
}
# Setup systemd service (optional)
setup_systemd( ) {
print_info "Would you like to set up systemd service? (requires sudo)"
read -p "Setup systemd service? (y/n) " -n 1 -r
echo
if [ [ $REPLY = ~ ^[ Yy] $ ] ] ; then
# Create webdav user if doesn't exist
if ! id -u webdav & >/dev/null; then
sudo useradd -r -s /bin/false webdav
print_success "Created webdav user"
fi
# Copy service file
if [ -f webdav.service ] ; then
sudo cp webdav.service /etc/systemd/system/
sudo systemctl daemon-reload
print_success "Systemd service installed"
print_info "To enable and start the service:"
echo " sudo systemctl enable webdav"
echo " sudo systemctl start webdav"
echo " sudo systemctl status webdav"
else
print_warning "webdav.service not found. Skipping..."
fi
fi
}
# Setup nginx (optional)
setup_nginx( ) {
print_info "Would you like to set up Nginx reverse proxy?"
read -p "Setup Nginx? (y/n) " -n 1 -r
echo
if [ [ $REPLY = ~ ^[ Yy] $ ] ] ; then
if command -v nginx & > /dev/null; then
read -p "Enter your domain name: " DOMAIN_NAME
if [ -f nginx.conf ] ; then
mkdir -p nginx/conf.d nginx/ssl
sed " s/webdav.example.com/ $DOMAIN_NAME /g " nginx.conf > nginx/conf.d/webdav.conf
print_success "Nginx configuration created"
print_info "Configuration saved to: nginx/conf.d/webdav.conf"
print_warning "Don't forget to configure SSL certificates!"
else
print_warning "nginx.conf template not found"
fi
else
print_warning "Nginx not installed. Skipping..."
fi
fi
}
# Setup Docker (optional)
setup_docker( ) {
print_info "Would you like to set up Docker deployment?"
read -p "Setup Docker? (y/n) " -n 1 -r
echo
if [ [ $REPLY = ~ ^[ Yy] $ ] ] ; then
if command -v docker & > /dev/null; then
if [ -f Dockerfile ] && [ -f docker-compose.yml ] ; then
print_info "Building Docker image..."
docker-compose build
print_success "Docker image built"
print_info "To start the service:"
echo " docker-compose up -d"
echo " docker-compose logs -f"
else
print_warning "Dockerfile or docker-compose.yml not found"
fi
else
print_warning "Docker not installed. Skipping..."
fi
fi
}
# Final instructions
print_instructions( ) {
echo ""
echo -e " ${ GREEN } ╔══════════════════════════════════════════════════════════════╗ ${ NC } "
echo -e " ${ GREEN } ║ Installation Complete! ║ ${ NC } "
echo -e " ${ GREEN } ╚══════════════════════════════════════════════════════════════╝ ${ NC } "
echo ""
print_info "Getting Started:"
echo ""
echo "1. Activate virtual environment:"
echo " source venv/bin/activate"
echo ""
echo "2. Start the server:"
echo " python main.py"
echo " OR with Gunicorn (production):"
echo " gunicorn main:init_app --config gunicorn_config.py"
echo ""
echo "3. Access WebDAV server:"
echo " http://localhost:8080/"
echo ""
echo "4. Default credentials:"
echo " Username: admin"
echo " Password: admin123"
echo " ⚠️ CHANGE THIS PASSWORD IMMEDIATELY!"
echo ""
echo "5. Manage users with CLI:"
echo " python webdav_cli.py user create newuser"
echo " python webdav_cli.py user list"
echo " python webdav_cli.py stats"
echo ""
print_warning "Remember to:"
echo " • Change the default admin password"
echo " • Configure SSL/TLS for production"
echo " • Set up firewall rules"
echo " • Configure backups"
echo ""
}
# Main installation process
main( ) {
print_header
check_root
check_requirements
install_dependencies
setup_directory
setup_venv
install_packages
setup_config
create_directories
init_database
setup_systemd
setup_nginx
setup_docker
print_instructions
print_success "Installation complete!"
}
# Run main function
main