Dokploy + Docker Swarm Homelab Setup Instructions This guide walks through setting up a fresh, multi-node Docker Swarm cluster using Dokploy for quick web app deployment and easy hosting of infrastructure services (like Pi-hole and Minio), including shared storage via NFS from your NAS node. 1. Prepare Environment • Choose a primary node (can be any capable Linux server). • Identify your NAS node (high capacity storage). • Gather all SSH credentials. • Ensure all nodes have Docker installed (curl -fsSL https://get.docker.com | sh). 2. Initialize Docker Swarm Cluster On your primary node: docker swarm init --advertise-addr On each additional node: • Run the join command given by the previous step, e.g.: docker swarm join --token :2377 3. Label Nodes for Placement Constraints On your primary node, label nodes: docker node update --label-add role=storage nas-node-01 docker node update --label-add storage=high nas-node-01 docker node update --label-add role=compute node-light-01 docker node update --label-add infra=true nas-node-01 (Replace node names as appropriate) 4. Set Up Dokploy On primary node: curl -sSL https://dokploy.com/install.sh | sh • Dokploy UI will be available on port 8080. • Default credentials: admin / admin (change ASAP). 5. Set Up Shared NFS Storage from Your NAS On your NAS node: • Install NFS server (Debian/Ubuntu): sudo apt install nfs-kernel-server • Export a directory: o Edit /etc/exports, add: /mnt/storage/docker-data *(rw,sync,no_subtree_check) o Restart NFS: sudo exportfs -ra sudo systemctl restart nfs-kernel-server 6. Create Shared NFS Volume in Docker On the manager node: docker volume create --driver local --opt type=nfs --opt o=addr=,rw,nolock,nfsvers=4 --opt device=:/mnt/storage/docker-data shared-data (Replace with your NAS's address.) 7. Deploy Apps with Dokploy + Placement Constraints • Use Dokploy UI to: o Deploy your web apps (Node.js, PHP, static sites) o Set replica counts (scaling) o Pin infrastructure apps (like Pi-hole or Minio) to the NAS node via placement constraints. o Use the shared NFS volume for persistent data. Example Docker Compose snippet for Pinning: services: pihole: image: pihole/pihole deploy: placement: constraints: - node.labels.role==storage volumes: - shared-data:/etc/pihole 8. (Optional) Set Up Minio (S3-Compatible Storage) • Deploy Minio with Dokploy, pin it to your NAS, and use shared volume for data: services: minio: image: minio/minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: changeme123 volumes: - shared-data:/data deploy: placement: constraints: - node.labels.role==storage ports: - "9000:9000" - "9001:9001" 9. Add Web Apps and Experiment! • Use Dokploy's UI to connect to your Gitea instance, auto-deploy repos, and experiment rapidly. • Traefik integration and SSL setup is handled automatically in Dokploy. 10. Restore K3s (Optional, Later) • Your original K3s manifests are saved in git—just reapply if you wish to revert: k3s server kubectl apply -f References • Docker Swarm Docs: https://docs.docker.com/engine/swarm/ • Dokploy Docs: https://dokploy.com/docs/ • Docker Volumes: https://docs.docker.com/engine/storage/volumes/ • NFS on Linux: https://help.ubuntu.com/community/NFS This guide gives you a fast start for a declarative, multi-node homelab with web app simplicity and infrastructure reliability using Dokploy and Docker Swarm!