ساخت و تشخیص استک
گردو برای ساختن برنامه دو راه دارد:
- اگر Dockerfile دارید، همان را میسازد و کاری به تشخیص استک ندارد.
- اگر ندارید، از روی فایلهای پروژه استک را تشخیص میدهد و با یک Dockerfile آماده و آزموده میسازد.
تشخیص استک
گردو فایلهای ریشهٔ پروژه (یا «پوشهٔ ریشه» اگر تنظیمش کردهاید) را به این ترتیب بررسی میکند و اولین مورد را برمیدارد:
| اگر این را پیدا کند | استک |
|---|---|
go.mod | Go |
Cargo.toml | Rust |
Gemfile | Ruby (Rails یا Rack) |
composer.json | Laravel اگر laravel/framework در آن باشد، وگرنه PHP |
manage.py، یا django در فایلهای وابستگی | Django |
requirements.txt، Pipfile یا pyproject.toml | Python |
package.json | بسته به وابستگیها: Next.js، Astro، SvelteKit، Nuxt/Vue، React، یا Node.js |
| هیچکدام، ولی فایل HTML هست | سایت استاتیک |
در پروژههای Node، اگر اسکریپت start در package.json سرور خودش را اجرا کند (مثلاً Express)، استک Node.js است، حتی اگر React هم در وابستگیها باشد.
اگر تشخیص اشتباه بود، در تنظیمات سرویس «استک» را دستی انتخاب کنید.
دستورهای پیشفرض
اگر «دستور ساخت» یا «دستور اجرا» را خالی بگذارید، اینها اجرا میشوند:
| استک | ساخت | اجرا |
|---|---|---|
| Next.js | npm run build | npm start |
| React، Vue، SvelteKit (استاتیک) | npm run build | پوشهٔ dist سرو میشود؛ مسیرهای ناشناخته به index.html میروند |
| Astro | npm run build | پوشهٔ dist سرو میشود |
| سایت استاتیک | npm run build اگر وجود داشته باشد | ریشهٔ پروژه سرو میشود |
| Node.js | npm run build اگر وجود داشته باشد | npm start، وگرنه index.js، server.js یا dist/index.js |
| Python | — | uvicorn یا gunicorn اگر در وابستگیها باشد، وگرنه app.py یا main.py |
| Django | collectstatic | gunicorn با فایل wsgi.py پروژه |
| Go | go build بستهٔ main | باینری ساختهشده |
| PHP | — | سرور PHP روی پوشهٔ public (یا ریشه) |
| Laravel | — | php artisan serve |
| Ruby | assets:precompile برای Rails | rails server یا rackup |
| Rust | cargo build --release | باینری ساختهشده |
مدیر بستهٔ Node از روی lock file انتخاب میشود.
نسخهٔ زبان
گردو نسخهای را میسازد که پروژه اعلام کرده. اولین جایی که نسخه در آن پیدا شود برنده است:
| زبان | از کجا خوانده میشود | نسخههای موجود | پیشفرض |
|---|---|---|---|
| Node.js | NODE_VERSION، .nvmrc، .node-version، .tool-versions، volta.node یا engines.node در package.json | 22، 24، 26 | 22 |
| Python | PYTHON_VERSION، .python-version، runtime.txt، .tool-versions، Pipfile، requires-python در pyproject.toml | 3.9 تا 3.14 | 3.14 |
| Go | GO_VERSION، خط toolchain یا go در go.mod، .tool-versions | 1.22 تا 1.26 | 1.24 |
| PHP | PHP_VERSION، config.platform.php یا require.php در composer.json، .tool-versions | 8.2، 8.3، 8.4 | 8.3 |
| Ruby | RUBY_VERSION، .ruby-version، .tool-versions، Gemfile، Gemfile.lock | 3.1 تا 3.4 | 3.3 |
| Rust | RUST_VERSION، rust-toolchain.toml | نسخههای پایدار 1.x | آخرین نسخهٔ پایدار |
متغیرهای NODE_VERSION و بقیه را مثل هر متغیر دیگری روی سرویس تعریف کنید. نسخه را میشود به شکل بازه نوشت (>=20، ^22، lts/*). اگر چند نسخهٔ موجود داخل بازه باشند، گردو نزدیکترینشان به نسخهٔ پیشفرض را انتخاب میکند؛ برای نسخهٔ مشخص، عدد دقیق بنویسید (24).
خط اول گزارش ساخت نشان میدهد چه نسخهای انتخاب شده و از کجا، مثلاً:
Using Node.js 24 (from .nvmrc: "lts/*")اگر نسخهٔ اعلامشده موجود نباشد، ساخت متوقف نمیشود. گردو نزدیکترین نسخهٔ موجود را برمیدارد و در گزارش مینویسد:
Node.js 18 is not available on Gerdoo; using 22 instead. Supported: 22, 24, 26.ساخت با Dockerfile
اگر Dockerfile در ریشه (یا «پوشهٔ ریشه») باشد، گردو همان را میسازد. اگر Dockerfile جای دیگری است، «مسیر Dockerfile» را بدهید (مثلاً docker/api.Dockerfile) و اگر لازم است «زمینهٔ ساخت»، یعنی پوشهای که COPYها از آن خوانده میشوند.
- برنامه همچنان باید روی
PORTیا «پورت داخلی» سرویس گوش بدهد.EXPOSEدر Dockerfile به تنهایی کافی نیست. - متغیرهای زمان ساخت بعد از هر خط
FROMبه شکلENVاضافه میشوند، پس در همهٔ مرحلههای ساخت در دسترساند و لازم نیستARGتعریف کنید. اگر Dockerfile بعداً باENVهمان نام را دوباره مقدار بدهد، مقدار Dockerfile برنده است. - ساخت چندمرحلهای (multi-stage) پشتیبانی میشود و برای کوچکتر شدن ایمیج توصیه میشود.
سایتهایی که از Vercel آمدهاند
اگر سایت استاتیک یا React/Vue/Astro/SvelteKit شما vercel.json دارد، گردو redirectها، rewriteها، هدرها و cleanUrls آن را اعمال میکند. جزئیات و محدودیتها در فایلهای پیکربندی.
اگر ساخت شکست خورد
گزارش ساخت را از زبانهٔ «استقرارها» باز کنید و از آخر به بالا بخوانید. رایجترین دلیلها و راهحلشان در عیبیابی ساخت آمده است.
وابستگیها از آینههای داخلی npm، PyPI و Go نصب میشوند تا ساخت از ایران سریع و پایدار باشد. لازم نیست چیزی تنظیم کنید.