A unified DevOps management tool with interactive CLI and web dashboard for managing Nginx, SSL certificates, and Node.js on Linux and Windows servers.
No external ACME binaries required — SSL certificates are issued via acme-client (pure Node.js, Let's Encrypt).
Tip: Two CLI commands are available:
easy-devops(full name) andezz(short alias). Both are registered in the npm bin and do exactly the same thing.
- 🖥️ Interactive CLI — Arrow-key menus with real-time status indicators
- 📊 Web Dashboard — Modern Vue 3 interface with dark/light themes (
#161616/#d64a29palette) - 🌐 Nginx Management — Start/stop/reload, config editor, error logs, install
- 🔒 SSL Certificate Management — Let's Encrypt via
acme-client(no certbot), HTTP-01 and DNS-01 challenges, wildcard certs, expiry tracking - 🔗 Domain Management — Reverse proxy configs with SSL, external URL backends, enable/disable, wildcard domains, WebSocket, gzip, rate limiting
- 📦 Node.js Manager — Version switching via nvm / nvm-windows, global package management
- 🔄 Real-time Updates — Socket.io powered status updates in dashboard
- 💿 SQLite Storage — Persistent configuration via
good.db
- Node.js 18+ (with npm)
- Linux (Debian/Ubuntu/etc.) or Windows
⚠️ Windows users: PowerShell must be run as Administrator (required for managing services and SSL certificates)- Optional: Nginx, nvm (installed separately or via the tool)
If you have Node.js 18+ installed, run:
npm install -g easy-devops && easy-devops
# Short alias also available: ezzIf you don't have Node.js yet, use the bootstrap installer:
curl -fsSL https://raw.githubusercontent.com/omar00050/Easy-DevOps/main/install.sh -o install.sh && bash install.shOr with wget:
wget -qO install.sh https://raw.githubusercontent.com/omar00050/Easy-DevOps/main/install.sh && bash install.sh
⚠️ Important: Run PowerShell as Administrator. Right-click PowerShell → "Run as Administrator".
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/omar00050/Easy-DevOps/main/install.ps1" -OutFile "install.ps1"; ./install.ps1Or from Command Prompt:
powershell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/omar00050/Easy-DevOps/main/install.ps1' -OutFile 'install.ps1'; ./install.ps1"What the installer does:
- Checks for Node.js 18+ (installs via nvm if missing)
- Installs Easy DevOps globally via npm
- Launches the interactive CLI
npm install -g easy-devops
easy-devops # or: ezzgit clone https://github.com/omar00050/Easy-DevOps.git
cd Easy-DevOps
npm install
npm start # or: easy-devops / ezz# Start the interactive CLI
easy-devops
# Short alias — same thing, faster to type
ezz
# Or run without installing
npx easy-devops ███████╗███████╗ Easy DevOps v1.2.1
██╔════╝╚════██╗ ─────────────────────
█████╗ ██╔╝ CLI & Web Dashboard
██╔══╝ ██╔╝ Nginx · SSL · Domains · Node.js
███████╗ ██████╗
╚══════╝ ╚═════╝
nginx: ✅ v1.26.2 | ACME: acme-client | node: v22.21.1
? Select an option:
📦 Node.js Manager
🌐 Nginx Manager
🔒 SSL Manager
🔗 Domain Manager
🎛️ Open Dashboard
⚙️ Settings
🔄 Check for Updates
✖ Exit
Press Ctrl+C at any prompt to exit cleanly.
Manage your Node.js runtime using nvm (Unix) or nvm-windows (Windows).
| Option | Description |
|---|---|
| Switch Node version | Lists available LTS versions and switches to the selected one |
| Manage global packages | Install, uninstall, or list globally installed npm packages |
| Update npm | Updates npm to the latest version |
Control the Nginx web server from the CLI.
| Option | Description |
|---|---|
| Reload nginx | Tests the config then sends a graceful reload signal |
| Restart nginx | Tests the config then performs a full stop/start |
| Test config | Runs nginx -t and displays the result |
| View error log | Shows the last 50 lines of the Nginx error log |
| Install nginx | Installs Nginx via apt-get (Linux) or winget (Windows) |
Manage Nginx reverse proxy configurations from CLI or dashboard.
| Option | Description |
|---|---|
| List Domains | Show all configured domains in a table (with status) |
| Add Domain | Interactive prompts for domain configuration |
| Edit Domain | Modify existing domain settings |
| Enable / Disable Domain | Toggle domain on/off without deleting config |
| Delete Domain | Remove domain (with option to also delete SSL files) |
Domain Configuration Options:
- Backend: local host:port (
127.0.0.1:3000) or full external URL (https://app.vercel.app) - Wildcard domain (
*.example.com) — auto-enforces DNS-01 SSL validation - SSL/HTTPS with certificate management
- WebSocket support (
wsupstream type) - Gzip compression
- Rate limiting (requests/second + burst)
- Security headers (X-Frame-Options, etc.)
- Custom timeout and body size limits
- Domain-specific access logs
Issue and renew Let's Encrypt SSL certificates via acme-client — no certbot or external binaries required.
| Status | Meaning |
|---|---|
| ✅ green | Valid, expires in > 30 days |
| Expiring soon (10–30 days) | |
| ❌ red | Critical (< 10 days) |
| Method | How it works |
|---|---|
| HTTP-01 | Easy DevOps stops nginx, binds port 80, serves the ACME token, then restarts nginx |
| DNS-01 | You add a _acme-challenge TXT record to your DNS; Easy DevOps waits for confirmation |
Wildcard certificates (
*.example.com) require DNS-01 — HTTP-01 is automatically disabled for wildcard domains.
Certificates are stored under sslDir (configured in Settings):
{sslDir}/{domain}/fullchain.pem
{sslDir}/{domain}/privkey.pem
{sslDir}/.account/account.key ← ACME account key, reused across all issuances
Default paths:
- Linux:
/etc/easy-devops/ssl/ - Windows:
C:\easy-devops\ssl\
Start the web dashboard:
# From CLI menu: Select "🎛️ Open Dashboard" → "Start dashboard"
# Or directly:
npm run dashboardAccess at http://localhost:6443 (or configured port).
Default credentials:
- Username:
admin - Password: Set in Settings menu or check your configuration
Tip: From the Dashboard menu, select "How to use" for a quick guide on getting started.
| Page | Features |
|---|---|
| Overview | System status cards for Nginx, SSL, Domains |
| Nginx | Start/stop controls, config editor, error logs |
| SSL | Certificate list, renewal actions, expiry badges |
| Domains | Add/edit form with collapsible sections, table view |
| Settings | Port, password, directory configuration, Linux permissions setup |
Linux users: After launching the dashboard for the first time, open Settings → Linux Permissions and click Setup Permissions. This writes
/etc/sudoers.d/easy-devopswith NOPASSWD rules forsystemctlso nginx start/stop/reload/restart work from the dashboard without a terminal. Without this step, nginx service control will return "Linux permissions not configured" errors.
The dashboard exposes RESTful API endpoints:
| Endpoint | Method | Description |
|---|---|---|
/api/nginx/status |
GET | Get nginx running status |
/api/nginx/start |
POST | Start nginx |
/api/nginx/stop |
POST | Stop nginx |
/api/nginx/reload |
POST | Graceful reload |
/api/nginx/configs |
GET | List config files |
/api/nginx/config/:file |
GET/POST | Read/write config file |
/api/domains |
GET/POST | List/create domains |
/api/domains/:name |
PUT/DELETE | Update/delete domain |
/api/domains/:name/toggle |
PUT | Enable or disable domain |
/api/domains/:name/reload |
POST | Reload nginx for domain |
/api/ssl |
GET | List certificates |
/api/ssl/create |
POST | Issue new certificate |
/api/ssl/create-confirm |
POST | Confirm DNS challenge |
/api/ssl/renew/:domain |
POST | Renew certificate |
/api/settings |
GET/POST | Dashboard settings |
/api/settings/permissions |
GET | Linux sudo permissions status |
/api/settings/permissions/setup |
POST | Configure NOPASSWD sudoers (Linux) |
All configuration is stored in a persistent user directory (never inside the npm package, so it survives updates):
Database location:
- Linux/macOS:
~/.config/easy-devops/easy-devops.sqlite - Windows:
%APPDATA%\easy-devops\easy-devops.sqlite
| Key | Contents |
|---|---|
config |
Dashboard port, password, nginxDir, sslDir, acmeEmail |
system-detection |
Cached system info (OS, Node, nginx) |
domains |
Array of domain configurations |
Config fields:
| Field | Default (Linux) | Default (Windows) | Description |
|---|---|---|---|
dashboardPort |
6443 |
6443 |
Dashboard HTTP port |
dashboardPassword |
admin |
admin |
Dashboard login password |
nginxDir |
/etc/nginx |
C:\nginx |
Nginx installation directory |
sslDir |
/etc/easy-devops/ssl |
C:\easy-devops\ssl |
SSL certificate storage root |
acmeEmail |
(empty) | (empty) | Email for Let's Encrypt account (required for cert issuance) |
easy-devops/
├── src/
│ ├── cli/
│ │ ├── index.js # CLI entry point
│ │ ├── managers/ # Domain, Nginx, SSL, Node.js logic
│ │ └── menus/ # Thin menu dispatcher wrappers
│ ├── core/
│ │ ├── config.js # Configuration load/save
│ │ ├── db.js # SQLite helpers (good.db)
│ │ ├── detector.js # System environment detection
│ │ ├── nginx-conf-generator.js # Nginx conf builder (shared)
│ │ ├── platform.js # isWindows, nginx cmd helpers, combineOutput
│ │ ├── shell.js # Cross-platform shell executor
│ │ └── validators.js # Shared input validation helpers
│ ├── dashboard/
│ │ ├── server.js # Express + Socket.io server
│ │ ├── routes/ # auth, domains, nginx, settings, ssl
│ │ ├── lib/ # cert-reader, domains-db, nginx-service
│ │ ├── views/ # EJS templates + partials
│ │ └── public/ # Static assets (Vue 3 app)
│ └── lib/
│ └── installer/ # Bash helper modules for install.sh
├── data/
│ └── easy-devops.sqlite
├── install.sh # Linux/macOS bootstrap installer
└── install.ps1 # Windows PowerShell installer
| Feature | Linux | Windows |
|---|---|---|
| CLI Interface | ✅ | ✅ |
| Web Dashboard | ✅ | ✅ |
| Nginx Management | ✅ | ✅ |
| SSL — HTTP-01 (acme-client) | ✅ | ✅ |
| SSL — DNS-01 (acme-client) | ✅ | ✅ |
| Wildcard Certificates | ✅ | ✅ |
| Node.js (nvm) | ✅ | ✅ (nvm-windows) |
| Nginx service control | systemctl | nginx.exe direct |
# Clone and install
git clone https://github.com/omar00050/Easy-DevOps.git
cd Easy-DevOps
npm install
# Run CLI
npm start # or: easy-devops / ezz
# Run dashboard
npm run dashboard
# System info only
npm run system-infoContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CHANGELOG.md for a full history of changes.
This project is licensed under the MIT License - see the LICENSE file for details.
Omar Farghaly
- GitHub: @omar00050
- npm: abo_farghaly
If you encounter any issues or have questions, please open an issue on GitHub.