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:
Pelican Installer Bot 2026-05-17 12:28:22 +00:00
parent cbc8ee39ff
commit 55b8a0e6da
2 changed files with 330 additions and 111 deletions

266
README.md
View file

@ -1,144 +1,204 @@
# 🐦 Pelican Installer # 🐦 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 ```bash
# Interactive install (asks you everything) curl -sSL https://install.jarviscli.dev | sudo bash
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
``` ```
## Automated Install (No Prompts) Or directly from GitHub:
```bash ```bash
# Panel with Nginx + PostgreSQL + SSL curl -sSL https://raw.githubusercontent.com/everestmcarthur/pelican-installer/main/install.sh | sudo bash
sudo bash install.sh install --panel \ ```
## Fully Automated Install (Non-Interactive)
```bash
curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
--panel \
--domain panel.example.com \ --domain panel.example.com \
--webserver nginx \ --webserver nginx \
--database postgres \ --database postgres \
--ssl --email admin@example.com \ --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 \ --timezone America/New_York \
-y -y
```
# Wings only ## Panel + Wings (Same Machine)
sudo bash install.sh install --wings -y
# Panel + Wings on same machine ```bash
sudo bash install.sh install --both \ curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
--both \
--domain panel.example.com \ --domain panel.example.com \
--webserver caddy \ --wings-domain node.example.com \
--wings-proxy --wings-ssl \
--webserver nginx \
--database postgres \ --database postgres \
--ssl --email you@example.com \
-y -y
``` ```
## All CLI Flags ## Wings Only (With Reverse Proxy)
| 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:
```bash ```bash
export FQDN="panel.example.com" curl -sSL https://install.jarviscli.dev | sudo bash -s -- install \
export WEBSERVER="nginx" --wings \
export DB_CHOICE="postgres" --wings-domain node.example.com \
export DB_PASSWORD="my_secure_password" --wings-proxy \
export CONFIGURE_SSL=true --webserver caddy \
export EMAIL="admin@example.com" -y
export ASSUME_YES=true
sudo -E bash install.sh install --panel
``` ```
## Features
| 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) | ✅ | ✅ |
## Update & Uninstall ## Update & Uninstall
```bash ```bash
# Update panel # Update everything
sudo bash install.sh update --panel
# Update wings
sudo bash install.sh update --wings
# Update both
sudo bash install.sh update --both -y sudo bash install.sh update --both -y
# Uninstall (interactive) # Uninstall
sudo bash install.sh uninstall sudo bash install.sh uninstall
``` ```
## Supported Systems ## All CLI Flags
| OS | Versions | ### Components
|----|----------| | Flag | Description |
| Ubuntu | 22.04, 24.04 | |------|-------------|
| Debian | 11, 12 | | `--panel` | Install Panel |
| AlmaLinux | 8, 9 | | `--wings` | Install Wings |
| Rocky Linux | 8, 9 | | `--both` | Install Panel + Wings |
| CentOS Stream | 9 |
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 ### Panel — Database
tail -f /var/log/pelican-installer.log | 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 ## 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
View 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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));
});