<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flossk.org/index.php?action=history&amp;feed=atom&amp;title=Test</id>
	<title>Test - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flossk.org/index.php?action=history&amp;feed=atom&amp;title=Test"/>
	<link rel="alternate" type="text/html" href="https://wiki.flossk.org/index.php?title=Test&amp;action=history"/>
	<updated>2026-08-27T04:32:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.flossk.org/index.php?title=Test&amp;diff=10&amp;oldid=prev</id>
		<title>Samikciku: Imported from Markdown</title>
		<link rel="alternate" type="text/html" href="https://wiki.flossk.org/index.php?title=Test&amp;diff=10&amp;oldid=prev"/>
		<updated>2026-08-22T23:48:18Z</updated>

		<summary type="html">&lt;p&gt;Imported from Markdown&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;zkaccess-c3-dashboard-bundle--readme&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= ZKAccess C3 dashboard bundle — README =&lt;br /&gt;
&lt;br /&gt;
This repository runs a small &amp;#039;&amp;#039;&amp;#039;Python (FastAPI)&amp;#039;&amp;#039;&amp;#039; service that will eventually talk to a &amp;#039;&amp;#039;&amp;#039;ZKAccess C3-100&amp;#039;&amp;#039;&amp;#039; over the network (Pull SDK–style TCP, typically port &amp;#039;&amp;#039;&amp;#039;4370&amp;#039;&amp;#039;&amp;#039;). Today it ships a &amp;#039;&amp;#039;&amp;#039;LAN web dashboard&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;JSON status&amp;#039;&amp;#039;&amp;#039; endpoints, packaged with &amp;#039;&amp;#039;&amp;#039;Docker Compose&amp;#039;&amp;#039;&amp;#039; for &amp;#039;&amp;#039;&amp;#039;Linux&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;setup-ubuntu-server.sh&amp;lt;/code&amp;gt;) or &amp;#039;&amp;#039;&amp;#039;Windows&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;setup-windows.bat&amp;lt;/code&amp;gt; + Docker Desktop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-what-you-edit-vs-what-docker-runs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. What you edit vs what Docker runs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! What&lt;br /&gt;
! Where it lives&lt;br /&gt;
! Who reads it&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;All runtime settings&amp;#039;&amp;#039;&amp;#039; (panel IP, ports, passwords, public URL)&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; in the project root (next to &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;)&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Docker Compose&amp;#039;&amp;#039;&amp;#039; injects &amp;lt;code&amp;gt;C3_*&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DASHBOARD_PUBLIC_BASE_URL&amp;lt;/code&amp;gt; into the container; the app also reads &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; when present (see &amp;lt;code&amp;gt;app/settings.py&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Which host TCP port&amp;#039;&amp;#039;&amp;#039; the dashboard listens on from outside the container&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; → &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Only&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;ports:&amp;lt;/code&amp;gt; mapping). This value is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; required inside the app if you set &amp;lt;code&amp;gt;DASHBOARD_PUBLIC_BASE_URL&amp;lt;/code&amp;gt; correctly.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optional second host port&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; → &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT_ALT&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;and&amp;#039;&amp;#039;&amp;#039; you must &amp;#039;&amp;#039;&amp;#039;uncomment&amp;#039;&amp;#039;&amp;#039; the second &amp;lt;code&amp;gt;ports:&amp;lt;/code&amp;gt; line&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Image / service name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
| You normally &amp;#039;&amp;#039;&amp;#039;do not&amp;#039;&amp;#039;&amp;#039; change these unless you rename the service.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rule of thumb:&amp;#039;&amp;#039;&amp;#039; to “replace all settings,” edit &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; (and rarely uncomment a port line in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;). Then &amp;#039;&amp;#039;&amp;#039;recreate&amp;#039;&amp;#039;&amp;#039; the container so new environment values apply.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Security:&amp;#039;&amp;#039;&amp;#039; keep your real &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; file out of git (it is listed in &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt;). Never paste real passwords into issues or screenshots without redacting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-prerequisites&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A PC running &amp;#039;&amp;#039;&amp;#039;Ubuntu&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Linux Mint&amp;#039;&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;&amp;#039;Debian&amp;#039;&amp;#039;&amp;#039; on the same LAN as the C3-100.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Internet access&amp;#039;&amp;#039;&amp;#039; on first run if Docker must be installed (the script downloads Docker’s official install script).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; privileges (Docker install, optional UFW, and Docker commands until your user is in the &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; group).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (for the interactive wizard’s safe &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; writer; &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; is installed automatically if missing and &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; exists).&lt;br /&gt;
&lt;br /&gt;
The bootstrap script can &amp;#039;&amp;#039;&amp;#039;install Docker for you&amp;#039;&amp;#039;&amp;#039; on apt-based distros. If you install Docker yourself first, see:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker --version&lt;br /&gt;
docker compose version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-one-script-on-ubuntu-recommended&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. One script on Ubuntu (recommended) ==&lt;br /&gt;
&lt;br /&gt;
From the &amp;#039;&amp;#039;&amp;#039;repository root&amp;#039;&amp;#039;&amp;#039; (the folder that contains &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;setup-ubuntu-server.sh&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd /path/to/del-hy-prnhs&lt;br /&gt;
bash setup-ubuntu-server.sh&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;what-the-script-does-in-order&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== What the script does, in order ===&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; to the repo root (next to the script).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Docker&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* If &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; are missing on &amp;#039;&amp;#039;&amp;#039;Ubuntu / Debian / Linux Mint / Pop!_OS&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/etc/os-release&amp;lt;/code&amp;gt;), it asks &amp;#039;&amp;#039;&amp;#039;Install Docker Engine now? [Y/n]&amp;#039;&amp;#039;&amp;#039; and, if you accept, runs Docker’s official &amp;#039;&amp;#039;&amp;#039;[https://get.docker.com get.docker.com]&amp;#039;&amp;#039;&amp;#039; script with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; (installs Engine + Compose plugin). It installs &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; via &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; first if needed.&lt;br /&gt;
#* On other distributions it stops with a link to the manual Docker install docs.&lt;br /&gt;
#* After install it runs &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;sudo usermod -aG docker &amp;amp;quot;$USER&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; and reminds you to &amp;#039;&amp;#039;&amp;#039;log out and back in&amp;#039;&amp;#039;&amp;#039; (or &amp;lt;code&amp;gt;newgrp docker&amp;lt;/code&amp;gt;). Until then, the script uses &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;sudo docker compose&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; when your user cannot talk to the daemon.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; (interactive wizard)&amp;#039;&amp;#039;&amp;#039; — unless &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; already exists and you answer &amp;#039;&amp;#039;&amp;#039;no&amp;#039;&amp;#039;&amp;#039; to reconfigure:&lt;br /&gt;
#* Panel &amp;#039;&amp;#039;&amp;#039;IP / hostname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#* Panel &amp;#039;&amp;#039;&amp;#039;TCP port&amp;#039;&amp;#039;&amp;#039; (default &amp;lt;code&amp;gt;4370&amp;lt;/code&amp;gt;)&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Username&amp;#039;&amp;#039;&amp;#039; (optional)&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Password / comm key&amp;#039;&amp;#039;&amp;#039; (optional, hidden; confirm once)&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Dashboard port&amp;#039;&amp;#039;&amp;#039; on this server (default &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;)&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Public base URL&amp;#039;&amp;#039;&amp;#039; for bookmarks (default &amp;lt;code&amp;gt;http://&amp;amp;lt;detected-LAN-IP&amp;amp;gt;:&amp;amp;lt;dashboard-port&amp;amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
#* Confirm &amp;#039;&amp;#039;&amp;#039;Write to .env&amp;#039;&amp;#039;&amp;#039; — file is written with mode &amp;#039;&amp;#039;&amp;#039;600&amp;#039;&amp;#039;&amp;#039; and double-quoted values where needed.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;docker compose up -d --build&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; — starts the stack.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;--ufw&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; only: after a successful start, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;sudo ufw allow &amp;amp;lt;DASHBOARD_HOST_PORT&amp;amp;gt;/tcp&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;ufw reload&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script options ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
| Install Docker if missing (with prompt), then wizard / existing &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;, then compose up.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --ufw&amp;lt;/code&amp;gt;&lt;br /&gt;
| Same, plus UFW rule for the dashboard port after compose succeeds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --force-recreate&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pass &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;--force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; to compose (e.g. after manual &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; edits).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --non-interactive&amp;lt;/code&amp;gt; or &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-y&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| No Docker install prompt, &amp;#039;&amp;#039;&amp;#039;no wizard&amp;#039;&amp;#039;&amp;#039; — requires an existing &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. Use on repeat runs in automation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --help&amp;lt;/code&amp;gt;&lt;br /&gt;
| Short usage.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typical-flows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Typical flows ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fresh server:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;bash setup-ubuntu-server.sh&amp;lt;/code&amp;gt; → accept Docker install → answer wizard → open the printed URL. Use &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;--ufw&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; if you want the firewall opened automatically.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Change panel or password later:&amp;#039;&amp;#039;&amp;#039; run the script again and answer &amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039; to reconfigure, or edit &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; by hand and run &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
You can &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;chmod +x setup-ubuntu-server.sh&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; and run &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;./setup-ubuntu-server.sh&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;; &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; works without that.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Security note:&amp;#039;&amp;#039;&amp;#039; the Docker install script is upstream-maintained but still runs as root; only use on machines where that is acceptable. Review [https://docs.docker.com/engine/install/ubuntu/ Docker’s install documentation] if you prefer a manual apt-based install instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;31-windows-docker-desktop&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Windows (Docker Desktop) ===&lt;br /&gt;
&lt;br /&gt;
Install &amp;#039;&amp;#039;&amp;#039;[https://docs.docker.com/desktop/install/windows-install/ Docker Desktop for Windows]&amp;#039;&amp;#039;&amp;#039; (includes Compose v2). From a &amp;#039;&amp;#039;&amp;#039;Command Prompt&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;PowerShell&amp;#039;&amp;#039;&amp;#039;, &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; to the repo folder that contains &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;cd C:\path\to\del-hy-prnhs&lt;br /&gt;
setup-windows.bat&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;setup-windows.bat&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; checks &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt;, runs &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;setup-windows-wizard.ps1&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; when &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; is missing (or when you choose to reconfigure), then &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;docker compose up -d --build&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* The wizard asks for the same values as the Linux script (C3 IP, port, optional user/password, dashboard port, public URL) and writes &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; with UTF-8 (password prompts use &amp;#039;&amp;#039;&amp;#039;masked&amp;#039;&amp;#039;&amp;#039; input).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;HTTP&amp;#039;&amp;#039;&amp;#039; is still &amp;#039;&amp;#039;&amp;#039;Uvicorn + FastAPI&amp;#039;&amp;#039;&amp;#039; inside the container (&amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;app\main.py&amp;lt;/code&amp;gt;); &amp;#039;&amp;#039;&amp;#039;Docker Desktop&amp;#039;&amp;#039;&amp;#039; publishes &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt; → 8000&amp;#039;&amp;#039;&amp;#039; (see &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setup-windows.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wizard if needed, then compose up.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setup-windows.bat /q&amp;lt;/code&amp;gt;&lt;br /&gt;
| No prompts; use existing &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; (or copy &amp;lt;code&amp;gt;.env.example&amp;lt;/code&amp;gt; once if missing).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setup-windows.bat /r&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pass &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;--force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; to compose (can combine: &amp;lt;code&amp;gt;/q /r&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setup-windows.bat /h&amp;lt;/code&amp;gt;&lt;br /&gt;
| Help.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If other PCs cannot reach the dashboard, allow the port in &amp;#039;&amp;#039;&amp;#039;Windows Defender Firewall&amp;#039;&amp;#039;&amp;#039; (Docker Desktop often prompts the first time).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-first-time-install-manual-step-by-step&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. First-time install (manual, step by step) ==&lt;br /&gt;
&lt;br /&gt;
Use this if you prefer not to use the script. Run everything &amp;#039;&amp;#039;&amp;#039;from the project directory&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;41-create-your-env-from-the-template&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 Create your &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; from the template ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd /path/to/del-hy-prnhs&lt;br /&gt;
cp .env.example .env&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;42-edit-env-and-replace-every-value&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Edit &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; and replace every value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;nano .env&lt;br /&gt;
# or: vim .env   or open .env in your desktop editor&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable&lt;br /&gt;
! Set it to…&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
| The &amp;#039;&amp;#039;&amp;#039;IPv4 address&amp;#039;&amp;#039;&amp;#039; (or DNS name) of your &amp;#039;&amp;#039;&amp;#039;C3-100&amp;#039;&amp;#039;&amp;#039; on the LAN.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_PORT&amp;lt;/code&amp;gt;&lt;br /&gt;
| Usually &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;4370&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. Change only if the device uses another TCP port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_USERNAME&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optional.&amp;#039;&amp;#039;&amp;#039; Leave empty if the panel only uses a password / comm key.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_PASSWORD&amp;lt;/code&amp;gt;&lt;br /&gt;
| The panel &amp;#039;&amp;#039;&amp;#039;password or comm key&amp;#039;&amp;#039;&amp;#039; if required; leave empty if not used.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt;&lt;br /&gt;
| Any &amp;#039;&amp;#039;&amp;#039;free TCP port on the Linux host&amp;#039;&amp;#039;&amp;#039; (e.g. &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;). Browser: &amp;lt;code&amp;gt;http://&amp;amp;lt;server-ip&amp;amp;gt;:&amp;amp;lt;port&amp;amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DASHBOARD_PUBLIC_BASE_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| Same service as a full URL, e.g. &amp;lt;code&amp;gt;http://192.168.1.50:8080&amp;lt;/code&amp;gt; — &amp;#039;&amp;#039;&amp;#039;host and port&amp;#039;&amp;#039;&amp;#039; must match &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Optional second port:&amp;#039;&amp;#039;&amp;#039; set &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT_ALT&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;, then in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;uncomment&amp;#039;&amp;#039;&amp;#039; the second &amp;lt;code&amp;gt;ports:&amp;lt;/code&amp;gt; line. Use two different port numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;43-open-the-firewall-if-ufw-is-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Open the firewall (if UFW is enabled) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo ufw allow &amp;lt;DASHBOARD_HOST_PORT&amp;gt;/tcp comment &amp;#039;ZKAccess dashboard&amp;#039;&lt;br /&gt;
sudo ufw reload&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;44-build-and-start-the-stack&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Build and start the stack ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose up -d --build&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;45-verify&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 Verify ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose ps&lt;br /&gt;
docker compose logs --tail=50 dashboard&lt;br /&gt;
curl -sS &amp;quot;http://127.0.0.1:&amp;lt;DASHBOARD_HOST_PORT&amp;gt;/health&amp;quot;&lt;br /&gt;
curl -sS &amp;quot;http://127.0.0.1:&amp;lt;DASHBOARD_HOST_PORT&amp;gt;/api/status&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
On another PC: &amp;lt;code&amp;gt;http://&amp;amp;lt;linux-server-ip&amp;amp;gt;:&amp;amp;lt;DASHBOARD_HOST_PORT&amp;amp;gt;/&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;/api/status&amp;lt;/code&amp;gt; never returns &amp;lt;code&amp;gt;C3_PASSWORD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;5-how-to-change-settings-later-replace--update&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. How to change settings later (replace / update) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Apply changes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose up -d --force-recreate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If &amp;#039;&amp;#039;&amp;#039;code&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;requirements.txt&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; / &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; changed:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;docker compose up -d --build --force-recreate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Or use: &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;If &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; changed, update &amp;#039;&amp;#039;&amp;#039;UFW&amp;#039;&amp;#039;&amp;#039; (or run &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --ufw --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; after editing &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;6-day-to-day-commands-project-directory&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Day-to-day commands (project directory) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Goal&lt;br /&gt;
! Command&lt;br /&gt;
|-&lt;br /&gt;
| Start&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Rebuild&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up -d --build&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Apply &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; changes&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up -d --force-recreate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Logs&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose logs -f dashboard&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Stop&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;7-full-list-of-environment-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Full list of environment variables ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable&lt;br /&gt;
! Required&lt;br /&gt;
! Default (if unset)&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strongly recommended&lt;br /&gt;
| empty&lt;br /&gt;
| ZKAccess panel IP or hostname.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_PORT&amp;lt;/code&amp;gt;&lt;br /&gt;
| No&lt;br /&gt;
| &amp;lt;code&amp;gt;4370&amp;lt;/code&amp;gt;&lt;br /&gt;
| Panel TCP port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_USERNAME&amp;lt;/code&amp;gt;&lt;br /&gt;
| No&lt;br /&gt;
| empty&lt;br /&gt;
| Optional; reserved for setups that need a user name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C3_PASSWORD&amp;lt;/code&amp;gt;&lt;br /&gt;
| Depends on panel&lt;br /&gt;
| empty&lt;br /&gt;
| Panel password / comm key; never returned by &amp;lt;code&amp;gt;/api/status&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt;&lt;br /&gt;
| No (Compose default)&lt;br /&gt;
| &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
| Host port for the web UI.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT_ALT&amp;lt;/code&amp;gt;&lt;br /&gt;
| No&lt;br /&gt;
| only if line uncommented in compose&lt;br /&gt;
| Second host port to the same app.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DASHBOARD_PUBLIC_BASE_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| No&lt;br /&gt;
| empty&lt;br /&gt;
| Bookmark URL on the HTML dashboard.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Compose reads &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;${...}&amp;lt;/code&amp;gt; interpolation in &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Library note:&amp;#039;&amp;#039;&amp;#039; [https://github.com/vwout/zkaccess-c3-py zkaccess-c3-py] often uses &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;connect(password=...)&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; only; &amp;lt;code&amp;gt;C3_USERNAME&amp;lt;/code&amp;gt; is still available for your firmware or future code paths.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;8-router-port-forwarding-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Router port forwarding (optional) ==&lt;br /&gt;
&lt;br /&gt;
Forward &amp;#039;&amp;#039;&amp;#039;WAN TCP&amp;#039;&amp;#039;&amp;#039; to &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;&amp;amp;lt;LAN-ip-of-linux-PC&amp;amp;gt;:&amp;amp;lt;DASHBOARD_HOST_PORT&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. The app does not need the WAN port in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;. For internet exposure, prefer &amp;#039;&amp;#039;&amp;#039;VPN&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;HTTPS + authentication&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;9-running-without-docker-developers-only&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Running without Docker (developers only) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cd /path/to/del-hy-prnhs&lt;br /&gt;
python3 -m venv .venv&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
uvicorn app.main:app --host 0.0.0.0 --port 8000&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Open &amp;lt;code&amp;gt;http://&amp;amp;lt;this-pc-ip&amp;amp;gt;:8000/&amp;lt;/code&amp;gt;. Without Docker, &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt; is ignored; you pick the port on the &amp;lt;code&amp;gt;uvicorn&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;10-troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Symptom&lt;br /&gt;
! Things to check&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;127.0.0.1:PORT&amp;lt;/code&amp;gt; fails&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose ps&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;docker compose logs dashboard&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;DASHBOARD_HOST_PORT&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Other PCs cannot connect&lt;br /&gt;
| Subnet, AP isolation, &amp;#039;&amp;#039;&amp;#039;UFW&amp;#039;&amp;#039;&amp;#039;, correct server IP.&lt;br /&gt;
|-&lt;br /&gt;
| Old values after editing &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up -d --force-recreate&amp;lt;/code&amp;gt; or &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| Docker permission denied&lt;br /&gt;
| User in &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; group, re-login, or &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; (not ideal long-term).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11-project-background&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 11. Project background ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[plan.md]]&amp;#039;&amp;#039;&amp;#039; — architecture, C3 data model, phases.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/vwout/zkaccess-c3-py zkaccess-c3-py]&amp;#039;&amp;#039;&amp;#039; — Python library for the panel protocol (integration planned in later phases).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;12-template-file-reference&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 12. Template file reference ==&lt;br /&gt;
&lt;br /&gt;
The checked-in &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env.example&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; lists all keys. When in doubt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cp .env.example .env&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then edit &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; only. After changes: &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;docker compose up -d --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (or &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;bash setup-ubuntu-server.sh --force-recreate&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;) and add &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;--build&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; when code or dependencies change.&lt;/div&gt;</summary>
		<author><name>Samikciku</name></author>
	</entry>
</feed>