2025-07-11 20:53:20 +01:00
|
|
|
# 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
|
2026-02-08 20:37:49 +00:00
|
|
|
- **Impact**: Clean WASM builds for frontend components
|