Add comprehensive README + Cloudflare Worker for install.jarviscli.dev
- Full README with all CLI flags documented in tables - Quick install, automated install, panel+wings, wings-only examples - Cloudflare Worker: serves install.sh for curl, landing page for browsers - Landing page with dark theme, click-to-copy, feature grid
This commit is contained in:
parent
cbc8ee39ff
commit
55b8a0e6da
2 changed files with 330 additions and 111 deletions
282
README.md
282
README.md
|
|
@ -1,144 +1,204 @@
|
|||
# 🐦 Pelican Installer
|
||||
|
||||
The best way to install [Pelican Panel](https://pelican.dev) & Wings — one script, fully automated, production-ready.
|
||||
The best way to install [Pelican Panel](https://pelican.dev) & Wings — one command, fully automated.
|
||||
|
||||
## Quick Start
|
||||
> Better than the pterodactyl-installer. Every option configurable via CLI flags, full web server configs, Redis support, auto admin creation, and more.
|
||||
|
||||
## Quick Install
|
||||
|
||||
```bash
|
||||
# Interactive install (asks you everything)
|
||||
sudo bash <(curl -sSL https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh)
|
||||
|
||||
# Or download first
|
||||
curl -sSL -o install.sh https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh
|
||||
sudo bash install.sh
|
||||
curl -sSL https://install.jarviscli.dev | sudo bash
|
||||
```
|
||||
|
||||
## Automated Install (No Prompts)
|
||||
Or directly from GitHub:
|
||||
|
||||
```bash
|
||||
# Panel with Nginx + PostgreSQL + SSL
|
||||
sudo bash install.sh install --panel \
|
||||
--domain panel.example.com \
|
||||
--webserver nginx \
|
||||
--database postgres \
|
||||
--ssl --email admin@example.com \
|
||||
--timezone America/New_York \
|
||||
-y
|
||||
|
||||
# Wings only
|
||||
sudo bash install.sh install --wings -y
|
||||
|
||||
# Panel + Wings on same machine
|
||||
sudo bash install.sh install --both \
|
||||
--domain panel.example.com \
|
||||
--webserver caddy \
|
||||
--database postgres \
|
||||
-y
|
||||
curl -sSL https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh | sudo bash
|
||||
```
|
||||
|
||||
## All CLI Flags
|
||||
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `install` / `update` / `uninstall` | Action to perform | `install` |
|
||||
| `--panel` | Install/update Panel | — |
|
||||
| `--wings` | Install/update Wings | — |
|
||||
| `--both` | Install/update Panel + Wings | — |
|
||||
| `--domain FQDN` | Panel domain name | *(asked)* |
|
||||
| `--webserver WS` | `nginx`, `apache`, or `caddy` | *(asked)* |
|
||||
| `--database DB` | `sqlite`, `mysql`, `mariadb`, or `postgres` | *(asked)* |
|
||||
| `--db-host HOST` | Database host | `127.0.0.1` |
|
||||
| `--db-port PORT` | Database port | *auto from DB type* |
|
||||
| `--db-name NAME` | Database name | `pelican` |
|
||||
| `--db-user USER` | Database user | `pelican` |
|
||||
| `--db-password PASS` | Database password | *auto-generated* |
|
||||
| `--ssl` | Enable SSL via Let's Encrypt | *(asked)* |
|
||||
| `--no-ssl` | Disable SSL | — |
|
||||
| `--email EMAIL` | Email for Let's Encrypt | *(asked if --ssl)* |
|
||||
| `--timezone TZ` | Server timezone | `UTC` |
|
||||
| `--yes`, `-y` | Skip all confirmation prompts | `false` |
|
||||
|
||||
## Environment Variables
|
||||
|
||||
Every flag can also be set via environment variable:
|
||||
## Fully Automated Install (Non-Interactive)
|
||||
|
||||
```bash
|
||||
export FQDN="panel.example.com"
|
||||
export WEBSERVER="nginx"
|
||||
export DB_CHOICE="postgres"
|
||||
export DB_PASSWORD="my_secure_password"
|
||||
export CONFIGURE_SSL=true
|
||||
export EMAIL="admin@example.com"
|
||||
export ASSUME_YES=true
|
||||
sudo -E bash install.sh install --panel
|
||||
curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
|
||||
--panel \
|
||||
--domain panel.example.com \
|
||||
--webserver nginx \
|
||||
--database postgres \
|
||||
--ssl --email you@example.com \
|
||||
--cache-driver redis \
|
||||
--session-driver redis \
|
||||
--queue-driver redis \
|
||||
--admin-email admin@example.com \
|
||||
--admin-user admin \
|
||||
--admin-pass S3cureP@ss \
|
||||
--timezone America/New_York \
|
||||
-y
|
||||
```
|
||||
|
||||
## Features
|
||||
## Panel + Wings (Same Machine)
|
||||
|
||||
| Feature | This Installer | pterodactyl-installer.se |
|
||||
|---------|:-:|:-:|
|
||||
| Pelican Panel support | ✅ | ❌ (Pterodactyl only) |
|
||||
| Full CLI flags (automated installs) | ✅ | ❌ |
|
||||
| Environment variable config | ✅ | ❌ |
|
||||
| Nginx | ✅ | ✅ |
|
||||
| Apache | ✅ | ✅ |
|
||||
| Caddy (auto-SSL) | ✅ | ❌ |
|
||||
| SQLite | ✅ | ❌ |
|
||||
| MySQL | ✅ | ✅ |
|
||||
| MariaDB | ✅ | ✅ |
|
||||
| PostgreSQL | ✅ | ❌ |
|
||||
| Auto-configures `.env` | ✅ | ❌ |
|
||||
| Runs database migrations | ✅ | ❌ |
|
||||
| PostgreSQL `pg_hba.conf` auth | ✅ | ❌ |
|
||||
| Writes DB password to `.env` | ✅ | ❌ |
|
||||
| Let's Encrypt SSL | ✅ | ✅ |
|
||||
| Post-install health checks | ✅ | ❌ |
|
||||
| HTTP connectivity check | ✅ | ❌ |
|
||||
| Queue worker systemd service | ✅ | ❌ |
|
||||
| Cron auto-setup | ✅ | ❌ |
|
||||
| Step-by-step progress (X/Y) | ✅ | ❌ |
|
||||
| Update command | ✅ | ❌ |
|
||||
| Uninstall command | ✅ | ❌ |
|
||||
| ARM64 support | ✅ | ❌ |
|
||||
| Comprehensive logging | ✅ | ❌ |
|
||||
| Single script (no deps) | ✅ | ✅ |
|
||||
```bash
|
||||
curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
|
||||
--both \
|
||||
--domain panel.example.com \
|
||||
--wings-domain node.example.com \
|
||||
--wings-proxy --wings-ssl \
|
||||
--webserver nginx \
|
||||
--database postgres \
|
||||
--ssl --email you@example.com \
|
||||
-y
|
||||
```
|
||||
|
||||
## Wings Only (With Reverse Proxy)
|
||||
|
||||
```bash
|
||||
curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
|
||||
--wings \
|
||||
--wings-domain node.example.com \
|
||||
--wings-proxy \
|
||||
--webserver caddy \
|
||||
-y
|
||||
```
|
||||
|
||||
## Update & Uninstall
|
||||
|
||||
```bash
|
||||
# Update panel
|
||||
sudo bash install.sh update --panel
|
||||
|
||||
# Update wings
|
||||
sudo bash install.sh update --wings
|
||||
|
||||
# Update both
|
||||
# Update everything
|
||||
sudo bash install.sh update --both -y
|
||||
|
||||
# Uninstall (interactive)
|
||||
# Uninstall
|
||||
sudo bash install.sh uninstall
|
||||
```
|
||||
|
||||
## Supported Systems
|
||||
## All CLI Flags
|
||||
|
||||
| OS | Versions |
|
||||
|----|----------|
|
||||
| Ubuntu | 22.04, 24.04 |
|
||||
| Debian | 11, 12 |
|
||||
| AlmaLinux | 8, 9 |
|
||||
| Rocky Linux | 8, 9 |
|
||||
| CentOS Stream | 9 |
|
||||
### Components
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--panel` | Install Panel |
|
||||
| `--wings` | Install Wings |
|
||||
| `--both` | Install Panel + Wings |
|
||||
|
||||
Both `x86_64` and `ARM64` architectures supported.
|
||||
### Panel — General
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--domain FQDN` | Panel domain name | *(required)* |
|
||||
| `--app-name NAME` | Application name | `Pelican` |
|
||||
| `--webserver WS` | `nginx`, `apache`, or `caddy` | *(asked)* |
|
||||
| `--ssl` | Enable SSL via Let's Encrypt | *(asked)* |
|
||||
| `--no-ssl` | Disable SSL | |
|
||||
| `--email EMAIL` | Let's Encrypt email | *(asked if SSL)* |
|
||||
| `--timezone TZ` | Timezone | `UTC` |
|
||||
|
||||
## Logs
|
||||
### Panel — Admin User (Skip Web Installer)
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--admin-email EMAIL` | Admin email |
|
||||
| `--admin-user USER` | Admin username |
|
||||
| `--admin-pass PASS` | Admin password |
|
||||
|
||||
All installer output is logged to `/var/log/pelican-installer.log`.
|
||||
> If all three are provided, the admin user is created automatically and the web installer is skipped entirely.
|
||||
|
||||
```bash
|
||||
tail -f /var/log/pelican-installer.log
|
||||
```
|
||||
### Panel — Database
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--database DB` | `sqlite`, `mysql`, `mariadb`, `postgres` | *(asked)* |
|
||||
| `--db-host HOST` | Database host | `127.0.0.1` |
|
||||
| `--db-port PORT` | Database port | *auto-detected* |
|
||||
| `--db-name NAME` | Database name | `pelican` |
|
||||
| `--db-user USER` | Database user | `pelican` |
|
||||
| `--db-password PASS` | Database password | *auto-generated* |
|
||||
|
||||
### Panel — Cache
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--cache-driver DRV` | `file` or `redis` | `file` |
|
||||
| `--redis-host HOST` | Redis host | `127.0.0.1` |
|
||||
| `--redis-port PORT` | Redis port | `6379` |
|
||||
| `--redis-user USER` | Redis username (ACL) | |
|
||||
| `--redis-password PW` | Redis password | |
|
||||
|
||||
> When using Redis + localhost, Redis server is auto-installed.
|
||||
|
||||
### Panel — Session
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--session-driver DRV` | `file`, `database`, `cookie`, `redis` | `file` |
|
||||
|
||||
### Panel — Queue
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--queue-driver DRV` | `database`, `redis`, `sync` | `database` |
|
||||
|
||||
### Wings
|
||||
| Flag | Description | Default |
|
||||
|------|-------------|---------|
|
||||
| `--wings-domain FQDN` | Wings node domain | |
|
||||
| `--wings-port PORT` | Wings daemon port | `8080` |
|
||||
| `--wings-proxy` | Set up reverse proxy | |
|
||||
| `--wings-ssl` | SSL for Wings proxy | |
|
||||
|
||||
### General
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--yes`, `-y` | Skip all confirmation prompts |
|
||||
| `--help`, `-h` | Show help |
|
||||
|
||||
## Features
|
||||
|
||||
- **Interactive & Non-Interactive** — Full wizard for beginners, CLI flags for automation
|
||||
- **3 Web Servers** — Nginx, Apache, Caddy (with auto-SSL)
|
||||
- **4 Databases** — SQLite, MySQL, MariaDB, PostgreSQL
|
||||
- **Redis Everything** — Cache, session, and queue with auto-install
|
||||
- **Wings Reverse Proxy** — Full config with WebSocket support for console/file manager on all 3 web servers
|
||||
- **Auto Admin User** — Skip the web installer entirely
|
||||
- **SSL Everywhere** — Let's Encrypt for Panel + Wings in one pass
|
||||
- **Health Checks** — Verifies PHP, web server, database, Redis, .env, HTTP response
|
||||
- **Update & Uninstall** — Built-in commands for lifecycle management
|
||||
- **ARM64 Support** — Works on x86_64 and ARM machines
|
||||
- **Progress Indicators** — Step counter, spinners, color-coded output
|
||||
- **Credential Boxes** — Database password, APP_KEY, admin creds displayed clearly
|
||||
- **Comprehensive Logging** — Everything logged to `/var/log/pelican-installer.log`
|
||||
|
||||
## Supported Operating Systems
|
||||
|
||||
- Ubuntu 20.04, 22.04, 24.04
|
||||
- Debian 11, 12
|
||||
- AlmaLinux 8, 9
|
||||
- Rocky Linux 8, 9
|
||||
- CentOS Stream 8, 9
|
||||
- RHEL 8, 9
|
||||
|
||||
## What It Does
|
||||
|
||||
### Panel Install
|
||||
1. Detects OS and architecture
|
||||
2. Runs preflight checks (root, memory, disk, tools)
|
||||
3. Installs PHP 8.2/8.3/8.4 with all required extensions
|
||||
4. Installs Redis (if selected for cache/session/queue)
|
||||
5. Installs and configures your chosen database
|
||||
6. Installs and configures your chosen web server
|
||||
7. Obtains SSL certificates (if enabled)
|
||||
8. Downloads Pelican Panel + Composer dependencies
|
||||
9. Writes full `.env` configuration (no web installer needed)
|
||||
10. Runs database migrations and seeders
|
||||
11. Creates admin user (if credentials provided)
|
||||
12. Sets up queue worker systemd service
|
||||
13. Configures cron job for scheduled tasks
|
||||
14. Runs health checks
|
||||
|
||||
### Wings Install
|
||||
1. Installs Docker CE
|
||||
2. Downloads Wings binary for your architecture
|
||||
3. Creates systemd service
|
||||
4. Configures reverse proxy (if selected)
|
||||
|
||||
## License
|
||||
|
||||
GPL-3.0 — See [LICENSE](LICENSE)
|
||||
GPL-3.0 — see [LICENSE](LICENSE).
|
||||
|
||||
## Credits
|
||||
|
||||
Built for [JarvisCLI](https://jarviscli.dev) by the Pelican Installer team.
|
||||
|
||||
Pelican Panel is created by [pelican-dev](https://github.com/pelican-dev) and is licensed under AGPL-3.0.
|
||||
|
|
|
|||
159
cloudflare-worker/worker.js
Normal file
159
cloudflare-worker/worker.js
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/**
|
||||
* Cloudflare Worker for install.jarviscli.dev
|
||||
*
|
||||
* curl -sSL https://install.jarviscli.dev | sudo bash → serves install.sh
|
||||
* Browser visit → shows landing page
|
||||
*/
|
||||
|
||||
const SCRIPT_URL = 'https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh';
|
||||
|
||||
function isCurl(request) {
|
||||
const ua = (request.headers.get('User-Agent') || '').toLowerCase();
|
||||
const accept = (request.headers.get('Accept') || '');
|
||||
// curl, wget, httpie, fetch without html accept
|
||||
return ua.includes('curl') || ua.includes('wget') || ua.includes('httpie') ||
|
||||
ua.includes('powershell') || !accept.includes('text/html');
|
||||
}
|
||||
|
||||
async function handleRequest(request) {
|
||||
const url = new URL(request.url);
|
||||
|
||||
// Direct script path always returns script
|
||||
if (url.pathname === '/install.sh' || url.pathname === '/script') {
|
||||
return serveScript();
|
||||
}
|
||||
|
||||
// Root: detect curl vs browser
|
||||
if (url.pathname === '/' || url.pathname === '') {
|
||||
if (isCurl(request)) {
|
||||
return serveScript();
|
||||
}
|
||||
return serveLanding();
|
||||
}
|
||||
|
||||
// 404
|
||||
return new Response('Not Found', { status: 404 });
|
||||
}
|
||||
|
||||
async function serveScript() {
|
||||
const resp = await fetch(SCRIPT_URL, {
|
||||
cf: { cacheTtl: 300, cacheEverything: true }
|
||||
});
|
||||
|
||||
if (!resp.ok) {
|
||||
return new Response('#!/bin/bash\necho "Error: Could not fetch installer. Try: curl -sSL https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh | sudo bash"\nexit 1', {
|
||||
status: 502,
|
||||
headers: { 'Content-Type': 'text/plain' }
|
||||
});
|
||||
}
|
||||
|
||||
const script = await resp.text();
|
||||
return new Response(script, {
|
||||
headers: {
|
||||
'Content-Type': 'text/plain; charset=utf-8',
|
||||
'Cache-Control': 'public, max-age=300',
|
||||
'X-Content-Type-Options': 'nosniff'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function serveLanding() {
|
||||
const html = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Pelican Installer — install.jarviscli.dev</title>
|
||||
<style>
|
||||
:root { --bg: #0f172a; --card: #1e293b; --border: #334155; --text: #e2e8f0; --dim: #94a3b8; --accent: #38bdf8; --green: #4ade80; --purple: #a78bfa; }
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { font-family: 'SF Mono', 'Fira Code', 'JetBrains Mono', monospace; background: var(--bg); color: var(--text); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; }
|
||||
.container { max-width: 680px; width: 100%; }
|
||||
h1 { font-size: 2rem; margin-bottom: 0.5rem; }
|
||||
h1 span { color: var(--accent); }
|
||||
.subtitle { color: var(--dim); margin-bottom: 2rem; font-size: 0.95rem; }
|
||||
.card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 1.5rem; margin-bottom: 1.5rem; }
|
||||
.card-title { color: var(--accent); font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 1rem; }
|
||||
.cmd { background: #0d1117; border: 1px solid var(--border); border-radius: 8px; padding: 1rem 1.25rem; font-size: 0.95rem; position: relative; cursor: pointer; transition: border-color 0.2s; overflow-x: auto; }
|
||||
.cmd:hover { border-color: var(--accent); }
|
||||
.cmd code { color: var(--green); white-space: nowrap; }
|
||||
.cmd .copy-hint { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); color: var(--dim); font-size: 0.75rem; opacity: 0; transition: opacity 0.2s; }
|
||||
.cmd:hover .copy-hint { opacity: 1; }
|
||||
.cmd.copied .copy-hint { color: var(--green); opacity: 1; }
|
||||
.features { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }
|
||||
.feature { display: flex; align-items: start; gap: 0.5rem; font-size: 0.85rem; color: var(--dim); }
|
||||
.feature::before { content: '✓'; color: var(--green); font-weight: bold; flex-shrink: 0; }
|
||||
.links { display: flex; gap: 1rem; margin-top: 1.5rem; }
|
||||
.links a { color: var(--accent); text-decoration: none; font-size: 0.85rem; }
|
||||
.links a:hover { text-decoration: underline; }
|
||||
.version { color: var(--purple); font-size: 0.8rem; margin-top: 1.5rem; text-align: center; }
|
||||
@media (max-width: 600px) { .features { grid-template-columns: 1fr; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🐦 <span>Pelican Installer</span></h1>
|
||||
<p class="subtitle">The best way to install Pelican Panel & Wings — one command, fully automated.</p>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Quick Install</div>
|
||||
<div class="cmd" onclick="copyCmd(this, 'curl -sSL https://install.jarviscli.dev | sudo bash')">
|
||||
<code>curl -sSL https://install.jarviscli.dev | sudo bash</code>
|
||||
<span class="copy-hint">click to copy</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Or with options</div>
|
||||
<div class="cmd" onclick="copyCmd(this, \`curl -sSL https://install.jarviscli.dev | sudo bash -s -- install --panel --domain panel.example.com --webserver nginx --database postgres --ssl --email you@example.com --cache-driver redis --session-driver redis --queue-driver redis --admin-email admin@example.com --admin-user admin --admin-pass MyPassword -y\`)">
|
||||
<code>curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \\<br> --panel --domain panel.example.com --webserver nginx \\<br> --database postgres --ssl --email you@example.com \\<br> --cache-driver redis --session-driver redis \\<br> --queue-driver redis --admin-email admin@example.com \\<br> --admin-user admin --admin-pass MyPassword -y</code>
|
||||
<span class="copy-hint">click to copy</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">Features</div>
|
||||
<div class="features">
|
||||
<div class="feature">Nginx, Apache & Caddy</div>
|
||||
<div class="feature">MySQL, MariaDB, PostgreSQL, SQLite</div>
|
||||
<div class="feature">Auto SSL via Let's Encrypt</div>
|
||||
<div class="feature">Redis cache, session & queue</div>
|
||||
<div class="feature">Wings reverse proxy (all 3 web servers)</div>
|
||||
<div class="feature">Fully non-interactive mode</div>
|
||||
<div class="feature">Auto admin user creation</div>
|
||||
<div class="feature">Post-install health checks</div>
|
||||
<div class="feature">Update & uninstall commands</div>
|
||||
<div class="feature">ARM64 support</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="links">
|
||||
<a href="https://github.com/everestmcarthur/pelican-installer">📦 GitHub</a>
|
||||
<a href="https://github.com/everestmcarthur/pelican-installer#readme">📖 Docs</a>
|
||||
<a href="https://github.com/everestmcarthur/pelican-installer/issues">🐛 Issues</a>
|
||||
</div>
|
||||
|
||||
<p class="version">Powered by JarvisCLI</p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function copyCmd(el, text) {
|
||||
navigator.clipboard.writeText(text);
|
||||
el.classList.add('copied');
|
||||
el.querySelector('.copy-hint').textContent = 'copied!';
|
||||
setTimeout(() => {
|
||||
el.classList.remove('copied');
|
||||
el.querySelector('.copy-hint').textContent = 'click to copy';
|
||||
}, 2000);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>`;
|
||||
return new Response(html, {
|
||||
headers: { 'Content-Type': 'text/html; charset=utf-8' }
|
||||
});
|
||||
}
|
||||
|
||||
addEventListener('fetch', event => {
|
||||
event.respondWith(handleRequest(event.request));
|
||||
});
|
||||
Loading…
Add table
Reference in a new issue