Definitions e Instances
Um template é a especificação de um serviço — abstrato, reutilizável. Para virar um container rodando, ele precisa de duas etapas intermediárias: uma definition e uma instance.
Conceitos
Definition
Uma definition é um template + inputs + profile + instance_uid. Representa a intenção de ter um serviço configurado de determinada forma neste host.
Template (memos)
+
Inputs (WEB_HOSTNAME=memos.example.com)
+
Profile (production)
+
instance_uid (memos-blog-001)
=
Definition "memos-blog-001"A definition resolve todas as referências do template:
${input.WEB_HOSTNAME}→memos.example.com${secrets.MARIADB_ROOT_PASSWORD}→ gerado e persistido${needs.database.host}→ container do asset MariaDB${instance.uid}→memos-blog-001
Instance
Uma instance é a materialização da definition: um container rodando no Docker, com volumes, rede, healthcheck e labels.
Definition "memos-blog-001"
↓
docker create + docker start
↓
Instance (container_id: abc123…, status: running)A regra é simples: uma instance por instance_uid. Tentar deployar o mesmo instance_uid duas vezes resulta em update da existente, não em duplicação.
Inputs
Os inputs vêm de três fontes do bloco config do template:
| Tier | Quando aparece no wizard | Exemplo |
|---|---|---|
config.required |
Sempre — usuário deve fornecer | WEB_HOSTNAME |
config.optional |
Sempre — tem default, usuário pode aceitar | MEMOS_MODE=prod |
config.advanced |
Só com --advanced ou modo expert |
PHP_MEMORY_LIMIT |
O CLI oferece dois modos de fornecimento:
Wizard interativo — agrupa inputs por prefixo (MAIN_DB_*, WEB_*, SMTP_*), valida pattern e oferece ajuda inline com ?:
deployally deploy --species memos --instance-uid memos-blog-001Flags inline — sem wizard, ideal para automação:
deployally deploy --species memos --instance-uid memos-blog-001 \
--input WEB_HOSTNAME=memos.example.com \
--input MEMOS_MODE=prod \
--profile production \
--applySecrets
Secrets nunca aparecem no wizard. Eles são resolvidos por uma chain de providers declarada no template:
secrets:
MARIADB_ROOT_PASSWORD:
kind: password
length: 32
providers: [local, random]
persist: trueA chain [local, random] significa: primeiro tenta ler de /opt/deployally/<uid>/secrets/MARIADB_ROOT_PASSWORD (provider local); se não existir, gera aleatório (provider random) e persiste. No próximo redeploy do mesmo instance_uid, o secret é reaproveitado — sem perder a senha do banco.
Outros providers disponíveis incluem vault, env e input (quando o usuário precisa fornecer o segredo, como uma chave de API externa).
Profile
O profile é um override declarativo aplicado em cima da definition base. Mesmo template, sizing diferente:
profiles:
development:
overrides:
resources.memory.limit: 128M
config.optional.MEMOS_MODE.default: dev
production:
overrides:
resources.memory.limit: 256M
config.optional.MEMOS_MODE.default: proddeployally deploy --species memos --instance-uid memos-blog-001 \
--profile development \
--applyCiclo de Vida
┌─────────────┐
│ Template │ (catálogo)
└──────┬──────┘
│ deployally deploy --species X
▼
┌─────────────┐
│ Definition │ (template + inputs + profile + uid)
└──────┬──────┘
│ --apply (resolve secrets, needs, cria recursos)
▼
┌─────────────┐
│ Instance │ (container running)
└─────────────┘Multi-Tenancy: Per-Instance Provisioning
Quando uma aplicação declara needs de um asset, o asset dispatcher provisiona recursos isolados por instância. Exemplo do WordPress sobre MariaDB:
# wordpress.yaml
needs:
database:
class: relational
options: [mariadb, mysql]
per_instance:
database: "wp_${instance.uid}"
user: "wp_${instance.uid}"
password: ${secrets.WP_DB_PASSWORD}
on_provision: create_user_and_db
on_decommission: drop_user_and_dbNo deploy de uma instance WordPress, o dispatcher chama a function create_user_and_db declarada pela MariaDB (em provides.functions) passando db_name=wp_<uid>, user=wp_<uid> e password=<secret>. Resultado: uma MariaDB compartilhada, N WordPress isolados, cada um com seu próprio banco/usuário/senha.
Ver detalhes em Ecologia.
Auto-Provision em Cascata
Se o asset declarado em needs ainda não existe no host, o flag --provision-missing-assets instrui o deploy a criá-lo automaticamente — primeira opção de needs.options, variant default: true, mesmo profile do consumer:
deployally deploy --species wordpress --instance-uid wp-blog-001 \
--input WEB_HOSTNAME=blog.example.com \
--provision-missing-assets \
--applySem esse flag, o deploy aborta exigindo o asset preexistente.
Comandos
# Listar instances ativas
deployally list
# Detalhes de uma instance
deployally show memos-blog-001
# Logs em tempo real
deployally logs memos-blog-001 --follow
# Executar uma action declarada no template
deployally action memos-blog-001 restart
# Decommission (remove container + cleanup)
deployally remove memos-blog-001Próximos Passos
- Templates — Estrutura do template que origina a definition.
- Manifestos — Onde a instance persiste config rendered e secrets.
- Ecologia — Como
needseprovidesconectam apps e assets.