#!/bin/bash set -e # Function to extract domain from Git SSH URL extract_domain() { local url=$1 # Handle different SSH URL formats if [[ $url == ssh://* ]]; then # For URLs starting with ssh://, extract the domain echo "$url" | sed -E 's|ssh://[^@]+@([^:/]+).*|\1|' else # For URLs without ssh://, extract the domain after '@' and before ':' echo "$url" | sed -E 's|[^@]+@([^:/]+).*|\1|' fi } # Check if the required environment variables are set if [ -z "$REPO_URL" ]; then echo "Error: REPO_URL environment variable must be set." exit 1 fi if [ ! -f /root/.ssh/id_rsa ]; then echo "Error: SSH private key not found at /root/.ssh/id_rsa" exit 1 fi if [ -z "$GIT_USER" ]; then echo "Error: GIT_USER environment variable must be set." exit 1 fi if [ -z "$GIT_EMAIL" ]; then echo "Error: GIT_EMAIL environment variable must be set." exit 1 fi # Set default package manager if not provided PACKAGE_MANAGER=${PACKAGE_MANAGER:-npm} # If no teleport edition is given, fallback to oss TELEPORT_EDITION=${TELEPORT_EDITION:-oss} # Install Teleport if the environment variables are set if [ -n "$TELEPORT_VERSION" ] && [ -n "$TELEPORT_URL" ]; then echo "Installing Teleport version $TELEPORT_VERSION, edition $TELEPORT_EDITION..." curl https://goteleport.com/static/install.sh | bash -s "${TELEPORT_VERSION}" "${TELEPORT_EDITION}" # If teleport token is set and there is no teleport.yaml file, create one if [ -n "$TELEPORT_TOKEN" ] && [ ! -f /etc/teleport.yaml ]; then teleport configure --roles=node --token="$TELEPORT_TOKEN" --proxy="$TELEPORT_URL" --no-acme -o file echo "Created teleport configuration file" fi else echo "Warning: TELEPORT_VERSION and TELEPORT_URL environment variables are not set. Skipping Teleport installation." fi # Ensure the SSH key has the correct permissions chmod 600 /root/.ssh/id_rsa # Extract the domain from the REPO_URL DOMAIN=$(extract_domain "$REPO_URL") # Add the SSH configuration for the domain echo "Host $DOMAIN HostName $DOMAIN IdentityFile /root/.ssh/id_rsa StrictHostKeyChecking no " >> /root/.ssh/config # Clone the repository if it doesn't exist if [ ! -d "/workspace/.git" ]; then git clone "$REPO_URL" /workspace fi # Add the public SSH key to authorized_keys if [ -f /root/.ssh/hostkey.pub ]; then cat /root/.ssh/hostkey.pub >> /root/.ssh/authorized_keys fi # Change to the repository directory cd /workspace # Install dependencies using the specified package manager case $PACKAGE_MANAGER in npm) npm install ;; yarn) yarn install ;; pnpm) pnpm install ;; bun) bun install ;; *) echo "Error: Unsupported package manager: $PACKAGE_MANAGER" exit 1 ;; esac # Copy the environment file to the repository's environments directory if [ -f /environment/.env ]; then mkdir -p /workspace/environments cp /environment/.env /workspace/.env else echo "Warning: Environment file not found at /environment/.env" fi # Set the git user and email git config --global user.name "$GIT_USER" git config --global user.email "$GIT_EMAIL" # Get the hostname of the machine HOSTNAME=$(hostname) # File path CONFIG_FILE="/etc/teleport.yaml" # Edit the teleport.yaml file to update the nodename if the file exists if [ -f "$CONFIG_FILE" ]; then sed -i "s/^ nodename:.*/ nodename: $HOSTNAME/" "$CONFIG_FILE" # Start Teleport in the background nohup teleport start & else echo "Warning: Teleport configuration file not found. Skipping Teleport start." fi # Start SSH server service ssh start # Determine the run command if [ -z "$RUN_COMMAND" ]; then # If RUN_COMMAND is not set, try to find a suitable command from package.json if [ -f "package.json" ]; then if grep -q '"dev"' package.json; then RUN_COMMAND="dev" elif grep -q '"start"' package.json; then RUN_COMMAND="start" else echo "Error: Could not determine a suitable run command from package.json" exit 1 fi else echo "Error: package.json not found and RUN_COMMAND not set" exit 1 fi fi # Start the application with pm2 using the specified package manager and run command exec pm2-runtime "$PACKAGE_MANAGER run $RUN_COMMAND"