Skip to content
Back to skills

Fusionaly Deploy

BSecurity

Use ONLY when explicitly invoked. Puts Fusionaly on a Linux server you reach over SSH with a key. Optionally creates a Hetzner server and the Cloudflare DNS record. The user runs the one interactive install command; the agent prepares and checks everything around it.

  • 13 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 4, 2026
datashellbashdockergitapisecurity

Works with

  • terminal
  • cli
  • api

Security analysis

B84/100
  • mediumUses curl or wget to download content
  • criticalAccesses sensitive system or user directories

Pro shows the line behind each finding and how to fix it

Scanned October 4, 2026

npx -y skills add karloscodes/fusionaly-oss --skill fusionaly-deploy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Fusionaly Deploy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Fusionaly Deploy
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/karloscodes-fusionaly-deploy/badge)](https://www.skillsdirectory.com/skills/karloscodes-fusionaly-deploy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: fusionaly-deploy
description: Use ONLY when explicitly invoked. Puts Fusionaly on a Linux server you reach over SSH with a key. Optionally creates a Hetzner server and the Cloudflare DNS record. The user runs the one interactive install command; the agent prepares and checks everything around it.
---

# Deploy Fusionaly

Four steps: a server, a DNS record, one install command, a check. The agent does the setup and the checks. **The user runs the install command in their own terminal**, because the installer is interactive and needs a real terminal.

## Rules

- **SSH keys only.** Never ask for, type, or store a password. If the server takes only passwords, stop and help the user add a key (`ssh-copy-id`).
- **Ask before anything that costs money or changes DNS.** Show the exact command first.
- **Never disable host key checks.** Use `-o StrictHostKeyChecking=accept-new` for a new server.
- **No "analytics" in the hostname.** Blockers drop hostnames with `analytics`, `tracking`, `stats` or `telemetry`. Suggest `data.example.com` or a brand name.
- **Tokens stay in the user's shell.** Ask the user to export them. Do not paste them into files.

## 1. Server

Ask: "Do you have a Linux server you can SSH into with a key?" This is the default path.

**Existing server.** Ask for the IP and the SSH user, then check:

```bash
ssh -o BatchMode=yes -o ConnectTimeout=5 <user>@<ip> 'uname -s && (test "$(id -u)" = 0 || sudo -n true) && echo ready'
```

`ready` means SSH works and the user has root or passwordless sudo. Anything else: stop and fix that first.

**New Hetzner server (optional).** Needs the `hcloud` CLI and a read/write API token from the Hetzner console (Security > API Tokens).

```bash
hcloud context create fusionaly            # paste the token when it asks
hcloud server-type list -o columns=name,cores,memory,disk   # pick the smallest shared type
hcloud ssh-key list                         # or: hcloud ssh-key create --name me --public-key-from-file ~/.ssh/id_ed25519.pub
```

Show the plan and ask before creating it (it is billable):

```bash
hcloud server create --name fusionaly --type <type> --image ubuntu-24.04 --location <location> --ssh-key <key>
hcloud server ip fusionaly
ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=5 root@<ip> 'echo ready'   # retry for ~60s while it boots
```

Fusionaly needs 1 vCPU, 512 MB RAM, 10 GB disk.

## 2. DNS

Ask for the domain. Then create an `A` record: `<domain>` → `<ip>`.

**Cloudflare (optional).** Ask the user to create a token with the "Edit zone DNS" template and `export CF_API_TOKEN=...` in their shell. Ask before creating the record:

```bash
zone=$(curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
  "https://api.cloudflare.com/client/v4/zones?name=<apex-domain>" | jq -r '.result[0].id')
curl -s -X POST -H "Authorization: Bearer $CF_API_TOKEN" -H "Content-Type: application/json" \
  "https://api.cloudflare.com/client/v4/zones/$zone/dns_records" \
  -d '{"type":"A","name":"<domain>","content":"<ip>","proxied":false,"ttl":300}' | jq '.success'
```

Keep `proxied` false until the certificate exists.

**Any other DNS provider:** tell the user the exact record to add.

Then wait until the record resolves. The certificate cannot be issued before that:

```bash
dig +short <domain> @1.1.1.1     # repeat until it prints <ip>
```

## 3. Install (the user runs this)

Tell the user to run this in their own terminal:

```
ssh -t <user>@<ip> 'curl -fsSL https://fusionaly.com/install | sudo bash'
```

The installer asks for the domain, checks DNS, installs Docker, starts Fusionaly with HTTPS, and sets up nightly backups and updates. Wait until the user says it finished.

## 4. Check

```bash
curl -s -o /dev/null -w "%{http_code}\n" https://<domain>/_health    # 200
```

Then the user opens `https://<domain>/setup` to create the admin account and add the first website.

## Done: tell the user

- Dashboard: `https://<domain>/admin`. Add the tracking script shown in the website settings.
- Updates and backups run every night. Keep a copy off the server too (VPS snapshots or rsync).
- Harden a new server: [server-hardener](https://github.com/karloscodes/server-hardener). Run it yourself: `ssh -t <user>@<ip> 'curl -fsSL https://raw.githubusercontent.com/karloscodes/server-hardener/main/harden.sh -o /tmp/harden.sh && sudo bash /tmp/harden.sh'`. If you pick Tailscale, SSH works only over Tailscale afterwards: connect this machine to your tailnet first.
- Ask your analytics from your AI client: https://fusionaly.com/agents/

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…