پرش به محتویات

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 کلید عمومی است.
  • -C Comment قابل شناسایی 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 22 Port را تعیین می‌کند.
  • 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 تایید کنید.

مرحله قبل: آماده‌سازی VPS | مرحله بعد: Reverse Proxy و TLS