dotnet publish do projeto e inicia o .dll que sai dele. Você envia o código-fonte (com o .csproj), sem as pastas bin e obj. Vale para C#, F# e Visual Basic.
Program.cs
Site.csproj
cube.json
.csproj, .fsproj ou .vbproj) sobe sem cube.json: a Cube entende que é .NET, usa esse projeto como arquivo principal e cria um bot. No painel, o Novo projeto acha os projetos em qualquer pasta (src/Api/Api.csproj, com ou sem a solução na raiz) e marca o mais provável; o site ASP.NET já vem como Site ou API. O projeto escolhido é o que o build publica, esteja onde estiver.
Como funciona
- Build: a cada envio,
dotnet publish <projeto> -c Releasepara a pasta/dados/publish, fora da pasta do código. Opublishbaixa os pacotes do NuGet (o cache fica na pasta do projeto e conta no espaço dele: o segundo envio não baixa de novo). As pastasbineobjdo build também ficam fora do código: não aparecem em Arquivos nem nos backups. Um build que falha deixa o publicado de antes. - Arquivo principal: o projeto que o build publica, na raiz ou numa pasta. Sem ele (só com o comando), o
dotnet publishusa o único projeto ou a solução da raiz. Trocar o projeto em Configurações › Geral publica de novo no próximo início. - Início: o comando roda o
.dllpublicado, com o nome do projeto:Bot.csprojviradotnet /dados/publish/Bot.dll. Se o<AssemblyName>do projeto for outro nome, use ele no comando. - Build próprio: o
builddocube.jsonvale no lugar do automático, e o comando de início roda o.dllque ele gera (por exemplo, o builddotnet publish src/Api/Api.csproj -c Release -o out -p:Tipo=prode o comandodotnet out/Api.dll).
Um .dll pronto
Se você já publica no seu computador (dotnet publish -c Release -o publicado), dá para enviar só o resultado: compacte o que está dentro da pasta publicado (o .dll do programa, o .runtimeconfig.json e o .deps.json dele, as bibliotecas e a wwwroot) e escolha o .dll como arquivo principal. Ele roda com dotnet app.dll, sem build: a Cube não baixa pacotes nem publica nada. O Novo projeto reconhece o programa pelo .runtimeconfig.json ao lado do .dll (as bibliotecas não têm um) e, pelo framework dele, sabe se é um site ASP.NET.
cube.json
net8.0 ou net9.0, ele também roda no .NET 10 (veja Versões e memória).
O build tem até 5 minutos. Medido na Cube em 29/09/2026: uma API ASP.NET mínima fica no ar uns 20 segundos depois do envio, um bot com um pacote do NuGet publica em uns 15 segundos, e um site Razor Pages novo, em menos de 1 minuto.
Sites e APIs
- O ASP.NET já ouve na porta do site: a Cube põe a variável
ASPNETCORE_HTTP_PORTScom a mesma porta daPORT. Useapp.Run()sem endereço; umapp.Run("http://localhost:5000")ou umUseUrlscom porta fixa não recebe as visitas. - O site serve a pasta do
.dllque o comando de início roda: oappsettings.jsone a pastawwwroot(com o CSS e o JavaScript comprimidos que o publish gera) de/dados/publish, do.dllpronto ou da saída do seu build. A variávelASPNETCORE_CONTENTROOTdiz isso, e uma sua vale no lugar. - As visitas chegam por HTTPS no seu endereço, e o ASP.NET entende os cabeçalhos
X-Forwarded-ForeX-Forwarded-Proto(ASPNETCORE_FORWARDEDHEADERS_ENABLED): oUseHttpsRedirectionnão entra em laço e os links saem comhttps://. - Chaves e textos de conexão vão em Variáveis de ambiente e chegam como a configuração do .NET:
ConnectionStrings__PadraoviraConnectionStrings:Padrao.
Bots
Bot.csproj
Environment.GetEnvironmentVariable("TOKEN"). O que o bot escreve no console aparece em Logs, ao vivo.
Versões e memória
- .NET 10, a versão com suporte longo. O .NET 8 e o 9 saem de suporte em novembro de 2026.
- Um projeto em
net8.0ounet9.0também roda sem mudar nada: o build compila para ele e a Cube o roda no .NET 10 (a variávelDOTNET_ROLL_FORWARDvem comoMajor; uma sua vale no lugar). O melhor é passar o<TargetFramework>paranet10.0quando puder. - A memória segue o mínimo do tipo no plano (bot 256 MB nos pagos e 100 MB no Free; site 512 MB). O .NET enxerga o limite do projeto e ajusta o coletor de lixo sozinho: passou do teto, o erro
Out of memoryaparece no log. Medido na Cube: um bot de console usa uns 30 MB, uma API ASP.NET mínima uns 55 MB e um site Razor Pages uns 80 MB.
Problemas comuns
MSB1011: Specify which project or solution file to use: a raiz tem mais de um projeto ou solução e nenhum arquivo principal. Escolha o projeto em Configurações › Geral (ou obuildcom o caminho dele).Could not execute because the specified command or file was not found: o.dlldo comando não existe. Veja primeiro se o build terminou (aba Logs › Instalação). Se terminou, o nome do.dllé o do<AssemblyName>do projeto, quando ele existe: mude o comando de início para o nome certo (os arquivos publicados aparecem na linha-> /dados/...do log). Num.dllpronto, confira o caminho dele dentro do .zip.You must install or update .NET to run this application: o projeto pede um .NET que a Cube não tem e a variávelDOTNET_ROLL_FORWARDfoi trocada. Tire a sua ou passe o projeto paranet10.0.- O site responde, mas o CSS não carrega: o
ASPNETCORE_CONTENTROOTfoi trocado para a pasta do código. Tire a variável (o padrão é a pasta do.dllque roda).

