341 lines
8.1 KiB
Markdown
341 lines
8.1 KiB
Markdown
|
|
# Lifecycle API Server
|
||
|
|
|
||
|
|
REST API for syntaxis management with explicit configuration file support.
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
The API server is **completely configuration-driven** and requires an explicit configuration file path via the `--config` argument.
|
||
|
|
|
||
|
|
### Running the Server
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Required: pass configuration file path
|
||
|
|
./syntaxis-api --config /path/to/config.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Configuration File Format
|
||
|
|
|
||
|
|
Create a TOML configuration file:
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[server]
|
||
|
|
host = "127.0.0.1" # Server host (required)
|
||
|
|
port = 3000 # Server port (required)
|
||
|
|
database_path = "/tmp/data.db" # Database file path (required, can be absolute or relative)
|
||
|
|
cors_enabled = true # Enable CORS (required)
|
||
|
|
log_level = "info" # Log level: trace/debug/info/warn/error (required)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Environment Variable Overrides
|
||
|
|
|
||
|
|
Environment variables override TOML configuration:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Override specific settings
|
||
|
|
LIFECYCLE_API_HOST=0.0.0.0 LIFECYCLE_API_PORT=8080 ./syntaxis-api --config /path/to/config.toml
|
||
|
|
|
||
|
|
# Change log level
|
||
|
|
LIFECYCLE_API_LOG_LEVEL=debug ./syntaxis-api --config /path/to/config.toml
|
||
|
|
|
||
|
|
# Use custom database path
|
||
|
|
LIFECYCLE_API_DATABASE_PATH=/var/lib/lifecycle/data.db ./syntaxis-api --config /path/to/config.toml
|
||
|
|
|
||
|
|
# Disable CORS
|
||
|
|
LIFECYCLE_API_CORS_ENABLED=false ./syntaxis-api --config /path/to/config.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration Examples
|
||
|
|
|
||
|
|
### Development Configuration
|
||
|
|
|
||
|
|
Create `~/.config/syntaxis-api/dev.toml`:
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[server]
|
||
|
|
host = "127.0.0.1"
|
||
|
|
port = 3000
|
||
|
|
database_path = "/tmp/syntaxis-dev.db"
|
||
|
|
cors_enabled = true
|
||
|
|
log_level = "debug"
|
||
|
|
```
|
||
|
|
|
||
|
|
Run:
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --config ~/.config/syntaxis-api/dev.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Production Configuration
|
||
|
|
|
||
|
|
Create `/etc/syntaxis-api/prod.toml`:
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[server]
|
||
|
|
host = "0.0.0.0"
|
||
|
|
port = 8080
|
||
|
|
database_path = "/var/lib/lifecycle/data.db"
|
||
|
|
cors_enabled = true
|
||
|
|
log_level = "info"
|
||
|
|
```
|
||
|
|
|
||
|
|
Run:
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --config /etc/syntaxis-api/prod.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Docker Configuration
|
||
|
|
|
||
|
|
Create `./config/docker.toml`:
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[server]
|
||
|
|
host = "0.0.0.0"
|
||
|
|
port = 3000
|
||
|
|
database_path = "/data/project.db"
|
||
|
|
cors_enabled = true
|
||
|
|
log_level = "info"
|
||
|
|
```
|
||
|
|
|
||
|
|
Dockerfile:
|
||
|
|
```dockerfile
|
||
|
|
FROM rust:1.75 as builder
|
||
|
|
WORKDIR /app
|
||
|
|
COPY . .
|
||
|
|
RUN cargo build -p syntaxis-api --release
|
||
|
|
|
||
|
|
FROM debian:bookworm-slim
|
||
|
|
RUN apt-get update && apt-get install -y sqlite3
|
||
|
|
COPY --from=builder /app/target/release/syntaxis-api /usr/local/bin/
|
||
|
|
WORKDIR /app
|
||
|
|
VOLUME ["/data"]
|
||
|
|
EXPOSE 3000
|
||
|
|
ENTRYPOINT ["syntaxis-api", "--config", "/etc/syntaxis-api/config.toml"]
|
||
|
|
```
|
||
|
|
|
||
|
|
Run with Docker:
|
||
|
|
```bash
|
||
|
|
docker run -p 3000:3000 -v /path/to/config.toml:/etc/syntaxis-api/config.toml -v /path/to/data:/data syntaxis-api
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration Schema
|
||
|
|
|
||
|
|
| Setting | Type | Required | Environment Variable | Notes |
|
||
|
|
|---------|------|----------|----------------------|-------|
|
||
|
|
| `host` | string | Yes | `LIFECYCLE_API_HOST` | Server bind address |
|
||
|
|
| `port` | u16 | Yes | `LIFECYCLE_API_PORT` | Server port number |
|
||
|
|
| `database_path` | string | Yes | `LIFECYCLE_API_DATABASE_PATH` | Path to SQLite database file |
|
||
|
|
| `cors_enabled` | bool | Yes | `LIFECYCLE_API_CORS_ENABLED` | Enable CORS headers (true/false) |
|
||
|
|
| `log_level` | string | Yes | `LIFECYCLE_API_LOG_LEVEL` | trace/debug/info/warn/error |
|
||
|
|
|
||
|
|
## Usage Examples
|
||
|
|
|
||
|
|
### Local Development
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --config ~/config/local.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Remote Server (Environment Variables Override)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
LIFECYCLE_API_HOST=0.0.0.0 LIFECYCLE_API_PORT=8080 LIFECYCLE_API_DATABASE_PATH=/data/prod.db \
|
||
|
|
./syntaxis-api --config /etc/syntaxis-api/prod.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Testing
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --config /tmp/test-config.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### systemd Service
|
||
|
|
|
||
|
|
Create `/etc/systemd/system/syntaxis-api.service`:
|
||
|
|
|
||
|
|
```ini
|
||
|
|
[Unit]
|
||
|
|
Description=Lifecycle API Server
|
||
|
|
After=network.target
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
Type=simple
|
||
|
|
User=lifecycle
|
||
|
|
ExecStart=/usr/local/bin/syntaxis-api --config /etc/syntaxis-api/config.toml
|
||
|
|
Restart=always
|
||
|
|
RestartSec=10
|
||
|
|
StandardOutput=journal
|
||
|
|
StandardError=journal
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
```
|
||
|
|
|
||
|
|
Enable and start:
|
||
|
|
```bash
|
||
|
|
sudo systemctl daemon-reload
|
||
|
|
sudo systemctl enable syntaxis-api
|
||
|
|
sudo systemctl start syntaxis-api
|
||
|
|
```
|
||
|
|
|
||
|
|
## Health Check
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl http://localhost:3000/api/health
|
||
|
|
```
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
All endpoints are relative to `/api`.
|
||
|
|
|
||
|
|
### Health Check
|
||
|
|
- `GET /health` - Server health status
|
||
|
|
|
||
|
|
### Projects
|
||
|
|
- `POST /projects` - Create project
|
||
|
|
- `GET /projects` - List projects
|
||
|
|
- `GET /projects/:id` - Get project
|
||
|
|
- `PUT /projects/:id` - Update project
|
||
|
|
- `DELETE /projects/:id` - Delete project
|
||
|
|
|
||
|
|
### Phases
|
||
|
|
- `GET /projects/:id/phases` - Get current phase
|
||
|
|
- `POST /projects/:id/phases/transition` - Transition to next phase
|
||
|
|
- `GET /projects/:id/phases/history` - Get phase history
|
||
|
|
|
||
|
|
### Checklists
|
||
|
|
- `GET /projects/:id/checklists` - Get all checklists
|
||
|
|
- `GET /projects/:id/checklists/phases/:phase` - Get checklist for phase
|
||
|
|
- `POST /projects/:id/checklists` - Add checklist item
|
||
|
|
- `PUT /projects/:id/checklists/items/:item_id` - Update checklist item
|
||
|
|
|
||
|
|
### Security
|
||
|
|
- `GET /projects/:id/security` - Get security assessment
|
||
|
|
- `POST /projects/:id/security/assess` - Run security assessment
|
||
|
|
|
||
|
|
### Status
|
||
|
|
- `GET /projects/:id/status` - Get project status
|
||
|
|
|
||
|
|
### Tools
|
||
|
|
- `GET /projects/:id/tools` - List tools
|
||
|
|
- `POST /projects/:id/tools/:name/enable` - Enable tool
|
||
|
|
- `POST /projects/:id/tools/:name/disable` - Disable tool
|
||
|
|
|
||
|
|
## Database
|
||
|
|
|
||
|
|
### SQLite Database
|
||
|
|
|
||
|
|
The API uses SQLite for data persistence. The database file is created automatically on first run at the path specified in configuration.
|
||
|
|
|
||
|
|
### Database Path
|
||
|
|
|
||
|
|
Paths can be absolute or relative:
|
||
|
|
- **Absolute**: `/var/lib/lifecycle/data.db`
|
||
|
|
- **Relative**: `./data/project.db` (relative to working directory)
|
||
|
|
|
||
|
|
### Directory Creation
|
||
|
|
|
||
|
|
The parent directory for the database file is created automatically if it doesn't exist.
|
||
|
|
|
||
|
|
## Logging
|
||
|
|
|
||
|
|
Logging uses the `tracing` crate with `tracing-subscriber` for output.
|
||
|
|
|
||
|
|
### Log Levels
|
||
|
|
|
||
|
|
- `trace` - Very detailed diagnostic information
|
||
|
|
- `debug` - Detailed debugging information
|
||
|
|
- `info` - General informational messages (default)
|
||
|
|
- `warn` - Warning messages
|
||
|
|
- `error` - Error messages only
|
||
|
|
|
||
|
|
### Setting Log Level
|
||
|
|
|
||
|
|
In configuration file:
|
||
|
|
```toml
|
||
|
|
[server]
|
||
|
|
log_level = "debug"
|
||
|
|
```
|
||
|
|
|
||
|
|
Or via environment variable:
|
||
|
|
```bash
|
||
|
|
LIFECYCLE_API_LOG_LEVEL=debug ./syntaxis-api --config config.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
## PAP Compliance
|
||
|
|
|
||
|
|
This configuration system follows **Project Agnostic Practice (PAP)** principles:
|
||
|
|
|
||
|
|
✅ **Explicit configuration** - Configuration file path must be provided via CLI
|
||
|
|
✅ **No project-specific paths** - Works anywhere with any config file
|
||
|
|
✅ **Configuration-driven** - All settings in TOML file or environment variables
|
||
|
|
✅ **Environment variable overrides** - Runtime customization
|
||
|
|
✅ **Clean error handling** - Exact configuration errors with file path information
|
||
|
|
✅ **No hardcoded defaults** - All settings must be explicitly configured
|
||
|
|
✅ **Portable** - Works across any environment with explicit config
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Missing Configuration File
|
||
|
|
|
||
|
|
**Error**: `Failed to read config file "...": No such file or directory`
|
||
|
|
|
||
|
|
**Solution**: Pass valid config file path:
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --config /path/to/config.toml
|
||
|
|
```
|
||
|
|
|
||
|
|
### Invalid TOML Syntax
|
||
|
|
|
||
|
|
**Error**: `Failed to parse TOML config from "...": ...`
|
||
|
|
|
||
|
|
**Solution**: Check TOML file syntax and try online TOML validator
|
||
|
|
|
||
|
|
### Database Directory Not Writable
|
||
|
|
|
||
|
|
**Error**: `Failed to create database directory: Permission denied`
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Check directory permissions: `ls -la /path/to/dir`
|
||
|
|
2. Create directory manually: `mkdir -p /path/to/data`
|
||
|
|
3. Change ownership: `sudo chown user:group /path/to/data`
|
||
|
|
|
||
|
|
### Port Already in Use
|
||
|
|
|
||
|
|
**Error**: `Failed to bind to 0.0.0.0:8080`
|
||
|
|
|
||
|
|
**Solutions**:
|
||
|
|
1. Check what's using the port: `lsof -i :8080`
|
||
|
|
2. Use different port in config file
|
||
|
|
3. Override via environment variable: `LIFECYCLE_API_PORT=9000 ./syntaxis-api --config config.toml`
|
||
|
|
|
||
|
|
### Help Command
|
||
|
|
|
||
|
|
```bash
|
||
|
|
./syntaxis-api --help
|
||
|
|
```
|
||
|
|
|
||
|
|
## Building
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cargo build -p syntaxis-api --release
|
||
|
|
```
|
||
|
|
|
||
|
|
Binary location: `target/release/syntaxis-api`
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cargo test -p syntaxis-api
|
||
|
|
```
|
||
|
|
|
||
|
|
## Code Quality
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cargo fmt -p syntaxis-api
|
||
|
|
cargo clippy -p syntaxis-api --all-targets
|
||
|
|
```
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- `config.rs` - Configuration module implementation
|
||
|
|
- `src/main.rs` - Server entry point and CLI argument handling
|