# Rustelo Installation Guide

<div align="center">
  <img src="logos/rustelo_dev-logo-h.svg" alt="RUSTELO" width="300" />
</div>

Welcome to Rustelo! This guide will help you install and set up your Rust web application framework built with Leptos using our unified installer.

## Quick Start

### Unix/Linux/macOS
```bash
# Clone or download the project
git clone <repository-url>
cd rustelo

# Quick development setup (default)
./install.sh

# Or specify options
./install.sh -m dev -n my-app
```

### Windows
```powershell
# Clone or download the project
git clone <repository-url>
cd rustelo

# Quick development setup (default)
.\install.ps1

# Or specify options
.\install.ps1 -Mode dev -ProjectName my-app
```

## Installation Modes

The unified installer supports three modes:

### 1. Development Mode (default)
```bash
./install.sh -m dev
```
- Environment: `dev`
- TLS: disabled
- OAuth: disabled
- Authentication: enabled
- Content Database: enabled
- Optimized for development with debugging

### 2. Production Mode
```bash
./install.sh -m prod
```
- Environment: `prod`
- TLS: enabled by default
- OAuth: optional
- Authentication: enabled
- Content Database: enabled
- Optimized for production deployment

### 3. Custom Mode
```bash
./install.sh -m custom
```
- Interactive configuration selection
- Choose features individually
- Customize all settings

## Command Line Options

### Unix/Linux/macOS (`install.sh`)

| Option | Description | Default |
|--------|-------------|---------|
| `-m, --mode MODE` | Installation mode (dev/prod/custom) | `dev` |
| `-n, --name NAME` | Project name | `my-rustelo-app` |
| `-e, --env ENV` | Environment (dev/prod) | `dev` |
| `-d, --dir DIR` | Installation directory | `./<project-name>` |
| `--enable-tls` | Enable TLS/HTTPS support | `false` |
| `--enable-oauth` | Enable OAuth authentication | `false` |
| `--disable-auth` | Disable authentication features | `false` |
| `--disable-content-db` | Disable content database features | `false` |
| `--skip-deps` | Skip dependency installation | `false` |
| `--force` | Force reinstallation | `false` |
| `--quiet` | Suppress debug output | `false` |
| `-h, --help` | Show help message | - |

### Windows (`install.ps1`)

| Option | Description | Default |
|--------|-------------|---------|
| `-Mode` | Installation mode (dev/prod/custom) | `dev` |
| `-ProjectName` | Project name | `my-rustelo-app` |
| `-Environment` | Environment (dev/prod) | `dev` |
| `-InstallDir` | Installation directory | `./<project-name>` |
| `-EnableTLS` | Enable TLS/HTTPS support | `false` |
| `-EnableOAuth` | Enable OAuth authentication | `false` |
| `-DisableAuth` | Disable authentication features | `false` |
| `-DisableContentDB` | Disable content database features | `false` |
| `-SkipDeps` | Skip dependency installation | `false` |
| `-Force` | Force reinstallation | `false` |
| `-Quiet` | Suppress debug output | `false` |
| `-Help` | Show help message | - |

## Environment Variables

You can also configure the installer using environment variables:

| Variable | Description | Default |
|----------|-------------|---------|
| `INSTALL_MODE` | Installation mode (dev/prod/custom) | `dev` |
| `PROJECT_NAME` | Project name | `my-rustelo-app` |
| `ENVIRONMENT` | Environment (dev/prod) | `dev` |
| `ENABLE_TLS` | Enable TLS (true/false) | `false` |
| `ENABLE_AUTH` | Enable authentication (true/false) | `true` |
| `ENABLE_CONTENT_DB` | Enable content database (true/false) | `true` |
| `ENABLE_OAUTH` | Enable OAuth (true/false) | `false` |
| `SKIP_DEPS` | Skip dependencies (true/false) | `false` |
| `FORCE_REINSTALL` | Force reinstall (true/false) | `false` |
| `QUIET` | Quiet mode (true/false) | `false` |

## Examples

### Development Setup
```bash
# Simple development setup
./install.sh

# Development with custom name
./install.sh -n my-blog

# Development with TLS enabled
./install.sh --enable-tls
```

### Production Setup
```bash
# Production setup with HTTPS
./install.sh -m prod -n my-app

# Production with OAuth enabled
./install.sh -m prod --enable-oauth

# Production in custom directory
./install.sh -m prod -d /opt/my-app
```

### Using Environment Variables
```bash
# Set environment variables
export INSTALL_MODE=prod
export PROJECT_NAME=my-production-app
export ENABLE_TLS=true
export ENABLE_OAUTH=true

# Run installer
./install.sh
```

### Windows Examples
```powershell
# Simple development setup
.\install.ps1

# Production setup with HTTPS
.\install.ps1 -Mode prod -ProjectName my-app -EnableTLS

# Custom interactive setup
.\install.ps1 -Mode custom

# Using environment variables
$env:INSTALL_MODE = "prod"
$env:PROJECT_NAME = "my-app"
.\install.ps1
```

## System Requirements

### Required Dependencies

