Эта инструкция ставит последнюю версию Dokploy из форка
agentHits/dokploy, ветка AgentHits-Dev.
Образ публикуется в GitHub Container Registry:
ghcr.io/agenthits/dokploy:agenthits-dev
Тег agenthits-dev всегда указывает на последнюю сборку ветки
AgentHits-Dev. Для воспроизводимой установки используйте тег релиза
agenthits-vX.Y.Z (список — в GitHub Releases); эти теги не удаляются.
В dashboard отображаются две версии:
Official: v0.29.8
Fork: agenthits-vX.Y.Z
Official показывает официальный Dokploy base, а Fork показывает сборку
AgentHits поверх этой базы. Подробнее: AgentHits fork.
Installer сам определяет систему:
| Система | Что делает installer |
|---|---|
| Linux: Ubuntu, Debian, Raspbian, Fedora, CentOS, RHEL | Ставит Docker через get.docker.com (версия DOCKER_VERSION, по умолчанию 29.8.2; если для релиза ее нет — последнюю) |
| Linux: Rocky, Alma, Oracle, Arch, Manjaro, openSUSE, Alpine, производные Debian/RHEL | Ставит Docker пакетным менеджером дистрибутива. На Alpine сначала apk add bash curl |
Linux на ARM (aarch64) |
Дополнительно включает эмуляцию amd64 (qemu): образ собирается только под amd64 |
| macOS (Apple Silicon и Intel) | Ставит OrbStack (через Homebrew, если его нет) и панель в отдельную Linux-машину OrbStack |
| Windows 10/11 | install-agenthits.ps1: WSL2 + Ubuntu 24.04, сеть, файрвол, автозапуск; внутри тот же install-agenthits.sh |
| WSL2 вручную | Проверяет systemd и что docker не из Docker Desktop |
Общие требования:
- Свободные порты
443и3000. - Доступ к GitHub, GHCR и Docker Hub.
- На Linux-хосте не должно быть важного Docker Swarm: installer выполняет
docker swarm leave --forceи создает новый single-node Swarm. На macOS и Windows панель живет в своей Linux-машине, и Docker хоста не трогается.
По умолчанию installer использует:
Dokploy: ghcr.io/agenthits/dokploy:agenthits-dev
Traefik: traefik:v3.7.16
Postgres: postgres:18.6
Redis: redis:8.10.2
Для postgres:18+ installer автоматически монтирует volume в
/var/lib/postgresql. Ручной sed для Postgres больше не нужен.
Одна команда для всех трех. Под root на Linux скрипт работает сразу, под
обычным пользователем сам перезапускается через sudo. На macOS запускайте
от своего пользователя, без sudo:
curl -fsSL https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.sh | bashВ конце installer печатает адрес панели, обычно http://<IP>:3000. На VPS это
публичный IP, на macOS и в WSL — адрес компьютера в локальной сети.
PowerShell от администратора:
irm https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.ps1 | iexinstall-agenthits.sh на macOS создает Linux-машину OrbStack dokploy
(Ubuntu 24.04) со своим Docker и запускает себя внутри нее. Docker и swarm
самого Mac (например, CI runners) не затрагиваются. Если OrbStack нет, он
ставится через brew install --cask orbstack; без Homebrew поставьте OrbStack
с https://orbstack.dev вручную.
В конце печатаются два адреса: http://localhost:3000 на самом Mac и
http://<IP Mac в локальной сети>:3000 для других устройств. Адрес берется
с en0/en1, а не с маршрута по умолчанию (там может быть VPN); задать его
явно можно через LAN_IP=192.168.1.20.
Особенности:
- На Apple Silicon панель (
amd64) работает через Rosetta, а Postgres, Redis и Traefik — нативно. Холодный старт панели медленнее, чем на VPS. - Порты
443и3000OrbStack пробрасывает на Mac и в локальную сеть (machines.expose_ports_to_lan, включено по умолчанию). Если из сети панель не открывается, а на самом Mac открывается, выполнитеorb restart dokploy. Если включен файрвол macOS, OrbStack должен быть в списке разрешенных; installer подскажет команду, если это не так. - Памяти OrbStack по умолчанию дает 8 ГБ на все машины и контейнеры вместе;
панель с базой занимает около 1.5 ГБ. Лимит меняется командой
orb config set memory_mib <MiB>. - При сне Mac OrbStack ставит машины на паузу. Для сервера отключите сон.
- Shell внутри машины:
orb -m dokploy -u root. Там работают все команды из разделов «Проверка» и «Если установка была прервана». - Полное удаление вместе с данными панели:
orb delete dokploy.
install-agenthits.ps1:
- Ставит WSL2 и Ubuntu 24.04 (
wsl --install). Если Windows попросит перезагрузку, перезагрузитесь и запустите команду еще раз. - Дописывает в
%UserProfile%\.wslconfigсекцию[wsl2]сnetworkingMode=mirrored(WSL получает IP Windows, панель видна в локальной сети; нужен Windows 11 22H2+) иvmIdleTimeout=-1. Уже заданные вами значения не меняются, installer только предупредит. - Открывает в Hyper-V firewall для WSL входящие TCP
443,3000и UDP443. - Проверяет, что эти порты не заняты программами Windows.
- Создает задачу планировщика «AgentHits Dokploy WSL», которая держит WSL запущенным после входа в Windows: без открытой сессии WSL останавливает дистрибутив вместе с Docker.
- Запускает внутри WSL
install-agenthits.sh. Если в дистрибутиве был выключен systemd, installer включает его, перезапускает WSL и продолжает.
Если установлен Docker Desktop с WSL integration для этого дистрибутива, installer остановится и попросит ее выключить: иначе панель встала бы в engine Docker Desktop.
Образ amd64 на x86-машине работает нативно.
WSL работает, только пока вы залогинены в Windows. Для сервера, который поднимается вместе с Windows без входа пользователя, поставьте Linux в Hyper-V VM (Windows Pro/Enterprise/Education):
- PowerShell от администратора:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All, затем перезагрузка. - Hyper-V Manager → Virtual Switch Manager → External switch на физическом сетевом адаптере. Тогда VM получит свой IP в локальной сети.
- Новая VM: Generation 2, ISO Ubuntu Server 24.04, от 4 vCPU и 8 ГБ RAM, диск от 60 ГБ, сеть — созданный External switch. В Security выберите шаблон Secure Boot «Microsoft UEFI Certificate Authority».
- Automatic Start Action → «Always start this virtual machine automatically».
- Поставьте Ubuntu с OpenSSH server. На роутере закрепите за VM постоянный IP (DHCP reservation): swarm привязан к адресу, который был при установке.
- Подключитесь к VM по SSH и выполните команду для Linux.
Этот вариант удобен для тестов и rollback, потому что тег не меняется:
curl -fsSL https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.sh -o install-agenthits.sh
chmod +x install-agenthits.sh
DOKPLOY_IMAGE=ghcr.io/agenthits/dokploy:agenthits-vX.Y.Z \
DOKPLOY_RELEASE_TAG=agenthits-dev \
bash install-agenthits.shЕсли Swarm выбирает неправильный адрес на VPS с несколькими сетевыми интерфейсами, задайте адрес явно:
ADVERTISE_ADDR=YOUR_PRIVATE_OR_PUBLIC_IP \
bash install-agenthits.shdocker service ls
docker service ps dokploy --no-trunc
docker service ps dokploy-postgres --no-trunc
docker service logs --tail 120 dokploy
curl -i http://127.0.0.1:3000/api/trpc/settings.health
docker service inspect dokploy --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'Ожидаемый health response:
{"result":{"data":{"json":{"status":"ok"}}}}Ожидаемый image:
ghcr.io/agenthits/dokploy:agenthits-dev
Или конкретный pinned image, если вы передали DOKPLOY_IMAGE.
Когда в AgentHits-Dev опубликован новый image:
curl -fsSL https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.sh -o install-agenthits.sh
chmod +x install-agenthits.sh
bash install-agenthits.sh updateТа же команда работает на macOS: она обновляет панель внутри машины OrbStack. Без скачивания файла:
curl -fsSL https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.sh | bash -s updateWindows (PowerShell от администратора):
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/agentHits/dokploy/AgentHits-Dev/install-agenthits.ps1))) updateupdate сначала проверяет текущий Docker service digest и metadata через
update.sh. Если установлен тот же image digest, команда завершается без
повторного docker pull и без перезапуска dokploy.
update обновляет весь стек панели, а не только её образ. Сначала скачивается
всё, что понадобится: образы Redis, Traefik и панели (закреплённые теги), образ
Postgres, если его major-версия совпадает с закреплённой, и update.sh. Если
что-то не скачалось, команда завершается строкой
Pre-download failed: ... Nothing was changed., и ни один сервис не трогается.
Затем шаги идут в таком порядке:
- Резервная копия Postgres:
pg_dumpallвDOKPLOY_BACKUP_DIR(по умолчанию/var/backups/dokploy). Файл остаётся на хосте, доступен только root (каталог 0700, файл 0600) и не удаляется автоматически. Делается, только если Postgres будет заменён, до любой замены. - Redis:
docker service updateс остановкой старой задачи до запуска новой и откатом при сбое. Ждёт ответаPONG. - Traefik: старый контейнер останавливается и удаляется (без переименования:
переименование запущенного контейнера, подключенного к нескольким сетям,
на Swarm-хосте не проходит). Перед этим installer запоминает образ и сети
старого контейнера на хосте (кроме
bridge). Новый контейнер создается с--restart no, подключается кdokploy-networkи к тем же сетям и только после этого запускается. В течениеDOKPLOY_TRAEFIK_SETTLEсекунд (10 по умолчанию) installer раз в секунду проверяет, что он запущен и без перезапусков. Как только это перестает выполняться, обновление откатывается, не дожидаясь конца окна. В конце проверка повторяется, и только после нее ему выставляется--restart always. Если на любом шаге после остановки старого контейнера что-то не сходится, старый образ создается заново с теми же сетями и запускается, а команда завершается ошибкой с названием шага. - Postgres: только если его major-версия совпадает с закреплённой. Выполняется
docker service updateс остановкой старой задачи до запуска новой, потому что две задачи не могут работать с одним volume. Ждётpg_isready. - Панель:
update.sh. Ждётhealthy-статуса контейнера; при откате swarm или нездоровом статусе команда завершается с ошибкой. - Docker Engine: только при
DOCKER_ENGINE_UPGRADE=1и если установленная версия отличается отDOCKER_VERSION. Включайте переменную в окружении командыupdate, напримерDOCKER_ENGINE_UPGRADE=1 bash install-agenthits.sh update; она передаётся через launcher на macOS и в Windows (WSL). По умолчанию выключено. Перед любыми изменениями installer сохраняет текущие пакеты Docker вDOKPLOY_BACKUP_DIR/docker-rollback-<UTC>/(каталог 0700, файлы 0600):docker-ceиdocker-ce-cliвсегда, остальные пакеты, если их версия меняется. Если сохранить пакеты не удалось, обновление останавливается с сообщениемPre-download failed: current Docker packages for rollback. Nothing was changed.Если источник Docker в/etc/apt/sources.list.dпредназначен для другого релиза, обновление тоже останавливается до изменений: installer не переписывает источник сам. Новые пакеты скачиваются заранее, установка идёт в самом конце. Перезапуск демона перезапускает все сервисы swarm на хосте: live-restore к сервисам swarm не применяется. После установки installer ждёт доDOKPLOY_DOCKER_VERIFY_TIMEOUTсекунд (120 по умолчанию), пока Docker Engine отвечает версиейDOCKER_VERSION, swarm активен,dokploy,dokploy-postgresиdokploy-redisготовы, аdokploy-traefikзапущен. Если установка пакетов не удалась или проверка не прошла, installer автоматически устанавливает сохранённые пакеты обратно, ждёт демон, запускаетdokploy-traefik, проверяет старую версию и сервисы и завершает команду с ошибкой с указанием каталога копии. Если откат тоже не удался, выводятся команды для ручного отката (см. ниже).
Серверы, которые панель обновляет по SSH (раздел Components), ждут 30 секунд, пока Docker отвечает закрепленной версией. Если за это время Docker не проходит проверку, Docker откатывается сразу после истечения окна, а dokploy-traefik запускается снова с --restart always.
Смена major-версии Postgres (например, 17 → 18) этим обновлением не выполняется.
Если установленная major-версия отличается от закреплённой, installer печатает
Postgres 17 stays. A major upgrade is a separate migration; this update does not change it.,
не делает резервную копию, не трогает Postgres и выполняет остальные шаги.
Перенос данных между major-версиями делается отдельно (dump и restore или pg_upgrade).
Простой на каждом шаге равен времени остановки старой задачи (или контейнера) и запуска новой: образы уже локальные, поэтому скачивание в простое не участвует. Единственный шаг, который перезапускает демон Docker, — шаг 6.
Ручной откат. Для сервисов swarm: docker service update --image <предыдущий образ> <сервис>,
предыдущий образ печатается в логе шага. Для Traefik:
docker rm -f dokploy-traefik, затем создайте контейнер из предыдущего образа (он печатается в логе шага) с теми же флагами и подключите его сети: docker network connect <сеть> dokploy-traefik. Сети и флаги до обновления видны в docker inspect dokploy-traefik. Запуск: docker start dokploy-traefik.
Ручной откат Docker Engine, если автоматический не завершился. Каталог копии
имеет вид DOKPLOY_BACKUP_DIR/docker-rollback-<UTC>/, например
/var/backups/dokploy/docker-rollback-20261008T120000Z; подставьте свой:
apt-get install -y --allow-downgrades --no-download /var/backups/dokploy/docker-rollback-<UTC>/*.deb
systemctl start docker
docker start dokploy-traefik
docker version --format '{{.Server.Version}}'Последняя команда должна показать версию Engine, которая была до обновления.
docker start dokploy-traefik безопасен, даже если контейнер уже запущен.
В dashboard кнопка Check for updates для AgentHits fork сравнивает текущий
Docker service image digest с ghcr.io/agenthits/dokploy:agenthits-stable.
Этот тег указывает на последний выпущенный релиз agenthits-vX.Y.Z, поэтому
UI ставит только релизы, а не каждую сборку ветки AgentHits-Dev. Если digest
отличается и релиз не старше установленной сборки, обновление через UI запускает
docker service update на этот образ, закреплённый по digest, а не на
официальный dokploy/dokploy. Тестовая панель может следить за каждой сборкой
через переменную DOKPLOY_AGENTHITS_UPDATE_TAG=agenthits-dev у сервиса
dokploy.
Обновление на конкретный immutable tag:
DOKPLOY_IMAGE=ghcr.io/agenthits/dokploy:agenthits-vX.Y.Z \
DOKPLOY_RELEASE_TAG=agenthits-dev \
bash install-agenthits.sh updateЕсли во время первой установки нажали Ctrl+C или сервисы создались
частично, для чистого тестового VPS можно сбросить состояние и запустить
installer заново:
docker service rm dokploy dokploy-postgres dokploy-redis 2>/dev/null || true
docker rm -f dokploy-traefik 2>/dev/null || true
docker swarm leave --force 2>/dev/null || true
docker volume rm dokploy dokploy-postgres dokploy-redis 2>/dev/null || true
rm -rf /etc/dokployПосле этого повторите быструю установку.
Не используйте этот reset на сервере с важными данными: он удаляет volumes и конфигурацию Dokploy.
Для публичной установки package ghcr.io/agenthits/dokploy должен быть public.
Если package private, сначала выполните login на VPS:
echo "YOUR_GITHUB_TOKEN" | docker login ghcr.io -u YOUR_GITHUB_USERNAME --password-stdin- Installer создает Docker secrets для Postgres, Better Auth, schedule jobs и deployment jobs.
- Fork version обычно зашита в GitHub image build. Передавайте
DOKPLOY_FORK_VERSIONвручную только для custom/local images. - Dashboard update button в AgentHits fork обновляет из
ghcr.io/agenthits/dokploy:agenthits-stable(последний релиз). Перевести кнопку на другой релиз можно ручным запуском workflowAgentHits Stable Tag. - Для rollback используйте тег релиза
agenthits-vX.Y.Z. Тегиagenthits-dev-<short-sha>живут только для последних ~10 сборок: старые версии образа удаляет еженедельная очистка GHCR.