fix: Fix deploy-alexhost.sh verify function and add GitLab CI/CD
All checks were successful
Build and Deploy LittleShop / Deploy to Pre-Production (CT109) (push) Successful in 59s
Build and Deploy LittleShop / Deploy to Production VPS (Manual Only) (push) Has been skipped

- Fix ssh_exec → ssh_sudo in verify_deployment function
- Add .gitlab-ci.yml for GitLab CI/CD deployment support
- Manual deployment jobs: deploy-alexhost, deploy-teleshop-only, deploy-telebot-only

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
SysAdmin 2025-11-26 12:39:21 +00:00
parent 86f19ba044
commit 26e9004242
2 changed files with 194 additions and 1 deletions

193
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,193 @@
# GitLab CI/CD Pipeline for AlexHost Deployment
# Server: 193.233.245.41 (teleshop.silentmary.mywire.org)
stages:
- build
- deploy
- verify
variables:
ALEXHOST_IP: "193.233.245.41"
ALEXHOST_USER: "sysadmin"
REGISTRY: "localhost:5000"
TELESHOP_IMAGE: "littleshop"
TELEBOT_IMAGE: "telebot"
# Manual deployment to AlexHost Production
deploy-alexhost:
stage: deploy
image: docker:24.0
services:
- docker:24.0-dind
rules:
- when: manual
variables:
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- apk add --no-cache openssh-client curl tar gzip
- mkdir -p ~/.ssh
- echo "$ALEXHOST_SSH_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $ALEXHOST_IP >> ~/.ssh/known_hosts 2>/dev/null || true
script:
- echo "=== Building and Deploying to AlexHost ==="
# Build TeleShop image
- echo "Building TeleShop image..."
- docker build -t ${TELESHOP_IMAGE}:${CI_COMMIT_SHA} -t ${TELESHOP_IMAGE}:latest -f Dockerfile .
- docker save ${TELESHOP_IMAGE}:latest | gzip > teleshop-image.tar.gz
# Build TeleBot image
- echo "Building TeleBot image..."
- docker build -t ${TELEBOT_IMAGE}:${CI_COMMIT_SHA} -t ${TELEBOT_IMAGE}:latest -f Dockerfile.telebot .
- docker save ${TELEBOT_IMAGE}:latest | gzip > telebot-image.tar.gz
# Transfer images to AlexHost
- echo "Transferring images to AlexHost..."
- scp -o StrictHostKeyChecking=no teleshop-image.tar.gz ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
- scp -o StrictHostKeyChecking=no telebot-image.tar.gz ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
- scp -o StrictHostKeyChecking=no docker-compose.alexhost.yml ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
# Deploy on AlexHost
- |
ssh -o StrictHostKeyChecking=no ${ALEXHOST_USER}@${ALEXHOST_IP} << 'DEPLOY_EOF'
set -e
echo "=== Loading Docker images ==="
gunzip -c /tmp/teleshop-image.tar.gz | sudo docker load
gunzip -c /tmp/telebot-image.tar.gz | sudo docker load
echo "=== Pushing to local registry ==="
sudo docker tag littleshop:latest localhost:5000/littleshop:latest
sudo docker push localhost:5000/littleshop:latest
sudo docker tag telebot:latest localhost:5000/telebot:latest
sudo docker push localhost:5000/telebot:latest
echo "=== Stopping existing containers ==="
sudo docker stop teleshop telebot 2>/dev/null || true
sudo docker rm teleshop telebot 2>/dev/null || true
echo "=== Starting new containers ==="
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
echo "=== Waiting for health checks ==="
sleep 30
sudo docker ps --format "table {{.Names}}\t{{.Status}}"
echo "=== Cleanup ==="
rm -f /tmp/teleshop-image.tar.gz /tmp/telebot-image.tar.gz
echo "=== Deployment complete ==="
DEPLOY_EOF
after_script:
- rm -f teleshop-image.tar.gz telebot-image.tar.gz
environment:
name: production
url: https://teleshop.silentmary.mywire.org
tags:
- docker
# Deploy only TeleShop
deploy-teleshop-only:
stage: deploy
image: docker:24.0
services:
- docker:24.0-dind
rules:
- when: manual
variables:
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- apk add --no-cache openssh-client curl tar gzip
- mkdir -p ~/.ssh
- echo "$ALEXHOST_SSH_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $ALEXHOST_IP >> ~/.ssh/known_hosts 2>/dev/null || true
script:
- echo "Building TeleShop image..."
- docker build -t ${TELESHOP_IMAGE}:latest -f Dockerfile .
- docker save ${TELESHOP_IMAGE}:latest | gzip > teleshop-image.tar.gz
- scp -o StrictHostKeyChecking=no teleshop-image.tar.gz ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
- scp -o StrictHostKeyChecking=no docker-compose.alexhost.yml ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
- |
ssh -o StrictHostKeyChecking=no ${ALEXHOST_USER}@${ALEXHOST_IP} << 'EOF'
gunzip -c /tmp/teleshop-image.tar.gz | sudo docker load
sudo docker tag littleshop:latest localhost:5000/littleshop:latest
sudo docker push localhost:5000/littleshop:latest
sudo docker stop teleshop 2>/dev/null || true
sudo docker rm teleshop 2>/dev/null || true
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
sleep 30 && sudo docker ps | grep teleshop
rm -f /tmp/teleshop-image.tar.gz
EOF
after_script:
- rm -f teleshop-image.tar.gz
environment:
name: production
url: https://teleshop.silentmary.mywire.org
tags:
- docker
# Deploy only TeleBot
deploy-telebot-only:
stage: deploy
image: docker:24.0
services:
- docker:24.0-dind
rules:
- when: manual
before_script:
- apk add --no-cache openssh-client curl tar gzip
- mkdir -p ~/.ssh
- echo "$ALEXHOST_SSH_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $ALEXHOST_IP >> ~/.ssh/known_hosts 2>/dev/null || true
script:
- echo "Building TeleBot image..."
- docker build -t ${TELEBOT_IMAGE}:latest -f Dockerfile.telebot .
- docker save ${TELEBOT_IMAGE}:latest | gzip > telebot-image.tar.gz
- scp -o StrictHostKeyChecking=no telebot-image.tar.gz ${ALEXHOST_USER}@${ALEXHOST_IP}:/tmp/
- |
ssh -o StrictHostKeyChecking=no ${ALEXHOST_USER}@${ALEXHOST_IP} << 'EOF'
gunzip -c /tmp/telebot-image.tar.gz | sudo docker load
sudo docker tag telebot:latest localhost:5000/telebot:latest
sudo docker push localhost:5000/telebot:latest
sudo docker stop telebot 2>/dev/null || true
sudo docker rm telebot 2>/dev/null || true
cd /home/sysadmin/teleshop-source && sudo docker compose up -d telebot
sleep 20 && sudo docker ps | grep telebot
rm -f /tmp/telebot-image.tar.gz
EOF
after_script:
- rm -f telebot-image.tar.gz
environment:
name: production
tags:
- docker
# Verify deployment status
verify-deployment:
stage: verify
image: alpine:latest
rules:
- when: manual
before_script:
- apk add --no-cache openssh-client curl
- mkdir -p ~/.ssh
- echo "$ALEXHOST_SSH_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $ALEXHOST_IP >> ~/.ssh/known_hosts 2>/dev/null || true
script:
- |
ssh -o StrictHostKeyChecking=no ${ALEXHOST_USER}@${ALEXHOST_IP} << 'EOF'
echo "=== Container Status ==="
sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "=== Health Checks ==="
curl -sf http://localhost:5100/health && echo " TeleShop: OK" || echo " TeleShop: FAIL"
echo ""
echo "=== Deployment verified ==="
EOF

View File

@ -171,7 +171,7 @@ deploy_telebot() {
verify_deployment() { verify_deployment() {
echo -e "${YELLOW}=== Verifying Deployment ===${NC}" echo -e "${YELLOW}=== Verifying Deployment ===${NC}"
ssh_exec " ssh_sudo "
echo '' echo ''
echo 'Container Status:' echo 'Container Status:'
sudo docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'NAMES|teleshop|telebot' sudo docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'NAMES|teleshop|telebot'