Installation
Install Fusionaly on your server with Chasen
Fusionaly runs on your own server with Chasen: HTTPS, live backups of the database, and an update each night. Pick where you start.
On your server
Section titled “On your server”On a fresh Ubuntu or Debian server, as root:
curl -fsSL https://fusionaly.com/install | sudo bash -s data.example.comPut your domain in place of data.example.com. Avoid “analytics”, “tracking”, “stats”, or “telemetry” in the hostname: ad blockers block those names, so visitor requests get dropped before reaching your server. A neutral subdomain like data.example.com is safer.
It installs Chasen (and Docker, when the server has none) and runs Fusionaly. Run it again to update Fusionaly now.
From your computer
Section titled “From your computer”If you deploy other apps with Chasen, or you prefer your own terminal:
curl -fsSL https://chasenhq.com/cli | shchasen deploy karloscodes/fusionaly --server root@203.0.113.5 --domain data.example.com --auto-updateThe first deploy installs Chasen on the server through SSH. --auto-update gives the same nightly update. Without it, run the line again to update.
After the install
Section titled “After the install”- The server needs Ubuntu or Debian, ports 80 and 443 open, and an A record for your domain. HTTPS comes on the first request.
- Create your account. Open
https://data.example.comright after the install: the first visitor creates the owner account, so do it before anyone else can. - No settings needed. Chasen gives Fusionaly its private key and keeps
/app/storageacross deploys. - Nightly updates. The newest Fusionaly image deploys each night, with a backup first. The old version keeps running if the new one does not start.
- Backups. With a bucket (
chasen bucket), a live replica copies each change to it as it happens, about a second behind, and the snapshots go there too. Chasen also takes a checked snapshot of the database every hour and before each deploy. Without a bucket, the snapshots stay on the server. - Everyday commands, from your computer after
chasen add server root@203.0.113.5:chasen -a fusionaly status,logs,backups,restore, androllback. On the server itself:sudo chasen-server status fusionaly. See the Chasen docs.
Run the image yourself
Section titled “Run the image yourself”Fusionaly is one Docker image, karloscodes/fusionaly, for amd64 and arm64. It is on two registries with the same tags: Docker Hub and ghcr.io/karloscodes/fusionaly. Use latest, or a version like 2.8.3.
docker run -d --name fusionaly \ -p 8080:8080 \ -e FUSIONALY_PRIVATE_KEY=$(openssl rand -hex 32) \ -v fusionaly-storage:/app/storage \ karloscodes/fusionaly:latest- Keep the private key. A new one signs everybody out.
- Create your account at
http://localhost:8080. The first visitor creates the owner account. - In production, put HTTPS in front, with any reverse proxy that forwards to port 8080: Caddy, Nginx, or a Cloudflare Tunnel. Fusionaly needs nothing special from it.
- Health path:
/up(also/_health). - The background jobs run in the same process: event processing and cleanup. Keep the container running.
Configuration
Section titled “Configuration”Fusionaly reads environment variables. It does not read a .env file.
| Variable | Default | Description |
|---|---|---|
FUSIONALY_PRIVATE_KEY |
(required in production) | Signs login sessions. Falls back to PRIVATE_KEY, which Chasen sets |
FUSIONALY_ENV |
development (production in the Docker image) |
development or production |
FUSIONALY_APP_PORT |
3000 |
The HTTP port. The Docker image uses 8080 |
FUSIONALY_LOG_LEVEL |
warn in production, debug in development |
debug, info, warn, or error |
FUSIONALY_STORAGE_PATH |
storage (/app/storage in the Docker image) |
The database and other files |
FUSIONALY_LOGS_DIR |
logs (/app/logs in the Docker image) |
Rotated log files. Every line also goes to stdout, so docker logs and chasen logs show them |
FUSIONALY_SESSION_TIMEOUT_SECONDS |
1800 |
Session timeout in seconds |
FUSIONALY_LOGIN_SESSION_TIMEOUT_SECONDS |
7776000 |
Login cookie timeout (default: 90 days) |
FUSIONALY_INGESTED_EVENTS_RETENTION_DAYS |
15 |
Days to keep processed queue rows. They hold the full URL and User-Agent |
FUSIONALY_EVENTS_RETENTION_DAYS |
760 |
Days to keep raw events. Events with a price stay. 0 keeps every event |
Storage and backups
Section titled “Storage and backups”The data directory (/app/storage in the image) holds everything to keep:
| Path | Contents |
|---|---|
fusionaly-production.db |
The SQLite database: analytics data, websites, account settings |
initial-admin-password |
The first password, until you change it |
Mount it as a volume: without one, the data is gone with the container.
To back it up, copy the database with SQLite’s online backup, which is safe while Fusionaly runs:
sqlite3 storage/fusionaly-production.db ".backup backup.db"To move to a new host, stop the container, copy the data directory, and start it there.
The installer (existing servers)
Section titled “The installer (existing servers)”Servers that the older installer set up keep working as they are: the nightly update and the fusionaly commands. Running the install line again on them changes nothing. To move one to Chasen, see Move to Chasen.