Платформа

Среда выполнения

Инстанс — обычный Linux-процесс в изолированном пространстве имён. Ниже — границы, внутри которых он живёт.

Файловая система

  • /app — код ревизии, доступен только на чтение.
  • /tmp — запись разрешена, до 512 МБ, очищается при перезапуске.
  • /var/run/vlone — сокет телеметрии и метаданные инстанса.

Локальный диск эфемерен и не общий между инстансами. Для постоянных данных используйте объектное хранилище или внешнюю БД.

Сеть

Входящий трафик приходит только на порт из переменной PORT. Исходящие соединения разрешены без ограничений, но проходят через NAT региона с фиксированным пулом адресов — их можно добавить в allowlist у партнёров.

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }

    http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "ok")
    })

    http.ListenAndServe(":"+port, nil)
}

Переменные окружения

ПеременнаяПримерОписание
PORT8080Порт, который обязан слушать сервис
VLONE_REGIONmsk1Регион инстанса
VLONE_REVISIONr184Текущая ревизия
VLONE_INSTANCE_IDmsk1-a7f3Идентификатор инстанса
VLONE_ENVproductionИмя окружения

Сигналы и завершение

При выводе инстанса из ротации процесс получает SIGTERM. У него есть drain_timeout (по умолчанию 30 секунд), чтобы закрыть соединения. После этого приходит SIGKILL.

const server = app.listen(process.env.PORT);

process.on('SIGTERM', () => {
  server.close(async () => {
    await db.pool.end();
    process.exit(0);
  });

  // страховка: не висеть дольше окна drain
  setTimeout(() => process.exit(1), 25_000).unref();
});

Лимиты инстанса

РазмерvCPUПамятьСоединений
micro0.25256 МБ200
small0.5512 МБ500
medium11 ГБ1 000
large24 ГБ4 000
xlarge48 ГБ8 000

Холодный старт

При scale.min = 0 инстанс останавливается после 5 минут без запросов. Первый запрос после простоя ждёт запуска: 120–400 мс для Go и Rust, 300–900 мс для Node.js и Python. Чтобы холодных стартов не было совсем, поставьте scale.min = 1.