SSH Deploy و GitHub Environment
این Runbook کلید اختصاصی Deploy، Host Key تاییدشده و Environment امن GitHub را تنظیم میکند.
مخاطب: Maintainer Repository و DevOps/SRE.
خارج از دامنه: کلید شخصی Developer، دسترسی Interactive عمومی و Secretهای Production.
۴. ساخت SSH Key اختصاصی Deploy
این Key را روی سیستم ویندوزی مورد اعتماد و خارج از Repository بسازید:
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh\tripylon"
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\tripylon\tripylon-backend-deploy" -C "github-actions:tripylon-backend"
New-Item -ItemType Directoryپوشه میسازد و-Forceدر صورت موجود بودن پوشه خطا نمیدهد.$env:USERPROFILEمسیر Profile کاربر ویندوز است؛ در نتیجه Key داخل Repository ساخته نمیشود.ssh-keygenیک جفت کلید میسازد.-t ed25519الگوریتم مدرن Ed25519 را انتخاب میکند.-fمسیر فایل Private Key را تعیین میکند؛ فایل دارای پسوند.pubکلید عمومی است.-CComment قابل شناسایی Key را ثبت میکند.- چون GitHub Actions بهصورت Unattended اجرا میشود، هنگام دو Prompt مربوط به Passphrase فقط Enter بزنید. جبران امنیتی آن، Key اختصاصی، Environment Secret، Branch Restriction، گزینه
restrictو Rotation است.
کلید عمومی را نمایش دهید:
Get-Content "$env:USERPROFILE\.ssh\tripylon\tripylon-backend-deploy.pub"
روی VPS ابتدا فایل مجاز را با Permission صحیح آماده کنید:
sudo install -d -m 0700 -o deploy -g deploy /home/deploy/.ssh
sudo -u deploy touch /home/deploy/.ssh/authorized_keys
sudo chown deploy:deploy /home/deploy/.ssh/authorized_keys
sudo chmod 600 /home/deploy/.ssh/authorized_keys
سپس مقدار واقعی خط .pub را بهجای ssh-ed25519 AAAA... قرار دهید و فقط همان یک خط را اضافه کنید:
printf '%s\n' 'restrict ssh-ed25519 AAAA... github-actions:tripylon-backend' | sudo tee -a /home/deploy/.ssh/authorized_keys >/dev/null
restrictقابلیتهایی مانند Port Forwarding، Agent Forwarding و تخصیص PTY را برای این Key میبندد.tee -aخط را Append میکند و مانع جایگزینی کل فایل و حذف Keyهای قبلی میشود.>/dev/nullچاپ دوباره کلید عمومی در Terminal را حذف میکند.- هرگز Private Key را روی VPS کپی نکنید؛ فقط فایل
.pubروی سرور قرار میگیرد.
۵. ثبت و تایید Host Key سرور
ابتدا Fingerprint واقعی Host Key را روی خود VPS بخوانید:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
سپس روی سیستم ویندوزی مورد اعتماد، Host Key را دریافت و در فایل جدا ذخیره کنید:
ssh-keyscan -H -t ed25519 -p 22 143.14.59.7 | Set-Content -Encoding ascii "$env:USERPROFILE\.ssh\tripylon\known_hosts"
ssh-keygen -lf "$env:USERPROFILE\.ssh\tripylon\known_hosts"
ssh-keyscanفقط Public Host Key را دریافت میکند و بهتنهایی هویت سرور را تضمین نمیکند.-Hنام Host را Hash،-t ed25519نوع Key و-p 22Port را تعیین میکند.- Fingerprint ویندوز باید دقیقا با Fingerprint خواندهشده روی VPS برابر باشد.
اتصال Deploy را تست کنید:
ssh -i "$env:USERPROFILE\.ssh\tripylon\tripylon-backend-deploy" -p 22 deploy@143.14.59.7 "docker version"
۶. تنظیم GitHub Environment
در Repository بکاند مسیر Settings -> Environments را باز کنید، Environment با نام دقیق development بسازید و Deployment Branch را فقط به main محدود کنید.
Environment Secretها:
| Secret | مقدار |
|---|---|
DEPLOY_HOST |
143.14.59.7 |
DEPLOY_PORT |
22 یا Port واقعی SSH |
DEPLOY_USER |
deploy |
DEPLOY_SSH_KEY |
محتوای کامل Private Key بدون .pub |
DEPLOY_KNOWN_HOSTS |
محتوای فایل تاییدشده known_hosts |
Environment Variableها:
| Variable | مقدار |
|---|---|
DEPLOY_PATH |
/opt/applications/tripylon-backend |
DEVELOPMENT_URL |
https://api.iranihosts.com |
ثبت با GitHub CLI از Root Repository:
gh auth login
gh repo set-default hoa-building-management/backend
Get-Content -Raw "$env:USERPROFILE\.ssh\tripylon\tripylon-backend-deploy" | gh secret set DEPLOY_SSH_KEY --env development
Get-Content -Raw "$env:USERPROFILE\.ssh\tripylon\known_hosts" | gh secret set DEPLOY_KNOWN_HOSTS --env development
"143.14.59.7" | gh secret set DEPLOY_HOST --env development
"22" | gh secret set DEPLOY_PORT --env development
"deploy" | gh secret set DEPLOY_USER --env development
gh variable set DEPLOY_PATH --env development --body "/opt/applications/tripylon-backend"
gh variable set DEVELOPMENT_URL --env development --body "https://api.iranihosts.com"
Get-Content -Rawکل فایل چندخطی را یک مقدار میخواند.gh secret setمقدار را بهصورت Secret رمزشده Environment ثبت میکند.gh variable setمقدار غیرحساس را ثبت میکند.
Workflow permissions را Read-only نگه دارید. فقط Job انتشار packages: write دارد. برای main، Checkهای Verify Go backend و Validate container build، حداقل یک Review، رد Approval قدیمی پس از Push جدید، ممنوعیت Force Push و ممنوعیت حذف Branch را اجباری کنید.
پس از نخستین انتشار، دسترسی Read مربوط به Machine Account را در تنظیمات Package GHCR تایید کنید.