Last active
December 15, 2024 04:37
-
-
Save s-en-o/b658f57c50567c41609bb8ed64a7dd1e to your computer and use it in GitHub Desktop.
Custom Dokploy installation to free up port 80 and 443
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
install_dokploy() { | |
if [ "$(id -u)" != "0" ]; then | |
echo "This script must be run as root" >&2 | |
exit 1 | |
fi | |
# check if is Mac OS | |
if [ "$(uname)" = "Darwin" ]; then | |
echo "This script must be run on Linux" >&2 | |
exit 1 | |
fi | |
# check if is running inside a container | |
if [ -f /.dockerenv ]; then | |
echo "This script must be run on Linux" >&2 | |
exit 1 | |
fi | |
# check if something is running on port 81 | |
if ss -tulnp | grep ':81 ' >/dev/null; then | |
echo "Error: something is already running on port 81" >&2 | |
exit 1 | |
fi | |
# check if something is running on port 444 | |
if ss -tulnp | grep ':444 ' >/dev/null; then | |
echo "Error: something is already running on port 444" >&2 | |
exit 1 | |
fi | |
command_exists() { | |
command -v "$@" > /dev/null 2>&1 | |
} | |
if command_exists docker; then | |
echo "Docker already installed" | |
else | |
curl -sSL https://get.docker.com | sh | |
fi | |
docker swarm leave --force 2>/dev/null | |
get_ip() { | |
# Try to get IPv4 | |
local ipv4=$(curl -4s https://ifconfig.io 2>/dev/null) | |
if [ -n "$ipv4" ]; then | |
echo "$ipv4" | |
else | |
# Try to get IPv6 | |
local ipv6=$(curl -6s https://ifconfig.io 2>/dev/null) | |
if [ -n "$ipv6" ]; then | |
echo "$ipv6" | |
fi | |
fi | |
} | |
advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}" | |
docker swarm init --advertise-addr $advertise_addr | |
if [ $? -ne 0 ]; then | |
echo "Error: Failed to initialize Docker Swarm" >&2 | |
exit 1 | |
fi | |
echo "Swarm initialized" | |
docker network rm -f dokploy-network 2>/dev/null | |
docker network create --driver overlay --attachable dokploy-network | |
echo "Network created" | |
mkdir -p /etc/dokploy | |
chmod 777 /etc/dokploy | |
docker pull dokploy/dokploy:latest | |
# Installation | |
docker service create \ | |
--name dokploy \ | |
--replicas 1 \ | |
--network dokploy-network \ | |
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ | |
--mount type=bind,source=/etc/dokploy,target=/etc/dokploy \ | |
--mount type=volume,source=dokploy-docker-config,target=/root/.docker \ | |
--publish published=3000,target=3000,mode=host \ | |
--update-parallelism 1 \ | |
--update-order stop-first \ | |
--constraint 'node.role == manager' \ | |
-e ADVERTISE_ADDR=$advertise_addr \ | |
# Custom traefik port to free up port 80 and 443 | |
-e TRAEFIK_SSL_PORT=444 \ | |
-e TRAEFIK_PORT=81 \ | |
dokploy/dokploy:latest | |
GREEN="\033[0;32m" | |
YELLOW="\033[1;33m" | |
BLUE="\033[0;34m" | |
NC="\033[0m" # No Color | |
format_ip_for_url() { | |
local ip="$1" | |
if echo "$ip" | grep -q ':'; then | |
# IPv6 | |
echo "[${ip}]" | |
else | |
# IPv4 | |
echo "${ip}" | |
fi | |
} | |
formatted_addr=$(format_ip_for_url "$advertise_addr") | |
echo "" | |
printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n" | |
printf "${BLUE}Wait 15 seconds for the server to start${NC}\n" | |
printf "${YELLOW}Please go to http://${formatted_addr}:3000${NC}\n\n" | |
} | |
update_dokploy() { | |
echo "Updating Dokploy..." | |
# Pull the latest image | |
docker pull dokploy/dokploy:latest | |
# Update the service | |
docker service update --image dokploy/dokploy:latest dokploy | |
echo "Dokploy has been updated to the latest version." | |
} | |
# Main script execution | |
if [ "$1" = "update" ]; then | |
update_dokploy | |
else | |
install_dokploy | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment