Hi everyone,
I’m having trouble getting the Incus web UI to work on my Alpine Linux setup. The incus daemon itself seems to be running fine, and the API is accessible, but the web UI is reported as not installed.
System Details:
- OS: Alpine Linux (using apk and rc-service)
- Incus Version: 6.0.4
- Incus UI Package: incus-ui-canonical (0.14.6-r0) (reinstalled via apk fix incus-ui-canonical)
What Works:
- The Incus API is responsive. I’ve set incus config set core.https_address “192.168.0.x:443” (using my server’s IP).
- curl https://192.168.0.x:443 -k returns: {“type”:“sync”,“status”:“Success”,“status_code”:200,“operation”:“”,“error_code”:0,“error”:“”,“metadata”:[“/1.0”]}
- The incusd service starts correctly via rc-service incusd start.
The Problem: Despite the above, when I run incus webui, I consistently get: Error: The server doesn’t have a web UI installed
Accessing https://192.168.0.x:443/ui/ or other common UI paths in a browser also doesn’t load the UI.
Troubleshooting Steps Taken:
- Ensured incus-ui-canonical is installed.
- Set core.https_address and confirmed the API is listening.
- Restarted incusd multiple times after changes.
- Checked the Incus configuration file for Alpine: /etc/conf.d/incusd. This file contains the line: INCUS_UI=/usr/share/incus-ui/.
- Verified that the directory /usr/share/incus-ui/ exists and contains UI assets (like index.html, assets/ etc.).
apk info -L incus-ui-canonical shows files are installed there:
incus-ui-canonical-0.14.6-r0 contains:
usr/share/incus-ui/index.html
usr/share/incus-ui/assets/AutoExpandingTextArea-DtSs6mgh.js
usr/share/incus-ui/assets/BackLink-BFCE71Sp.js
usr/share/incus-ui/assets/BaseLayout-DZ0dbCAL.js
usr/share/incus-ui/assets/CancelOperationBtn-aScOssHT.js
usr/share/incus-ui/assets/CertificateAdd-DdFmCYVV.js
usr/share/incus-ui/assets/CertificateGenerate-Dz_r28Xo.js
usr/share/incus-ui/assets/ClusterGroupForm-D0o-Htuw.js
usr/share/incus-ui/assets/ClusterList-COCz0W8S.js
usr/share/incus-ui/assets/ClusterMemberSelector-2pwjPlIw.js
usr/share/incus-ui/assets/ConfigFieldDescription-PdSBxa-E.js
usr/share/incus-ui/assets/CreateClusterGroup-X73L1SKO.js
usr/share/incus-ui/assets/CreateInstance-B8tF47Kt.js
usr/share/incus-ui/assets/CreateInstanceFromImageBtn-D9hfubpw.js
usr/share/incus-ui/assets/CreateNetwork-DLslVEae.js
usr/share/incus-ui/assets/CreateNetworkAcl-CdA256iT.js
usr/share/incus-ui/assets/CreateNetworkAclRule-DBFOk-We.js
usr/share/incus-ui/assets/CreateNetworkForward-WTLmVcys.js
usr/share/incus-ui/assets/CreateProfile-m28wv8vG.js
usr/share/incus-ui/assets/CreateProject-XW8l6EZl.js
usr/share/incus-ui/assets/CreateStoragePool-BOl0j8Ek.js
usr/share/incus-ui/assets/CreateStorageVolume-t494rRAT.js
usr/share/incus-ui/assets/CustomIsoList-CvkXdJSn.js
usr/share/incus-ui/assets/DeleteStoragePoolBtn-U3uNE7aV.js
usr/share/incus-ui/assets/DeleteStorageVolumeBtn-CgtVfVaF.js
usr/share/incus-ui/assets/DiskSizeSelector-DLVCkuvd.js
usr/share/incus-ui/assets/EditClusterGroup-Dt6_FEj2.js
usr/share/incus-ui/assets/EditNetworkForward-CsIB4dyA.js
usr/share/incus-ui/assets/ExpandableList-DHijbZKL.js
usr/share/incus-ui/assets/FormFooterLayout-CuU-kGjK.js
usr/share/incus-ui/assets/FormMenuItem-B-2aF0bb.js
usr/share/incus-ui/assets/FormMenuItem-qJs8Ougx.css
usr/share/incus-ui/assets/GroupOrIdentityChangesTable-CuBtOxjY.js
usr/share/incus-ui/assets/GroupSelectionActions-DVJheN4i.js
usr/share/incus-ui/assets/HelpLink-B3XkufrK.js
usr/share/incus-ui/assets/ImageList-BycANsQL.js
usr/share/incus-ui/assets/InstanceDetail-AP3OlSZx.js
usr/share/incus-ui/assets/InstanceDetail-DSXBckUd.css
usr/share/incus-ui/assets/InstanceList-DMSNRoi4.js
usr/share/incus-ui/assets/ItemName-D1f-vGpQ.js
usr/share/incus-ui/assets/Login-BvSWqVyJ.js
usr/share/incus-ui/assets/ModifiedStatusAction-gLdk8ZF2.js
usr/share/incus-ui/assets/NetworkAclDetail-b9m1rtrF.js
usr/share/incus-ui/assets/NetworkAclForm-DmE7AuUw.js
usr/share/incus-ui/assets/NetworkAclList-B0zMC923.js
usr/share/incus-ui/assets/NetworkDetail-Ch2egW9b.js
usr/share/incus-ui/assets/NetworkForm-Csgxjn-9.js
usr/share/incus-ui/assets/NetworkForwardForm-Co_Bu7yW.js
usr/share/incus-ui/assets/NetworkList-BQ9zrV1L.js
usr/share/incus-ui/assets/NetworkListTable-BW7vKh65.js
usr/share/incus-ui/assets/NetworkMap-DqYJcHvy.js
usr/share/incus-ui/assets/NotificationRow-xxjehJ4r.js
usr/share/incus-ui/assets/OperationList-V6rCBk9R.js
usr/share/incus-ui/assets/PageHeader-Cd5BXnZN.js
usr/share/incus-ui/assets/PermissionGroups-DA6mDSFc.js
usr/share/incus-ui/assets/PermissionIdentities-kUPGTF6g.js
usr/share/incus-ui/assets/PermissionIdpGroups-BJfY0wJI.js
usr/share/incus-ui/assets/ProfileDetail-cvWDo8qG.js
usr/share/incus-ui/assets/ProfileDetailsForm-Bx3hAML4.js
usr/share/incus-ui/assets/ProfileInstances-Y6SQF-Cg.js
usr/share/incus-ui/assets/ProfileList-qe_L54eC.js
usr/share/incus-ui/assets/ProgressBar-BocwRx6g.js
usr/share/incus-ui/assets/ProjectConfiguration-DH2XTv9Y.js
usr/share/incus-ui/assets/ProjectForm-uiuE3UZk.js
usr/share/incus-ui/assets/ProtectedRoute-CFJ4SCFP.js
usr/share/incus-ui/assets/ProxyDeviceForm-6du8G-46.js
usr/share/incus-ui/assets/RenameHeader-DkGppZEy.js
usr/share/incus-ui/assets/ResourceIcon-86GgumPw.js
usr/share/incus-ui/assets/ResourceLabel-klENYVEz.js
usr/share/incus-ui/assets/ResourceLink-BTm6xiTi.js
usr/share/incus-ui/assets/ScrollableContainer-C40WlKkU.js
usr/share/incus-ui/assets/ScrollableTable-Pld7CwH9.js
usr/share/incus-ui/assets/SelectableMainTable-DZZ4Uh4h.js
usr/share/incus-ui/assets/SelectedTableNotification-Qud-p7NZ.js
usr/share/incus-ui/assets/Settings-CL50uuPw.js
usr/share/incus-ui/assets/SidePanel-OwG_zO5W.js
usr/share/incus-ui/assets/SnapshotForm-jJ-8TQWh.js
usr/share/incus-ui/assets/StoragePoolDetail-DaRzd6yI.js
usr/share/incus-ui/assets/StoragePoolSelectTable-BqBiNtpU.js
usr/share/incus-ui/assets/StoragePoolSelector-DYszAQ–.js
usr/share/incus-ui/assets/StoragePoolSize-DJZgUfCE.js
usr/share/incus-ui/assets/StoragePools-UUeo2Lsf.js
usr/share/incus-ui/assets/StorageUsedBy-CK2s5onm.js
usr/share/incus-ui/assets/StorageVolumeDetail-zqax6c0r.js
usr/share/incus-ui/assets/StorageVolumeForm-BfdDj4x7.js
usr/share/incus-ui/assets/StorageVolumes-BslYtSpP.js
usr/share/incus-ui/assets/StorageVolumesFilter-BKyk3NCB.js
usr/share/incus-ui/assets/TabLinks-7jcnLhf2.js
usr/share/incus-ui/assets/UploadCustomIso-C5m4CXwN.js
usr/share/incus-ui/assets/UsedByItem-BZo8_h5S.js
usr/share/incus-ui/assets/VolumeAddSnapshotBtn-BwEg1skc.js
usr/share/incus-ui/assets/WarningList-CYriiWm_.js
usr/share/incus-ui/assets/YamlNotification-B6nzlSje.js
usr/share/incus-ui/assets/YamlSwitch-DQDXFilO.js
usr/share/incus-ui/assets/certificate-BBIk9Y5a.js
usr/share/incus-ui/assets/clusterGroups-BBvcNvdt.js
usr/share/incus-ui/assets/formFields-BDRvqvBI.js
usr/share/incus-ui/assets/images-BxCO3Ibp.js
usr/share/incus-ui/assets/images-Rj2mAqsA.js
usr/share/incus-ui/assets/index-CFxEQZH6.css
usr/share/incus-ui/assets/index-OqWUVYWk.js
usr/share/incus-ui/assets/index.esm-BKGmqQwy.js
usr/share/incus-ui/assets/instanceDelete-B18DdObD.js
usr/share/incus-ui/assets/instanceOptions-BVjIWe7l.js
usr/share/incus-ui/assets/instances-BgX7wtmC.js
usr/share/incus-ui/assets/instances-CsC6Yw04.js
usr/share/incus-ui/assets/loadCustomVolumes-DlO0f06T.js
usr/share/incus-ui/assets/loadIsoVolumes-CqodvNvg.js
usr/share/incus-ui/assets/network-forwards-CdQP4t_Y.js
usr/share/incus-ui/assets/networkForm-CTnJlLu7.js
usr/share/incus-ui/assets/networks-Vwlq20fA.js
usr/share/incus-ui/assets/operations-Bh89JbNy.js
usr/share/incus-ui/assets/searchAndFilter-BEZtSWxl.js
usr/share/incus-ui/assets/snapshots-CrstmIz9.js
usr/share/incus-ui/assets/useClusterMembers–BGINepG.js
usr/share/incus-ui/assets/useSmallScreen-BPhRJUbc.js
usr/share/incus-ui/assets/useSortTableData-6Sa4QgGW.js
usr/share/incus-ui/assets/icon/contextual-menu.svg
usr/share/incus-ui/assets/img/app-logo.png
usr/share/incus-ui/assets/img/favicon-32x32.png
usr/share/incus-ui/assets/img/incus-logo.svg
usr/share/incus-ui/assets/img/microCloud-logo.svg
usr/share/incus-ui/assets/img/screenshot.png
usr/share/incus-ui/assets/js/manifest.js
usr/share/incus-ui/monaco-editor/min/vs/loader.js
usr/share/incus-ui/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.de.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.es.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.fr.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.it.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.ja.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.ko.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.ru.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.zh-cn.js
usr/share/incus-ui/monaco-editor/min/vs/base/common/worker/simpleWorker.nls.zh-tw.js
usr/share/incus-ui/monaco-editor/min/vs/base/worker/workerMain.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/abap/abap.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/apex/apex.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/azcli/azcli.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/bat/bat.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/bicep/bicep.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/clojure/clojure.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/coffee/coffee.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/cpp/cpp.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/csharp/csharp.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/csp/csp.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/css/css.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/cypher/cypher.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/dart/dart.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/ecl/ecl.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/elixir/elixir.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/flow9/flow9.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/go/go.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/graphql/graphql.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/hcl/hcl.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/html/html.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/ini/ini.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/java/java.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/javascript/javascript.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/julia/julia.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/less/less.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/lexon/lexon.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/liquid/liquid.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/lua/lua.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/m3/m3.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/markdown/markdown.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/mdx/mdx.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/mips/mips.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/msdax/msdax.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/mysql/mysql.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/pascal/pascal.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/perl/perl.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/php/php.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/pla/pla.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/postiats/postiats.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/powershell/powershell.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/pug/pug.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/python/python.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/r/r.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/razor/razor.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/redis/redis.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/redshift/redshift.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/ruby/ruby.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/rust/rust.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/sb/sb.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/scala/scala.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/scheme/scheme.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/scss/scss.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/shell/shell.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/solidity/solidity.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/sophia/sophia.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/sparql/sparql.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/sql/sql.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/st/st.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/swift/swift.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/tcl/tcl.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/twig/twig.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/typescript/typescript.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/typespec/typespec.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/vb/vb.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/xml/xml.js
usr/share/incus-ui/monaco-editor/min/vs/basic-languages/yaml/yaml.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.css
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.de.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.es.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.fr.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.it.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.ja.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.ko.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.ru.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.zh-cn.js
usr/share/incus-ui/monaco-editor/min/vs/editor/editor.main.nls.zh-tw.js
usr/share/incus-ui/monaco-editor/min/vs/language/css/cssMode.js
usr/share/incus-ui/monaco-editor/min/vs/language/css/cssWorker.js
usr/share/incus-ui/monaco-editor/min/vs/language/html/htmlMode.js
usr/share/incus-ui/monaco-editor/min/vs/language/html/htmlWorker.js
usr/share/incus-ui/monaco-editor/min/vs/language/json/jsonMode.js
usr/share/incus-ui/monaco-editor/min/vs/language/json/jsonWorker.js
usr/share/incus-ui/monaco-editor/min/vs/language/typescript/tsMode.js
usr/share/incus-ui/monaco-editor/min/vs/language/typescript/tsWorker.js
ls -l /usr/share/incus-ui/ output:
total 4
drwxr-xr-x 1 root root 6136 May 29 20:12 assets
-rw-r–r-- 1 root root 665 Feb 3 22:57 index.html
drwxr-xr-x 1 root root 6 May 25 17:44 monaco-editor
Checked permissions for /usr/share/incus-ui/ (they seem to be default root:root with world-readable access).
drwxr-xr-x 1 root root 58 May 29 20:12 /usr/share/incus-ui
- The incusd daemon is started with INCUSD_OPTIONS=" --group incus".
Current Situation & Logs: Even with the INCUS_UI variable pointing to /usr/share/incus-ui/, the daemon doesn’t seem to recognize that the UI is installed.
Question: Has anyone encountered this on Alpine Linux or a similar setup? Why would Incus report the UI as not installed when the incus-ui-canonical package is present and the INCUS_UI path in the service configuration seems correct?
Are there any other configurations I might be missing, or specific checks Incus performs to detect the UI that might be failing here? Could this be a permissions issue with the incus group, or an issue with the Alpine package itself?
Any insights or further troubleshooting steps would be greatly appreciated!
Thanks,