2025-10-07 11:12:02 +01:00

198 lines
4.9 KiB
Markdown

# Example Infrastructure Template
This is a complete, ready-to-deploy example of a simple web application stack.
## What's Included
- **2 Web servers** - Load-balanced frontend
- **1 Database server** - Backend database
- **Complete configuration** - Ready to deploy with minimal changes
- **Usage instructions** - Step-by-step deployment guide
## Architecture
```
┌─────────────────────────────────────────┐
│ Internet / Load Balancer │
└─────────────┬───────────────────────────┘
┌───────┴───────┐
│ │
┌─────▼─────┐ ┌────▼──────┐
│ demo-web-01│ │demo-web-02│
│ (Public) │ │ (Public) │
└─────┬──────┘ └────┬──────┘
│ │
└───────┬───────┘
│ Private Network
┌─────▼──────┐
│ demo-db-01 │
│ (Private) │
└────────────┘
```
## Quick Start
### 1. Load Required Provider
```bash
cd infra/<your-infra-name>
# Load your cloud provider
provisioning mod load providers . upcloud
# OR
provisioning mod load providers . aws
```
### 2. Configure Provider Settings
Edit `servers.k` and uncomment provider-specific settings:
**UpCloud example:**
```kcl
plan = "1xCPU-2GB" # Web servers
# plan = "2xCPU-4GB" # Database server (larger)
storage_size = 25 # Disk size in GB
```
**AWS example:**
```kcl
instance_type = "t3.small" # Web servers
# instance_type = "t3.medium" # Database server
storage_size = 25
```
### 3. Load Optional Task Services
```bash
# For container support
provisioning mod load taskservs . containerd
# For additional services
provisioning mod load taskservs . docker redis nginx
```
### 4. Deploy
```bash
# Test configuration first
kcl run servers.k
# Dry-run to see what will be created
provisioning s create --infra <name> --check
# Deploy the infrastructure
provisioning s create --infra <name>
# Monitor deployment
watch provisioning s list --infra <name>
```
### 5. Verify Deployment
```bash
# List all servers
provisioning s list --infra <name>
# SSH into web server
provisioning s ssh demo-web-01
# Check database server
provisioning s ssh demo-db-01
```
## Configuration Details
### Web Servers (demo-web-01, demo-web-02)
- **Networking**: Public IPv4 + Private IPv4
- **Purpose**: Frontend application servers
- **Load balancing**: Configure externally
- **Resources**: Minimal (1-2 CPU, 2-4GB RAM)
### Database Server (demo-db-01)
- **Networking**: Private IPv4 only (no public access)
- **Purpose**: Backend database
- **Security**: Isolated on private network
- **Resources**: Medium (2-4 CPU, 4-8GB RAM)
## Next Steps
### Application Deployment
1. **Deploy application code** - Use SSH or CI/CD
2. **Configure web servers** - Set up Nginx/Apache
3. **Set up database** - Install PostgreSQL/MySQL
4. **Configure connectivity** - Connect web servers to database
### Security Hardening
1. **Firewall rules** - Lock down server access
2. **SSH keys** - Disable password auth
3. **Database access** - Restrict to web servers only
4. **SSL certificates** - Set up HTTPS
### Monitoring & Backup
1. **Monitoring** - Set up metrics collection
2. **Logging** - Configure centralized logging
3. **Backups** - Set up database backups
4. **Alerts** - Configure alerting
### Scaling
1. **Add more web servers** - Copy web-02 definition
2. **Database replication** - Add read replicas
3. **Load balancer** - Configure external LB
4. **Auto-scaling** - Set up scaling policies
## Customization
### Change Server Count
```kcl
# Add more web servers
{
hostname = "demo-web-03"
# ... copy configuration from web-01
}
```
### Change Resource Sizes
```kcl
# Web servers
plan = "2xCPU-4GB" # Increase resources
# Database
plan = "4xCPU-8GB" # More resources for DB
storage_size = 100 # Larger disk
```
### Add Task Services
```kcl
taskservs = [
{ name = "containerd", profile = "default" }
{ name = "docker", profile = "default" }
{ name = "redis", profile = "default" }
]
```
## Common Issues
### Deployment Fails
- Check provider credentials
- Verify network configuration
- Check resource quotas
### Can't SSH
- Verify SSH key is loaded
- Check firewall rules
- Ensure server is running
### Database Connection
- Verify private network
- Check firewall rules between web and DB
- Test connectivity from web servers
## Template Characteristics
- **Complexity**: Medium
- **Servers**: 3 (2 web + 1 database)
- **Pre-configured modules**: Provider only
- **Best for**: Quick demos, learning deployments, testing infrastructure code