# GitHub Actions Deployment Setup
This guide will help you configure automated deployment for your CV server.
## How It Works
When you push to the `main` branch, GitHub Actions will:
1. SSH into your server
2. Pull the latest code with `git pull origin main`
3. Restart your systemd service
4. Verify the deployment by checking the health endpoint
## Prerequisites
✅ Your server must have:
- Git repository cloned at the deployment path
- Systemd service configured to run `go run .`
- SSH access configured
- `sudo` permissions for the user (to restart systemd service)
## GitHub Secrets Configuration
Go to your GitHub repository → Settings → Secrets and variables → Actions → New repository secret
### Required Secrets
| Secret Name | Description | Example Value |
|-------------|-------------|---------------|
| `SSH_PRIVATE_KEY` | Your SSH private key | `-----BEGIN OPENSSH PRIVATE KEY-----`
`...`
`-----END OPENSSH PRIVATE KEY-----` |
| `SSH_HOST` | Your server's IP or domain | `192.168.1.100` or `cv.example.com` |
| `SSH_USER` | SSH username | `deploy` or `ubuntu` |
### Optional Secrets (with defaults)
| Secret Name | Description | Default Value |
|-------------|-------------|---------------|
| `SSH_PORT` | SSH port number | `22` |
| `SERVICE_NAME` | Systemd service name | `cv-server` |
| `REPO_PATH` | Path to repository on server | `/opt/cv-server` |
## Step-by-Step Setup
### 1. Generate SSH Key Pair (if you don't have one)
On your local machine:
```bash
ssh-keygen -t ed25519 -C "github-actions-cv-deploy" -f ~/.ssh/cv-deploy
```
This creates:
- `~/.ssh/cv-deploy` (private key) - Add to GitHub Secrets
- `~/.ssh/cv-deploy.pub` (public key) - Add to server
### 2. Add Public Key to Server
Copy the public key to your server:
```bash
ssh-copy-id -i ~/.ssh/cv-deploy.pub your-user@your-server
```
Or manually:
```bash
# On your server
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "YOUR_PUBLIC_KEY_CONTENT" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```
### 3. Add Private Key to GitHub Secrets
```bash
# Copy the private key content
cat ~/.ssh/cv-deploy
```
Copy the **entire output** (including `-----BEGIN` and `-----END` lines) and add it as `SSH_PRIVATE_KEY` secret in GitHub.
### 4. Configure Sudoers (for service restart)
Your SSH user needs permission to restart the systemd service without a password:
```bash
# On your server
sudo visudo -f /etc/sudoers.d/cv-deploy
```
Add this line (replace `your-user` with your SSH username):
```
your-user ALL=(ALL) NOPASSWD: /bin/systemctl restart cv-server, /bin/systemctl status cv-server, /bin/systemctl is-active cv-server, /usr/bin/journalctl -u cv-server*
```
Save and verify:
```bash
sudo -l # Should show the commands without requiring password
```
### 5. Example Systemd Service
Your systemd service should be configured to run `go run .`. Example at `/etc/systemd/system/cv-server.service`:
```ini
[Unit]
Description=CV Server - Go Hot Reload
After=network.target
[Service]
Type=simple
User=your-user
WorkingDirectory=/opt/cv-server
Environment="GO_ENV=production"
Environment="PORT=1999"
ExecStart=/usr/local/go/bin/go run .
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
```
Enable and start:
```bash
sudo systemctl daemon-reload
sudo systemctl enable cv-server
sudo systemctl start cv-server
```
### 6. Add GitHub Secrets
In your GitHub repository:
1. Go to **Settings** → **Secrets and variables** → **Actions**
2. Click **New repository secret**
3. Add each secret:
```
SSH_PRIVATE_KEY: [paste entire private key]
SSH_HOST: your.server.ip.or.domain
SSH_USER: your-ssh-username
SSH_PORT: 22 (if using default, can skip)
SERVICE_NAME: cv-server (if different, update)
REPO_PATH: /opt/cv-server (if different, update)
```
## Testing the Deployment
### Manual Trigger
You can manually trigger the deployment:
1. Go to **Actions** tab in GitHub
2. Click **Deploy CV Server** workflow
3. Click **Run workflow** → **Run workflow**
### Automatic Trigger
Simply push to main:
```bash
git add .
git commit -m "Test deployment"
git push origin main
```
### Verify Deployment
Check the Actions tab in GitHub to see the deployment progress. The workflow will:
- ✅ Pull latest code
- ✅ Restart service
- ✅ Check service status
- ✅ Verify health endpoint
## Troubleshooting
### SSH Connection Issues
```bash
# Test SSH connection from GitHub Actions
ssh -i ~/.ssh/cv-deploy -p 22 user@host "echo 'Connection successful'"
```
### Service Restart Issues
```bash
# Check service logs
sudo journalctl -u cv-server -n 50 --no-pager
# Check service status
sudo systemctl status cv-server
```
### Permission Issues
```bash
# Verify sudoers configuration
sudo -l
# Test restart command
sudo systemctl restart cv-server
```
### Health Check Failures
```bash
# Test health endpoint on server
curl http://localhost:1999/health
# Check if service is listening
sudo netstat -tlnp | grep 1999
```
## Security Best Practices
✅ Use ED25519 SSH keys (more secure than RSA)
✅ Restrict sudo permissions to specific commands only
✅ Use a dedicated deployment user (not root)
✅ Regularly rotate SSH keys
✅ Enable firewall rules to restrict SSH access
✅ Use SSH key passphrase (store in GitHub Secrets if needed)
## Next Steps
After setup is complete:
1. Test the deployment with a small change
2. Monitor the first few deployments
3. Set up notifications for failed deployments (GitHub Actions settings)
4. Consider adding deployment tags/releases for rollback capability