Runtimes
A Zenifra não faz detecção automática de runtime. Em projetos com origem em um repositório Git, o usuário escolhe explicitamente o runtime no momento da criação do projeto.
Runtimes suportados
| Runtime | Como funciona |
|---|---|
| Node.js | O usuário escolhe a versão no console e a plataforma instala dependências com npm ci |
| Python | O usuário escolhe a versão no console e a plataforma instala dependências com pip install --no-cache-dir -r requirements.txt, quando o arquivo existe |
| Bun | O usuário escolhe a versão no console e a plataforma instala dependências com bun install --frozen-lockfile |
| Go | O usuário escolhe a versão no console; os módulos do go.mod são baixados pela própria build, sem etapa de instalação separada |
| Java | O usuário escolhe a versão do JDK no console; as dependências são baixadas pela build (Maven ou o Gradle wrapper do repositório), sem etapa de instalação separada |
Nota: Hoje, os runtimes oficialmente suportados para builds por repositório Git são
Node.js,Python,Bun,GoeJava. PHP, .NET, Nginx, Apache e outros stacks devem ser publicados via Imagem OCI.
Versões disponíveis
| Runtime | Versões | Porta padrão sugerida |
|---|---|---|
| Node.js | 20, 22, 24 e 26 | 3000 |
| Python | 3.11, 3.12, 3.13 e 3.14 | 8000 |
| Bun | 1.2, 1.3 e 1.4 | 3000 |
| Go | 1.25, 1.26 e 1.27 (padrão 1.27) | 8080 |
| Java | 17, 21 e 25, todas LTS (padrão 21) | 8080 |
Escolha a mesma versão principal usada no desenvolvimento. A porta sugerida é apenas um ponto de partida: o campo Porta do projeto precisa ser igual à porta em que a aplicação escuta.
Ambiente de build e execução
- As variáveis de ambiente do projeto ficam disponíveis durante a instalação de dependências, o
pre-builde abuild, além da execução. Isso permite usar variáveis em etapas de build, comoNEXT_PUBLIC_*ouVITE_*. - Alterar uma variável reinicia as instâncias, mas não refaz a build. Valores embutidos durante a build só mudam numa nova publicação.
- A aplicação roda com um usuário sem privilégios, dentro do diretório da aplicação. Ela pode gravar nesse diretório, mas os arquivos são efêmeros, salvo no armazenamento persistente.
- No Node.js e no Bun, a execução usa
NODE_ENV=production. - A build usa a pasta definida em Diretório raiz (por padrão, a raiz do repositório; em monorepos, uma subpasta como
backend) e um ambiente gerado pela Zenifra para o runtime escolhido: umDockerfileexistente no repositório não é usado. Para construir com o seu próprioDockerfile, publique uma Imagem OCI. - A pasta
.gitdo repositório não é incluída na aplicação publicada. Se sua aplicação lia informações do Git em tempo de execução (por exemplo, o commit atual), use uma variável de ambiente. - No Python, a saída de
print()eloggingé enviada sem buffer para os logs, e o ambiente de build inclui compilador C e as bibliotecas do cliente PostgreSQL para pacotes com extensões nativas.
Regra importante
Em projetos GitHub criados pelo console, runtime, versão e branch não podem ser alterados no console; pela API (PUT /v1/project/:id/source) ou pela CLI (zenifra project source) é possível reconfigurar a origem. Em projetos Forgejo, a seção Repositório Git da página do projeto permite alterar runtime, versão e comandos.
Node.js
Arquivos obrigatórios
{
"name": "my-app",
"scripts": {
"start": "node index.js"
}
}Para projetos Node.js baseados em Git, estes arquivos são obrigatórios:
package.jsonpackage-lock.json
Instalação padrão de dependências
A Zenifra instala as dependências com:
npm ciPor padrão, npm ci instala as dependências declaradas no lockfile. Mantenha TypeScript, bundlers e outras ferramentas de build em devDependencies. Se a configuração do projeto definir NODE_ENV=production para a build, essa instalação omite essas dependências; nesse caso, configure o pre-build como npm install --include=dev. Ele é executado depois da instalação padrão e antes de npm run build, tornando as ferramentas disponíveis para a build. O runtime atual não remove devDependencies depois dessa etapa.
Sem comando
build: quando o campobuildfica vazio, asdevDependenciessão removidas depois da instalação. Tudo o que o comandostartusa precisa estar emdependencies.
Projetos Git com Yarn ou pnpm só são compatíveis com o runtime Node.js atual quando também fornecem um package-lock.json npm compatível. A Zenifra não converte automaticamente lockfiles nem workspaces de Yarn ou pnpm; sem um lockfile npm compatível, publique uma Imagem OCI preparada pelo seu próprio processo de build.
Comandos do projeto
Depois da instalação padrão, os comandos abaixo são definidos pelo usuário na criação do projeto:
pre-build(opcional)build(opcional)start(obrigatório)
Um uso comum de pre-build em Node.js é gerar código antes da build, como clientes de ORM. O pre-build roda durante a build, não a cada início da aplicação; para migrations de banco, prefira executá-las no início do start, como mostram os guias por framework.
Python
Arquivos de dependências
Mantenha um requirements.txt no Diretório raiz do projeto (por padrão, a raiz do repositório) com as dependências de execução. A instalação abaixo só roda quando esse arquivo existe. Se o repositório também tiver pyproject.toml ou setup.py, o pacote é instalado com pip install -e . depois da build.
Instalação padrão de dependências
pip install --no-cache-dir -r requirements.txtComandos do projeto
Assim como em Node.js, estes comandos são definidos pelo usuário na criação do projeto:
pre-build(opcional)build(opcional)start(obrigatório)
Bun
Arquivos
{
"name": "my-app",
"scripts": {
"start": "bun index.ts"
}
}package.json(obrigatório)bun.lock(recomendado): versione o lockfile para que a build instale exatamente as mesmas versões usadas no desenvolvimento. Gere-o com a mesma versão do Bun escolhida no projeto: um lockfile criado por uma versão mais nova pode ser recusado por uma versão anterior.
Instalação padrão de dependências
bun install --frozen-lockfileAs devDependencies continuam instaladas depois da build, então ferramentas como TypeScript e bundlers ficam disponíveis no pre-build e na build. O Bun executa TypeScript diretamente, sem etapa de compilação obrigatória.
Comandos do projeto
O comando start padrão é bun run start, que executa o script start do package.json. Assim como nos outros runtimes, também é possível definir:
pre-build(opcional)build(opcional)start(obrigatório)
Go
Arquivos
Mantenha o go.mod (e o go.sum) no Diretório raiz do projeto (por padrão, a raiz do repositório). Escolha uma versão do Go igual ou mais nova que a linha go do go.mod: com uma versão anterior, a build para com go.mod requires go >= …. Não há etapa de instalação separada: os módulos são baixados pela própria build, e uma pasta vendor/ versionada funciona com go build -mod=vendor.
Comandos padrão
# build
go build -o app .
# start
./appA build padrão compila o pacote main da raiz. Se ele estiver numa subpasta, como no formato cmd/server, aponte a build para ela:
go build -o app ./cmd/serverO pre-build (opcional, por exemplo go generate ./...) roda antes da build. Se o campo build ficar vazio, nada é compilado e o start não terá o que executar.
Observações
- A build é estática: o CGO fica desativado e o ambiente não tem compilador C. Pacotes que dependem de CGO precisam de uma alternativa em Go puro ou de uma Imagem OCI. Por exemplo,
github.com/mattn/go-sqlite3compila, mas falha quando a aplicação inicia (requires cgo); usemodernc.org/sqlite. Drivers em Go puro, como opgx, funcionam normalmente. - Arquivos incorporados com
//go:embed(templates, arquivos estáticos) entram no binário normalmente. - O binário não inclui informações do Git. Para expor a versão ou o commit, use uma variável de ambiente.
- O ambiente define
PORT=8080por padrão. Leia a porta dePORTe mantenha o campo Porta do projeto igual à porta em que a aplicação escuta.
Java
Ambiente e arquivos
A build usa um JDK Eclipse Temurin na versão escolhida (17, 21 ou 25) com Maven 3.9. Em projetos Maven, mantenha o pom.xml no Diretório raiz; em projetos Gradle, versione o wrapper (gradlew e a pasta gradle/). Não há etapa de instalação separada: as dependências são baixadas pela build. Se o projeto tiver um .dockerignore, ele não é usado nessa build.
Comandos padrão (Maven)
# build
mvn -B -DskipTests package
# start
java -jar target/*.jarO start padrão espera um único jar executável em target/, como o gerado pelo Spring Boot. Se o projeto tiver o Maven Wrapper, use ./mvnw -B -DskipTests package como build.
Gradle
Projetos Gradle usam o wrapper do próprio repositório. Por exemplo, com Spring Boot:
# build
./gradlew bootJar -x test
# start
java -jar build/libs/<nome>.jar- Aponte o jar exato no
start: o Gradle também gera um-plain.jar, que não é executável. - Se o
build.gradledefine um toolchain Java (languageVersion = JavaLanguageVersion.of(17)), escolha essa mesma versão no projeto. Caso contrário, a build falha procurando esse JDK. - Com Kotlin e Ktor,
./gradlew buildFatJargerabuild/libs/<nome>-all.jar.
Outros frameworks
| Framework | build | start |
|---|---|---|
| Spring Boot (Maven) | mvn -B -DskipTests package | java -jar target/*.jar |
| Quarkus | mvn -B -DskipTests package | java -jar target/quarkus-app/quarkus-run.jar |
Javalin e outros com maven-shade-plugin | mvn -B -DskipTests package | java -jar target/<nome>.jar |
| Ktor (Gradle) | ./gradlew buildFatJar | java -jar build/libs/<nome>-all.jar |
No Quarkus, defina quarkus.http.port=${PORT:8080} no application.properties ou mantenha a Porta do projeto em 8080.
Um programa de arquivo único (Main.java) pode rodar sem build: deixe o build vazio e use java Main.java como start.
Memória
A aplicação inicia com -XX:MaxRAMPercentage=75: a JVM usa até 75% da memória do plano para o heap, em vez dos 25% padrão da JVM. Para mudar, defina a variável de ambiente JAVA_TOOL_OPTIONS.
Observações
- O
pre-build(opcional) roda antes dabuild. - O ambiente define
PORT=8080por padrão, e o Spring Boot já escuta em8080. Se a aplicação usar outra porta, ajuste o campo Porta do projeto.
O que editar depois
Em projetos GitHub, depois da criação, ficam editáveis os comandos pre-build, build e start e a forma de atualização; runtime, versão e branch são definidos na criação. Consulte Implantação via GitHub.
Em projetos Forgejo, também é possível trocar repositório, branch, runtime, versão e modo de deploy depois da criação; consulte Deploy a partir do Forgejo.
Última atualização em
Health checks para projetos HTTP
Configure o health check de projetos HTTP, valide respostas 2xx, acompanhe falhas por 30 dias e mantenha instâncias disponíveis na Zenifra.
Templates na Zenifra
Implante n8n, Metabase, WordPress e outras aplicações prontas com um clique ou crie Templates para sua organização.