کوډنګ اجنټ وايي چې ځانګړنه کار کوي. ښايي رښتیا وي. هغه ازموینې چې ده لیکلې تېرېږي، او دا تر هغه لږ څه ثابتوي چې ټول یې غواړي. هغه څه چې تاسو یې په رښتیا غواړئ دا دي چې مخکې له دې چې کاروونکو ته نږدې شي، په براوزر کې یې پرانیزئ، او دا هم پرته له دې چې له اجنټ وغواړئ تولید ته لاس ووړي.
د مخکتنې چاپېریالونه همدا حل کوي، او د دې لپاره پلاټفارم ته اړتیا نشته. یو VPS د خپل IPv4 سره، Docker، Caddy او دوه لنډ سکرېپټونه هرې څانګې ته خپل URL ورکوي لکه https://feature-login-form.preview.example.com، د پټنوم شاته او په هر push سره بیا جوړېږي. اجنټ داسې SSH کیلي ترلاسه کوي چې مخکتنې پیلولی او درولی شي، او نور هېڅ.
موږ دا په ازمویښتي سرور جوړ کړ او له لیکلو مخکې مو ټوله دوره وچلوله: جوړول، پرانیستل، بیا push، لرې کول، او د کیلي د ناوړه کارونې هڅه.
څه پکار دي
- یو VPS د عامه IPv4 سره. په AI-Agent-IP کې په یو وخت څو مخکتنې ځای کېږي.
- یو wildcard DNS ریکارډ:
*.preview.example.com→ د سرور IP. - ستاسو د اپلیکېشن زېرمه د یو
Dockerfileسره چې په 8080 پورټ خدمت کوي. هره ژبه سمه ده. - Ubuntu 24.04 یا Debian 12/13 د
apt install -y docker.io caddy gitسره.
زېرمه یو ځل د یوازې لوستلو deploy کیلي سره /srv/app ته کلون کړئ.
دوه سکرېپټونه
/usr/local/bin/preview-up یوه څانګه جوړوي او آنلاین کوي یې:
#!/usr/bin/env bash
# preview-up <branch> — build the branch and open it at https://<name>.preview.example.com
set -euo pipefail
BRANCH="$1"
NAME=$(printf '%s' "$BRANCH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/--*/-/g; s/^-//; s/-$//' | cut -c1-40)
DIR=/srv/previews/$NAME
git -C /srv/app fetch --quiet origin "$BRANCH"
rm -rf "$DIR"; git -C /srv/app worktree prune
git -C /srv/app worktree add --quiet --force --detach "$DIR" FETCH_HEAD
docker build --quiet -t "preview-$NAME" "$DIR" >/dev/null
docker rm -f "preview-$NAME" >/dev/null 2>&1 || true
docker run -d --name "preview-$NAME" --restart unless-stopped --memory 512m -p 127.0.0.1::8080 "preview-$NAME" >/dev/null
PORT=$(docker port "preview-$NAME" 8080/tcp | head -1 | awk -F: '{print $NF}')
cat > "/etc/caddy/previews/$NAME.caddy" <<CADDY
$NAME.preview.example.com {
import preview_common
reverse_proxy 127.0.0.1:$PORT
}
CADDY
systemctl reload caddy
echo "https://$NAME.preview.example.com"
/usr/local/bin/preview-down یې لرې کوي:
#!/usr/bin/env bash
# preview-down <branch> — remove the branch preview
set -euo pipefail
NAME=$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/--*/-/g; s/^-//; s/-$//' | cut -c1-40)
docker rm -f "preview-$NAME" >/dev/null 2>&1 || true
docker image rm "preview-$NAME" >/dev/null 2>&1 || true
rm -f "/etc/caddy/previews/$NAME.caddy"; rm -rf "/srv/previews/$NAME"; git -C /srv/app worktree prune
systemctl reload caddy
ځینې انتخابونه په قصد شوي. کانټینرونه یوازې په 127.0.0.1 کې د تصادفي پورټ سره خپرېږي، نو له Caddy پرته هېڅ شی ورته نه رسېږي. دا مهم دی، ځکه هغه پورټونه چې Docker یې خپروي له ufw څخه تېرېږي. هره مخکتنه د 512 MB حافظې حد لري، څو یوه بېواګې څانګه نورې ونه غورځوي. او د همغې څانګې بیا چلول یې په همغه ځای کې بیا جوړوي: push، up وچلوئ، تازه یې کړئ.
Caddy: د هرې مخکتنې لپاره یوه فایل، د ټولو لپاره یو پټنوم
mkdir -p /etc/caddy/previews /srv/previews
chmod +x /usr/local/bin/preview-up /usr/local/bin/preview-down
caddy hash-password --plaintext 'choose-a-review-password'
هش په /etc/caddy/Caddyfile کې کېږدئ:
(preview_common) {
basicauth {
reviewer PASTE-THE-HASH-HERE
}
}
import /etc/caddy/previews/*.caddy
بیا systemctl reload caddy. اوس هره مخکتنه د یو شان ننوتلو شاته ده، نو د ډیبګ وتنو سره نیمګړې څانګه په خلاص انټرنېټ کې نه پاتې کېږي. د Caddy په نویو نسخو کې دا لارښوونه basic_auth هم لیکل کېږي؛ basicauth لا هم په دواړو کې کار کوي.
د اجنټ کیلي: up او down، نور هېڅ
اجنټ ته اړتیا ده چې مخکتنې پیل کړي، نه دا چې د سرور مالک شي. یو deploy کارن او یو دروازې سکرېپټ جوړ کړئ چې دقیقاً دوه کمانډونه مني:
#!/usr/bin/env bash
# /usr/local/bin/preview-gate — the only thing the agent's key may run
set -euo pipefail
read -r ACTION BRANCH EXTRA <<< "${SSH_ORIGINAL_COMMAND:-}"
[[ -z "${EXTRA:-}" && "${BRANCH:-}" =~ ^[A-Za-z0-9][A-Za-z0-9._/-]{0,99}$ && "$BRANCH" != *..* ]] || { echo "usage: up|down <branch>" >&2; exit 2; }
case "$ACTION" in
up) exec sudo /usr/local/bin/preview-up "$BRANCH" ;;
down) exec sudo /usr/local/bin/preview-down "$BRANCH" ;;
*) echo "usage: up|down <branch>" >&2; exit 2 ;;
esac
useradd -m -s /bin/bash deploy
echo 'deploy ALL=(root) NOPASSWD: /usr/local/bin/preview-up, /usr/local/bin/preview-down' > /etc/sudoers.d/preview
chmod 440 /etc/sudoers.d/preview && visudo -cf /etc/sudoers.d/preview
chmod 755 /usr/local/bin/preview-gate
په /home/deploy/.ssh/authorized_keys کې د اجنټ عامه کیلي له دې سکرېپټ سره وتړئ:
restrict,command="/usr/local/bin/preview-gate" ssh-ed25519 AAAA... coding-agent
له هغه ماشین چې اجنټ پرې کار کوي:
ssh deploy@preview.example.com up feature/login-form
# https://feature-login-form.preview.example.com
ssh deploy@preview.example.com down feature/login-form
زموږ په ازموینه کې up څانګه جوړه او خپره کړه، د نوي commit وروسته دویم up نوې نسخه وښوده، او down کانټینر او سایټ دواړه لرې کړل. د دې کیلي سره د cat /etc/shadow، up x; id، د -x یا a/../b په څېر د څانګو نومونه، یا تعاملي ننوتلو هڅو ټولو یوازې usage: up|down <branch> ترلاسه کړ. د څانګې نوم باید په توري یا عدد پیل شي او .. نشي لرلی.
له اجنټ سره نښلول
په Claude Code یا Codex کې د پروژې د لارښوونو په فایل کې یوه کرښه بس ده:
د یوې څانګې له push وروسته
ssh deploy@preview.example.com up <branch>وچلوه او چاپ شوی URL په خپل لنډیز کې ولیکه. کله چې څانګه یوځای یا پرېښودل شي،downوچلوه.
که ستاسو CI دمخه په هر push چلېږي، همغه کمانډ له هغه ځایه وبولئ او کیلي د اجنټ له چاپېریال بشپړه لرې وساتئ. دا سخته لاره ده، او له شخصي پروژې هاخوا هر څه لپاره به موږ همدا غوره کړو.
څه ته پام وکړئ
- ډیسک. هره جوړونه د انځور طبقې پرېږدي. اونيز cron د
docker image prune -fسره دا کنټرولوي؛downد مخکتنې خپل انځور دمخه ړنګوي. - هغه څانګې چې هېڅوک یې نه تړي. اجنټان تر انسانانو ډېرې څانګې پرانیزي. یو cron چې له یوې اونۍ زاړه
preview-*کانټینرونه لېست کړي او پرېpreview-downوچلوي، تاسو د شلو هېرو شوو مخکتنو له موندلو ژغوري. - رازونه. مخکتنې باید د ازمویښتي اسنادو سره وچلېږي. د basic auth پټنوم ناشنا خلک بهر ساتي، خو دا نه سموي چې مخکتنه د تولید ډېټابېس ته ونښلول شي.
- د جوړونې وخت. انځورونه په سرور جوړېږي، نو درنه جوړونه د روانو مخکتنو سره پر CPU سیالي کوي. که جوړونه څو دقیقې نیسي، په CI کې یې جوړ کړئ او انځور راکش کړئ.
لازمه نه ده چې پخپله اجنټ په دې سرور اوسېږي. که اوسېږي، د Claude Code لپاره VPS وګورئ، او د دې لپاره چې دا سرور پخپله فرمایش او ساتنه وکړي، هغه د EQVPS MCP سرور سره ونښلوئ. همغه ماشین ستاسو د ټیم MCP دروازه هم کوربه کولی شي. پرته له کوم سرور د نامعتبر کوډ چلولو لپاره سینډباکسونه شته، او د خپل IPv4 لرونکي پلانونه له میاشتې $8 څخه پیلېږي.
تبصرې
لا تبصرې نشته. لومړی اوسئ.