selah-cli
Version:
Zero-setup AWS deployment for Bolt.new apps. Build in Bolt, deploy to production in 3 minutes with AI guidance.
189 lines (141 loc) • 5.17 kB
Markdown
# Hackathon Remote Deployment Guide
This guide explains how to use the `selah deploy --hackathon` command for remote AWS deployment from Bolt.new, avoiding terminal timeout issues.
## Overview
The `--hackathon` flag enables remote deployment, where:
- Quick operations (code migration, packaging) run locally in Bolt.new
- Heavy operations (CDK deployment) run on a remote EC2 instance
- Your AWS credentials are securely passed from local to EC2 (no EC2 setup needed!)
- You get the same fully-deployed AWS application without timeouts
## Prerequisites
1. **Complete `selah analyze`** - You need an approved deployment blueprint
2. **EC2 Runner Setup** - A configured EC2 instance running the deployment service
3. **Supabase Edge Functions** - Deployed and configured with EC2 URL
## Usage
```bash
# In Bolt.new terminal
selah deploy --hackathon
```
This command will:
1. Package your deployment (infrastructure + code)
2. Upload to Supabase Edge Function
3. Trigger deployment on EC2
4. Stream logs back to your terminal
5. Update your local `.env` with AWS endpoints
## Setting Up the EC2 Runner
### 1. Launch EC2 Instance
- **AMI**: Amazon Linux 2
- **Instance Type**: t2.medium or larger
- **Storage**: 30GB minimum
- **Security Group**: Allow inbound port 3000 from Supabase IPs
### 2. Install Runner
SSH into your instance and run:
```bash
# Download setup script
curl -O https://raw.githubusercontent.com/your-repo/selah-cli/main/src/cli/templates/setup-ec2-runner.sh
chmod +x setup-ec2-runner.sh
./setup-ec2-runner.sh
# Copy the runner script
curl -O https://raw.githubusercontent.com/your-repo/selah-cli/main/src/cli/templates/ec2-deploy-runner.js
# Start the service (no AWS credentials needed!)
pm2 start ecosystem.config.js
```
### 3. Update Edge Function Environment
In Supabase Dashboard:
1. Go to Edge Functions
2. Find `remote-deploy` function
3. Add environment variable:
```
EC2_RUNNER_URL=http://your-ec2-ip:3000
```
## How It Works
```mermaid
graph LR
A[Bolt.new] -->|1. Package + Credentials| B[Supabase Edge Function]
B -->|2. Forward Encrypted| C[EC2 Runner]
C -->|3. Deploy with Creds| D[AWS]
C -->|4. Stream Logs| B
B -->|5. Poll Status| A
A -->|6. Update .env| E[Local Project]
```
### Credential Flow
1. **Local**: Reads AWS credentials from environment or `~/.aws/credentials`
2. **Encryption**: Credentials encrypted with AES-256-CBC
3. **Transit**: Sent with deployment package
4. **EC2**: Decrypts and uses for CDK deployment only
5. **Cleanup**: Credentials cleared from memory after use
## Deployment Flow
1. **Local Preparation** (Bolt.new):
- Package `selah/` directory
- Include `src/` for auto-migrate
- Include `dist/` if pre-built
- Zip everything (~10-50MB)
2. **Remote Execution** (EC2):
- Extract package
- Run `auto-migrate.js` (Supabase → AWS)
- Build frontend with AWS clients
- Deploy with CDK
- Run post-deploy scripts
3. **Result Handling**:
- Stream deployment logs
- Return AWS endpoints
- Update local `.env` file
## Troubleshooting
### "Upload failed" Error
- Check Supabase Edge Function is deployed
- Verify anon key in environment
### "EC2 runner error"
- Check EC2 instance is running
- Verify security group allows Supabase
- Check PM2 logs: `pm2 logs selah-runner`
### "Deployment timed out"
- Default timeout is 30 minutes
- Large projects may need EC2 instance upgrade
- Check CloudFormation console for stack status
### No .env Updates
- Ensure post-deploy script has correct permissions
- Check deployment logs for errors
- Manually update from terminal output
## Cost Considerations
- **EC2 Instance**: ~$30/month (t2.medium, always on)
- **Alternative**: Use Lambda for runner (pay per deployment)
- **Storage**: Minimal, deployments auto-cleanup after 1 hour
## Security Best Practices
1. **Restrict EC2 Access**:
- Only allow Supabase Edge Function IPs
- Use IAM instance profile for AWS permissions
- Rotate credentials regularly
2. **Deployment Isolation**:
- Each deployment runs in isolated directory
- Auto-cleanup after completion
- No persistent state between deployments
3. **Monitoring**:
- CloudWatch logs for EC2
- PM2 monitoring dashboard
- Supabase function logs
## Advanced Configuration
### Custom Build Commands
Modify `ec2-deploy-runner.js` to support custom build steps:
```javascript
// Add after line 92
if (metadata.customBuildCommand) {
job.logs.push(`[INFO] Running custom build: ${metadata.customBuildCommand}`);
await runCommand('npm', ['run', metadata.customBuildCommand], workDir, job);
}
```
### Parallel Deployments
Increase PM2 instances for concurrent deployments:
```javascript
// In ecosystem.config.js
instances: 3, // Handle 3 deployments simultaneously
```
### Deployment Caching
Cache `node_modules` between deployments:
```bash
# On EC2 instance
mkdir -p /opt/selah-cache/npm
export npm_config_cache=/opt/selah-cache/npm
```
## Support
- **Issues**: [GitHub Issues](https://github.com/your-repo/selah-cli/issues)
- **Logs**: Check both Bolt.new terminal and EC2 PM2 logs
- **Community**: Join our Discord for help