name: Deploy to VPS on: push: branches: - master workflow_dispatch: permissions: contents: read packages: write env: IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/bete jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive - name: Normalize image name run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> "$GITHUB_ENV" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . push: true tags: | ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:${{ github.sha }} - name: Deploy to VPS uses: appleboy/ssh-action@v1.2.0 env: IMAGE_NAME: ${{ env.IMAGE_NAME }} GHCR_USERNAME: ${{ github.actor }} GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }} ENV_FILE: ${{ secrets.ENV_FILE }} with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USERNAME }} key: ${{ secrets.VPS_SSH_KEY }} envs: IMAGE_NAME,GHCR_USERNAME,GHCR_TOKEN,ENV_FILE script: | set -eu APP_DIR=/opt/imphenbot mkdir -p "$APP_DIR" cd "$APP_DIR" printf '%s\nIMAGE_NAME=%s:latest\n' "$ENV_FILE" "$IMAGE_NAME" > .env cat > docker-compose.yml <<'EOF' services: bete: image: ${IMAGE_NAME} container_name: imphenbot restart: unless-stopped env_file: - .env EOF echo "$GHCR_TOKEN" | docker login ghcr.io -u "$GHCR_USERNAME" --password-stdin docker compose pull docker compose up -d docker image prune -f