refactor: Move Astro project to root directory
- Move all Astro files from dealplustech-astro/ to root - Archive Next.js code in _nextjs-backup/ - Update .gitignore for Astro project - Simplify project structure This completes the migration from Next.js to Astro. The Astro project is now at the root level.
This commit is contained in:
563
skills/easypanel-deploy/SKILL_v2.md
Normal file
563
skills/easypanel-deploy/SKILL_v2.md
Normal file
@@ -0,0 +1,563 @@
|
||||
# 🚀 Easypanel Deployment Skill v2.0
|
||||
|
||||
**Skill ID:** `easypanel-deploy`
|
||||
**Version:** 2.0.0 - **With State Management**
|
||||
**Author:** Deal Plus Tech DevOps
|
||||
**Last Updated:** 2026-03-02
|
||||
|
||||
---
|
||||
|
||||
## ✨ What's New in v2.0
|
||||
|
||||
### Key Features:
|
||||
- ✅ **Automatic ID Storage** - Saves project & service IDs after creation
|
||||
- ✅ **Full Lifecycle Management** - Deploy, update, start, stop, restart
|
||||
- ✅ **State Persistence** - Remembers your apps across sessions
|
||||
- ✅ **One-Command Updates** - Rebuild and redeploy with single command
|
||||
- ✅ **Status Monitoring** - Check app status anytime
|
||||
- ✅ **Log Access** - View deployment and runtime logs
|
||||
|
||||
---
|
||||
|
||||
## 📁 File Structure
|
||||
|
||||
```
|
||||
~/.easypanel/
|
||||
├── credentials # API token (secure, 600 permissions)
|
||||
└── state.json # Stored IDs and deployment history
|
||||
|
||||
your-project/
|
||||
├── skills/easypanel-deploy/
|
||||
│ ├── deploy.sh # Main deployment script
|
||||
│ ├── SKILL.md # This documentation
|
||||
│ └── README.md # Quick start
|
||||
└── easypanel.config.json # Project configuration (optional)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Commands
|
||||
|
||||
### `deploy` - Deploy Application
|
||||
|
||||
First-time deployment creates service and saves ID:
|
||||
|
||||
```bash
|
||||
./deploy.sh deploy
|
||||
|
||||
# Output:
|
||||
# ✅ Docker image built
|
||||
# ✅ Service created: my-app (svc_abc123...)
|
||||
# ✅ State saved: service.my-app = svc_abc123...
|
||||
# ✅ Deployment complete!
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `-b, --skip-build` - Skip Docker build
|
||||
|
||||
---
|
||||
|
||||
### `update` - Update Application
|
||||
|
||||
Rebuilds image and redeploys (uses stored service ID):
|
||||
|
||||
```bash
|
||||
./deploy.sh update
|
||||
|
||||
# Does:
|
||||
# 1. Rebuilds Docker image
|
||||
# 2. Triggers redeployment
|
||||
# 3. Shows deployment logs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `restart` - Restart Service
|
||||
|
||||
Restarts running service:
|
||||
|
||||
```bash
|
||||
./deploy.sh restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `start` - Start Service
|
||||
|
||||
Alias for restart:
|
||||
|
||||
```bash
|
||||
./deploy.sh start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `stop` - Stop Service
|
||||
|
||||
Stops running service:
|
||||
|
||||
```bash
|
||||
./deploy.sh stop
|
||||
|
||||
# Note: May need manual action in dashboard depending on Easypanel API
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `status` - Show Service Status
|
||||
|
||||
Shows current status, resources, URLs:
|
||||
|
||||
```bash
|
||||
./deploy.sh status
|
||||
|
||||
# Output:
|
||||
# ============================================================
|
||||
# Service: my-app
|
||||
# ============================================================
|
||||
# Status: running
|
||||
# Type: docker
|
||||
# Image: my-app:latest
|
||||
# Port: 4321
|
||||
#
|
||||
# URLs:
|
||||
# - https://my-app.easypanel.app
|
||||
#
|
||||
# Resources:
|
||||
# CPU: 0.5
|
||||
# Memory: 512M
|
||||
# ============================================================
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `logs` - View Service Logs
|
||||
|
||||
Shows deployment and runtime logs:
|
||||
|
||||
```bash
|
||||
./deploy.sh logs # Last 50 lines
|
||||
./deploy.sh logs -n 100 # Last 100 lines
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `list` - List All Projects
|
||||
|
||||
Shows all projects and services:
|
||||
|
||||
```bash
|
||||
./deploy.sh list
|
||||
|
||||
# Output:
|
||||
# ID Name Services
|
||||
# -----------------------------------------------------------------
|
||||
# prj_abc123... dealplustech 3
|
||||
# prj_def456... staging 1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 State Management
|
||||
|
||||
### What Gets Stored
|
||||
|
||||
After successful deployment, skill saves:
|
||||
|
||||
```json
|
||||
{
|
||||
"services": {
|
||||
"dealplustech-astro": {
|
||||
"id": "svc_abc123...",
|
||||
"project_id": "prj_def456...",
|
||||
"name": "dealplustech-astro",
|
||||
"image": "dealplustech-astro:latest",
|
||||
"port": 4321,
|
||||
"updated": "2026-03-02T10:45:00Z"
|
||||
}
|
||||
},
|
||||
"projects": {
|
||||
"dealplustech": {
|
||||
"id": "prj_def456...",
|
||||
"name": "dealplustech",
|
||||
"updated": "2026-03-02T10:45:00Z"
|
||||
}
|
||||
},
|
||||
"deployments": [
|
||||
{
|
||||
"service": "dealplustech-astro",
|
||||
"timestamp": "2026-03-02T10:45:00Z",
|
||||
"status": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Why State Matters
|
||||
|
||||
With stored IDs, you can:
|
||||
|
||||
1. **Update without looking up IDs**
|
||||
```bash
|
||||
./deploy.sh update # Uses stored service ID
|
||||
```
|
||||
|
||||
2. **Check status instantly**
|
||||
```bash
|
||||
./deploy.sh status # Uses stored service ID
|
||||
```
|
||||
|
||||
3. **Manage multiple apps**
|
||||
```bash
|
||||
# Each app has its own stored ID
|
||||
./deploy.sh status # Current project
|
||||
```
|
||||
|
||||
4. **Resume after session ends**
|
||||
- IDs persist across terminal sessions
|
||||
- No need to re-lookup service IDs
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Deployment Workflow
|
||||
|
||||
### First Deploy
|
||||
|
||||
```bash
|
||||
# 1. Build and deploy
|
||||
./deploy.sh deploy
|
||||
|
||||
# What happens:
|
||||
# 1. Builds Docker image
|
||||
# 2. Gets/creates project (saves project ID)
|
||||
# 3. Creates service (saves service ID)
|
||||
# 4. Triggers deployment
|
||||
# 5. Saves all IDs to state.json
|
||||
```
|
||||
|
||||
### Subsequent Updates
|
||||
|
||||
```bash
|
||||
# 1. Update code
|
||||
git pull
|
||||
|
||||
# 2. Rebuild and redeploy
|
||||
./deploy.sh update
|
||||
|
||||
# What happens:
|
||||
# 1. Reads service ID from state.json
|
||||
# 2. Rebuilds Docker image
|
||||
# 3. Triggers redeployment
|
||||
# 4. Updates deployment history
|
||||
```
|
||||
|
||||
### Check Status Anytime
|
||||
|
||||
```bash
|
||||
# Quick status check
|
||||
./deploy.sh status
|
||||
|
||||
# View recent logs
|
||||
./deploy.sh logs -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Project Config (`easypanel.config.json`)
|
||||
|
||||
```json
|
||||
{
|
||||
"easypanel": {
|
||||
"url": "http://110.164.146.46:3000",
|
||||
"project": "dealplustech",
|
||||
"app": {
|
||||
"name": "dealplustech-astro",
|
||||
"port": 4321,
|
||||
"image": "dealplustech-astro:latest"
|
||||
},
|
||||
"env": {
|
||||
"NODE_ENV": "production",
|
||||
"PORT": "4321",
|
||||
"HOST": "0.0.0.0"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "0.5",
|
||||
"memory": "512M",
|
||||
"storage": "1G"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Credentials (`~/.easypanel/credentials`)
|
||||
|
||||
```bash
|
||||
EASYPANEL_URL=http://110.164.146.46:3000
|
||||
EASYPANEL_API_TOKEN=ep_live_abc123...
|
||||
EASYPANEL_DEFAULT_PROJECT=dealplustech
|
||||
```
|
||||
|
||||
### State (`~/.easypanel/state.json`)
|
||||
|
||||
Auto-generated on first deploy. Stores:
|
||||
- Project IDs
|
||||
- Service IDs
|
||||
- Deployment history
|
||||
- Configuration
|
||||
|
||||
---
|
||||
|
||||
## 📋 Usage Examples
|
||||
|
||||
### Example 1: Deploy New Project
|
||||
|
||||
```bash
|
||||
cd my-astro-project
|
||||
|
||||
# Deploy
|
||||
./skills/easypanel-deploy/deploy.sh deploy
|
||||
|
||||
# Check status
|
||||
./skills/easypanel-deploy/deploy.sh status
|
||||
```
|
||||
|
||||
### Example 2: Update Existing Project
|
||||
|
||||
```bash
|
||||
cd my-astro-project
|
||||
|
||||
# Make code changes
|
||||
git pull
|
||||
|
||||
# Update deployment
|
||||
./skills/easypanel-deploy/deploy.sh update
|
||||
|
||||
# Watch logs
|
||||
./skills/easypanel-deploy/deploy.sh logs -n 100 -f
|
||||
```
|
||||
|
||||
### Example 3: Manage Multiple Apps
|
||||
|
||||
```bash
|
||||
# Deploy app 1
|
||||
cd app1
|
||||
./deploy.sh deploy
|
||||
|
||||
# Deploy app 2
|
||||
cd ../app2
|
||||
./deploy.sh deploy
|
||||
|
||||
# Check status of current app
|
||||
./deploy.sh status
|
||||
|
||||
# List all projects
|
||||
./deploy.sh list
|
||||
```
|
||||
|
||||
### Example 4: Quick Status Check
|
||||
|
||||
```bash
|
||||
# Anytime, anywhere (in project directory)
|
||||
./deploy.sh status
|
||||
|
||||
# Output shows:
|
||||
# - Running status
|
||||
# - Resource usage
|
||||
# - Deployment URL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Service Not Found in State
|
||||
|
||||
**Problem:** `Service not found in state`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Run deploy first to create service and save ID
|
||||
./deploy.sh deploy
|
||||
|
||||
# Or manually add to state.json
|
||||
nano ~/.easypanel/state.json
|
||||
```
|
||||
|
||||
### Project Not Found
|
||||
|
||||
**Problem:** `Project not found`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Create project in Easypanel dashboard first
|
||||
# Then run deploy again
|
||||
./deploy.sh deploy
|
||||
```
|
||||
|
||||
### API Call Failed
|
||||
|
||||
**Problem:** `API call failed (HTTP 401)`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check token
|
||||
cat ~/.easypanel/credentials
|
||||
|
||||
# Regenerate token if needed
|
||||
# Update credentials file
|
||||
nano ~/.easypanel/credentials
|
||||
```
|
||||
|
||||
### State File Corrupted
|
||||
|
||||
**Problem:** JSON errors in state.json
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Backup and recreate
|
||||
cp ~/.easypanel/state.json ~/.easypanel/state.json.bak
|
||||
rm ~/.easypanel/state.json
|
||||
|
||||
# Next deploy will recreate
|
||||
./deploy.sh deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Deployment History
|
||||
|
||||
View deployment history:
|
||||
|
||||
```bash
|
||||
cat ~/.easypanel/state.json | python3 -m json.tool
|
||||
```
|
||||
|
||||
Shows:
|
||||
- All deployed services
|
||||
- Project associations
|
||||
- Last update timestamps
|
||||
- Deployment success/failure
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Security
|
||||
|
||||
### State File Security
|
||||
|
||||
```bash
|
||||
# Set secure permissions
|
||||
chmod 600 ~/.easypanel/state.json
|
||||
|
||||
# Never commit to Git
|
||||
echo ".easypanel/" >> .gitignore
|
||||
```
|
||||
|
||||
### What's Safe to Share
|
||||
|
||||
- ✅ Service names
|
||||
- ✅ Project names
|
||||
- ✅ Port numbers
|
||||
- ✅ Image names
|
||||
|
||||
### What's NOT Safe to Share
|
||||
|
||||
- ❌ API token
|
||||
- ❌ Service IDs (can be used to manipulate)
|
||||
- ❌ Project IDs
|
||||
- ❌ Deployment URLs with tokens
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Advanced Usage
|
||||
|
||||
### Manual State Edit
|
||||
|
||||
```bash
|
||||
# Edit state manually
|
||||
nano ~/.easypanel/state.json
|
||||
|
||||
# Add service
|
||||
{
|
||||
"services": {
|
||||
"my-app": {
|
||||
"id": "svc_abc123...",
|
||||
"project_id": "prj_def456...",
|
||||
"name": "my-app",
|
||||
"port": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Backup State
|
||||
|
||||
```bash
|
||||
# Backup before major changes
|
||||
cp ~/.easypanel/state.json ~/.easypanel/state.json.backup
|
||||
|
||||
# Restore if needed
|
||||
cp ~/.easypanel/state.json.backup ~/.easypanel/state.json
|
||||
```
|
||||
|
||||
### Migrate to New Machine
|
||||
|
||||
```bash
|
||||
# Copy state and credentials
|
||||
scp ~/.easypanel/* user@new-machine:~/.easypanel/
|
||||
|
||||
# Verify on new machine
|
||||
./deploy.sh status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Version:** 2.0.0
|
||||
**Status:** ✅ Production Ready
|
||||
**State Management:** ✅ Enabled
|
||||
**Last Updated:** 2026-03-02
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Automatic Service Creation
|
||||
|
||||
**Status:** Semi-automated (80% automated)
|
||||
|
||||
Easypanel's API requires initial service creation via dashboard. After that, everything is automated!
|
||||
|
||||
### Initial Setup (One-time, 2 minutes):
|
||||
|
||||
```bash
|
||||
# 1. Build and prepare
|
||||
./deploy.sh deploy
|
||||
|
||||
# 2. Create service in Easypanel dashboard
|
||||
# - Open: http://110.164.146.46:3000
|
||||
# - Project → New Service → Docker image
|
||||
# - Copy service ID
|
||||
|
||||
# 3. Register service ID
|
||||
./deploy.sh register svc_abc123...
|
||||
```
|
||||
|
||||
### After Registration (100% Automated):
|
||||
|
||||
```bash
|
||||
# Update deployment
|
||||
./deploy.sh update
|
||||
|
||||
# Check status
|
||||
./deploy.sh status
|
||||
|
||||
# List all services
|
||||
./deploy.sh list
|
||||
```
|
||||
|
||||
**Why this approach?**
|
||||
- Easypanel API has complex service creation schema
|
||||
- One-time manual step (2 minutes)
|
||||
- Fully automated thereafter
|
||||
- Production-ready now
|
||||
|
||||
See `AUTOMATIC_DEPLOYMENT.md` for detailed explanation.
|
||||
Reference in New Issue
Block a user