/opt/server/ é um repositório git privado hospedado no GitHub. Sua única função é permitir um deploy reproduzível: subiu uma máquina nova, instalou Docker, clonou o repo, rodou o bootstrap — infra de pé.

Filosofia

Só infra, sem projetos

O repo guarda apenas a infra compartilhada e a documentação. Cada projeto em projetos/ mora em seu próprio repositório.

Sem segredos

.env reais, dados de volume, certificados e credenciais geradas nunca entram no repo. Só os .env.example (templates).

Reproduzível

Servidor novo = git clone + ./bootstrap.sh + docker compose up -d. Tudo descrito em Primeiro deploy.

Privado

Mesmo sem segredos, o repo é privado. Composes revelam topologia interna que não precisa ser pública.

O que entra no git

/opt/server/
├── .gitignore
├── README.md
├── docs/                          # toda a documentação Mintlify
└── infra/
    ├── .env.example               # templates (sem segredo)
    ├── bootstrap.sh
    ├── npm/docker-compose.yml
    ├── postgres/
    │   ├── docker-compose.yml
    │   ├── .env.example
    │   └── create-db.sh
    ├── redis/
    │   ├── docker-compose.yml
    │   └── .env.example
    └── n8n/
        ├── docker-compose.yml
        └── .env.example
E projetos/.gitkeep — só pra preservar a pasta vazia (git não rastreia diretórios sem arquivos).

O que NÃO entra (.gitignore)

PadrãoPor quê não vai pro git
.env, .env.localSenhas reais geradas pelo bootstrap
infra/*/data/Dados persistentes (DBs, workflows, configs do NPM)
infra/npm/letsencrypt/Chaves privadas dos certificados TLS
infra/postgres/secrets/Credenciais de DBs criados pelo create-db.sh
projetos/* (exceto .gitkeep)Cada projeto é um repo separado
node_modules/, .next/, .cache/Lixo de Node/Mintlify
.DS_Store, *.swp, .vscode/, .idea/Lixo de OS/editor
Os .env.example versionáveis usam placeholders vazios — nunca preencha valores reais neles. Quem preenche é o bootstrap.sh, e ele escreve no .env (que é ignorado).

Subir num servidor novo

1

Pré-requisitos no host

# docker + docker compose
sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER
newgrp docker
2

Clonar o repo em /opt/server

sudo mkdir -p /opt/server
sudo chown $USER:$USER /opt/server
git clone git@github.com:<seu-usuario>/<repo>.git /opt/server
3

Bootstrap

cd /opt/server/infra
./bootstrap.sh
Isso cria a rede server_net e gera todos os segredos em .env locais.
4

Subir os serviços

Seguir a ordem em Primeiro deploy.

Atualizando o repo

Mudanças na infra (compose, scripts, docs) seguem o ciclo git normal:
cd /opt/server
git status                        # ver o que mudou
git add infra/postgres/docker-compose.yml
git commit -m "postgres: bump para 17"
git push
Em outros servidores, basta:
cd /opt/server
git pull
cd infra/postgres && docker compose up -d   # aplica mudança

Backup vs versionamento

Git não substitui backup. O repo só guarda configuração. Os dados reais (infra/*/data/, certificados do NPM) precisam de backup separado — snapshot da VM, rsync periódico, ou tar agendado.