diff --git a/action.yml b/action.yml index 80e9ee5..2ee84c4 100644 --- a/action.yml +++ b/action.yml @@ -1,82 +1,104 @@ -name: Deploy Docker Compose via SSH +name: Deploy Docker Compose + +description: Deploy a Docker Compose file to a remote server via SSH + +inputs: + docker_compose_path: + description: 'Path to the docker-compose file (e.g. docker-compose.yml)' + required: true + default: 'docker-compose.yml' + + remote_host: + description: 'Remote server IP or hostname' + required: true + default: '185.218.126.87' + + remote_user: + description: 'SSH username on remote server' + required: true + default: 'linly' + + deployment_path: + description: 'Remote path to deploy the compose file (e.g. /home/linly/services/gitea)' + required: true + default: '/home/linly/services/gitea' + + + timeout: + description: 'Timeout in seconds for docker-compose up' + required: false + default: 300 runs: - using: composite - inputs: - docker_compose_path: - description: 'Path to deploy docker-compose.yml (e.g. /home/user/app/docker-compose.yml)' - required: false - default: 'docker-compose.yml' - remote_host: - description: 'Remote host (e.g. 192.168.1.100)' - required: false - default: '185.218.126.87' - remote_user: - description: 'Remote user (e.g. ubuntu)' - required: false - default: 'linly' - deployment_path: - description: 'the path where the docker-compose file will be copied to' - required: true - default: '/home/linly/services/gitea' - env: - # These are provided via GitHub Secrets - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - SSH_KNOWN_HOSTS: ${{ secrets.SSH_KNOWN_HOSTS }} - DEPLOYMENT_PATH: ${{ inputs.deployment_path || 'docker-compose.yml' }} - REMOTE_HOST: ${{ inputs.remote_host || 'your-server.example.com' }} - REMOTE_USER: ${{ inputs.remote_user || 'ubuntu' }} - DOCKER_COMPOSE_PATH: ${{ inputs.docker_compose_path }} + using: ubuntu-latest + # We use Docker to run this action, so we don't need to run it on a runner + # (you can also use "ubuntu-latest" if you prefer, but Docker is better for consistency) - steps: - - name: Checkout code - uses: actions/checkout@v4 + # Specify the Docker image to use (this is optional but recommended) + # You can use a custom image or just use the base image + # Here we use a minimal image with SSH and docker-compose - - name: Set up SSH agent (to use private key) - run: | - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - # Optional: add known hosts - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - # Ensure SSH config - echo "Host ${REMOTE_HOST}" >> ~/.ssh/config - echo " HostName ${REMOTE_HOST}" >> ~/.ssh/config - echo " User ${REMOTE_USER}" >> ~/.ssh/config - echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config - echo " StrictHostKeyChecking yes" >> ~/.ssh/config - echo " UserKnownHostsFile ~/.ssh/known_hosts" >> ~/.ssh/config + # Environment variables (we pass inputs to the action) + env: + REMOTE_HOST: ${{ inputs.remote_host }} + REMOTE_USER: ${{ inputs.remote_user }} + DEPLOYMENT_PATH: ${{ inputs.deployment_path }} + DOCKER_COMPOSE_PATH: ${{ inputs.docker_compose_path }} + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + SSH_KNOWN_HOSTS: ${{ secrets.SSH_KNOWN_HOSTS }} + TIMEOUT: ${{ inputs.timeout }} - - name: Copy docker-compose.yml to remote host - run: | - # Ensure the remote path exists - mkdir -p "$(dirname "${DEPLOYMENT_PATH}")" - # Use scp to copy the file - scp -o StrictHostKeyChecking=yes -o UserKnownHostsFile= ~/.ssh/known_hosts \ - -i ~/.ssh/id_rsa \ - ${COMPOSE_PATH} \ - ${REMOTE_USER}@${REMOTE_HOST}:"${DEPLOYMENT_PATH}" - shell: bash + # Optional: Set timeout for the entire action + # timeout-minutes: 10 - - name: Deploy services via SSH - run: | - # Run docker-compose up -d on the remote host - ssh -o StrictHostKeyChecking=yes \ - -o UserKnownHostsFile= ~/.ssh/known_hosts \ - -i ~/.ssh/id_rsa \ - ${REMOTE_USER}@${REMOTE_HOST} \ - "docker-compose -f ${DEPLOYMENT_PATH} up -d --timeout 300" - shell: bash +steps: + - name: Checkout code + uses: actions/checkout@v4 - - name: Verify services are running - run: | - ssh -o StrictHostKeyChecking=yes \ - -o UserKnownHostsFile= ~/.ssh/known_hosts \ - -i ~/.ssh/id_rsa \ - ${REMOTE_USER}@${REMOTE_HOST} \ - "docker-compose -f ${DEPLOYMENT_PATH} ps" - shell: bash + - name: Set up SSH config + run: | + mkdir -p ~/.ssh + echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa - - name: Final success message - run: echo "✅ Docker Compose deployed successfully on ${REMOTE_HOST}" + echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + chmod 644 ~/.ssh/known_hosts + + # SSH config file + echo "Host ${REMOTE_HOST}" > ~/.ssh/config + echo " HostName ${REMOTE_HOST}" >> ~/.ssh/config + echo " User ${REMOTE_USER}" >> ~/.ssh/config + echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config + echo " StrictHostKeyChecking yes" >> ~/.ssh/config + echo " UserKnownHostsFile ~/.ssh/known_hosts" >> ~/.ssh/config + + - name: Copy docker-compose file to remote server + run: | + mkdir -p "$(dirname "${DEPLOYMENT_PATH}")" + scp -o StrictHostKeyChecking=yes \ + -o UserKnownHostsFile= ~/.ssh/known_hosts \ + -i ~/.ssh/id_rsa \ + "${DOCKER_COMPOSE_PATH}" \ + "${REMOTE_USER}@${REMOTE_HOST}:${DEPLOYMENT_PATH}" + shell: bash + + - name: Deploy services via SSH + run: | + ssh -o StrictHostKeyChecking=yes \ + -o UserKnownHostsFile= ~/.ssh/known_hosts \ + -i ~/.ssh/id_rsa \ + "${REMOTE_USER}@${REMOTE_HOST}" \ + "docker-compose -f ${DEPLOYMENT_PATH} up -d --timeout ${TIMEOUT}" + shell: bash + + - name: Verify services are running + run: | + ssh -o StrictHostKeyChecking=yes \ + -o UserKnownHostsFile= ~/.ssh/known_hosts \ + -i ~/.ssh/id_rsa \ + "${REMOTE_USER}@${REMOTE_HOST}" \ + "docker-compose -f ${DEPLOYMENT_PATH} ps" + shell: bash + + - name: Final success message + run: echo "✅ Docker Compose deployed successfully on ${REMOTE_HOST}"