Rustelo/docs/leptos-serve.md
Jesús Pérez 0d0297423e
Some checks failed
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Security Audit (push) Has been cancelled
CI/CD Pipeline / Performance Benchmarks (push) Has been cancelled
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
CI/CD Pipeline / Build Docker Image (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Cleanup (push) Has been cancelled
chore: fix with CI and pre-commit
2026-02-08 20:37:49 +00:00

341 lines
7.8 KiB
Markdown

# Leptos Serve Documentation
This document explains how to use `cargo leptos serve` with this project and troubleshoot common issues.
## Quick Start
To start the development server with leptos:
```bash
cargo leptos serve
```
To start with a specific configuration file:
```bash
cargo leptos serve -- -c config.dev.toml
```
## Configuration
The leptos configuration is defined in the workspace `Cargo.toml` file under `[[workspace.metadata.leptos]]`:
```toml
[[workspace.metadata.leptos]]
output-name = "website"
bin-target = "server" # Specifies which binary to use
site-root = "target/site"
site-pkg-dir = "pkg"
assets-dir = "public"
site-addr = "127.0.0.1:3030"
reload-port = 3031
env = "DEV"
bin-features = ["ssr"]
lib-features = ["hydrate"]
name = "website"
bin-package = "server"
lib-package = "client"
```
## Binary Targets
This project has multiple binary targets:
- `server` - Main application server (used by leptos)
- `config_tool` - Configuration management utility
The `bin-target = "server"` specification ensures leptos uses the correct binary.
## Common Commands
### Development Server
```bash
# Start development server
cargo leptos serve
# Start with custom config
cargo leptos serve -- -c config.dev.toml
# Start with environment variables
ROOT_PATH=/custom/path cargo leptos serve
```
### Building
```bash
# Build for development
cargo leptos build
# Build for production
cargo leptos build --release
```
### Watching Files
```bash
# Watch for changes and rebuild automatically
cargo leptos watch
```
## Environment Variables
Leptos respects the same environment variables as the server:
```bash
# Server configuration
ROOT_PATH=/app \
ENVIRONMENT=development \
SERVER_PORT=3030 \
cargo leptos serve
```
## Configuration Files
You can specify different configuration files:
```bash
# Development
cargo leptos serve -- -c config.dev.toml
# Production
cargo leptos serve -- -c config.prod.toml
# Custom configuration
cargo leptos serve -- -c /path/to/custom.toml
```
## Troubleshooting
### Multiple Binary Targets Error
**Error:**
```
Several bin targets found for member "server", please specify which one to use with:
[[workspace.metadata.leptos]] bin-target = "name"
```
**Solution:**
This is fixed by specifying `bin-target = "server"` in the workspace configuration.
### LocalSet Runtime Error
**Error:**
```
PANIC: panicked at tokio-1.46.1/src/task/local.rs:420:29:
`spawn_local` called from outside of a `task::LocalSet` or LocalRuntime
```
**Solution:**
This is fixed by wrapping the main server logic in a `tokio::task::LocalSet`. The main function now uses:
```rust
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let local = tokio::task::LocalSet::new();
local.run_until(run_server()).await
}
```
This provides the proper runtime context for Leptos to spawn local tasks.
### Port Already in Use
**Error:**
```
Error binding to 127.0.0.1:3030: Address already in use
```
**Solutions:**
1. Stop the running server: `pkill -f "target.*server"`
2. Use a different port: Modify `site-addr` in Cargo.toml
3. Set via environment: `SERVER_PORT=3031 cargo leptos serve`
### Configuration File Not Found
**Error:**
```
Failed to load configuration: Missing file: config.toml
```
**Solutions:**
1. Ensure you're in the project root directory
2. Check if the config file exists: `ls -la config*.toml`
3. Use absolute path: `cargo leptos serve -- -c /full/path/to/config.toml`
### Database Connection Issues
If the server fails to start due to database issues:
1. Check database URL in configuration
2. Ensure database is running
3. For development without database:
```bash
cargo leptos serve -- -c config.dev.toml
```
## Development Workflow
### Typical Development Setup
1. **Start the development server:**
```bash
cargo leptos serve -- -c config.dev.toml
```
2. **In another terminal, start CSS watching (if using Tailwind):**
```bash
npm run dev
```
3. **Make changes to your code** - leptos will automatically rebuild and reload
### Common Issues and Solutions
If you encounter runtime panics or errors:
1. **LocalSet Error**: Ensure your main function uses `tokio::task::LocalSet`
2. **Binary Target Error**: Verify `bin-target = "server"` is set in Cargo.toml
3. **WASM Compilation**: Check that uuid has the "js" feature enabled
4. **Environment Variables**: Set `LEPTOS_OUTPUT_NAME=website` if needed
### Project Structure
```
template/
├── Cargo.toml # Workspace config with leptos metadata
├── config.dev.toml # Development configuration
├── config.prod.toml # Production configuration
├── server/
│ ├── Cargo.toml # Server dependencies and binary targets
│ ├── src/
│ │ ├── main.rs # Main server binary (used by leptos)
│ │ └── bin/
│ │ └── config_tool.rs # Additional binary
├── client/ # Frontend Leptos components
└── shared/ # Shared code between client and server
```
## Advanced Usage
### Custom Build Features
You can customize which features are enabled:
```bash
# Build with specific features
cargo leptos build --bin-features "ssr,auth"
# Build lib with specific features
cargo leptos build --lib-features "hydrate"
```
### Production Deployment
For production builds:
```bash
# Build optimized release
cargo leptos build --release
# The output will be in target/site/
# Deploy the contents of target/site/ to your web server
```
### Custom Server Configuration
You can pass additional arguments to the server:
```bash
# Pass custom server arguments
cargo leptos serve -- -c config.prod.toml --verbose
# With environment variables
ROOT_PATH=/app \
DATABASE_URL=postgresql://... \
cargo leptos serve -- -c config.prod.toml
```
## Integration with Other Tools
### Docker
```dockerfile
FROM rust:latest
WORKDIR /app
COPY . .
# Install cargo-leptos
RUN cargo install cargo-leptos
# Build the project
RUN cargo leptos build --release
ENV ROOT_PATH=/app
ENV ENVIRONMENT=production
EXPOSE 3030
CMD ["cargo", "leptos", "serve", "--", "-c", "config.prod.toml"]
```
### CI/CD
```yaml
# GitHub Actions example
- name: Install cargo-leptos
run: cargo install cargo-leptos
- name: Build with leptos
run: cargo leptos build --release
- name: Test server
run: |
ROOT_PATH=/tmp/test \
cargo leptos serve -- -c config.test.toml &
sleep 5
curl http://localhost:3030/health
```
## Related Documentation
- [ROOT_PATH Configuration](./ROOT_PATH_CONFIG.md)
- [Configuration Guide](./CONFIGURATION.md)
- [Deployment Guide](./DEPLOYMENT.md)
- [Leptos Official Documentation](https://leptos.dev/)
## Performance Tips
1. **Use release builds for production:**
```bash
cargo leptos build --release
```
2. **Enable compression in production config:**
```toml
[app]
enable_compression = true
```
3. **Optimize asset serving:**
```toml
[static]
assets_dir = "public" # Ensure static assets are properly configured
```
4. **Monitor reload port conflicts:**
- Default reload port: 3031
- Change if needed: `reload-port = 3032` in Cargo.toml
## Recent Fixes
### LocalSet Runtime Fix (v0.1.0)
- **Issue**: `spawn_local` called from outside of a `task::LocalSet` panic
- **Fix**: Main function now uses `tokio::task::LocalSet` for proper Leptos runtime context
- **Impact**: Eliminates runtime panics when using cargo leptos serve
### Multiple Binary Targets Fix (v0.1.0)
- **Issue**: "Several bin targets found" error with cargo-leptos
- **Fix**: Added `bin-target = "server"` to workspace leptos configuration
- **Impact**: cargo leptos commands now work without ambiguity
### WASM Compatibility Fix (v0.1.0)
- **Issue**: uuid compilation errors on wasm32-unknown-unknown target
- **Fix**: Added "js" feature to uuid dependencies
- **Impact**: Clean WASM builds for frontend components