# Updating the panel

> Update FeatherPanel with the installer, the update button in the admin area or plain Docker Compose commands, and what to back up before you do.

Source: https://featherpanel.com/docs/panel/updating/

The backend container runs `php cli migrate` every time it starts, so updating is a matter of getting new images and restarting
the stack. Pick one of the three ways below.

> [!IMPORTANT]
> Back up first. The installer asks "Create a backup before updating?" and runs the same backup as the
> [Backup Manager](https://featherpanel.com/docs/panel/backups) if you answer yes.

## With the installer

```bash
curl -sSL https://get.featherpanel.com/installer.sh | bash
```

Pick `[1] Panel`, then `Update Panel`. For a Docker install the installer:

1. Downloads the current `docker-compose.yml` again (from `main`, or the development Compose file if you chose a
   development build) and re-applies your panel port.
2. Offers the backup.
3. Stops the stack, runs `docker compose pull` and starts it again with `docker compose up -d`.

## From the admin area

On Docker installs the version widget on the admin dashboard and the Updates page (`/admin/updates`) can start a panel
update. The Updates page also lists plugin updates and the FeatherWings version of each node. Both call `POST /api/admin/settings/docker/update`, which needs the `ADMIN_SETTINGS_EDIT` permission.

The backend cannot restart its own containers, so it asks the `featherpanel-docker-updater` service on the host. That
service listens on `127.0.0.1:9418`, checks the `DOCKER_UPDATER_TOKEN` from `/var/www/featherpanel/.env`, and runs
`docker compose up -d --pull always --remove-orphans` in `/var/www/featherpanel`. Its log is in
`/var/www/featherpanel/install.log`.

```bash
systemctl status featherpanel-docker-updater
```

If the button reports that the updater is unreachable, the service is not installed or not running. Run the installer's
update once; it installs the service.

## With Docker Compose

```bash
cd /var/www/featherpanel
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
```

This keeps your existing `docker-compose.yml`. Compare it with the current file in the repository from time to time,
because new services and variables arrive there.

## Source installs

For source installs the installer runs `installer/source/init/update.bash`. It discards local changes in the repository,
pulls the configured git ref, installs backend dependencies and runs migrations, rebuilds the frontend and the async
runner, and restarts the services.

## After the update

- Open the panel and check the version in the admin dashboard.
- Check `docker compose ps`: every service should be `healthy`.
- Check the node versions on the Updates page and update [FeatherWings](https://featherpanel.com/docs/wings/updating) where it is behind.

## Frequently asked questions

### Will an update remove my plugins?

The installer warns that plugins, themes and code modifications may be removed during an update and offers a backup first. Plugins live in the featherpanel_addons volume, which a normal Docker update keeps, but code changes made inside containers are lost when the images are replaced.

### Does FeatherPanel update itself?

No. The installer stores an auto-update preference in its configuration file, but nothing in the installer or panel acts on it. Run an update yourself, with the installer, the admin update button or Docker Compose.
