
deploy-guide
by JHaugaard
SKILL.md
name: deploy-guide description: "Guide user through actual deployment steps for their application. This skill should be used when a project is ready to deploy to production. Walks through pre-deployment checks, deployment execution, and post-deployment verification. Supports VPS/Docker, Cloudflare Pages, fly.io, and Hostinger Shared Hosting." allowed-tools:
- Read
- Grep
- Glob
- Write
- Bash
- WebFetch
deploy-guide
If not present, gather information conversationally.
Let me verify your project is ready for deployment, then we'll proceed step by step."
Where are you deploying?
- VPS with Docker - Your Hostinger VPS using Docker Compose
- Cloudflare Pages - Static/JAMstack deployment
- Fly.io - Containerized full-stack deployment
- Hostinger Shared Hosting - PHP + MySQL deployment
Which target? [1/2/3/4]"
Code Readiness:
- All changes committed to git
- Working branch merged to main (or deploy branch)
- No uncommitted changes
- Build passes locally
Configuration:
- Environment variables documented
- Production config separate from development
- Secrets not committed to git
Testing (if applicable):
- Tests passing
- No critical bugs open
Infrastructure:
- Target environment accessible
- Required services running (database, etc.)
- DNS configured (if first deployment)
Verify on correct branch
git branch --show-current
Check build passes
{build_command}
Verify tests pass (if configured)
{test_command}
</verification-commands>
<prompt-to-user>
Running pre-deployment checks...
{checklist_results}
**Issues Found:** {count}
{issue_details}
Ready to proceed with deployment? [yes/no/fix issues]
</prompt-to-user>
</phase>
<phase id="2" name="deploy">
<action>Execute deployment based on target.</action>
<deployment-targets>
<vps-docker>
<name>VPS with Docker (Hostinger)</name>
<pre-steps>
1. Ensure Docker Compose file is ready
2. Verify SSH access to VPS
3. Confirm project directory exists on VPS
</pre-steps>
<deployment-process>
**Step 1: Connect to VPS**
```bash
ssh {username}@{host}
Step 2: Navigate to project
cd /var/www/{project_name}
Step 3: Pull latest code
git pull origin main
Step 4: Build and restart containers
docker compose pull
docker compose up -d --build
Step 5: Verify containers running
docker compose ps
Step 6: Check application logs
docker compose logs --tail=50
Step 7: Clean up
docker system prune -f
-
Create project directory:
sudo mkdir -p /var/www/{project_name} sudo chown {username}:{username} /var/www/{project_name} -
Clone repository:
cd /var/www/{project_name} git clone {repo_url} . -
Create production .env:
cp .env.example .env nano .env # Configure production values -
Configure Caddy (reverse proxy):
{domain} { reverse_proxy localhost:{port} } -
Reload Caddy:
sudo systemctl reload caddy
If connected to GitHub:
- Push to main branch
- Cloudflare automatically deploys
- Monitor build in Cloudflare dashboard
Option B: Direct Deploy (Manual)
Using Wrangler CLI:
# Install/update Wrangler
npm install -g wrangler
# Login to Cloudflare
wrangler login
# Build project
{build_command}
# Deploy
wrangler pages deploy {output_dir} --project-name={project_name}
- Create project in Cloudflare Pages dashboard
- Connect to GitHub repository (recommended)
- Configure build settings:
- Build command:
npm run build - Build output directory:
outordistor.next
- Build command:
- Set environment variables in dashboard
Step 2: Deploy
flyctl deploy
Step 3: Monitor deployment
flyctl logs
Step 4: Verify running
flyctl status
Step 5: Open application
flyctl open
-
Install Fly CLI:
curl -L https://fly.io/install.sh | sh -
Authenticate:
flyctl auth login -
Create app:
flyctl apps create {app_name} -
Create fly.toml (or use
flyctl launch) -
Set secrets:
flyctl secrets set DATABASE_URL="..." flyctl secrets set SECRET_KEY="..." -
Create database (if needed):
flyctl postgres create flyctl postgres attach
# SSH to server
ssh {username}@{host}
# Navigate to public_html
cd ~/public_html/{subdirectory}
# Pull latest code
git pull origin main
# Install dependencies (if composer)
composer install --no-dev --optimize-autoloader
Option B: Using rsync
rsync -avz --delete \
--exclude='.git' \
--exclude='.env' \
--exclude='node_modules' \
./ {username}@{host}:~/public_html/{subdirectory}/
Option C: Using FTP
Use FileZilla or similar:
- Connect to FTP server
- Navigate to public_html
- Upload files (excluding .env, node_modules, .git)
-
Create subdirectory (if not root):
mkdir -p ~/public_html/{subdirectory} -
Create .htaccess (for PHP routing):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] -
Configure database in cPanel
-
Create production .env on server
-
Set correct file permissions:
find . -type f -exec chmod 644 {} \; find . -type d -exec chmod 755 {} \;
Functionality:
- Authentication works (if applicable)
- Database connections working
- API endpoints responding
Performance:
- Reasonable load time
- No console errors
- SSL certificate valid
Check SSL certificate
curl -vI https://{domain} 2>&1 | grep "SSL certificate"
Check specific endpoints
curl https://{domain}/api/health
</verification-commands>
<prompt-to-user>
Verifying deployment...
{verification_results}
**Status:** {SUCCESS/ISSUES_FOUND}
{details}
{if success}
Your application is live at: https://{domain}
{if issues}
Issues detected. Would you like help troubleshooting? [yes/no]
</prompt-to-user>
</phase>
<phase id="4" name="create-deployment-log">
<action>Create .docs/deployment-log.md documenting the deployment.</action>
<deployment-log-template>
```markdown
# Deployment Log
## Latest Deployment
**Date:** {date}
**Target:** {deployment_target}
**Branch:** {branch}
**Commit:** {commit_hash}
**Deployed by:** {user}
**Status:** SUCCESS
### Pre-Deployment Checks
- [x] Code committed and pushed
- [x] Build passed locally
- [x] Tests passing
- [x] Environment configured
### Deployment Steps Executed
1. {step_1}
2. {step_2}
3. {step_3}
### Post-Deployment Verification
- [x] Application accessible
- [x] No errors in logs
- [x] Core functionality working
### URLs
- **Production:** https://{domain}
- **API:** https://{domain}/api
---
## Deployment Runbook
### Regular Deployment
```bash
{deployment_commands}
Rollback Procedure
{rollback_commands}
Environment Variables
| Variable | Description | Where to Set |
|---|---|---|
| {var_1} | {desc} | {location} |
| {var_2} | {desc} | {location} |
Deployment History
| Date | Commit | Status | Notes |
|---|---|---|---|
| {date} | {hash} | SUCCESS | Initial deployment |
Troubleshooting
Common Issues
Application not loading:
- Check container status:
docker compose ps - Check logs:
docker compose logs - Verify Caddy config
Database connection failed:
- Verify DATABASE_URL in .env
- Check database container running
- Test connection manually
SSL certificate issues:
- Caddy auto-generates certificates
- Check Caddy logs:
sudo journalctl -u caddy - Verify DNS pointing to server
</deployment-log-template>
</phase>
<phase id="5" name="summarize">
<action>Provide deployment summary and next steps.</action>
<summary-template>
## Deployment Complete
**Application:** {project_name}
**Target:** {deployment_target}
**URL:** https://{domain}
**Status:** SUCCESS
---
### Deployment Record
Created: .docs/deployment-log.md
This file contains:
- Deployment runbook for future deployments
- Rollback procedure
- Environment variables reference
- Troubleshooting guide
---
### Workflow Status
**TERMINATION POINT - MANUAL DEPLOYMENT**
Your application is deployed. You can stop here if you don't need CI/CD automation.
**Next Options:**
1. **Stop here** - Use .docs/deployment-log.md for future manual deployments
2. **Add CI/CD** - Use **ci-cd-implement** skill to automate deployments
---
### For Future Deployments
Quick deployment:
```bash
{quick_deploy_command}
See .docs/deployment-log.md for full runbook.
Monitoring Recommendations
- Check logs regularly:
{log_command} - Monitor uptime with external service
- Set up alerts for errors
Congratulations on your deployment!
Rebuild from scratch
docker compose down docker compose build --no-cache docker compose up -d
**Port already in use:**
```bash
# Find process using port
sudo lsof -i :{port}
# Kill process or change port in docker-compose.yml
Out of disk space:
# Clean up Docker
docker system prune -a --volumes
SSL certificate not working:
- Verify DNS points to server
- Check Caddy logs:
sudo journalctl -u caddy -f - Wait for certificate propagation (up to 15 minutes)
Permission denied:
- Verify user credentials in .env
- Check database user has required permissions
Environment variables:
- Set in Cloudflare Pages dashboard
- Redeploy after changing
App crashing:
- Check logs:
flyctl logs - Verify health check endpoint
- Check memory usage:
flyctl status
Status: Phase 0: Project Brief (project-brief-writer) Phase 1: Tech Stack (tech-stack-advisor) Phase 2: Deployment Strategy (deployment-advisor) Phase 3: Project Foundation (project-spinup) <- TERMINATION POINT (localhost) Phase 4: Test Strategy (test-orchestrator) - optional Phase 5: Deployment (you are here) <- TERMINATION POINT (manual deploy) Phase 6: CI/CD (ci-cd-implement) <- TERMINATION POINT (full automation)
This is a TERMINATION POINT for projects not needing CI/CD automation.
Mention this option when users seem uncertain about their progress.
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon