402 lines
7.6 KiB
Markdown
402 lines
7.6 KiB
Markdown
# Attune API Quick Start Guide
|
|
|
|
Get the Attune API up and running in minutes!
|
|
|
|
## Prerequisites
|
|
|
|
- Rust 1.70+ installed
|
|
- PostgreSQL 13+ installed and running
|
|
- `sqlx-cli` (will be installed if needed)
|
|
|
|
## Step 1: Database Setup
|
|
|
|
The API needs a PostgreSQL database. Run the setup script:
|
|
|
|
```bash
|
|
cd attune
|
|
./scripts/setup-db.sh
|
|
```
|
|
|
|
This will:
|
|
- Create the `attune` database
|
|
- Run all migrations
|
|
- Set up the schema
|
|
|
|
**If the script doesn't work**, do it manually:
|
|
|
|
```bash
|
|
# Connect to PostgreSQL
|
|
psql -U postgres
|
|
|
|
# Create database
|
|
CREATE DATABASE attune;
|
|
|
|
# Exit psql
|
|
\q
|
|
|
|
# Run migrations
|
|
export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/attune"
|
|
cargo install sqlx-cli --no-default-features --features postgres
|
|
sqlx migrate run
|
|
```
|
|
|
|
## Step 2: Configure the API
|
|
|
|
The API uses a YAML configuration file. Create your config from the example:
|
|
|
|
```bash
|
|
cp config.example.yaml config.yaml
|
|
```
|
|
|
|
**Edit the configuration file:**
|
|
|
|
```bash
|
|
nano config.yaml
|
|
```
|
|
|
|
Key settings to review:
|
|
|
|
```yaml
|
|
database:
|
|
url: postgresql://postgres:postgres@localhost:5432/attune
|
|
|
|
security:
|
|
jwt_secret: your-secret-key-change-this
|
|
encryption_key: your-32-char-encryption-key-here
|
|
|
|
server:
|
|
port: 8080
|
|
cors_origins:
|
|
- http://localhost:3000
|
|
```
|
|
|
|
**Generate secure secrets for production:**
|
|
|
|
```bash
|
|
# Generate JWT secret
|
|
openssl rand -base64 64
|
|
|
|
# Generate encryption key
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
**If your database uses different credentials**, update the database URL in `config.yaml`:
|
|
|
|
```yaml
|
|
database:
|
|
url: postgresql://YOUR_USER:YOUR_PASSWORD@localhost:5432/attune
|
|
```
|
|
|
|
## Step 3: Start the API
|
|
|
|
Simply run:
|
|
|
|
```bash
|
|
cargo run --bin attune-api
|
|
```
|
|
|
|
You should see:
|
|
```
|
|
INFO Starting Attune API Service
|
|
INFO Loaded configuration from config.yaml
|
|
INFO Configuration loaded successfully
|
|
INFO Environment: development
|
|
INFO Connecting to database...
|
|
INFO Database connection established
|
|
INFO JWT configuration initialized (access: 3600s, refresh: 604800s)
|
|
INFO Starting server on 0.0.0.0:8080
|
|
INFO Server listening on 0.0.0.0:8080
|
|
INFO Attune API Service is ready
|
|
```
|
|
|
|
## Step 4: Test It!
|
|
|
|
### Health Check
|
|
|
|
```bash
|
|
curl http://localhost:8080/health
|
|
```
|
|
|
|
Expected response:
|
|
```json
|
|
{
|
|
"status": "healthy"
|
|
}
|
|
```
|
|
|
|
### Register a User
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/auth/register \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"login": "admin",
|
|
"password": "admin123456",
|
|
"display_name": "Administrator"
|
|
}'
|
|
```
|
|
|
|
You'll get back access and refresh tokens:
|
|
```json
|
|
{
|
|
"data": {
|
|
"access_token": "eyJhbGciOiJIUzI1NiIs...",
|
|
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
|
|
"token_type": "Bearer",
|
|
"expires_in": 3600
|
|
}
|
|
}
|
|
```
|
|
|
|
### Use the Token
|
|
|
|
Save your access token and use it for authenticated requests:
|
|
|
|
```bash
|
|
# Replace YOUR_TOKEN with the actual access_token from above
|
|
curl http://localhost:8080/auth/me \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"id": 1,
|
|
"login": "admin",
|
|
"display_name": "Administrator"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Step 5: Explore the API
|
|
|
|
### Available Endpoints
|
|
|
|
**Authentication:**
|
|
- `POST /auth/register` - Register new user
|
|
- `POST /auth/login` - Login
|
|
- `POST /auth/refresh` - Refresh token
|
|
- `GET /auth/me` - Get current user (protected)
|
|
- `POST /auth/change-password` - Change password (protected)
|
|
|
|
**Health:**
|
|
- `GET /health` - Basic health check
|
|
- `GET /health/detailed` - Detailed status with DB check
|
|
- `GET /health/ready` - Readiness probe
|
|
- `GET /health/live` - Liveness probe
|
|
|
|
**Packs:**
|
|
- `GET /api/v1/packs` - List all packs
|
|
- `POST /api/v1/packs` - Create pack
|
|
- `GET /api/v1/packs/:ref` - Get pack by reference
|
|
- `PUT /api/v1/packs/:ref` - Update pack
|
|
- `DELETE /api/v1/packs/:ref` - Delete pack
|
|
|
|
### Create a Pack
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8080/api/v1/packs \
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"ref": "core.basics",
|
|
"name": "Basic Operations",
|
|
"description": "Core automation pack",
|
|
"version": "1.0.0",
|
|
"author": "Admin"
|
|
}'
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
The `.env` file supports many configuration options. See `.env.example` for all available settings.
|
|
|
|
### Common Customizations
|
|
|
|
**Change the port:**
|
|
```bash
|
|
ATTUNE__SERVER__PORT=3000
|
|
```
|
|
### Debug Logging
|
|
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
log:
|
|
level: debug
|
|
format: pretty # Human-readable output
|
|
```
|
|
|
|
Or use environment variables:
|
|
|
|
```bash
|
|
export ATTUNE__LOG__LEVEL=debug
|
|
export ATTUNE__LOG__FORMAT=pretty
|
|
cargo run --bin attune-api
|
|
```
|
|
### Longer Token Expiration (Development)
|
|
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
security:
|
|
jwt_access_expiration: 7200 # 2 hours
|
|
jwt_refresh_expiration: 2592000 # 30 days
|
|
```
|
|
### Database Connection Pool
|
|
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
database:
|
|
max_connections: 100
|
|
min_connections: 10
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Database Connection Failed
|
|
|
|
```
|
|
Error: error communicating with database
|
|
```
|
|
|
|
**Solution:**
|
|
1. Verify PostgreSQL is running: `pg_isready`
|
|
2. Check credentials in `.env` file
|
|
3. Ensure database exists: `psql -U postgres -l | grep attune`
|
|
|
|
### Migration Errors
|
|
|
|
```
|
|
Error: migration version not found
|
|
```
|
|
|
|
**Solution:**
|
|
```bash
|
|
export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/attune"
|
|
sqlx migrate run
|
|
```
|
|
|
|
### Port Already in Use
|
|
|
|
```
|
|
Error: Address already in use
|
|
```
|
|
|
|
**Solution:** Change the port in `.env`:
|
|
```bash
|
|
ATTUNE__SERVER__PORT=8081
|
|
```
|
|
|
|
### JWT Secret Warning
|
|
|
|
```
|
|
WARN JWT_SECRET not set in config, using default (INSECURE for production!)
|
|
```
|
|
|
|
**Solution:** The default `.env` file has this set. Make sure:
|
|
1. The `.env` file exists in the `attune/` directory
|
|
2. The variable is set: `ATTUNE__SECURITY__JWT_SECRET=your-secret-here`
|
|
|
|
## Development Tips
|
|
|
|
### Auto-reload on Changes
|
|
|
|
Use `cargo-watch` for automatic rebuilds:
|
|
|
|
```bash
|
|
cargo install cargo-watch
|
|
cargo watch -x 'run --bin attune-api'
|
|
```
|
|
|
|
### Enable SQL Query Logging
|
|
|
|
In `.env`:
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
database:
|
|
log_statements: true
|
|
```
|
|
|
|
### Pretty Logs
|
|
|
|
For development, use pretty formatting:
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
log:
|
|
format: pretty
|
|
```
|
|
|
|
For production, use JSON:
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
log:
|
|
format: json
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
- Read the [Authentication Guide](./authentication.md)
|
|
- Learn about [Testing](./testing-authentication.md)
|
|
- See [API Reference](./auth-quick-reference.md) for all endpoints
|
|
- Check out the [Architecture Documentation](./architecture.md)
|
|
|
|
## Production Deployment
|
|
|
|
Before deploying to production:
|
|
|
|
1. **Change JWT Secret:**
|
|
```bash
|
|
ATTUNE__SECURITY__JWT_SECRET=$(openssl rand -base64 64)
|
|
```
|
|
|
|
2. **Use Environment Variables:**
|
|
Don't commit `.env` to version control. Use your platform's secrets management.
|
|
|
|
3. **Enable HTTPS:**
|
|
Configure TLS/SSL termination at your load balancer or reverse proxy.
|
|
|
|
3. **Use production configuration:**
|
|
```bash
|
|
# Use production config file
|
|
export ATTUNE_CONFIG=config.production.yaml
|
|
|
|
# Or set environment
|
|
export ATTUNE__ENVIRONMENT=production
|
|
```
|
|
|
|
4. **Adjust connection pool** in `config.production.yaml`:
|
|
```yaml
|
|
database:
|
|
max_connections: 100
|
|
min_connections: 10
|
|
```
|
|
|
|
6. **Enable JSON Logging:**
|
|
```bash
|
|
ATTUNE__LOG__FORMAT=json
|
|
```
|
|
|
|
## Getting Help
|
|
|
|
- Documentation: `docs/` directory
|
|
- Issues: GitHub Issues
|
|
- API Quick Reference: `docs/auth-quick-reference.md`
|
|
|
|
Happy automating! 🚀
|
|
**Configure CORS origins:**
|
|
```bash
|
|
# Default (empty) - allows localhost:3000, localhost:8080, 127.0.0.1:3000, 127.0.0.1:8080
|
|
ATTUNE__SERVER__CORS_ORIGINS=
|
|
|
|
# Custom origins (comma-separated)
|
|
ATTUNE__SERVER__CORS_ORIGINS=http://localhost:3000,https://app.example.com
|
|
```
|
|
|
|
**Note:** CORS origins must be specified when using authentication (credentials). The API cannot use wildcard origins (`*`) with credentials enabled.
|