A lightweight PaaS for managing Docker applications. Deploy, monitor, and clean up compose-based stacks from a single control surface.
@GUIDocker/
├── dashboard/ # Go application — main PaaS server
│ ├── config/ # Configuration
│ ├── domain/ # Entities, ports
│ ├── infrastructure/ # BoltDB, Docker CLI
│ ├── interfaces/ # HTTP handlers, middleware
│ ├── usecase/ # App lifecycle, scanner
│ ├── views/ # HTML templates
│ └── static/ # Tailwind CSS, assets
│
├── website/ # Public home page / landing site
│ ├── docker-compose.yml # Importable static site stack
│ ├── index.html # Product intro, feature highlights
│ ├── style.input.css # Tailwind source
│ └── style.css # Compiled CSS (build output)
│
└── .project/ # Project planning notes and internal docs
- dashboard/ — Go server with HTTP Basic Auth, BoltDB, and Docker Compose integration. Serves the full admin UI (Overview, Apps, Compose, Logs, Scanner, Settings) and REST API.
- website/ — Static landing page (HTML + Tailwind) for the public product home page. Built via
npm run build:wwwfromdashboard/and importable into the admin panel viawebsite/docker-compose.yml.
cd dashboard
go build -o dashboard .
PAAS_ADMIN_USER=admin PAAS_ADMIN_PASS=admin@123 ./dashboardOpen http://localhost:3000.
cd dashboard
npm install
# Dashboard UI (Tailwind)
npm run build:css
# Landing page (website/)
npm run build:www- The dashboard remains an autonomous temporary GUI for a single root operator.
- Applications are deployed by Docker Compose and continue running after the dashboard container is removed.
- Public routing is handled by host-installed
nginxandcertbot, managed by the dashboard. - Applications are attached to the managed Docker network
paas-networkand should be routed by internal container port, not by published host ports.
Use this flow to deploy the official landing page through the admin panel:
- Import from Git.
- Use repository URL
https://github.com/fastygo/guidocker.git. - Set compose file path to
website/docker-compose.yml. - Leave app port empty because the compose file already defines the service.
- Deploy the imported app.
- Open app settings in the dashboard.
- Set
ProxyTargetPortto80because routing now targets the internal container port onpaas-network. - Save the app configuration.
- Add the public domain later through routing/settings in the admin panel.
- Enable HTTPS only after DNS is ready and host certbot settings are configured.
Use this sequence after the site is already reachable over plain HTTP on its domain.
Enable certificate automationTurn on hostcertbotintegration for the platform.Use Let's Encrypt staging environmentUse this only for test issuance. Staging certificates are expected to be untrusted by browsers andcurl.Enable automatic renewalKeep this enabled for normal operation. Disable it only if you plan to run renewal manually on the host.I accept Let's Encrypt terms of serviceRequired before the dashboard can issue a certificate.Save admin settingsSave platform TLS settings before enabling HTTPS on a specific app.Run certificate renewal nowUse this as a manual renewal/verification action. It is not required during the initial certificate issuance flow.
- Set
PublicDomain. - Set
ProxyTargetPortto the internal container port. Forwebsite/docker-compose.ymlthis is80. - Save the app.
- Enable
Enable HTTPS on proxy. - Save the app again to trigger certificate issuance and HTTPS routing.
Check that the certificate exists on disk:
ls -la /etc/letsencrypt/live/<domain>Check what certbot knows about the certificate:
certbot certificatesCheck the effective nginx config for the routed domain:
nginx -T | sed -n '/<domain>/,/}/p'Check HTTPS from the server:
curl -I https://<domain>/Inspect issuer and validity dates:
echo | openssl s_client -connect <domain>:443 -servername <domain> 2>/dev/null | \
openssl x509 -noout -subject -issuer -dates- If staging is enabled, the certificate issuer will include
(STAGING)and clients will not trust it. - If staging is disabled, the issuer should be a normal Let's Encrypt production CA and
curl -I https://<domain>/should succeed without certificate errors. nginx -Tshould showlisten 443 ssl;and certificate paths under/etc/letsencrypt/live/<domain>/.
Use the dashboard button Run certificate renewal now when you want to verify the renewal path or renew near expiry.
Equivalent terminal checks:
certbot renew --dry-run
docker logs --tail 100 dashboard
nginx -tExpected result:
certbot renew --dry-runsucceeds- dashboard logs do not show certificate errors
nginx -tremains successful after renewal
- Disable
Use Let's Encrypt staging environmentin admin settings. - Save admin settings.
- Open the app.
- Disable
Enable HTTPS on proxyand save. - Re-enable
Enable HTTPS on proxyand save again. - Re-run the verification commands above and confirm the issuer no longer contains
(STAGING).
- dashboard/README.md — Full dashboard docs: setup, API, deployment, Makefile targets.