-
Notifications
You must be signed in to change notification settings - Fork 0
109 lines (97 loc) · 4.84 KB
/
deploy.yml
File metadata and controls
109 lines (97 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
name: Deploy to Production
on:
push:
branches:
- main
- master
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup SSH
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add server to known hosts
run: |
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: Deploy to server
env:
SERVER_USER: ${{ secrets.SERVER_USER }}
SERVER_HOST: ${{ secrets.SERVER_HOST }}
SERVER_PATH: ${{ secrets.SERVER_PATH }}
run: |
# Create deployment directory structure
ssh $SERVER_USER@$SERVER_HOST "mkdir -p $SERVER_PATH"
# Sync files to server (excluding .git, node_modules, vendor, etc.)
rsync -avz --delete \
--exclude '.git' \
--exclude 'node_modules' \
--exclude 'vendor' \
--exclude '.env' \
--exclude '.env.production' \
--exclude '.env.local' \
--exclude 'storage/logs/*' \
--exclude 'storage/framework/cache/*' \
--exclude 'storage/framework/sessions/*' \
--exclude 'storage/framework/views/*' \
--exclude 'ssl' \
--exclude '.idea' \
--exclude '.vscode' \
./ $SERVER_USER@$SERVER_HOST:$SERVER_PATH/
# Copy .env.production to .env on server (if exists)
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && \
if [ -f .env.production ]; then \
cp .env.production .env && \
echo '.env.production copied to .env'; \
else \
echo 'Warning: .env.production not found on server'; \
fi"
# Set proper permissions
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && \
chmod -R 775 storage bootstrap/cache 2>/dev/null || true"
# Build and start containers
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml pull barakad-nginx 2>/dev/null || true && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml build barakad && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d && \
echo 'Waiting for containers to start...' && \
sleep 10 && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml ps && \
echo 'Checking if barakad container is running...' && \
BARAKAD_STATUS=\$(docker-compose -f docker-compose.yml -f docker-compose.prod.yml ps barakad | grep -c 'Up' || echo '0') && \
if [ \"\$BARAKAD_STATUS\" = \"0\" ]; then \
echo 'ERROR: barakad container is not running!' && \
echo 'Container logs:' && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml logs --tail=100 barakad && \
exit 1; \
fi && \
echo 'Waiting for PHP-FPM to be ready...' && \
sleep 10 && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml exec -T barakad php artisan migrate --force 2>/dev/null || true && \
docker-compose -f docker-compose.yml -f docker-compose.prod.yml exec -T barakad php artisan storage:link 2>/dev/null || true"
- name: Health check
env:
SERVER_USER: ${{ secrets.SERVER_USER }}
SERVER_HOST: ${{ secrets.SERVER_HOST }}
SERVER_PATH: ${{ secrets.SERVER_PATH }}
run: |
echo "Waiting for services to start..."
sleep 20
echo "Checking container status..."
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && docker-compose -f docker-compose.yml -f docker-compose.prod.yml ps"
echo "Checking PHP-FPM connection..."
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && docker-compose -f docker-compose.yml -f docker-compose.prod.yml exec -T barakad sh -c 'nc -zv localhost 9000 && echo \"PHP-FPM is listening\"' || echo \"PHP-FPM check skipped\""
echo "Testing HTTP endpoint..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 30 http://$SERVER_HOST) || HTTP_CODE="000"
if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "302" ] && [ "$HTTP_CODE" != "301" ]; then
echo "Health check failed. HTTP status: $HTTP_CODE"
echo "Checking logs..."
ssh $SERVER_USER@$SERVER_HOST "cd $SERVER_PATH && docker-compose -f docker-compose.yml -f docker-compose.prod.yml logs --tail=50 barakad barakad-nginx"
exit 1
fi
echo "HTTP endpoint responded with status: $HTTP_CODE"
echo "Deployment successful!"