diff --git a/app/Actions/Server/StartSentinel.php b/app/Actions/Server/StartSentinel.php index 587ac4a8db..d13ff16830 100644 --- a/app/Actions/Server/StartSentinel.php +++ b/app/Actions/Server/StartSentinel.php @@ -24,7 +24,12 @@ public function handle(Server $server, bool $restart = false, ?string $latestVer $token = data_get($server, 'settings.sentinel_token'); $endpoint = data_get($server, 'settings.sentinel_custom_url'); $debug = data_get($server, 'settings.is_sentinel_debug_enabled'); +<<<<<<< Updated upstream $mountDir = '/data/coolify/sentinel'; +======= + $base_path = config('coolify.base_config_path'); + $mountDir = "$base_path/sentinel"; +>>>>>>> Stashed changes $image = "ghcr.io/coollabsio/sentinel:$version"; if (! $endpoint) { throw new \Exception('You should set FQDN in Instance Settings.'); diff --git a/app/Actions/Server/UpdateCoolify.php b/app/Actions/Server/UpdateCoolify.php index be9b4062c9..353755ede7 100644 --- a/app/Actions/Server/UpdateCoolify.php +++ b/app/Actions/Server/UpdateCoolify.php @@ -34,11 +34,19 @@ public function handle($manual_update = false) $this->currentVersion = config('constants.coolify.version'); if (! $manual_update) { if (! $settings->is_auto_update_enabled) { +<<<<<<< Updated upstream return; } if ($this->latestVersion === $this->currentVersion) { return; } +======= + return; + } + if ($this->latestVersion === $this->currentVersion) { + return; + } +>>>>>>> Stashed changes if (version_compare($this->latestVersion, $this->currentVersion, '<')) { return; } @@ -54,9 +62,11 @@ private function update() instant_remote_process(["docker pull -q ghcr.io/coollabsio/coolify:{$this->latestVersion}"], $this->server, false); + $base_path = config('coolify.base_config_path'); + remote_process([ - 'curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o /data/coolify/source/upgrade.sh', - "bash /data/coolify/source/upgrade.sh $this->latestVersion", + "curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o {$base_path}/source/upgrade.sh", + "bash {$base_path}/source/upgrade.sh $this->latestVersion", ], $this->server); } } diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 4cd40f2031..f57cd9594e 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -56,7 +56,7 @@ function base_configuration_dir(): string { - return '/data/coolify'; + return config('coolify.base_config_path') ?? '/data/coolify'; } function application_configuration_dir(): string { diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 3fadd914c1..5bf1cf6a22 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -80,11 +80,11 @@ services: container_name: coolify-testing-host volumes: - /var/run/docker.sock:/var/run/docker.sock - - dev_coolify_data:/data/coolify - - dev_backups_data:/data/coolify/backups - - dev_postgres_data:/data/coolify/_volumes/database - - dev_redis_data:/data/coolify/_volumes/redis - - dev_minio_data:/data/coolify/_volumes/minio + - dev_coolify_data:${BASE_CONFIG_PATH:-/data/coolify} + - dev_backups_data:${BASE_CONFIG_PATH:-/data/coolify}/backups + - dev_postgres_data:${BASE_CONFIG_PATH:-/data/coolify}/_volumes/database + - dev_redis_data:${BASE_CONFIG_PATH:-/data/coolify}/_volumes/redis + - dev_minio_data:${BASE_CONFIG_PATH:-/data/coolify}/_volumes/minio networks: - coolify mailpit: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c7349f7b04..48cc608e72 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -3,15 +3,15 @@ services: image: "ghcr.io/coollabsio/coolify:${LATEST_IMAGE:-latest}" volumes: - type: bind - source: /data/coolify/source/.env + source: ${BASE_CONFIG_PATH:-/data/coolify}/source/.env target: /var/www/html/.env read_only: true - - /data/coolify/ssh:/var/www/html/storage/app/ssh - - /data/coolify/applications:/var/www/html/storage/app/applications - - /data/coolify/databases:/var/www/html/storage/app/databases - - /data/coolify/services:/var/www/html/storage/app/services - - /data/coolify/backups:/var/www/html/storage/app/backups - - /data/coolify/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance + - ${BASE_CONFIG_PATH:-/data/coolify}/ssh:/var/www/html/storage/app/ssh + - ${BASE_CONFIG_PATH:-/data/coolify}/applications:/var/www/html/storage/app/applications + - ${BASE_CONFIG_PATH:-/data/coolify}/databases:/var/www/html/storage/app/databases + - ${BASE_CONFIG_PATH:-/data/coolify}/services:/var/www/html/storage/app/services + - ${BASE_CONFIG_PATH:-/data/coolify}/backups:/var/www/html/storage/app/backups + - ${BASE_CONFIG_PATH:-/data/coolify}/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance environment: - APP_ENV=production - APP_NAME @@ -98,7 +98,7 @@ services: - "${SOKETI_PORT:-6001}:6001" - "6002:6002" volumes: - - /data/coolify/ssh:/var/www/html/storage/app/ssh + - ${BASE_CONFIG_PATH:-/data/coolify}/ssh:/var/www/html/storage/app/ssh environment: APP_NAME: "${APP_NAME:-Coolify}" SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" diff --git a/docker-compose.windows.yml b/docker-compose.windows.yml index f2b03d2099..0677bb8980 100644 --- a/docker-compose.windows.yml +++ b/docker-compose.windows.yml @@ -6,7 +6,7 @@ services: container_name: coolify-testing-host volumes: - //var/run/docker.sock://var/run/docker.sock - - ./:/data/coolify + - ./:${BASE_CONFIG_PATH:-/data/coolify} coolify: image: "ghcr.io/coollabsio/coolify:latest" pull_policy: always diff --git a/other/nightly/docker-compose.prod.yml b/other/nightly/docker-compose.prod.yml index f9cded363c..19dff00d1a 100644 --- a/other/nightly/docker-compose.prod.yml +++ b/other/nightly/docker-compose.prod.yml @@ -3,15 +3,15 @@ services: image: "ghcr.io/coollabsio/coolify:${LATEST_IMAGE:-latest}" volumes: - type: bind - source: /data/coolify/source/.env + source: ${BASE_CONFIG_PATH:-/data/coolify}/source/.env target: /var/www/html/.env read_only: true - - /data/coolify/ssh:/var/www/html/storage/app/ssh - - /data/coolify/applications:/var/www/html/storage/app/applications - - /data/coolify/databases:/var/www/html/storage/app/databases - - /data/coolify/services:/var/www/html/storage/app/services - - /data/coolify/backups:/var/www/html/storage/app/backups - - /data/coolify/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance + - ${BASE_CONFIG_PATH:-/data/coolify}/ssh:/var/www/html/storage/app/ssh + - ${BASE_CONFIG_PATH:-/data/coolify}/applications:/var/www/html/storage/app/applications + - ${BASE_CONFIG_PATH:-/data/coolify}/databases:/var/www/html/storage/app/databases + - ${BASE_CONFIG_PATH:-/data/coolify}/services:/var/www/html/storage/app/services + - ${BASE_CONFIG_PATH:-/data/coolify}/backups:/var/www/html/storage/app/backups + - ${BASE_CONFIG_PATH:-/data/coolify}/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance environment: - APP_ENV=production - APP_NAME @@ -98,7 +98,7 @@ services: - "${SOKETI_PORT:-6001}:6001" - "6002:6002" volumes: - - /data/coolify/ssh:/var/www/html/storage/app/ssh + - ${BASE_CONFIG_PATH:-/data/coolify}/ssh:/var/www/html/storage/app/ssh environment: APP_NAME: "${APP_NAME:-Coolify}" SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" diff --git a/other/nightly/docker-compose.windows.yml b/other/nightly/docker-compose.windows.yml index ef2de82e98..97285196f1 100644 --- a/other/nightly/docker-compose.windows.yml +++ b/other/nightly/docker-compose.windows.yml @@ -6,7 +6,7 @@ services: container_name: coolify-testing-host volumes: - //var/run/docker.sock://var/run/docker.sock - - ./:/data/coolify + - ./:${BASE_CONFIG_PATH:-/data/coolify} coolify: image: "ghcr.io/coollabsio/coolify:latest" pull_policy: always diff --git a/other/nightly/install.sh b/other/nightly/install.sh index def105aa72..5f104eb475 100755 --- a/other/nightly/install.sh +++ b/other/nightly/install.sh @@ -57,16 +57,50 @@ if [ "$WARNING_SPACE" = true ]; then sleep 5 fi +<<<<<<< Updated upstream mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,sentinel} mkdir -p /data/coolify/ssh/{keys,mux} mkdir -p /data/coolify/proxy/dynamic +======= +# Set BASE_CONFIG_PATH to change the installation directory like so: +# curl -fsSL https://cdn.coollabs.io/coolify/install.sh | BASE_CONFIG_PATH=/custom/path/to/coolify sudo -E bash +# useful for immutable OSes like openSUSE MicroOS, Fedora Silverblue, etc... +# priority = .env file > BASE_CONFIG_PATH cli variable > default data/coolify +if [ -f ./.env ]; then + BASE_CONFIG_PATH=$(grep -w "BASE_CONFIG_PATH" ./.env | cut -d "=" -f 2 | tr -d '"') || true +fi +BASE_CONFIG_PATH=${BASE_CONFIG_PATH:-"/data/coolify"} + +# Set MANUAL_DEPENDENCIES to allow installation on unsupported platforms +# and skip automatic dependencies installation +MANUAL_DEPENDENCIES=${MANUAL_DEPENDENCIES:-false} + +# Early check to see if we can write to install path +if [ ! -w "$BASE_CONFIG_PATH" ]; then + echo "-----------------------" + echo "Error on Installation:" + echo "Directory to install Coolify is not writable. Please check your permissions and try again." + echo "-----------------------" + exit 1 +fi + +if [ "$MANUAL_DEPENDENCIES" = "true" ]; then + echo "Warning: Manual dependencies mode enabled." + echo "Warning: Skipping OS check and automatic dependencies installation." + echo "Warning: Ensure all required dependencies are installed manually." +fi +>>>>>>> Stashed changes + +mkdir -p "$BASE_CONFIG_PATH"/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,sentinel} +mkdir -p "$BASE_CONFIG_PATH"/ssh/{keys,mux} +mkdir -p "$BASE_CONFIG_PATH"/proxy/dynamic -chown -R 9999:root /data/coolify -chmod -R 700 /data/coolify +chown -R 9999:root "$BASE_CONFIG_PATH" +chmod -R 700 "$BASE_CONFIG_PATH" -INSTALLATION_LOG_WITH_DATE="/data/coolify/source/installation-${DATE}.log" +INSTALLATION_LOG_WITH_DATE="$BASE_CONFIG_PATH/source/installation-${DATE}.log" -exec > >(tee -a $INSTALLATION_LOG_WITH_DATE) 2>&1 +exec > >(tee -a "$INSTALLATION_LOG_WITH_DATE") 2>&1 getAJoke() { JOKES=$(curl -s --max-time 2 "https://v2.jokeapi.dev/joke/Programming?blacklistFlags=nsfw,religious,political,racist,sexist,explicit&format=txt&type=single" || true) @@ -76,7 +110,7 @@ getAJoke() { fi } OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') -ENV_FILE="/data/coolify/source/.env" +ENV_FILE="$BASE_CONFIG_PATH/source/.env" # Check if the OS is manjaro, if so, change it to arch if [ "$OS_TYPE" = "manjaro" ] || [ "$OS_TYPE" = "manjaro-arm" ]; then @@ -88,6 +122,14 @@ if [ "$OS_TYPE" = "endeavouros" ]; then OS_TYPE="arch" fi +<<<<<<< Updated upstream +======= +# Check if the OS is Endeavour OS, if so, change it to arch +if [ "$OS_TYPE" = "endeavouros" ]; then + OS_TYPE="arch" +fi + +>>>>>>> Stashed changes # Check if the OS is Asahi Linux, if so, change it to fedora if [ "$OS_TYPE" = "fedora-asahi-remix" ]; then OS_TYPE="fedora" @@ -132,6 +174,7 @@ if [ -z "$LATEST_REALTIME_VERSION" ]; then fi +<<<<<<< Updated upstream case "$OS_TYPE" in arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | opensuse-leap | opensuse-tumbleweed | almalinux | amzn | alpine) ;; *) @@ -139,6 +182,18 @@ arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | exit ;; esac +======= +if [ "$MANUAL_DEPENDENCIES" = "false" ]; then + case "$OS_TYPE" in + arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | opensuse-leap | opensuse-tumbleweed | almalinux | amzn | alpine) ;; + *) + echo "This script only supports Debian, Redhat, Arch Linux, Alpine Linux, or SLES based operating systems for now." + echo "If you still want to install Coolify, please do it manually, read the documentation: https://coolify.io/docs/installation" + exit + ;; + esac +fi +>>>>>>> Stashed changes # Overwrite LATEST_VERSION if user pass a version number if [ "$1" != "" ]; then @@ -147,16 +202,21 @@ if [ "$1" != "" ]; then LATEST_VERSION="${LATEST_VERSION#v}" fi +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes echo -e "---------------------------------------------" echo "| Operating System | $OS_TYPE $OS_VERSION" echo "| Docker | $DOCKER_VERSION" echo "| Coolify | $LATEST_VERSION" echo "| Helper | $LATEST_HELPER_VERSION" echo "| Realtime | $LATEST_REALTIME_VERSION" +echo "| Installation Path | $BASE_CONFIG_PATH" echo -e "---------------------------------------------\n" echo -e "1. Installing required packages (curl, wget, git, jq, openssl). " +<<<<<<< Updated upstream case "$OS_TYPE" in arch) @@ -193,6 +253,47 @@ sles | opensuse-leap | opensuse-tumbleweed) exit ;; esac +======= +echo -e "1. Installing required packages (curl, wget, git, jq, openssl). " + +if [ "$MANUAL_DEPENDENCIES" = "false" ]; then + case "$OS_TYPE" in + arch) + pacman -Sy --noconfirm --needed curl wget git jq openssl >/dev/null || true + ;; + alpine) + sed -i '/^#.*\/community/s/^#//' /etc/apk/repositories + apk update >/dev/null + apk add curl wget git jq openssl >/dev/null + ;; + ubuntu | debian | raspbian) + apt-get update -y >/dev/null + apt-get install -y curl wget git jq openssl >/dev/null + ;; + centos | fedora | rhel | ol | rocky | almalinux | amzn) + if [ "$OS_TYPE" = "amzn" ]; then + dnf install -y wget git jq openssl >/dev/null + else + if ! command -v dnf >/dev/null; then + yum install -y dnf >/dev/null + fi + if ! command -v curl >/dev/null; then + dnf install -y curl >/dev/null + fi + dnf install -y wget git jq openssl >/dev/null + fi + ;; + sles | opensuse-leap | opensuse-tumbleweed) + zypper refresh >/dev/null + zypper install -y curl wget git jq openssl >/dev/null + ;; + *) + echo "This script only supports Debian, Redhat, Arch Linux, or SLES based operating systems for now." + exit + ;; + esac +fi +>>>>>>> Stashed changes echo -e "2. Check OpenSSH server configuration. " @@ -218,6 +319,11 @@ elif [ -x "$(command -v service)" ]; then fi +<<<<<<< Updated upstream +======= + + +>>>>>>> Stashed changes if [ "$SSH_DETECTED" = "false" ]; then echo " - OpenSSH server not detected. Installing OpenSSH server." case "$OS_TYPE" in @@ -261,6 +367,51 @@ if [ "$SSH_DETECTED" = "false" ]; then esac echo " - OpenSSH server installed successfully." SSH_DETECTED=true +<<<<<<< Updated upstream +======= + echo " - OpenSSH server not detected. Installing OpenSSH server." + case "$OS_TYPE" in + arch) + pacman -Sy --noconfirm openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + alpine) + apk add openssh >/dev/null + rc-update add sshd default >/dev/null 2>&1 + service sshd start >/dev/null 2>&1 + ;; + ubuntu | debian | raspbian) + apt-get update -y >/dev/null + apt-get install -y openssh-server >/dev/null + systemctl enable ssh >/dev/null 2>&1 + systemctl start ssh >/dev/null 2>&1 + ;; + centos | fedora | rhel | ol | rocky | almalinux | amzn) + if [ "$OS_TYPE" = "amzn" ]; then + dnf install -y openssh-server >/dev/null + else + dnf install -y openssh-server >/dev/null + fi + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + sles | opensuse-leap | opensuse-tumbleweed) + zypper install -y openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + *) + echo "###############################################################################" + echo "WARNING: Could not detect and install OpenSSH server - this does not mean that it is not installed or not running, just that we could not detect it." + echo -e "Please make sure it is installed and running, otherwise Coolify cannot connect to the host system. \n" + echo "###############################################################################" + exit 1 + ;; + esac + echo " - OpenSSH server installed successfully." + SSH_DETECTED=true +>>>>>>> Stashed changes fi # Detect SSH PermitRootLogin @@ -347,6 +498,32 @@ if ! [ -x "$(command -v docker)" ]; then systemctl start docker >/dev/null 2>&1 systemctl enable docker >/dev/null 2>&1 ;; +<<<<<<< Updated upstream +======= + *) + if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then + echo "Docker automated installation is not supported on Ubuntu 24.10 (non-LTS release)." + echo "Please install Docker manually." + exit 1 + fi + curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1 + "fedora") + if [ -x "$(command -v dnf5)" ]; then + # dnf5 is available + dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo --overwrite >/dev/null 2>&1 + else + # dnf5 is not available, use dnf + dnf config-manager --add-repo=https://download.docker.com/linux/fedora/docker-ce.repo >/dev/null 2>&1 + fi + dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null 2>&1 + if ! [ -x "$(command -v docker)" ]; then + echo " - Docker could not be installed automatically. Please visit https://docs.docker.com/engine/install/ and install Docker manually to continue." + exit 1 + fi + systemctl start docker >/dev/null 2>&1 + systemctl enable docker >/dev/null 2>&1 + ;; +>>>>>>> Stashed changes *) if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then echo "Docker automated installation is not supported on Ubuntu 24.10 (non-LTS release)." @@ -356,6 +533,10 @@ if ! [ -x "$(command -v docker)" ]; then curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1 if ! [ -x "$(command -v docker)" ]; then curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1 +<<<<<<< Updated upstream +======= + curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1 +>>>>>>> Stashed changes if ! [ -x "$(command -v docker)" ]; then echo " - Docker installation failed." echo " Maybe your OS is not supported?" @@ -382,6 +563,13 @@ test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json /etc/docker/daemon "default-address-pools": [ {"base":"10.0.0.0/8","size":24} ] +<<<<<<< Updated upstream +======= + }, + "default-address-pools": [ + {"base":"10.0.0.0/8","size":24} + ] +>>>>>>> Stashed changes } EOL cat >/etc/docker/daemon.json.coolify </etc/docker/daemon.json.coolify <>>>>>> Stashed changes } EOL TEMP_FILE=$(mktemp) @@ -449,10 +644,10 @@ else fi echo -e "5. Download required files from CDN. " -curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml -curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml -curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production -curl -fsSL $CDN/upgrade.sh -o /data/coolify/source/upgrade.sh +curl -fsSL $CDN/docker-compose.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.yml +curl -fsSL $CDN/docker-compose.prod.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.prod.yml +curl -fsSL $CDN/.env.production -o "$BASE_CONFIG_PATH"/source/.env.production +curl -fsSL $CDN/upgrade.sh -o "$BASE_CONFIG_PATH"/source/upgrade.sh echo -e "6. Make backup of .env to .env-$DATE" @@ -462,7 +657,7 @@ if [ -f $ENV_FILE ]; then else echo " - File does not exist: $ENV_FILE" echo " - Copying .env.production to .env-$DATE" - cp /data/coolify/source/.env.production $ENV_FILE-$DATE + cp "$BASE_CONFIG_PATH"/source/.env.production "$ENV_FILE-$DATE" # Generate a secure APP_ID and APP_KEY sed -i "s|^APP_ID=.*|APP_ID=$(openssl rand -hex 16)|" "$ENV_FILE-$DATE" sed -i "s|^APP_KEY=.*|APP_KEY=base64:$(openssl rand -base64 32)|" "$ENV_FILE-$DATE" @@ -483,15 +678,23 @@ fi # Merge .env and .env.production. New values will be added to .env echo -e "7. Propagating .env with new values - if necessary." -awk -F '=' '!seen[$1]++' "$ENV_FILE-$DATE" /data/coolify/source/.env.production > $ENV_FILE +awk -F '=' '!seen[$1]++' "$ENV_FILE-$DATE" "$BASE_CONFIG_PATH"/source/.env.production > "$ENV_FILE" if [ "$AUTOUPDATE" = "false" ]; then - if ! grep -q "AUTOUPDATE=" /data/coolify/source/.env; then - echo "AUTOUPDATE=false" >>/data/coolify/source/.env + if ! grep -q "AUTOUPDATE=" "$BASE_CONFIG_PATH"/source/.env; then + echo "AUTOUPDATE=false" >>"$BASE_CONFIG_PATH"/source/.env else - sed -i "s|AUTOUPDATE=.*|AUTOUPDATE=false|g" /data/coolify/source/.env + sed -i "s|AUTOUPDATE=.*|AUTOUPDATE=false|g" "$BASE_CONFIG_PATH"/source/.env fi fi + +# Merge BASE_CONFIG_PATH to .env file +if ! grep -q "BASE_CONFIG_PATH=" "$BASE_CONFIG_PATH"/source/.env; then + echo "BASE_CONFIG_PATH=$BASE_CONFIG_PATH" >>"$BASE_CONFIG_PATH"/source/.env +else + sed -i "s|BASE_CONFIG_PATH=.*|BASE_CONFIG_PATH=$BASE_CONFIG_PATH|g" "$BASE_CONFIG_PATH"/source/.env +fi + echo -e "8. Checking for SSH key for localhost access." if [ ! -f ~/.ssh/authorized_keys ]; then mkdir -p ~/.ssh @@ -502,28 +705,40 @@ fi set +e IS_COOLIFY_VOLUME_EXISTS=$(docker volume ls | grep coolify-db | wc -l) +<<<<<<< Updated upstream set -e if [ "$IS_COOLIFY_VOLUME_EXISTS" -eq 0 ]; then +======= +IS_COOLIFY_VOLUME_EXISTS=$(docker volume ls | grep coolify-db | wc -l) +set -e + +if [ "$IS_COOLIFY_VOLUME_EXISTS" -eq 0 ]; then +if [ "$IS_COOLIFY_VOLUME_EXISTS" -eq 0 ]; then +>>>>>>> Stashed changes echo " - Generating SSH key." - ssh-keygen -t ed25519 -a 100 -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal -q -N "" -C coolify - chown 9999 /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal + ssh-keygen -t ed25519 -a 100 -f "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal -q -N "" -C coolify + chown 9999 "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal sed -i "/coolify/d" ~/.ssh/authorized_keys - cat /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub >> ~/.ssh/authorized_keys - rm -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub + cat "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub >> ~/.ssh/authorized_keys + rm -f "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub fi -chown -R 9999:root /data/coolify -chmod -R 700 /data/coolify +chown -R 9999:root "$BASE_CONFIG_PATH" +chmod -R 700 "$BASE_CONFIG_PATH" echo -e "9. Installing Coolify ($LATEST_VERSION)" echo -e " - It could take a while based on your server's performance, network speed, stars, etc." echo -e " - Please wait." getAJoke +<<<<<<< Updated upstream bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" +======= +bash "$BASE_CONFIG_PATH"/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" +>>>>>>> Stashed changes echo " - Coolify installed successfully." -rm -f $ENV_FILE-$DATE +rm -f "$ENV_FILE-$DATE" echo " - Waiting for 20 seconds for Coolify (database migrations) to be ready." getAJoke @@ -553,5 +768,10 @@ if [ -n "$PRIVATE_IPS" ]; then fi done fi +<<<<<<< Updated upstream echo -e "\nWARNING: It is highly recommended to backup your Environment variables file (/data/coolify/source/.env) to a safe location, outside of this server (e.g. into a Password Manager).\n" cp /data/coolify/source/.env /data/coolify/source/.env.backup +======= +echo -e "\nWARNING: It is highly recommended to backup your Environment variables file ($BASE_CONFIG_PATH/source/.env) to a safe location, outside of this server (e.g. into a Password Manager).\n" +cp "$BASE_CONFIG_PATH"/source/.env "$BASE_CONFIG_PATH"/source/.env.backup +>>>>>>> Stashed changes diff --git a/other/nightly/upgrade.sh b/other/nightly/upgrade.sh index 670072b12f..073735ff58 100644 --- a/other/nightly/upgrade.sh +++ b/other/nightly/upgrade.sh @@ -5,27 +5,43 @@ VERSION="13" CDN="https://cdn.coollabs.io/coolify-nightly" LATEST_IMAGE=${1:-latest} LATEST_HELPER_VERSION=${2:-latest} +DATE=$(date +%Y-%m-%d-%H-%M-%S) +<<<<<<< Updated upstream DATE=$(date +%Y-%m-%d-%H-%M-%S) LOGFILE="/data/coolify/source/upgrade-${DATE}.log" curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production +======= +# Check if.env file exists, if exists get BASE_CONFIG_PATH, if not defaults to data/coolify +if [ -f ./.env ]; then + BASE_CONFIG_PATH=$(grep -w "BASE_CONFIG_PATH" ./.env | cut -d "=" -f 2 | tr -d '"') || true +fi + +BASE_CONFIG_PATH=${BASE_CONFIG_PATH:-"/data/coolify"} + +LOGFILE="$BASE_CONFIG_PATH"/source/upgrade-${DATE}.log + +curl -fsSL $CDN/docker-compose.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.yml +curl -fsSL $CDN/docker-compose.prod.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.prod.yml +curl -fsSL $CDN/.env.production -o "$BASE_CONFIG_PATH"/source/.env.production +>>>>>>> Stashed changes # Merge .env and .env.production. New values will be added to .env -awk -F '=' '!seen[$1]++' /data/coolify/source/.env /data/coolify/source/.env.production > /data/coolify/source/.env.tmp && mv /data/coolify/source/.env.tmp /data/coolify/source/.env -# Check if PUSHER_APP_ID or PUSHER_APP_KEY or PUSHER_APP_SECRET is empty in /data/coolify/source/.env -if grep -q "PUSHER_APP_ID=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" /data/coolify/source/.env +awk -F '=' '!seen[$1]++' "$BASE_CONFIG_PATH"/source/.env "$BASE_CONFIG_PATH"/source/.env.production > "$BASE_CONFIG_PATH"/source/.env.tmp && mv "$BASE_CONFIG_PATH"/source/.env.tmp "$BASE_CONFIG_PATH"/source/.env +# Check if PUSHER_APP_ID or PUSHER_APP_KEY or PUSHER_APP_SECRET is empty in BASE_CONFIG_PATH/source/.env +if grep -q "PUSHER_APP_ID=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi -if grep -q "PUSHER_APP_KEY=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" /data/coolify/source/.env +if grep -q "PUSHER_APP_KEY=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi -if grep -q "PUSHER_APP_SECRET=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" /data/coolify/source/.env +if grep -q "PUSHER_APP_SECRET=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi # Make sure coolify network exists @@ -33,9 +49,17 @@ fi docker network create --attachable coolify 2>/dev/null # docker network create --attachable --driver=overlay coolify-overlay 2>/dev/null +<<<<<<< Updated upstream if [ -f /data/coolify/source/docker-compose.custom.yml ]; then echo "docker-compose.custom.yml detected." >> $LOGFILE docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml -f /data/coolify/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 else docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 +======= +if [ -f "$BASE_CONFIG_PATH"/source/docker-compose.custom.yml ]; then + echo "docker-compose.custom.yml detected." >> $LOGFILE + docker run -v "$BASE_CONFIG_PATH"/source:"$BASE_CONFIG_PATH"/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file $BASE_CONFIG_PATH/source/.env -f $BASE_CONFIG_PATH/source/docker-compose.yml -f $BASE_CONFIG_PATH/source/docker-compose.prod.yml -f $BASE_CONFIG_PATH/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 +else + docker run -v "$BASE_CONFIG_PATH"/source:"$BASE_CONFIG_PATH"/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file $BASE_CONFIG_PATH/source/.env -f $BASE_CONFIG_PATH/source/docker-compose.yml -f $BASE_CONFIG_PATH/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 +>>>>>>> Stashed changes fi diff --git a/scripts/install.sh b/scripts/install.sh index 3f289438f9..0d31e4791e 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -57,16 +57,50 @@ if [ "$WARNING_SPACE" = true ]; then sleep 5 fi +<<<<<<< Updated upstream mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,sentinel} mkdir -p /data/coolify/ssh/{keys,mux} mkdir -p /data/coolify/proxy/dynamic +======= +# Set BASE_CONFIG_PATH to change the installation directory like so: +# curl -fsSL https://cdn.coollabs.io/coolify/install.sh | BASE_CONFIG_PATH=/custom/path/to/coolify sudo -E bash +# useful for immutable OSes like openSUSE MicroOS, Fedora Silverblue, etc... +# priority = .env file > BASE_CONFIG_PATH cli variable > default data/coolify +if [ -f ./.env ]; then + BASE_CONFIG_PATH=$(grep -w "BASE_CONFIG_PATH" ./.env | cut -d "=" -f 2 | tr -d '"') || true +fi +BASE_CONFIG_PATH=${BASE_CONFIG_PATH:-"/data/coolify"} + +# Set MANUAL_DEPENDENCIES to allow installation on unsupported platforms +# and skip automatic dependencies installation +MANUAL_DEPENDENCIES=${MANUAL_DEPENDENCIES:-false} + +# Early check to see if we can write to install path +if [ ! -w "$BASE_CONFIG_PATH" ]; then + echo "-----------------------" + echo "Error on Installation:" + echo "Directory to install Coolify is not writable. Please check your permissions and try again." + echo "-----------------------" + exit 1 +fi + +if [ "$MANUAL_DEPENDENCIES" = "true" ]; then + echo "Warning: Manual dependencies mode enabled." + echo "Warning: Skipping OS check and automatic dependencies installation." + echo "Warning: Ensure all required dependencies are installed manually." +fi +>>>>>>> Stashed changes + +mkdir -p "$BASE_CONFIG_PATH"/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,sentinel} +mkdir -p "$BASE_CONFIG_PATH"/ssh/{keys,mux} +mkdir -p "$BASE_CONFIG_PATH"/proxy/dynamic -chown -R 9999:root /data/coolify -chmod -R 700 /data/coolify +chown -R 9999:root "$BASE_CONFIG_PATH" +chmod -R 700 "$BASE_CONFIG_PATH" -INSTALLATION_LOG_WITH_DATE="/data/coolify/source/installation-${DATE}.log" +INSTALLATION_LOG_WITH_DATE="$BASE_CONFIG_PATH/source/installation-${DATE}.log" -exec > >(tee -a $INSTALLATION_LOG_WITH_DATE) 2>&1 +exec > >(tee -a "$INSTALLATION_LOG_WITH_DATE") 2>&1 getAJoke() { JOKES=$(curl -s --max-time 2 "https://v2.jokeapi.dev/joke/Programming?blacklistFlags=nsfw,religious,political,racist,sexist,explicit&format=txt&type=single" || true) @@ -76,7 +110,7 @@ getAJoke() { fi } OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') -ENV_FILE="/data/coolify/source/.env" +ENV_FILE="$BASE_CONFIG_PATH/source/.env" # Check if the OS is manjaro, if so, change it to arch if [ "$OS_TYPE" = "manjaro" ] || [ "$OS_TYPE" = "manjaro-arm" ]; then @@ -88,6 +122,14 @@ if [ "$OS_TYPE" = "endeavouros" ]; then OS_TYPE="arch" fi +<<<<<<< Updated upstream +======= +# Check if the OS is Endeavour OS, if so, change it to arch +if [ "$OS_TYPE" = "endeavouros" ]; then + OS_TYPE="arch" +fi + +>>>>>>> Stashed changes # Check if the OS is Asahi Linux, if so, change it to fedora if [ "$OS_TYPE" = "fedora-asahi-remix" ]; then OS_TYPE="fedora" @@ -132,6 +174,7 @@ if [ -z "$LATEST_REALTIME_VERSION" ]; then fi +<<<<<<< Updated upstream case "$OS_TYPE" in arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | opensuse-leap | opensuse-tumbleweed | almalinux | amzn | alpine) ;; *) @@ -139,6 +182,18 @@ arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | exit ;; esac +======= +if [ "$MANUAL_DEPENDENCIES" = "false" ]; then + case "$OS_TYPE" in + arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | opensuse-leap | opensuse-tumbleweed | almalinux | amzn | alpine) ;; + *) + echo "This script only supports Debian, Redhat, Arch Linux, Alpine Linux, or SLES based operating systems for now." + echo "If you still want to install Coolify, please do it manually, read the documentation: https://coolify.io/docs/installation" + exit + ;; + esac +fi +>>>>>>> Stashed changes # Overwrite LATEST_VERSION if user pass a version number if [ "$1" != "" ]; then @@ -147,16 +202,21 @@ if [ "$1" != "" ]; then LATEST_VERSION="${LATEST_VERSION#v}" fi +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes echo -e "---------------------------------------------" echo "| Operating System | $OS_TYPE $OS_VERSION" echo "| Docker | $DOCKER_VERSION" echo "| Coolify | $LATEST_VERSION" echo "| Helper | $LATEST_HELPER_VERSION" echo "| Realtime | $LATEST_REALTIME_VERSION" +echo "| Installation Path | $BASE_CONFIG_PATH" echo -e "---------------------------------------------\n" echo -e "1. Installing required packages (curl, wget, git, jq, openssl). " +<<<<<<< Updated upstream case "$OS_TYPE" in arch) @@ -193,6 +253,47 @@ sles | opensuse-leap | opensuse-tumbleweed) exit ;; esac +======= +echo -e "1. Installing required packages (curl, wget, git, jq, openssl). " + +if [ "$MANUAL_DEPENDENCIES" = "false" ]; then + case "$OS_TYPE" in + arch) + pacman -Sy --noconfirm --needed curl wget git jq openssl >/dev/null || true + ;; + alpine) + sed -i '/^#.*\/community/s/^#//' /etc/apk/repositories + apk update >/dev/null + apk add curl wget git jq openssl >/dev/null + ;; + ubuntu | debian | raspbian) + apt-get update -y >/dev/null + apt-get install -y curl wget git jq openssl >/dev/null + ;; + centos | fedora | rhel | ol | rocky | almalinux | amzn) + if [ "$OS_TYPE" = "amzn" ]; then + dnf install -y wget git jq openssl >/dev/null + else + if ! command -v dnf >/dev/null; then + yum install -y dnf >/dev/null + fi + if ! command -v curl >/dev/null; then + dnf install -y curl >/dev/null + fi + dnf install -y wget git jq openssl >/dev/null + fi + ;; + sles | opensuse-leap | opensuse-tumbleweed) + zypper refresh >/dev/null + zypper install -y curl wget git jq openssl >/dev/null + ;; + *) + echo "This script only supports Debian, Redhat, Arch Linux, or SLES based operating systems for now." + exit + ;; + esac +fi +>>>>>>> Stashed changes echo -e "2. Check OpenSSH server configuration. " @@ -218,6 +319,11 @@ elif [ -x "$(command -v service)" ]; then fi +<<<<<<< Updated upstream +======= + + +>>>>>>> Stashed changes if [ "$SSH_DETECTED" = "false" ]; then echo " - OpenSSH server not detected. Installing OpenSSH server." case "$OS_TYPE" in @@ -261,6 +367,51 @@ if [ "$SSH_DETECTED" = "false" ]; then esac echo " - OpenSSH server installed successfully." SSH_DETECTED=true +<<<<<<< Updated upstream +======= + echo " - OpenSSH server not detected. Installing OpenSSH server." + case "$OS_TYPE" in + arch) + pacman -Sy --noconfirm openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + alpine) + apk add openssh >/dev/null + rc-update add sshd default >/dev/null 2>&1 + service sshd start >/dev/null 2>&1 + ;; + ubuntu | debian | raspbian) + apt-get update -y >/dev/null + apt-get install -y openssh-server >/dev/null + systemctl enable ssh >/dev/null 2>&1 + systemctl start ssh >/dev/null 2>&1 + ;; + centos | fedora | rhel | ol | rocky | almalinux | amzn) + if [ "$OS_TYPE" = "amzn" ]; then + dnf install -y openssh-server >/dev/null + else + dnf install -y openssh-server >/dev/null + fi + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + sles | opensuse-leap | opensuse-tumbleweed) + zypper install -y openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + *) + echo "###############################################################################" + echo "WARNING: Could not detect and install OpenSSH server - this does not mean that it is not installed or not running, just that we could not detect it." + echo -e "Please make sure it is installed and running, otherwise Coolify cannot connect to the host system. \n" + echo "###############################################################################" + exit 1 + ;; + esac + echo " - OpenSSH server installed successfully." + SSH_DETECTED=true +>>>>>>> Stashed changes fi # Detect SSH PermitRootLogin @@ -347,6 +498,8 @@ if ! [ -x "$(command -v docker)" ]; then systemctl start docker >/dev/null 2>&1 systemctl enable docker >/dev/null 2>&1 ;; +<<<<<<< Updated upstream +======= *) if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then echo "Docker automated installation is not supported on Ubuntu 24.10 (non-LTS release)." @@ -354,8 +507,36 @@ if ! [ -x "$(command -v docker)" ]; then exit 1 fi curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1 + "fedora") + if [ -x "$(command -v dnf5)" ]; then + # dnf5 is available + dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo --overwrite >/dev/null 2>&1 + else + # dnf5 is not available, use dnf + dnf config-manager --add-repo=https://download.docker.com/linux/fedora/docker-ce.repo >/dev/null 2>&1 + fi + dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null 2>&1 if ! [ -x "$(command -v docker)" ]; then + echo " - Docker could not be installed automatically. Please visit https://docs.docker.com/engine/install/ and install Docker manually to continue." + exit 1 + fi + systemctl start docker >/dev/null 2>&1 + systemctl enable docker >/dev/null 2>&1 + ;; +>>>>>>> Stashed changes + *) + if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then + echo "Docker automated installation is not supported on Ubuntu 24.10 (non-LTS release)." + echo "Please install Docker manually." + exit 1 + fi + curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1 + if ! [ -x "$(command -v docker)" ]; then + curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1 +<<<<<<< Updated upstream +======= curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1 +>>>>>>> Stashed changes if ! [ -x "$(command -v docker)" ]; then echo " - Docker installation failed." echo " Maybe your OS is not supported?" @@ -382,6 +563,13 @@ test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json /etc/docker/daemon "default-address-pools": [ {"base":"10.0.0.0/8","size":24} ] +<<<<<<< Updated upstream +======= + }, + "default-address-pools": [ + {"base":"10.0.0.0/8","size":24} + ] +>>>>>>> Stashed changes } EOL cat >/etc/docker/daemon.json.coolify </etc/docker/daemon.json.coolify <>>>>>> Stashed changes } EOL TEMP_FILE=$(mktemp) @@ -449,10 +644,10 @@ else fi echo -e "5. Download required files from CDN. " -curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml -curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml -curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production -curl -fsSL $CDN/upgrade.sh -o /data/coolify/source/upgrade.sh +curl -fsSL $CDN/docker-compose.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.yml +curl -fsSL $CDN/docker-compose.prod.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.prod.yml +curl -fsSL $CDN/.env.production -o "$BASE_CONFIG_PATH"/source/.env.production +curl -fsSL $CDN/upgrade.sh -o "$BASE_CONFIG_PATH"/source/upgrade.sh echo -e "6. Make backup of .env to .env-$DATE" @@ -462,7 +657,7 @@ if [ -f $ENV_FILE ]; then else echo " - File does not exist: $ENV_FILE" echo " - Copying .env.production to .env-$DATE" - cp /data/coolify/source/.env.production $ENV_FILE-$DATE + cp "$BASE_CONFIG_PATH"/source/.env.production "$ENV_FILE-$DATE" # Generate a secure APP_ID and APP_KEY sed -i "s|^APP_ID=.*|APP_ID=$(openssl rand -hex 16)|" "$ENV_FILE-$DATE" sed -i "s|^APP_KEY=.*|APP_KEY=base64:$(openssl rand -base64 32)|" "$ENV_FILE-$DATE" @@ -483,15 +678,23 @@ fi # Merge .env and .env.production. New values will be added to .env echo -e "7. Propagating .env with new values - if necessary." -awk -F '=' '!seen[$1]++' "$ENV_FILE-$DATE" /data/coolify/source/.env.production > $ENV_FILE +awk -F '=' '!seen[$1]++' "$ENV_FILE-$DATE" "$BASE_CONFIG_PATH"/source/.env.production > "$ENV_FILE" if [ "$AUTOUPDATE" = "false" ]; then - if ! grep -q "AUTOUPDATE=" /data/coolify/source/.env; then - echo "AUTOUPDATE=false" >>/data/coolify/source/.env + if ! grep -q "AUTOUPDATE=" "$BASE_CONFIG_PATH"/source/.env; then + echo "AUTOUPDATE=false" >>"$BASE_CONFIG_PATH"/source/.env else - sed -i "s|AUTOUPDATE=.*|AUTOUPDATE=false|g" /data/coolify/source/.env + sed -i "s|AUTOUPDATE=.*|AUTOUPDATE=false|g" "$BASE_CONFIG_PATH"/source/.env fi fi + +# Merge BASE_CONFIG_PATH to .env file +if ! grep -q "BASE_CONFIG_PATH=" "$BASE_CONFIG_PATH"/source/.env; then + echo "BASE_CONFIG_PATH=$BASE_CONFIG_PATH" >>"$BASE_CONFIG_PATH"/source/.env +else + sed -i "s|BASE_CONFIG_PATH=.*|BASE_CONFIG_PATH=$BASE_CONFIG_PATH|g" "$BASE_CONFIG_PATH"/source/.env +fi + echo -e "8. Checking for SSH key for localhost access." if [ ! -f ~/.ssh/authorized_keys ]; then mkdir -p ~/.ssh @@ -506,24 +709,24 @@ set -e if [ "$IS_COOLIFY_VOLUME_EXISTS" -eq 0 ]; then echo " - Generating SSH key." - ssh-keygen -t ed25519 -a 100 -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal -q -N "" -C coolify - chown 9999 /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal + ssh-keygen -t ed25519 -a 100 -f "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal -q -N "" -C coolify + chown 9999 "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal sed -i "/coolify/d" ~/.ssh/authorized_keys - cat /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub >> ~/.ssh/authorized_keys - rm -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub + cat "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub >> ~/.ssh/authorized_keys + rm -f "$BASE_CONFIG_PATH"/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub fi -chown -R 9999:root /data/coolify -chmod -R 700 /data/coolify +chown -R 9999:root "$BASE_CONFIG_PATH" +chmod -R 700 "$BASE_CONFIG_PATH" echo -e "9. Installing Coolify ($LATEST_VERSION)" echo -e " - It could take a while based on your server's performance, network speed, stars, etc." echo -e " - Please wait." getAJoke -bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" +bash "$BASE_CONFIG_PATH"/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" echo " - Coolify installed successfully." -rm -f $ENV_FILE-$DATE +rm -f "$ENV_FILE-$DATE" echo " - Waiting for 20 seconds for Coolify (database migrations) to be ready." getAJoke @@ -553,5 +756,10 @@ if [ -n "$PRIVATE_IPS" ]; then fi done fi +<<<<<<< Updated upstream echo -e "\nWARNING: It is highly recommended to backup your Environment variables file (/data/coolify/source/.env) to a safe location, outside of this server (e.g. into a Password Manager).\n" cp /data/coolify/source/.env /data/coolify/source/.env.backup +======= +echo -e "\nWARNING: It is highly recommended to backup your Environment variables file ($BASE_CONFIG_PATH/source/.env) to a safe location, outside of this server (e.g. into a Password Manager).\n" +cp "$BASE_CONFIG_PATH"/source/.env "$BASE_CONFIG_PATH"/source/.env.backup +>>>>>>> Stashed changes diff --git a/scripts/upgrade.sh b/scripts/upgrade.sh index 1bdf0f4614..f1a50e83d6 100644 --- a/scripts/upgrade.sh +++ b/scripts/upgrade.sh @@ -5,27 +5,43 @@ VERSION="13" CDN="https://cdn.coollabs.io/coolify" LATEST_IMAGE=${1:-latest} LATEST_HELPER_VERSION=${2:-latest} +DATE=$(date +%Y-%m-%d-%H-%M-%S) +<<<<<<< Updated upstream DATE=$(date +%Y-%m-%d-%H-%M-%S) LOGFILE="/data/coolify/source/upgrade-${DATE}.log" curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production +======= +# Check if.env file exists, if exists get BASE_CONFIG_PATH, if not defaults to data/coolify +if [ -f ./.env ]; then + BASE_CONFIG_PATH=$(grep -w "BASE_CONFIG_PATH" ./.env | cut -d "=" -f 2 | tr -d '"') || true +fi + +BASE_CONFIG_PATH=${BASE_CONFIG_PATH:-"/data/coolify"} + +LOGFILE="$BASE_CONFIG_PATH"/source/upgrade-${DATE}.log + +curl -fsSL $CDN/docker-compose.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.yml +curl -fsSL $CDN/docker-compose.prod.yml -o "$BASE_CONFIG_PATH"/source/docker-compose.prod.yml +curl -fsSL $CDN/.env.production -o "$BASE_CONFIG_PATH"/source/.env.production +>>>>>>> Stashed changes # Merge .env and .env.production. New values will be added to .env -awk -F '=' '!seen[$1]++' /data/coolify/source/.env /data/coolify/source/.env.production > /data/coolify/source/.env.tmp && mv /data/coolify/source/.env.tmp /data/coolify/source/.env -# Check if PUSHER_APP_ID or PUSHER_APP_KEY or PUSHER_APP_SECRET is empty in /data/coolify/source/.env -if grep -q "PUSHER_APP_ID=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" /data/coolify/source/.env +awk -F '=' '!seen[$1]++' "$BASE_CONFIG_PATH"/source/.env "$BASE_CONFIG_PATH"/source/.env.production > "$BASE_CONFIG_PATH"/source/.env.tmp && mv "$BASE_CONFIG_PATH"/source/.env.tmp "$BASE_CONFIG_PATH"/source/.env +# Check if PUSHER_APP_ID or PUSHER_APP_KEY or PUSHER_APP_SECRET is empty in BASE_CONFIG_PATH/source/.env +if grep -q "PUSHER_APP_ID=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi -if grep -q "PUSHER_APP_KEY=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" /data/coolify/source/.env +if grep -q "PUSHER_APP_KEY=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi -if grep -q "PUSHER_APP_SECRET=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" /data/coolify/source/.env +if grep -q "PUSHER_APP_SECRET=$" "$BASE_CONFIG_PATH"/source/.env; then + sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" "$BASE_CONFIG_PATH"/source/.env fi # Make sure coolify network exists @@ -33,9 +49,17 @@ fi docker network create --attachable coolify 2>/dev/null # docker network create --attachable --driver=overlay coolify-overlay 2>/dev/null +<<<<<<< Updated upstream if [ -f /data/coolify/source/docker-compose.custom.yml ]; then echo "docker-compose.custom.yml detected." >> $LOGFILE docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml -f /data/coolify/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 else docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 +======= +if [ -f "$BASE_CONFIG_PATH"/source/docker-compose.custom.yml ]; then + echo "docker-compose.custom.yml detected." >> $LOGFILE + docker run -v "$BASE_CONFIG_PATH"/source:"$BASE_CONFIG_PATH"/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file $BASE_CONFIG_PATH/source/.env -f $BASE_CONFIG_PATH/source/docker-compose.yml -f $BASE_CONFIG_PATH/source/docker-compose.prod.yml -f $BASE_CONFIG_PATH/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> "$LOGFILE" 2>&1 +else + docker run -v "$BASE_CONFIG_PATH"/source:"$BASE_CONFIG_PATH"/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file $BASE_CONFIG_PATH/source/.env -f $BASE_CONFIG_PATH/source/docker-compose.yml -f $BASE_CONFIG_PATH/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> "$LOGFILE" 2>&1 +>>>>>>> Stashed changes fi