Install with a domain and HTTPS
Choose this path for a secure web address from the start. If you already completed Quick Install, skip to first login and your first station. These are alternative installation paths; do not install twice.
Each command says where to run it. Copy one block at a time, replace the example values, and wait for it to finish. A command prompt returning means the command finished; an error means stop and check the troubleshooting section before continuing. Copy buttons only copy text. They never run commands.
Step 01
Choose a fresh server
A virtual private server (VPS) is a computer you rent from a hosting provider. It stays online so your station can broadcast when your own computer is off. In your provider’s dashboard, create a new Ubuntu 24.04 LTS server with an x86_64/AMD64 processor. Choose a plain operating-system image, not a web-hosting panel, Docker image, or ARM server.
- Use an empty server dedicated to Freo. An existing Freo installation or PostgreSQL database is not a fresh target.
- You need administrator access: a
rootlogin or a user allowed to runsudo. - Allow storage for the application, downloaded and extracted packages, your music, and backups. CPU and memory needs grow with stations and audio processing; no universal minimum size is published with this release. Your provider can help size the server.
- Check the provider’s data-transfer allowance. As an example, a 128 kbps stream uses about 58 MB per listener-hour before overhead; ten listeners for a month can use roughly 415 GB.
- Have some MP3, WAV, M4A or FLAC music you have permission to broadcast.
Write down these details before continuing:
| Detail | Where to get it |
|---|---|
| Server’s public IPv4 address | Your hosting dashboard. Use your real address wherever this guide says YOUR_SERVER_IP. |
| SSH username and login method | Your provider, often ubuntu or root. Keep the password or private key private. |
| Radio hostname | A name you control, such as radio.example.com. The examples are placeholders, not working Freo servers. |
| Certificate email | An email address you monitor. Replace you@example.com with yours. |
Ready: You have a fresh supported server, its login details, and access to your domain’s DNS settings.
Step 02
Connect and prepare
On Windows, open Windows Terminal or PowerShell. On macOS or Linux, open Terminal. SSH opens a command line on the remote server. Replace both uppercase placeholders:
ssh YOUR_SSH_USER@YOUR_SERVER_IPIf your provider requires a key file, use ssh -i /path/to/your/private-key YOUR_SSH_USER@YOUR_SERVER_IP with the actual local key path. If it uses a different SSH port, add -p PORT. Compare a first-connection host fingerprint with your provider’s console before accepting it. Passwords are not shown while you type; that is normal.
You are now typing on the server. Confirm its name matches the server you just created:
hostname
cat /etc/os-release
uname -m
sudo -vLook for Ubuntu, VERSION_ID="24.04", and x86_64. sudo grants administrator privileges for a command. If you are already logged in as root and sudo is unavailable, omit that word; otherwise obtain a sudo-capable account from your provider.
Install the small tools used below. This does not install Freo yet:
sudo apt-get update
sudo apt-get install -y ca-certificates curl python3 dnsutils ufw tmux lessCheck the clock and available disk space:
timedatectl status
df -h /The clock should show the correct date/time and be synchronized. If not, fix time synchronization with your provider before certificate or download checks. Make sure there is free space for your packages and music.
Ready: You are on the intended Ubuntu 24.04 x86_64 server, commands complete without errors, and you have administrator access.
Step 03
Give your station a secure address
HTTPS protects your admin login and is required for a remote browser microphone. Set it up during installation. You need a domain or subdomain that belongs to you.
- Open the DNS settings for your domain. Add an A record named
radio, pointing to your new server’s public IPv4 address. For a domain such asexample.com, this createsradio.example.com. - Use ordinary DNS routing during setup. If your DNS service offers a proxy or CDN mode, choose DNS-only for this hostname.
- For this IPv4 walkthrough, remove a stale AAAA record for that radio hostname unless IPv6 is correctly configured on the same server. Do not change unrelated records for your domain.
- Wait for DNS to update, then check your actual radio hostname:
dig +short A radio.example.com
dig +short AAAA radio.example.comThe A answer must be your new server’s public IPv4 address. With IPv4-only setup, the AAAA answer should be empty. A matching result is a useful check, but DNS caches elsewhere may still need time.
In the hosting dashboard’s firewall (sometimes called a security group), allow:
| Port | Who can connect | Purpose |
|---|---|---|
| TCP 22, or your SSH port | Your administrator IP | Server administration |
| TCP 80 | Everyone | HTTP and certificate validation |
| TCP 443 | Everyone | HTTPS website and streams |
Allow outbound DNS, HTTPS and package-repository access. The installer needs GitHub, Ubuntu/Xiph repositories and Freo Live. Database and internal audio ports do not need public access. Live Mic has separate network requirements; get basic music playback working first.
Set up Ubuntu’s firewall too
The following assumes SSH uses TCP 22. If your connection uses another port, add an allow rule for that actual port before enabling the firewall. Keep this session open and your provider’s recovery console available.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw show addedCheck that your SSH port is listed, then enable the firewall:
sudo ufw enable
sudo ufw statusConfirm the warning only after allowing SSH. Open a second terminal on your computer and verify that you can still SSH in before closing the original session. Do not reset an existing firewall configuration.
Ready: DNS points at your server, SSH still works, and inbound 80/443 are allowed in both cloud and host firewalls. Port 80 must remain reachable for certificate validation and renewal.
Step 04
Download and check the installer
Download on the new server, not your laptop. Start a tmux session first; it keeps the installation running if your SSH connection drops:
tmux new -s freo-setupA new terminal opens inside the existing one. Continue there. If you disconnect later, SSH back in as the same user and run tmux attach -t freo-setup. If it says no session exists, check the installation’s outcome before starting again.
mkdir -p "$HOME/freo-setup"
cd "$HOME/freo-setup"
curl --fail --silent --show-error --proto '=https' \
--connect-timeout 15 --max-time 120 \
--output freo-install.sh.part https://freo.live/install &&
mv freo-install.sh.part freo-install.shIf the download fails, stop. After a successful download, check the approved installer checksum:
printf '%s %s\n' '0e494e6b07af6331ff27894515fd648a71da1c1769e3bdd257cb396dc65bdf9a' 'freo-install.sh' | sha256sum --checkExpect freo-install.sh: OK. A mismatch means do not run it; obtain the current approved instructions. This checksum checks the script against this guide. The later Freo package signature is verified separately by the installer.
Inspect the script before running it
You can also read the exact reviewed source. These commands check shell syntax and display the downloaded file without running the installer. Press q to leave less.
bash -n freo-install.sh
less freo-install.shReady: The complete script has downloaded and its checksum says OK. Freo has not been installed yet.
Step 05
Install Freo
Replace radio.example.com with the hostname you checked in step 3 and you@example.com with your real certificate email. Use only the hostname: no https://, slash, or port.
sudo bash freo-install.sh \
--domain radio.example.com \
--https --email you@example.comThe installer shows the server name, address, operating system, installer version and selected Freo version. Check that this is your new server. At Continue? [y/N], enter y only if the details are right. It may separately ask to install missing signature-verification tools.
It downloads the stable GitHub release, verifies its publisher signature and package contents, then installs the application, database and radio services. It also requests an HTTPS certificate for your hostname. Keep the session open and wait for completion; package downloads and processing can take time.
Alternative: IP-only HTTP installation
This is the explicit-IP version of Quick Install. HTTP is unencrypted; HTTPS protects admin access, and remote browser microphones require it. Skip the DNS hostname steps, retain SSH/HTTP firewall access, and replace YOUR_SERVER_IP with the server’s real public IPv4 address. Run this instead of the HTTPS command, not afterward.
sudo bash freo-install.sh --domain YOUR_SERVER_IPDo not rerun the fresh installer later to switch an installed server to HTTPS. Follow the supported configuration/recovery instructions.
Success: The installer reports that Freo is installed and prints your /admin/login address. Keep the printed private diagnostics path. If it stops with an error, go to troubleshooting; do not repeatedly reinstall over partial state.
Step 06
Make the first login yours
On your own computer, open the address printed by the installer in a web browser, such as https://radio.example.com/admin/login. Use your actual hostname. For the HTTP alternative, use http://YOUR_SERVER_IP/admin/login.
The approved release’s first login is username admin and temporary password IAmOnTheAir. Immediately complete the required setup with your email and a new private password of at least 16 characters. Save it in a password manager. The temporary password then stops working.
For HTTPS, the browser should show a secure connection without a certificate warning. Do not enter credentials through an unexpected certificate warning; check DNS and the installer’s certificate result first.
Success: You can sign in with your new account and see Freo’s administration workspace. An empty station list is normal—no demo stations or music are installed.
Step 07
Put your first music on air
Start with one station and a small set of music. Keep the same station selected while following these steps.
- Add a station. Open Stations → Add station. Give it a name and a Station ID such as
my-radio(lowercase letters, numbers and hyphens). Choose your timezone, then select Add station. The ID forms part of the listening URL and cannot be changed later. Wait for provisioning to finish; if it fails, inspect the displayed error before retrying. - Import music. Open the station’s Music workspace and its import page. Choose files or a folder, review the selection, then select Import music. Wait until processing completes. Check that the songs are enabled for broadcast; do not choose Keep disabled for this first test. Preview a song to confirm the audio is right.
- Make a small playlist. Open Playlists, choose + New, enter a name, choose Straight (in order) or Random, and save. Use + Add music to add your imported songs. Confirm the playlist contains playable songs.
- Choose continuous playback. Open Station Control → Open Simple. In the library, find your playlist and place it in the Just play this selection. Save the selection. Return to Station Control, choose Use Simple, and confirm the mode change if prompted. Simple plays the chosen source continuously; you can add scheduled shows later.
- Turn broadcasting on. In Station Control, turn MASTER BROADCAST ON. Wait for the change to be applied and the observed station status to update. An ON switch alone is not proof that music is playing: an empty or unavailable source can produce a fallback tone.
- Listen as a visitor. Open your station’s public player, such as
https://radio.example.com/player/my-radio, in another browser or on your phone. Replace both the hostname and station ID. Press Play; browsers usually require this click. Confirm you hear music, not just tone. Try mobile data to check access from outside your network.
Success: The public player plays your chosen music and you see confirmed playback in Freo. Your browser’s monitor button only controls local listening; MASTER BROADCAST controls whether the station broadcasts.
Remote microphone input is a separate feature with an optional gateway and WebRTC network setup. Once basic radio works, follow the Live Mic guide.
Step 08
Check it, then test a reboot
Back in your server terminal, run the release’s validation script and list any failed services:
cd /opt/freo
sudo bash scripts/validate-install.sh
sudo systemctl --failed --no-pagerLook for a line beginning Freo validation passed. Ideally the service list shows no failed units. Investigate a failed validation or failed unit rather than assuming the website loading proves everything works.
For an HTTPS installation, check certificate renewal too:
sudo certbot renew --dry-runExpect successful renewal simulation for your radio certificate. When you are ready for a brief interruption, leave your station broadcasting and reboot:
sudo rebootYour SSH connection will close. Wait for the server to return, reconnect using step 2, and run the validation commands again. Open the admin page and public player and press Play. Confirm your running station comes back without starting it manually, with your music and settings intact.
Finished: Validation passes, the HTTPS certificate works, and music plays externally before and after reboot.
Step 09
Look after your station
- Arrange backups before building a large library. Follow the backup and recovery guide for your database, music, configuration and installation identity. Store a protected copy away from this server and test restoration on a separate machine. A provider snapshot alone is not a verified application backup.
- Use the upgrade path for updates. The primary administrator can access Software management. Read the release notes and recovery procedure before upgrading. Do not use the fresh installer on an existing station.
- Registration is optional. Create a Freo Live account if you want to link and manage your installation. Automatic reporting includes the running version and aggregate station information; public directory listing needs a separate opt-in. Version status can remain Unknown until a successful heartbeat, normally hourly. Do not replace identity files or credentials to force a status.
- Keep access private. Protect server keys and admin credentials. Share only reviewed, relevant diagnostic output when requesting help; never share
.env, passwords, private keys, bearer tokens or identity files.
Freo is source-available and free for up to three stations under its published license. Hosting, domains and the rights to broadcast your music are separate. See licensing for details.
Help when you need it
If a step doesn’t work
SSH times out or says “Permission denied”
Confirm the public IP, SSH port and username in the hosting dashboard. A timeout usually needs a network/firewall check. Permission denied means checking the username and your provider’s password/key instructions. If you changed the firewall, use the provider’s console to restore your SSH allow rule. Do not disable host-key checking to silence a fingerprint mismatch.
The operating system or architecture is rejected
Use a fresh Ubuntu 24.04 LTS x86_64/AMD64 VM. ARM/aarch64 and other Ubuntu versions are not supported by this bootstrap. Create the correct VM rather than removing its checks.
DNS is wrong or the certificate request fails
Recheck the radio hostname’s A record, any AAAA record, and inbound 80/443 at both firewalls. Make sure DNS-only routing reaches this server. Check the clock and certificate email. If installation has already started, retain the diagnostics and use recovery guidance; do not rerun the fresh installer merely to retry the certificate.
The download, checksum or signature check fails
Stop. Check outbound access, disk space and the clock. A GitHub rate limit or temporary outage may require waiting before retrying discovery on a still-fresh server. A checksum mismatch may mean the approved script has changed; compare the current guide and source before continuing. Never skip verification or substitute an unsigned source archive.
“Existing Freo state” or an existing PostgreSQL cluster is detected
This server is not a fresh target. Use the upgrade/recovery procedure or a new empty VM. Do not delete directories, databases, service accounts or identity files to get past the guard.
The connection dropped or installation stopped halfway
Reconnect as the same SSH user and run tmux attach -t freo-setup. If the installer is still running, let it finish. If it failed, keep the private diagnostics path printed by the bootstrap, normally /var/tmp/freo-bootstrap-…. That directory may contain installer.log and verification.json, recording whether installation started. Use sudo less /var/tmp/ACTUAL_DIRECTORY/installer.log with the real path to inspect it; press q to exit. Do not start a second installation or erase partial state.
The web page does not open or the first login fails
Use the exact address and HTTP/HTTPS mode printed by the installer, including /admin/login. Check DNS and firewall rules. The temporary login works only before first-time setup; afterward use your chosen account. If the password is lost, use the documented account-recovery procedure rather than reinstalling.
sudo systemctl status freo nginx --no-pager
sudo journalctl -u freo -n 50 --no-pagerRead the output locally and redact sensitive details before sharing.
The station is on but there is silence or a tone
Confirm MASTER BROADCAST is ON and the observed station state is online. Check your selected station, enabled/processed songs, saved playlist, and active Simple source. Tone means the stream can be running without program music. Press Play in the public player and check local volume. If your source is valid but playback does not recover, inspect station and automation status:
cd /opt/freo
sudo venv/bin/flask --app wsgi:app station status my-radio
sudo journalctl -u freo-automation -u freo-playout@my-radio -n 50 --no-pagerStill stuck? Contact us with your Ubuntu version, Freo version, the step that failed and a short, redacted error excerpt.