Empacotamento e Implantação
Empacotamento para Implantação
Quando seu app estiver pronto, você precisa empacotá-lo em um arquivo .zip para fazer o upload. O arquivo ZIP deve seguir convenções específicas de estrutura e incluir um arquivo manifest.json obrigatório.
O Arquivo manifest.json (Obrigatório)
Todos os apps devem incluir um arquivo manifest.json no diretório assets/. Este arquivo contém os metadados do seu app:
{
"app": {
"type": "lua",
"name": "my-app",
"title": "My App",
"version": "1.0.0",
"description": "Uma breve descrição do que seu app faz",
"dependencies": [
{
"name": "other-app",
"version": ">=1.0.0"
}
]
},
"contact_fields": [
{
"type": "STRING",
"name": "customer_id",
"display": "ID do Cliente",
"private": false
}
],
"journeys": [
{
"name": "Jornada de Boas-vindas",
"file": "journeys/welcome.md",
"description": "Dá boas-vindas a novos usuários"
}
],
"media_assets": [
{
"asset_path": "images/logo.png",
"filename": "logo.png",
"content_type": "image/png",
"description": "Logotipo da empresa"
}
]
}
Metadados do App (Obrigatório)
Campos obrigatórios:
app.type: O tipo do app (ex:"lua"para apps Lua)app.name: O nome do seu app (deve corresponder ao nome do arquivo Lua principal sem extensão)app.title: O título de exibição para seu app (mostrado na UI da Turn)app.version: String de versão semântica (ex:1.0.0,2.1.3,1.0.0-beta)app.description: Uma breve descrição da funcionalidade do seu app
Campos opcionais:
app.dependencies: Um array de apps que devem estar instalados para que seu app funcione. Cada dependência deve especificar:name: O nome exato do app requeridoversion: Uma restrição de versão (ex:>=1.0.0,~>2.1,1.0.0)
Comportamento de dependências:
- Se
dependenciesnão for especificado ou for um array vazio[], a plataforma assume que seu app não tem dependências e pode ser instalado independentemente - Quando dependências são especificadas, a plataforma valida que todos os apps requeridos estão instalados com versões compatíveis antes de permitir a instalação
- Entradas de dependência inválidas (sem
nameouversion) são silenciosamente ignoradas
Campos de Contato (Opcional)
O array contact_fields define campos personalizados que seu app adicionará aos contatos. Esses campos são criados automaticamente quando o app é instalado usando turn.manifest.install().
"contact_fields": [
{
"type": "STRING",
"name": "customer_id",
"display": "ID do Cliente",
"private": false
},
{
"type": "BOOLEAN",
"name": "is_premium",
"display": "Membro Premium",
"private": false
},
{
"type": "NUMBER",
"name": "loyalty_points",
"display": "Pontos de Fidelidade",
"private": true
}
]
Propriedades do campo:
type(obrigatório): Tipo do campo -"STRING","BOOLEAN","NUMBER", ou"DATE"name(obrigatório): Nome interno do campo (minúsculas, sublinhados permitidos)display(obrigatório): Rótulo legível mostrado na UIprivate(obrigatório):truepara ocultar de usuários não-admin,falsepara mostrar a todos
Notas:
- Campos são criados automaticamente durante a instalação do app
- Campos podem ser inscritos para notificações de mudança usando
turn.app.set_contact_subscriptions() - Use
private: truepara dados sensíveis como registros médicos, informações financeiras ou identificadores pessoais
Jornadas (Opcional)
O array journeys define templates de jornada que seu app fornece. Estes são arquivos markdown no seu diretório assets/ que definem fluxos de conversação.
"journeys": [
{
"name": "Jornada de Boas-vindas",
"file": "journeys/welcome.md",
"description": "Dá boas-vindas a novos usuários e coleta informações básicas"
},
{
"name": "Fluxo de Pagamento",
"file": "journeys/payment.md",
"description": "Processa pagamentos com integração Stripe"
}
]
Propriedades da jornada:
name(obrigatório): Nome de exibição para a jornada na UI da Turnfile(obrigatório): Caminho para o arquivo markdown dentro do diretórioassets/description(obrigatório): Breve descrição do que a jornada faz
Notas:
- Arquivos de jornada são importados automaticamente durante a instalação ao usar
turn.manifest.install() - Jornadas podem chamar de volta para seu app usando a função DSL
app() - Arquivos markdown de jornadas suportam a sintaxe DSL completa de jornadas da Turn.io
Ativos de Mídia (Opcional)
O array media_assets define imagens e outros arquivos de mídia incluídos com seu app. Estes são enviados e disponibilizados para uso em jornadas e mensagens.
"media_assets": [
{
"asset_path": "images/welcome-banner.jpg",
"filename": "welcome-banner.jpg",
"content_type": "image/jpeg",
"description": "Imagem de banner de boas-vindas"
},
{
"asset_path": "images/logo.png",
"filename": "logo.png",
"content_type": "image/png",
"description": "Logotipo da empresa"
},
{
"asset_path": "documents/terms.pdf",
"filename": "termos-de-servico.pdf",
"content_type": "application/pdf",
"description": "Documento de termos de serviço"
}
]
Propriedades do ativo de mídia:
asset_path(obrigatório): Caminho para o arquivo dentro do diretórioassets/do seu appfilename(obrigatório): Nome a usar ao fazer upload (pode ser diferente de asset_path)content_type(obrigatório): Tipo MIME (ex:"image/jpeg","image/png","application/pdf")description(obrigatório): Descrição do propósito do ativo
Tipos de conteúdo suportados:
- Imagens:
image/jpeg,image/png,image/gif,image/webp - Documentos:
application/pdf - Vídeos:
video/mp4,video/3gpp - Áudio:
audio/mpeg,audio/ogg,audio/aac
Notas:
- Arquivos de mídia são enviados para o armazenamento de mídia da Turn durante a instalação
- Arquivos enviados recebem URLs únicas que podem ser usadas em mensagens e jornadas
- Use
turn.assets.read()para acessar o conteúdo binário de ativos para upload
Sem o arquivo manifest.json, o upload do seu app falhará com um erro :manifest_not_found.
Estrutura do Arquivo ZIP
Seu app deve seguir esta estrutura:
my-app.zip
├── my-app.lua # Arquivo principal (obrigatório, deve corresponder ao nome do app)
├── my-app/ # Opcional: Diretório de módulos
│ ├── utils.lua
│ ├── handlers.lua
│ └── api/
│ └── client.lua
└── assets/ # Obrigatório: Contém manifest e arquivos estáticos
├── manifest.json # OBRIGATÓRIO: Metadados do app
├── templates/
│ └── welcome.md
└── images/
└── logo.png
Importante: O diretório assets/ agora é obrigatório (não opcional) já que deve conter o arquivo manifest.json.
Usando o Docker SDK (Recomendado)
Se você usou o Docker SDK para criar o scaffold do seu app, o empacotamento é simples:
make build
# Isso cria my_app-0.0.1.zip (versão do manifest.json)
O comando build automaticamente:
- Inclui seu arquivo
.luaprincipal - Inclui o diretório
assets/commanifest.json - Inclui quaisquer módulos no diretório
lib/ - Exclui arquivos de teste e arquivos de desenvolvimento
Usando o Script Zip-It
O template tradicional inclui um script zip-it.sh que automatiza o empacotamento:
./zip-it.sh
# O script irá remover quaisquer arquivos zip antigos,
# criar um novo arquivo zip com seu código mais recente
Empacotamento Manual
Se você precisar de mais controle sobre o empacotamento:
# App simples (arquivo único)
zip payment-processor-1.0.0.zip payment-processor.lua
# App com módulos
zip -r my-app-1.0.0.zip my-app.lua my-app/
# App com ativos
zip -r my-app-1.0.0.zip my-app.lua my-app/ assets/
# Excluir arquivos de teste
zip -r my-app-1.0.0.zip my-app.lua my-app/ assets/ -x "*/spec/*" "*/turn.lua" "*.rockspec"
# Verificar conteúdo
unzip -l my-app-1.0.0.zip
Notas Importantes
NÃO inclua no seu ZIP:
- Arquivos de teste (diretório
spec/) - Mock da API Turn (
turn.lua) - Arquivos de desenvolvimento (
*.rockspec,.git/, etc.) - Arquivos de documentação (
README.md, a menos que em assets/)
INCLUA:
- Arquivo principal do app (deve corresponder ao nome do app)
- Arquivo
assets/manifest.json(OBRIGATÓRIO) - Todos os módulos Lua necessários
- Pasta de ativos com manifest.json e quaisquer templates/imagens
- Quaisquer arquivos de configuração que seu app precise
Processo de Upload
- Vá para a plataforma Turn.io
- Navegue até Configurações → Apps
- Clique em "Carregar Novo App"
- Selecione seu arquivo ZIP
- A plataforma validará:
- Presença de
assets/manifest.json - Estrutura JSON válida no manifest
- Campos obrigatórios (name, version, description)
- Formato de versionamento semântico
- Presença de
- Após validação bem-sucedida, uma definição de app será criada
Fornecendo Documentação do App na UI
Para garantir uma ótima experiência do usuário, você pode fornecer documentação que aparecerá diretamente na UI da Turn.io. Lide com o evento get_app_info_markdown e retorne uma string Markdown.
Este é o lugar perfeito para explicar o que seu app faz, listar suas funcionalidades e fornecer instruções de configuração ou exemplos de endpoint de API.
elseif event == "get_app_info_markdown" then
return [[
# Meu App Incrível
Este app se integra com o serviço externo `XYZ`.
## Configuração
Para usar este app, forneça sua `XYZ_API_KEY` na configuração abaixo.
## Endpoint de Webhook
Envie requisições `POST` do seu serviço para a seguinte URL:
`/apps/]] .. app.uuid .. [[/webhook`
]]
end