Releases: gavrilencu/PortDock
Release list
v1.12.1
Fix: read-only SQL console on PostgreSQL 16 and newer
Fixes
- The read-only SQL console failed with permission denied on PostgreSQL 16+: the read-only role introduced in v1.12.0 did not inherit the
pg_read_all_datagrant, because inheritance became a property of the grant itself in PostgreSQL 16. The grant is now made with inheritance; existing databases are repaired on the next query.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.12.1 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.12.1Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.12.0...v1.12.1
v1.12.0
Security hardening, faster everywhere, new logo
This release follows a full security and performance review of PortDock. Updating is recommended for every installation.
Security
- Extra docker run options and compose files can no longer hand a container the server. Options are checked against an allow-list and quoted (no privileged mode, host namespaces, capabilities or host ports); bind mounts of server paths and devices are for administrators only, and never the root,
/etcor the Docker socket. Compose files that need such settings deploy only when an administrator enables Allow host access on the application. - Build paths stay inside the repository: base directory, Dockerfile, compose file and publish directory cannot climb out with
... - The webhook secret is shown only to users with write access and stored encrypted; the deploy hook no longer accepts
GET. - Owners and administrators are never linked by e-mail through SSO or LDAP. They connect a provider themselves from Settings → Profile; members are linked only with a verified e-mail (trust e-mail is now off by default); administrators link local accounts to a directory from Settings → Team.
- Only the owner can change the owner's password; second-factor codes are throttled per account;
X-Forwarded-Foris trusted only from proxies (private ranges by default,PORTDOCK_TRUSTED_PROXIES). - Content-Security-Policy, Permissions-Policy and HSTS (on HTTPS) on the interface; the sign-in page follows only same-site redirects; custom labels cannot steer the proxy.
- Members no longer receive the infrastructure settings, the servers' images, volumes, networks or setup logs; the SQL console runs read-only PostgreSQL scripts as a real read-only role.
Performance
- SQLite reads use a pool of connections next to the single writer, so a long write no longer stalls every request; ten indexes added. A deadlock that froze the whole instance when a member opened the dashboard is fixed.
- Deployment logs are appended instead of rewritten every two seconds, capped at 8 MB, and never loaded in lists.
- Servers are reconciled in parallel with backoff from unreachable ones; topology and fleet share one docker call per server every few seconds; the health check uses one probe container instead of one every two seconds.
- The interface loads pages, the terminal and the assistant on demand (first download ~3× smaller), renders long build logs in a window, polls less and compresses JSON.
- The SSH connection to a server is no longer dropped when it refuses one more session.
Fixes
- Applications no longer stay in deploying after a PortDock restart.
- A cancellation during the rollout can no longer leave two versions live.
- A TOTP or recovery code cannot be used twice by parallel requests; two concurrent first registrations cannot both become owner.
- Pages that hit a
nulllist show an error box with a reload button instead of a blank page.
New logo
The PortDock icon and wordmark appear in the sidebar, on the sign-in page, in About, on the status page and as the favicon, with a variant for each theme.
Notes
- Existing applications with docker options that the allow-list refuses fail at the next deploy with a clear message; an administrator can adjust them.
- If an owner or administrator signed in through SSO before, they sign in with their password once and connect the provider from their profile.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.12.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.12.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.11.0...v1.12.0
v1.11.0
SAST, DAST and security reports for every deploy
What's new
- Static analysis of the source (SAST) with Semgrep:
- Runs right after the checkout, before the build, on every deploy (per application), or on demand from the Security tab.
- Finds injections, unsafe deserialization, weak cryptography, secrets, insecure Dockerfiles… with the rule, file and line, CWE, description and fix.
- A deploy can be blocked when a high finding is found.
- Rule sets are configurable (
p/default,p/owasp-top-ten,p/secrets, URLs or files of the repository) in Settings → Network & proxy → Security scanners.
- Dynamic scan of the running application (DAST) with OWASP ZAP:
- A baseline scan runs in the background once the new version is live, or on demand; it doesn't attack the application.
- It reaches the application directly inside the PortDock network; the URL to scan can be changed per application (Docker Compose applications use their first domain).
- Reports missing security headers, insecure cookies, information leaks… with the number of instances and the solution.
- Reports for every scan (Trivy, Semgrep and ZAP):
- A self-contained HTML report, CSV (opens in Excel), JSON and the raw report of the tool (Trivy JSON, SARIF, ZAP JSON and HTML).
- Viewed in the browser or downloaded one by one or as a ZIP.
- Each deployment page lists its scans with a Download all (ZIP) button for every report of that build and deploy.
- The last 30 scans of each kind are kept per application.
- Security tab with sub-tabs for the image (Trivy), the code (SAST) and the running app (DAST), each with its own settings, filters and history.
- The images of the scanners can be pulled from your own registry (Trivy, Semgrep and ZAP image settings).
Fixes
- The "⋯" menus are no longer cut off at the bottom of cards and tables (for example on Uptime with a single monitor); they open upwards when there is no room below.
Notes
- The first SAST and DAST scans download the Semgrep and ZAP images (a few hundred MB), once per server.
- Static analysis needs the source, so it is available for applications deployed from Git.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.11.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.11.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.10.1...v1.11.0
v1.10.1
Fix: the SQL console page crashed when a query failed
Fixes
- SQL console: when the first statement of a script failed (a table that doesn't exist, a typo, a name that needs quotes), the page stopped with "Cannot read properties of null (reading 'length')". It now shows the database's error message, for example
relation "customers" does not exist. - If the database client stops without a result or an error, the console now shows what it printed instead of an empty result.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.10.1 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.10.1Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.10.0...v1.10.1
v1.10.0
Every server in one view, corporate proxy and Nexus mirrors
What's new
- Containers of every server in one place (new Containers page):
- The containers of all connected servers, each with its server and the PortDock resource it belongs to (project / environment / name), CPU and memory.
- Logs, terminal, restart, start, pause, stop and remove, wherever the container runs.
- Filters by server, state and PortDock resources; a card per server shows whether it is reachable.
- Tabs for the images (with how many containers use each, and removal of unused ones) and the volumes of every server.
- Members only see the containers of the projects they have access to.
- Servers of each resource shown in the project page.
- Corporate proxy (Settings → Network & proxy):
- HTTP / HTTPS proxy with user and password (stored encrypted) and
NO_PROXYwith names, domains, IP addresses and CIDR ranges. - Used by PortDock itself (Git providers, updates, notifications, AI assistant, uptime checks), by builds (git clone,
docker buildas predefined build arguments so nothing is left in the images, Nixpacks, Docker Compose builds, the Trivy database) and by containers. - Each application can follow the setting, always use the proxy or never use it.
- A connection test runs through the settings before they are saved.
- HTTP / HTTPS proxy with user and password (stored encrypted) and
- Docker Hub mirror for Nexus, Artifactory or Harbor:
- Merged into
/etc/docker/daemon.jsonon each server, keeping your other settings, withinsecure-registriesfor plain HTTP. - Applied by reloading Docker, without stopping any container.
- The daemon's proxy is written as a systemd drop-in, applied with a confirmed restart of Docker.
- Merged into
- Package mirrors for builds: npm, PyPI, Go proxy and any other build variable (Maven, NuGet…), used automatically by the Node.js, Bun, Python and Go build packs; a mirror of the Trivy database for servers without internet.
Notes
- In your own Dockerfiles, declare the package mirror variables you need (
ARG NPM_CONFIG_REGISTRY) before the step that installs packages; the proxy works without any change. - Writing the Docker daemon configuration needs root or passwordless sudo on the server.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.10.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.10.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.9.0...v1.10.0
v1.9.0
SQL console, uptime monitoring and status page, Trivy scans, Microsoft Teams, Azure DevOps previews
What's new
- SQL console in every PostgreSQL, MySQL, MariaDB, SQL Server and ClickHouse database: browse the tables, run a script (or the selected part), see each statement's result, NULLs and affected rows, and export to CSV.
- Members without an admin role have read-only access, enforced twice: only reading statements are accepted, and they run in a session that cannot write (a read-only transaction under a reading role, a SELECT-only user, an impersonated
db_datareader, orreadonly=1). - Organization admins can allow writes. Every query is recorded in the audit log; client commands (
\!,system,:!!…) are refused.
- Members without an admin role have read-only access, enforced twice: only reading statements are accepted, and they run in a session that cannot write (a read-only transaction under a reading role, a SELECT-only user, an impersonated
- Uptime monitoring (new Uptime page): checks of your URLs every 30 seconds to 1 hour — accepted status codes, an optional keyword, response time and TLS certificate expiry — with 24-hour and 30-day uptime, 90-day history and incidents.
- Alerts through the notification channels:
monitor.down,monitor.up,monitor.ssl_expiring.
- Alerts through the notification channels:
- Public status page at
/status: the state and 90-day uptime of the public monitors and the incidents of the last 14 days, without URLs or error details. - Vulnerability scanning with Trivy (application → Security): scan the running images now or on every deploy, with findings by severity, fixed versions, filters and history.
- Deployments can be blocked on critical or on critical and high vulnerabilities; the running version stays live.
- Docker Compose images are scanned once running.
- Microsoft Teams notifications, as Adaptive Cards (Teams Workflows or incoming webhooks).
- Azure DevOps: pull requests targeting the branch get preview deployments (redeployed on new commits, removed when completed or abandoned), and every deployment is reported as
portdock/deployon the commit andportdock/previewon the pull request.
Notes
- For Azure DevOps statuses, add the Code: Status scope to the personal access token, then Recreate service hooks in each application's CI/CD tab to subscribe to pull requests.
- Uptime checks run from the PortDock server. The first Trivy scan on a server downloads the vulnerability database (about a minute).
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.9.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.9.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.8.0...v1.9.0
v1.8.0
Azure DevOps: deploy repositories and deploy on every push
What's new
- Connect Azure DevOps from Settings → Git sources: an organization (
contoso,https://dev.azure.com/contoso,*.visualstudio.comor an Azure DevOps Server 2020+ collection) and a personal access token with the scopes Code: Read and Service Hooks: Read, query & manage. The token is checked when you connect, stored encrypted, and can be replaced when it expires without touching the applications. - New resource → Git repository → Azure DevOps: search the repositories of every project, pick the branch, and the build pack is detected from the repository (Dockerfile, Compose with a domain per service, Node, Vite, Python, Go…), just like for GitHub.
- Deploy on push: PortDock adds a service hook (Code pushed) to the application's repository, authenticated by a secret header. Pushes to the branch deploy; watch paths are checked against the files of the pushed commits; deleted branches and other branches are ignored.
- CI/CD & Webhooks shows whether the service hook is active, recreates it with one click, and gives the URL and header to add it by hand when the token isn't allowed to.
- The hook follows the application: replaced when the webhook secret is regenerated or the repository changes, removed when the application is deleted. A connection still used by applications can't be removed.
Notes
- Azure DevOps must reach PortDock: set
PORTDOCK_PUBLIC_URLto a public HTTPS address for deploys on push. - Pull request previews stay available for GitHub, GitLab and Gitea.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.8.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.8.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.7.0...v1.8.0
v1.7.0
Database backups for every engine, including Microsoft SQL Server
What's new
- Microsoft SQL Server as a managed database (SQL Server 2022, free Express edition), with the database created automatically.
- Backups for every engine, done the way each engine's documentation recommends, while the database keeps serving:
- PostgreSQL:
pg_dumpcustom format, restored withpg_restore --cleanin a single transaction (all or nothing); - MySQL and MariaDB:
--single-transactiondumps with routines, events and triggers; - SQL Server: copy-only full backups with checksums, verified with
RESTORE VERIFYONLY; - MongoDB:
mongodumparchives; - ClickHouse: now supported — table schemas and data in Native format;
- Redis and Valkey:
BGSAVEinstead ofSAVE, so clients are no longer blocked during a backup.
- PostgreSQL:
- A job queue: backups and restores of a database run one at a time; new requests wait as Pending, and at most two jobs run per server.
- Back up now on every database, and Back up all now in Settings → Backup storage.
- Safer restores: a safety backup of the current data is taken first (kept as Before restore); if it fails, nothing is restored. Restores run in the background with their progress shown.
- The Backups tab lists every backup with its status, type, size and path on the server, to download or delete.
Fixes
- Retention of a schedule no longer deletes the files of other schedules or of manual backups.
- A half-written backup file is never shown as complete, and jobs interrupted by a restart are marked as failed.
- MongoDB only counts as healthy once its root user exists.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.7.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.7.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.6.0...v1.7.0
v1.6.0
Open source under Apache-2.0
PortDock is now officially open source under the Apache License 2.0: free to use, change and distribute, including commercially, as long as the license and the NOTICE file are kept.
What's new
- License:
LICENSE(Apache-2.0) andNOTICEfiles; the Docker image carries theorg.opencontainers.image.licenseslabel, and Settings → About shows the license. - New README in English with a quick start (installer or prebuilt image), the full feature list, screenshots, a comparison with hosted platforms, configuration, guides (domains and certificates, Docker Compose, versions, GitHub, CI/CD, SSO and LDAP, AI assistant, updates) and the architecture. The Romanian documentation moved to
docs/README.ro.mdand was brought up to date. CONTRIBUTING.mdexplains how to report issues and send pull requests;SECURITY.mdexplains how to report a vulnerability privately.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.6.0 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.6.0Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.5.2...v1.6.0
v1.5.2
About page and credits
Changes
- Settings → About, available to every user: the installed version and whether an update is available, links to GitHub, releases and issue reporting, and a short overview of everything PortDock can do. Available in English, Romanian and Russian.
- Credits at the bottom of every page and on the sign-in page: "© 2026 PortDock · Developed by Gavrilencu Grigore". The year updates by itself.
Install on a server
On a Linux server (Ubuntu or Debian recommended), as root. Ports 80 and 443 must be free for the HTTPS proxy.
Option 1: installer (installs Docker if it is missing and builds this version):
git clone --branch v1.5.2 https://github.com/gavrilencu/PortDock.git portdock
cd portdock
sudo bash install.sh # dashboard on http://<server-ip>:8000
sudo bash install.sh https://portdock.example.com # or with a domain that points to the serverIf port 8000 is taken, the installer uses the next free port and prints the address.
Option 2: prebuilt image (Docker already installed):
docker run -d --name portdock --restart unless-stopped \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/portdock:/data/portdock \
-e PORTDOCK_PUBLIC_URL=http://<server-ip>:8000 \
ghcr.io/gavrilencu/portdock:v1.5.2Keep the data directory mounted at the same path as on the host (/data/portdock). To use another port, change it on the left of -p, for example -p 8001:8000.
Then open the dashboard, create the owner account, and start the proxy from Servers → localhost → Run setup.
Update an existing installation
In PortDock, click Update available at the bottom of the sidebar, or go to Settings → Updates. A backup is taken first, and the previous version comes back automatically if the new one doesn't start. Your applications keep running during the update.
Full Changelog: v1.5.1...v1.5.2