Public Access
bd5f676e0a
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
# Conflicts: # cli/manifest_licensing.php
183 lines
5.3 KiB
Python
183 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Example deployment workflow using MCP SSH Manager
|
|
This script demonstrates how to automate deployments similar to the ERPNext scenario
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path to import tools
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / 'tools'))
|
|
|
|
from server_manager import load_env_config, test_server_connection
|
|
|
|
def create_deployment_config(server_name, files, options=None):
|
|
"""
|
|
Create a deployment configuration for ssh_deploy tool
|
|
"""
|
|
config = {
|
|
"server": server_name,
|
|
"files": files,
|
|
"options": options or {}
|
|
}
|
|
return config
|
|
|
|
def deploy_erpnext_customization():
|
|
"""
|
|
Example: Deploy ERPNext customization files
|
|
Similar to the user's scenario with payment_proposal files
|
|
"""
|
|
|
|
# Define the files to deploy
|
|
files_to_deploy = [
|
|
{
|
|
"local": "/Users/jeremy/GitHub/erpnextswiss/erpnextswiss/doctype/payment_proposal/payment_proposal.py",
|
|
"remote": "/home/neoffice/frappe-bench/apps/erpnextswiss/erpnextswiss/doctype/payment_proposal/payment_proposal.py"
|
|
},
|
|
{
|
|
"local": "/Users/jeremy/GitHub/erpnextswiss/erpnextswiss/doctype/payment_proposal/payment_proposal.js",
|
|
"remote": "/home/neoffice/frappe-bench/apps/erpnextswiss/erpnextswiss/doctype/payment_proposal/payment_proposal.js"
|
|
}
|
|
]
|
|
|
|
# Deployment options
|
|
options = {
|
|
"owner": "neoffice:neoffice", # Set correct ownership
|
|
"permissions": "644", # Standard file permissions
|
|
"backup": True, # Always backup before overwriting
|
|
"restart": "cd /home/neoffice/frappe-bench && bench restart" # Restart after deployment
|
|
}
|
|
|
|
# Create deployment configuration
|
|
deployment = create_deployment_config("dmis", files_to_deploy, options)
|
|
|
|
print("📦 Deployment Configuration:")
|
|
print(json.dumps(deployment, indent=2))
|
|
|
|
# In Claude Code, you would say:
|
|
# "Deploy payment_proposal files to dmis server with neoffice ownership and restart bench"
|
|
|
|
return deployment
|
|
|
|
def deploy_web_application():
|
|
"""
|
|
Example: Deploy web application files
|
|
"""
|
|
|
|
files_to_deploy = [
|
|
{
|
|
"local": "./dist/index.html",
|
|
"remote": "/var/www/html/index.html"
|
|
},
|
|
{
|
|
"local": "./dist/app.js",
|
|
"remote": "/var/www/html/js/app.js"
|
|
},
|
|
{
|
|
"local": "./dist/styles.css",
|
|
"remote": "/var/www/html/css/styles.css"
|
|
}
|
|
]
|
|
|
|
options = {
|
|
"owner": "www-data:www-data",
|
|
"permissions": "644",
|
|
"backup": True,
|
|
"restart": "systemctl restart nginx"
|
|
}
|
|
|
|
deployment = create_deployment_config("production", files_to_deploy, options)
|
|
|
|
print("🌐 Web Deployment Configuration:")
|
|
print(json.dumps(deployment, indent=2))
|
|
|
|
return deployment
|
|
|
|
def deploy_configuration_files():
|
|
"""
|
|
Example: Deploy configuration files with elevated privileges
|
|
"""
|
|
|
|
files_to_deploy = [
|
|
{
|
|
"local": "./config/nginx.conf",
|
|
"remote": "/etc/nginx/nginx.conf"
|
|
},
|
|
{
|
|
"local": "./config/app.env",
|
|
"remote": "/etc/myapp/app.env"
|
|
}
|
|
]
|
|
|
|
options = {
|
|
"owner": "root:root",
|
|
"permissions": "600", # Restrictive permissions for config files
|
|
"backup": True,
|
|
"restart": "systemctl reload nginx && systemctl restart myapp"
|
|
}
|
|
|
|
deployment = create_deployment_config("production", files_to_deploy, options)
|
|
|
|
print("⚙️ Configuration Deployment:")
|
|
print(json.dumps(deployment, indent=2))
|
|
|
|
return deployment
|
|
|
|
def main():
|
|
"""
|
|
Demonstrate various deployment scenarios
|
|
"""
|
|
|
|
print("🚀 MCP SSH Manager - Deployment Examples")
|
|
print("=" * 50)
|
|
print()
|
|
|
|
# Check if server configuration exists
|
|
servers = load_env_config()
|
|
|
|
if not servers:
|
|
print("⚠️ No servers configured. Run 'python tools/server_manager.py' to add servers.")
|
|
return
|
|
|
|
print("📋 Available servers:", ", ".join(servers.keys()))
|
|
print()
|
|
|
|
# Example 1: ERPNext deployment (like the user's scenario)
|
|
print("Example 1: ERPNext Deployment")
|
|
print("-" * 30)
|
|
deploy_erpnext_customization()
|
|
print()
|
|
|
|
# Example 2: Web application deployment
|
|
print("Example 2: Web Application Deployment")
|
|
print("-" * 30)
|
|
deploy_web_application()
|
|
print()
|
|
|
|
# Example 3: Configuration files deployment
|
|
print("Example 3: Configuration Files Deployment")
|
|
print("-" * 30)
|
|
deploy_configuration_files()
|
|
print()
|
|
|
|
print("💡 Tips for using in Claude Code:")
|
|
print("-" * 30)
|
|
print("1. Create server aliases for easier access:")
|
|
print(' "Create alias dmis for dmis_server"')
|
|
print()
|
|
print("2. Deploy multiple files at once:")
|
|
print(' "Deploy all .py and .js files from payment_proposal to dmis"')
|
|
print()
|
|
print("3. Use sudo for system files:")
|
|
print(' "Deploy nginx.conf to production:/etc/nginx/ with sudo"')
|
|
print()
|
|
print("4. Always test connection first:")
|
|
print(' "Test connection to production server"')
|
|
print()
|
|
print("📚 See docs/DEPLOYMENT_GUIDE.md for complete documentation")
|
|
|
|
if __name__ == "__main__":
|
|
main() |