- **Rust** (1.75.0 or later)
  - Install from [rustup.rs](https://rustup.rs/)
  - Includes `cargo` package manager

- **Node.js** (18.0.0 or later)
  - Install from [nodejs.org](https://nodejs.org/)
  - Includes `npm` package manager
  - Optional: `pnpm` for faster package management

- **Git** (for cloning repositories)

- **OpenSSL** (for TLS certificate generation)

- **mdBook** (for documentation)
  - Automatically installed by installer
  - Manual install: `cargo install mdbook`
  - Required for documentation system

- **Just** (task runner)
  - Automatically installed by installer
  - Manual install: `cargo install just`
  - Required for development workflow

### Optional Dependencies

- **PostgreSQL** (for database features)
- **Redis** (for caching and sessions)
- **Docker** (for containerized deployment)
- **mdBook plugins** (for enhanced documentation)
  - `mdbook-linkcheck` - Link validation
  - `mdbook-toc` - Table of contents generation
  - `mdbook-mermaid` - Diagram support
  - Automatically installed by installer

### System-Specific Requirements

#### Linux (Ubuntu/Debian)
```bash
# Update package list
sudo apt update

# Install required packages
sudo apt install -y git curl build-essential pkg-config libssl-dev

# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install Node.js
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
```

#### macOS
```bash
# Install Homebrew if not already installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install required packages
brew install git openssl

# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install Node.js
brew install node
```

#### Windows
1. Install Git from [git-scm.com](https://git-scm.com/)
2. Install Rust from [rustup.rs](https://rustup.rs/)
3. Install Node.js from [nodejs.org](https://nodejs.org/)
4. Install OpenSSL (or use the installer's automatic setup)

## What the Installer Does

1. **System Check**: Verifies required tools are installed
2. **Dependency Installation**: Installs Rust and Node.js if missing
3. **Rust Tools**: Installs `cargo-leptos`, `mdbook`, `just`, and other development tools
4. **Documentation Tools**: Installs mdBook plugins for enhanced documentation
5. **Project Creation**: Copies template files to new project directory
6. **Configuration**: Creates `.env` file with appropriate settings
7. **Dependencies**: Installs Rust and Node.js dependencies
8. **Build**: Compiles the project
9. **Scripts**: Creates startup scripts for development and production
10. **Documentation Setup**: Initializes documentation system
11. **TLS Setup**: Generates self-signed certificates if enabled

## Project Structure

After installation, your project will have this structure:

```
my-rustelo-app/
├── src/                    # Rust source code
│   ├── client/            # Client-side code
│   ├── server/            # Server-side code
│   └── shared/            # Shared code
├── public/                # Static assets
├── book/                  # Documentation source (mdBook)
├── book-output/           # Built documentation
├── certs/                 # TLS certificates (if enabled)
├── scripts/               # Setup and utility scripts
│   ├── setup-docs.sh      # Documentation setup
│   ├── build-docs.sh      # Build documentation
│   ├── deploy-docs.sh     # Deploy documentation
│   └── docs-dev.sh        # Documentation dev server
├── .env                   # Environment configuration
├── Cargo.toml            # Rust dependencies
├── package.json          # Node.js dependencies
├── justfile              # Task runner configuration
├── book.toml             # mdBook configuration
├── start.sh              # Development start script (Unix)
├── start.bat             # Development start script (Windows)
├── start-prod.sh         # Production start script (Unix)
├── start-prod.bat        # Production start script (Windows)
└── build.sh              # Build script (Unix)
```

## Configuration

### Environment Variables (.env)

The installer creates a `.env` file with settings appropriate for your chosen mode:

| Variable | Description | Dev Default | Prod Default |
|----------|-------------|-------------|--------------|
| `ENVIRONMENT` | Environment type | `dev` | `prod` |
| `SERVER_HOST` | Server bind address | `127.0.0.1` | `0.0.0.0` |
| `SERVER_PORT` | Server port | `3030` | `443` |
| `SERVER_PROTOCOL` | Protocol | `http` | `https` |
| `DATABASE_URL` | Database connection | Local PostgreSQL | Production URL |
| `SESSION_SECRET` | Session encryption key | Dev key | Generated |
| `LOG_LEVEL` | Logging level | `debug` | `info` |

### Feature Configuration

Features are controlled by environment variables:

- `ENABLE_AUTH` - Authentication system
- `ENABLE_CONTENT_DB` - Content management
- `ENABLE_TLS` - HTTPS support
- `ENABLE_OAUTH` - OAuth providers

## Development Workflow

### Starting the Development Server

```bash
# Navigate to project
cd my-rustelo-app

# Start development server (Unix)
./start.sh

# Start development server (Windows)
.\start.bat

# Or use cargo directly
cargo leptos watch
```

### Building for Production

```bash
# Build for production (Unix)
./start-prod.sh

# Build for production (Windows)
.\start-prod.bat

# Or use cargo directly
cargo leptos build --release
./target/release/server
```

### Available Commands

#### Development Commands
| Command | Description |
|---------|-------------|
| `cargo leptos watch` | Start development server with hot reload |
| `cargo leptos build` | Build for production |
| `cargo build` | Build Rust code only |
| `npm run build:css` | Build CSS only |
| `npm run dev` | Watch CSS changes |
| `cargo test` | Run tests |
| `cargo clippy` | Run linter |

#### Just Commands (Task Runner)
| Command | Description |
|---------|-------------|
| `just dev` | Start development server |
| `just build` | Build project |
| `just test` | Run tests |
| `just docs-dev` | Start documentation dev server |
| `just docs-build` | Build documentation |
| `just docs-deploy-github` | Deploy docs to GitHub Pages |
| `just help` | Show all available commands |
| `just help-docs` | Show documentation commands |

#### Documentation Commands
| Command | Description |
|---------|-------------|
| `./scripts/setup-docs.sh` | Setup documentation system |
| `./scripts/docs-dev.sh` | Start documentation dev server |
| `./scripts/build-docs.sh` | Build documentation |
| `./scripts/deploy-docs.sh` | Deploy documentation |
| `mdbook serve` | Serve documentation locally |
| `mdbook build` | Build documentation manually |

## Troubleshooting

### Common Issues

#### 1. Installation Mode Not Recognized
**Error**: `Invalid installation mode: xyz`

**Solution**: Use valid modes: `dev`, `prod`, or `custom`
```bash
./install.sh -m dev  # Valid
./install.sh -m prod # Valid
./install.sh -m custom # Valid
```

#### 2. Project Directory Already Exists
**Error**: `Project directory already exists`

**Solution**: Use `--force` flag or choose different name
```bash
./install.sh --force  # Overwrite existing
./install.sh -n different-name  # Use different name
```

#### 3. Missing Dependencies
**Error**: `Missing required system tools`

**Solution**: Install missing tools:
```bash
# Ubuntu/Debian
sudo apt install git curl openssl

# macOS
brew install git openssl

# Windows: Install manually from official websites
```

#### 4. Rust Installation Issues
**Error**: `cargo: command not found`

**Solution**: Ensure Rust is installed and in PATH:
```bash
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Add to PATH
source ~/.cargo/env
```

#### 5. Node.js Dependencies
**Error**: `npm: command not found`

**Solution**: Install Node.js from [nodejs.org](https://nodejs.org/)

#### 6. Build Failures
**Error**: `cargo build` fails with linking errors

**Solution**: Install system dependencies:
```bash
# Ubuntu/Debian
sudo apt install build-essential pkg-config libssl-dev

# macOS
xcode-select --install
```

### Getting Help

1. Check the installation log: `install.log`
2. Review configuration files: `.env`, `Cargo.toml`
3. Validate settings: `cargo run --bin config_tool -- validate`
4. Check documentation files in the project directory

## Manual Installation

If you prefer to set up manually without the installer:

### 1. Clone Template
```bash
git clone <repository-url>
cd rustelo
cp -r template my-project
cd my-project
```

### 2. Install Tools
```bash
cargo install cargo-leptos
cargo install mdbook
cargo install just
cargo install cargo-watch  # Optional
cargo install mdbook-linkcheck  # Optional
cargo install mdbook-toc  # Optional
cargo install mdbook-mermaid  # Optional
```

### 3. Configure Environment
Create `.env` file:
```env
ENVIRONMENT=dev
SERVER_HOST=127.0.0.1
SERVER_PORT=3030
SERVER_PROTOCOL=http
DATABASE_URL=postgresql://dev:dev@localhost:5432/myapp_dev
SESSION_SECRET=your-secret-key
ENABLE_AUTH=true
ENABLE_CONTENT_DB=true
ENABLE_TLS=false
```

### 4. Install Dependencies
```bash
cargo fetch
npm install
```

### 5. Setup Documentation
```bash
./scripts/setup-docs.sh --full
```

### 6. Build and Run
```bash
npm run build:css
cargo build
cargo leptos watch

# Or use just commands
just dev
just docs-dev  # In another terminal for documentation
```

## Production Deployment

### Security Checklist

After running the installer in production mode:

- [ ] Update `SESSION_SECRET` in `.env` with a secure random value
- [ ] Configure proper database connection string
- [ ] Set up valid TLS certificates (replace self-signed ones)
- [ ] Review all security settings in configuration files
- [ ] Configure OAuth providers if enabled
- [ ] Set up proper logging and monitoring
- [ ] Configure firewall rules
- [ ] Set up backup procedures

### Environment Variables for Production

```env
ENVIRONMENT=prod
SERVER_HOST=0.0.0.0
SERVER_PORT=443
SERVER_PROTOCOL=https
DATABASE_URL=postgresql://user:password@host:5432/database
SESSION_SECRET=your-very-secure-random-secret
ENABLE_AUTH=true
ENABLE_CONTENT_DB=true
ENABLE_TLS=true
```

## Support

For issues and questions:
- Check the troubleshooting section above
- Review the configuration documentation
- Check the installation log file
- Create an issue on the project repository

## License

This project is licensed under the MIT License. See the LICENSE file for details.

---

Happy coding with Rustelo! 🚀
