Browse Source
ci: add Jenkinsfile, update Docker config, and fix DRF Token auth scheme for automated deployment
master
ci: add Jenkinsfile, update Docker config, and fix DRF Token auth scheme for automated deployment
master
7 changed files with 40 additions and 48 deletions
-
4Dockerfile
-
21Jenkinsfile
-
24docker-compose.yml
-
13docker/40-config-js.sh
-
18docker/nginx/default.conf.template
-
6runner.sh
-
2src/services/http.ts
@ -0,0 +1,21 @@ |
|||||
|
pipeline { |
||||
|
environment { |
||||
|
production_server_ip = "88.99.212.243" |
||||
|
production_server_name = "newhorizon_germany_001_server" |
||||
|
project_path = "/projects/aqila/aqila_panel" |
||||
|
} |
||||
|
agent any |
||||
|
stages { |
||||
|
stage("deploy"){ |
||||
|
steps{ |
||||
|
script{ |
||||
|
withCredentials([usernamePassword(credentialsId: production_server_name, usernameVariable: "USERNAME", passwordVariable: "PASSWORD")]) { |
||||
|
sh "sshpass -p $PASSWORD ssh -p 1782 $USERNAME@$production_server_ip -o StrictHostKeyChecking=no \"cd $project_path && ./runner.sh\"" |
||||
|
def lastCommit = sh(script: "git log -1 --pretty=format:\"%h - %s (%an)\"", returnStdout: true).trim() |
||||
|
sh "curl -F chat_id=-1002316394394 -F message_thread_id=11 -F document=@/var/jenkins_home/jobs/${env.JOB_NAME}/builds/${env.BUILD_NUMBER}/log -F caption='Project name: #${env.JOB_NAME} \nBuild status is ${currentBuild.currentResult} \nBuild url: ${BUILD_URL} \nLast Commit: ${lastCommit}' https://api.telegram.org/bot7207581748:AAFeymryw7S44D86LYfWqYK-tSNeV3TOwBs/sendDocument" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,39 +1,27 @@ |
|||||
# docker-compose برای داشبورد حسینیه (SPA پشت nginx). |
|
||||
# |
|
||||
# منبع واحد env در پروداکشن: فایل .env.production (با env_file خوانده میشود). |
|
||||
# همهٔ متغیرها از همان یک جا میآیند و در runtime به کانتینر تزریق میشوند. |
|
||||
|
|
||||
services: |
services: |
||||
web: |
web: |
||||
build: |
build: |
||||
context: . |
context: . |
||||
dockerfile: Dockerfile |
dockerfile: Dockerfile |
||||
image: hosseinieh-dashboard:latest |
|
||||
container_name: hosseinieh-dashboard |
|
||||
|
image: aqila-panel:latest |
||||
|
container_name: aqila_panel |
||||
restart: unless-stopped |
restart: unless-stopped |
||||
|
|
||||
# ← تنها منبع متغیرهای محیط در پروداکشن |
|
||||
env_file: |
env_file: |
||||
- .env.production |
- .env.production |
||||
|
|
||||
# ← پورت 5010 میزبان به 80 کانتینر (nginx) |
|
||||
ports: |
ports: |
||||
- "5010:80" |
|
||||
|
|
||||
# دسترسی به بکاندی که روی خود میزبان اجرا میشود (host.docker.internal) |
|
||||
# extra_hosts: |
|
||||
# - "host.docker.internal:host-gateway" |
|
||||
|
- "5013:80" |
||||
|
|
||||
healthcheck: |
healthcheck: |
||||
test: ["CMD", "wget", "-qO-", "http://localhost/healthz"] |
|
||||
|
test: ["CMD", "wget", "-qO-", "http://127.0.0.1/healthz"] |
||||
interval: 30s |
interval: 30s |
||||
timeout: 3s |
timeout: 3s |
||||
retries: 3 |
retries: 3 |
||||
start_period: 10s |
start_period: 10s |
||||
networks: |
networks: |
||||
- najm_najm |
|
||||
|
- aqila_backend_aqila |
||||
|
|
||||
networks: |
networks: |
||||
najm_najm: |
|
||||
|
aqila_backend_aqila: |
||||
external: true |
external: true |
||||
|
|
||||
@ -1,26 +1,19 @@ |
|||||
#!/bin/sh |
#!/bin/sh |
||||
# تولید /config.js از متغیرهای محیط — «منبع واحدِ env در runtime». |
|
||||
# |
|
||||
# nginx رسمی هر اسکریپت اجراییِ /docker-entrypoint.d/*.sh را پیش از استارت سرور |
|
||||
# اجرا میکند. اینجا مقادیر env (که از .env.production → docker-compose میآیند) |
|
||||
# را در window.__ENV__ مینویسیم تا app آنها را در runtime بخواند — بدون rebuild. |
|
||||
# |
|
||||
# توجه: کلید Soniox از این مسیر نمیآید — در کد هاردکد شده است (نه env، نه API). |
|
||||
set -eu |
set -eu |
||||
|
|
||||
TARGET="/usr/share/nginx/html/config.js" |
TARGET="/usr/share/nginx/html/config.js" |
||||
|
|
||||
# پیشفرضها (همراستا با fallbackهای کد). با env قابل override. |
|
||||
VITE_API_BASE_URL="${VITE_API_BASE_URL:-/api}" |
VITE_API_BASE_URL="${VITE_API_BASE_URL:-/api}" |
||||
|
VITE_AUTH_SCHEME="${VITE_AUTH_SCHEME:-Token}" |
||||
|
|
||||
# escape امنِ مقادیر برای قرارگیری داخل رشتهٔ JS (backslash، کوتیشن، خط جدید). |
|
||||
js_escape() { |
js_escape() { |
||||
printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e "s/'/\\\\'/g" | tr '\n' ' ' |
|
||||
|
printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e "s/'/\\'/g" | tr '\n' ' ' |
||||
} |
} |
||||
|
|
||||
{ |
{ |
||||
echo "window.__ENV__ = {" |
echo "window.__ENV__ = {" |
||||
echo " VITE_API_BASE_URL: '$(js_escape "$VITE_API_BASE_URL")'," |
echo " VITE_API_BASE_URL: '$(js_escape "$VITE_API_BASE_URL")'," |
||||
|
echo " VITE_AUTH_SCHEME: '$(js_escape "$VITE_AUTH_SCHEME")'," |
||||
echo "};" |
echo "};" |
||||
} > "$TARGET" |
} > "$TARGET" |
||||
|
|
||||
|
|||||
@ -1,2 +1,4 @@ |
|||||
|
|
||||
git pull origin master && docker compose up -d --build |
|
||||
|
#!/bin/bash |
||||
|
git pull origin master |
||||
|
DOCKER_BUILDKIT=1 docker compose up -d --build web |
||||
|
docker exec nginx-nginx-1 nginx -s reload |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue