# Gitea Actions Workflow for AlexHost Deployment # This workflow provides manual deployment to the AlexHost production server # Server: 193.233.245.41 (teleshop.silentmary.mywire.org) name: Deploy to AlexHost on: workflow_dispatch: inputs: deploy_teleshop: description: 'Deploy TeleShop (LittleShop)' required: true default: 'true' type: boolean deploy_telebot: description: 'Deploy TeleBot' required: true default: 'true' type: boolean force_rebuild: description: 'Force rebuild without cache' required: false default: 'false' type: boolean env: ALEXHOST_IP: 193.233.245.41 ALEXHOST_USER: sysadmin REGISTRY: localhost:5000 TELESHOP_IMAGE: littleshop TELEBOT_IMAGE: telebot jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build TeleShop Image if: ${{ inputs.deploy_teleshop == 'true' }} run: | echo "Building TeleShop image..." CACHE_FLAG="" if [ "${{ inputs.force_rebuild }}" = "true" ]; then CACHE_FLAG="--no-cache" fi docker build $CACHE_FLAG -t ${{ env.TELESHOP_IMAGE }}:${{ github.sha }} -t ${{ env.TELESHOP_IMAGE }}:latest -f Dockerfile . docker save ${{ env.TELESHOP_IMAGE }}:latest | gzip > teleshop-image.tar.gz echo "TeleShop image built successfully" - name: Build TeleBot Image if: ${{ inputs.deploy_telebot == 'true' }} run: | echo "Building TeleBot image..." CACHE_FLAG="" if [ "${{ inputs.force_rebuild }}" = "true" ]; then CACHE_FLAG="--no-cache" fi docker build $CACHE_FLAG -t ${{ env.TELEBOT_IMAGE }}:${{ github.sha }} -t ${{ env.TELEBOT_IMAGE }}:latest -f Dockerfile.telebot . docker save ${{ env.TELEBOT_IMAGE }}:latest | gzip > telebot-image.tar.gz echo "TeleBot image built successfully" - name: Configure SSH run: | mkdir -p ~/.ssh echo "${{ secrets.ALEXHOST_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ env.ALEXHOST_IP }} >> ~/.ssh/known_hosts 2>/dev/null || true - name: Copy TeleShop Image to AlexHost if: ${{ inputs.deploy_teleshop == 'true' }} run: | echo "Transferring TeleShop image to AlexHost..." scp -o StrictHostKeyChecking=no teleshop-image.tar.gz ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }}:/tmp/ echo "TeleShop image transferred" - name: Copy TeleBot Image to AlexHost if: ${{ inputs.deploy_telebot == 'true' }} run: | echo "Transferring TeleBot image to AlexHost..." scp -o StrictHostKeyChecking=no telebot-image.tar.gz ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }}:/tmp/ echo "TeleBot image transferred" - name: Copy Docker Compose to AlexHost run: | echo "Copying deployment files..." scp -o StrictHostKeyChecking=no docker-compose.alexhost.yml ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }}:/tmp/ - name: Deploy TeleShop on AlexHost if: ${{ inputs.deploy_teleshop == 'true' }} run: | ssh -o StrictHostKeyChecking=no ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }} << 'DEPLOY_EOF' set -e echo "=== Deploying TeleShop ===" # Load image echo "Loading TeleShop image..." gunzip -c /tmp/teleshop-image.tar.gz | sudo docker load # Tag and push to local registry echo "Pushing to local registry..." sudo docker tag littleshop:latest localhost:5000/littleshop:latest sudo docker push localhost:5000/littleshop:latest # Stop and remove existing container echo "Stopping existing container..." sudo docker stop teleshop 2>/dev/null || true sudo docker rm teleshop 2>/dev/null || true # Start new container using compose echo "Starting new container..." cd /home/sysadmin/teleshop-source 2>/dev/null || mkdir -p /home/sysadmin/teleshop-source cp /tmp/docker-compose.alexhost.yml /home/sysadmin/teleshop-source/docker-compose.yml cd /home/sysadmin/teleshop-source sudo docker compose up -d teleshop # Wait for health check echo "Waiting for health check..." sleep 30 if sudo docker ps | grep -q "teleshop.*healthy"; then echo "TeleShop deployed successfully!" else echo "Warning: Container may still be starting..." sudo docker ps | grep teleshop fi # Cleanup rm /tmp/teleshop-image.tar.gz echo "=== TeleShop deployment complete ===" DEPLOY_EOF - name: Deploy TeleBot on AlexHost if: ${{ inputs.deploy_telebot == 'true' }} run: | ssh -o StrictHostKeyChecking=no ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }} << 'DEPLOY_EOF' set -e echo "=== Deploying TeleBot ===" # Load image echo "Loading TeleBot image..." gunzip -c /tmp/telebot-image.tar.gz | sudo docker load # Tag and push to local registry echo "Pushing to local registry..." sudo docker tag telebot:latest localhost:5000/telebot:latest sudo docker push localhost:5000/telebot:latest # Stop and remove existing container echo "Stopping existing container..." sudo docker stop telebot 2>/dev/null || true sudo docker rm telebot 2>/dev/null || true # Start new container using compose echo "Starting new container..." cd /home/sysadmin/teleshop-source sudo docker compose up -d telebot # Wait for startup echo "Waiting for startup..." sleep 20 sudo docker ps | grep telebot # Cleanup rm /tmp/telebot-image.tar.gz echo "=== TeleBot deployment complete ===" DEPLOY_EOF - name: Verify Deployment run: | ssh -o StrictHostKeyChecking=no ${{ env.ALEXHOST_USER }}@${{ env.ALEXHOST_IP }} << 'VERIFY_EOF' echo "=== Deployment Verification ===" echo "" echo "Running Containers:" sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" echo "" echo "Testing TeleShop health..." curl -sf http://localhost:5100/health && echo "TeleShop: OK" || echo "TeleShop: FAIL" echo "" echo "Testing TeleBot health..." curl -sf http://localhost:5010/health 2>/dev/null && echo "TeleBot: OK" || echo "TeleBot: API endpoint not exposed (normal for bot-only mode)" echo "" echo "=== Verification complete ===" VERIFY_EOF - name: Cleanup Local Artifacts if: always() run: | rm -f teleshop-image.tar.gz telebot-image.tar.gz echo "Cleanup complete"