re-uploading work
This commit is contained in:
401
docs/guides/quick-start.md
Normal file
401
docs/guides/quick-start.md
Normal file
@@ -0,0 +1,401 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user