mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 19:01:47 +00:00
Compare commits
3 Commits
58db357cde
...
v2.3.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1161e97d9e | ||
|
|
55d7dedd9a | ||
|
|
ad2752b7b0 |
@@ -7,6 +7,15 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.3.8] - 2026-04-12
|
||||||
|
|
||||||
|
### Alterado
|
||||||
|
|
||||||
|
- Docker: `docker-compose.yml` refatorado — removidos profiles, build e dependência de arquivo externo; compose agora é standalone (basta `curl` + `docker compose up -d`)
|
||||||
|
- Docker: `docker-entrypoint.sh` simplificado — extensão `pgcrypto` criada via Node.js antes das migrations; loop de retry reescrito; removido hack `@localhost → @db`
|
||||||
|
- Docker: scripts reduzidos de 10 para 5 — `docker:up`, `docker:db`, `docker:down`, `docker:logs`, `docker:update`
|
||||||
|
- Docs: README reestruturado em dois perfis claros — **Usar** (só Docker) e **Desenvolver** (hot-reload)
|
||||||
|
|
||||||
## [2.3.7] - 2026-04-11
|
## [2.3.7] - 2026-04-11
|
||||||
|
|
||||||
### Adicionado
|
### Adicionado
|
||||||
|
|||||||
215
README.md
215
README.md
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
> **⚠️ Não há versão online hospedada.** Você precisa clonar o repositório e rodar localmente ou no seu próprio servidor.
|
> **⚠️ Não há versão online hospedada.** Você precisa clonar o repositório e rodar localmente ou no seu próprio servidor.
|
||||||
|
|
||||||
[](CHANGELOG.md)
|
[](CHANGELOG.md)
|
||||||
[](https://nextjs.org/)
|
[](https://nextjs.org/)
|
||||||
[](https://www.typescriptlang.org/)
|
[](https://www.typescriptlang.org/)
|
||||||
[](https://www.postgresql.org/)
|
[](https://www.postgresql.org/)
|
||||||
@@ -33,11 +33,8 @@
|
|||||||
|
|
||||||
- [Sobre o Projeto](#-sobre-o-projeto)
|
- [Sobre o Projeto](#-sobre-o-projeto)
|
||||||
- [Como rodar o OpenMonetis](#-como-rodar-o-openmonetis)
|
- [Como rodar o OpenMonetis](#-como-rodar-o-openmonetis)
|
||||||
- [Antes de tudo: preparar o servidor](#-antes-de-tudo-preparar-o-servidor-ubuntu-2404)
|
- [Perfil 1 — Usar](#perfil-1--usar-self-hosting)
|
||||||
- [Modo 1 — Só quero usar](#modo-1--só-quero-usar-sem-mexer-no-código)
|
- [Perfil 2 — Desenvolver](#perfil-2--desenvolver)
|
||||||
- [Modo 2 — Quero configurar opcionais](#modo-2--quero-configurar-opcionais-oauth-e-mail-ia)
|
|
||||||
- [Modo 3 — Quero contribuir com o código](#modo-3--quero-contribuir-com-o-código)
|
|
||||||
- [Modo 4 — Banco remoto](#modo-4--banco-remoto-supabase-neon-railway)
|
|
||||||
- [Scripts Disponíveis](#-scripts-disponíveis)
|
- [Scripts Disponíveis](#-scripts-disponíveis)
|
||||||
- [Docker](#-docker)
|
- [Docker](#-docker)
|
||||||
- [Backup](#-backup)
|
- [Backup](#-backup)
|
||||||
@@ -108,127 +105,85 @@ A ideia é simples: ter um lugar onde consigo ver todas as minhas contas, cartõ
|
|||||||
|
|
||||||
## 🚀 Como rodar o OpenMonetis
|
## 🚀 Como rodar o OpenMonetis
|
||||||
|
|
||||||
O OpenMonetis precisa de dois serviços funcionando ao mesmo tempo para operar: **o app** (a interface e a lógica do sistema) e **o banco de dados** (onde ficam guardados seus lançamentos, contas, categorias etc.). Existem algumas formas de subir os dois, dependendo do que você quer fazer.
|
Escolha o perfil que corresponde ao seu objetivo:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🖥️ Antes de tudo: preparar o servidor (Ubuntu 24.04)
|
### Perfil 1 — Usar (self-hosting)
|
||||||
|
|
||||||
Se você está em um **servidor Ubuntu limpo** (VPS, Oracle Cloud, DigitalOcean...) sem Docker, Node.js ou pnpm instalados, rode esse script primeiro. Ele instala tudo que é necessário automaticamente e pula o que já estiver presente.
|
Só quer rodar o OpenMonetis. **Não precisa clonar o repositório nem instalar Node.js** — apenas Docker.
|
||||||
|
|
||||||
> ⚠️ **Testado apenas em Ubuntu Server 24.04 LTS.** Em outras distribuições ou versões, instale as dependências manualmente.
|
```bash
|
||||||
|
# 1. Baixe o compose
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml
|
||||||
|
|
||||||
|
# 2. Suba tudo
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Acesse em: `http://localhost:3000`
|
||||||
|
|
||||||
|
O banco sobe com credenciais padrão. Para personalizar (senha, Google OAuth, e-mail, IA...), crie um `.env` na mesma pasta **antes** de subir:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env mínimo recomendado para produção
|
||||||
|
BETTER_AUTH_SECRET=gere-um-valor-com-openssl-rand-base64-32
|
||||||
|
BETTER_AUTH_URL=https://seu-dominio.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Veja todas as variáveis disponíveis em [Variáveis de Ambiente](#-variáveis-de-ambiente).
|
||||||
|
|
||||||
|
**Banco remoto (Supabase, Neon, Railway...):** defina `DATABASE_URL` no `.env` e suba só o app:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d app
|
||||||
|
```
|
||||||
|
|
||||||
|
**Não tem Docker instalado?** Em servidores Ubuntu 24.04 limpos, use o script de instalação:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/scripts/install-deps.sh -o install-deps.sh
|
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/scripts/install-deps.sh -o install-deps.sh
|
||||||
sudo sh install-deps.sh
|
sudo sh install-deps.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
O script instala:
|
> Ao final, faça **logout e login** para as permissões do grupo `docker` terem efeito.
|
||||||
|
|
||||||
| Ferramenta | Como instala |
|
|
||||||
|---|---|
|
|
||||||
| `git`, `curl`, `ca-certificates` | apt |
|
|
||||||
| Docker Engine + Docker Compose | Repositório oficial do Docker |
|
|
||||||
| Homebrew | Script oficial (como usuário não-root) |
|
|
||||||
| Node.js 22 | Via Homebrew |
|
|
||||||
| pnpm | Via corepack |
|
|
||||||
|
|
||||||
Ao final, o usuário atual é adicionado ao grupo `docker` — faça **logout e login** para a mudança ter efeito antes de continuar.
|
|
||||||
|
|
||||||
Se já tiver Docker e Node.js 22+ instalados, pule essa etapa.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Modo 1 — Só quero usar (sem mexer no código)
|
### Perfil 2 — Desenvolver
|
||||||
|
|
||||||
Esse é o caminho mais simples. Você baixa apenas um arquivo de configuração e o Docker faz o resto: baixa a imagem do app pronta do Docker Hub e sobe o banco automaticamente. **Não precisa clonar o repositório nem instalar dependências.**
|
Quer modificar o código com hot-reload. O banco roda no Docker, o app roda direto no seu servidor.
|
||||||
|
|
||||||
|
**Requisitos:** Docker + Node.js 22+ + pnpm
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Baixa o arquivo de configuração
|
# 1. Clone o repositório
|
||||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml
|
|
||||||
|
|
||||||
# 2. Sobe o app e o banco juntos
|
|
||||||
docker compose --profile local up
|
|
||||||
```
|
|
||||||
|
|
||||||
Acesse em: `http://localhost:3000`
|
|
||||||
|
|
||||||
> O banco sobe com as credenciais padrão. Se quiser usar uma senha personalizada, crie um arquivo `.env` na mesma pasta antes de subir — veja a seção [Variáveis de Ambiente](#-variáveis-de-ambiente).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Modo 2 — Quero configurar opcionais (OAuth, e-mail, IA)
|
|
||||||
|
|
||||||
Se quiser ativar login com Google, envio de e-mails, integrações com IA ou outras configurações, use o assistente interativo. Ele faz perguntas passo a passo e gera o arquivo `.env` com tudo preenchido corretamente.
|
|
||||||
|
|
||||||
**Pré-requisito:** Node.js 22+
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Mac / Linux / WSL
|
|
||||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/setup.mjs -o setup.mjs && node setup.mjs
|
|
||||||
|
|
||||||
# Windows (PowerShell)
|
|
||||||
curl -o setup.mjs https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/setup.mjs ; node setup.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
O assistente vai perguntar:
|
|
||||||
- Banco local (Docker) ou remoto (Supabase, Neon, Railway...)?
|
|
||||||
- URL da aplicação
|
|
||||||
- Google OAuth (opcional)
|
|
||||||
- E-mail via Resend (opcional)
|
|
||||||
- Chaves de IA — Claude, GPT, Gemini, OpenRouter (opcional)
|
|
||||||
- Domínio público separado para landing page (opcional)
|
|
||||||
|
|
||||||
Ao final, ele clona o repositório, instala as dependências e aplica o schema no banco. Depois é só subir:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd openmonetis
|
|
||||||
docker compose --profile local up
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Modo 3 — Quero contribuir com o código
|
|
||||||
|
|
||||||
Nesse modo o Next.js roda **direto no seu servidor com hot-reload** — toda vez que você salva um arquivo, o sistema atualiza automaticamente sem precisar reiniciar nada. O banco continua rodando dentro do Docker (mais simples), só o app fica fora.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Clona o repositório e roda o assistente de configuração
|
|
||||||
git clone https://github.com/felipegcoutinho/openmonetis.git
|
git clone https://github.com/felipegcoutinho/openmonetis.git
|
||||||
cd openmonetis
|
cd openmonetis
|
||||||
node setup.mjs
|
|
||||||
|
|
||||||
# 2. Sobe apenas o banco em background (o app vai rodar fora do Docker)
|
# 2. Instale as dependências
|
||||||
pnpm docker:up:db
|
pnpm install
|
||||||
|
|
||||||
# 3. Inicia o app com hot-reload
|
# 3. Configure o ambiente
|
||||||
|
cp .env.example .env
|
||||||
|
# Edite o .env com suas configurações
|
||||||
|
|
||||||
|
# 4. Suba o banco
|
||||||
|
pnpm docker:db
|
||||||
|
|
||||||
|
# 5. Habilite extensões do PostgreSQL (apenas no primeiro setup)
|
||||||
|
pnpm db:extensions
|
||||||
|
|
||||||
|
# 6. Aplique o schema no banco (apenas no primeiro setup)
|
||||||
|
pnpm db:push
|
||||||
|
|
||||||
|
# 7. Inicie o app com hot-reload
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Acesse em: `http://localhost:3000`
|
Acesse em: `http://localhost:3000`
|
||||||
|
|
||||||
---
|
Toda vez que salvar um arquivo, o app atualiza automaticamente sem precisar reiniciar.
|
||||||
|
|
||||||
### Modo 4 — Banco remoto (Supabase, Neon, Railway...)
|
|
||||||
|
|
||||||
Se você já tem um banco PostgreSQL hospedado em algum serviço externo, não precisa rodar o banco localmente. Informe a URL do banco durante o `setup.mjs` (escolha a opção "URL remota") e suba só o app:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node setup.mjs # escolha "URL remota" e cole a URL do seu banco
|
|
||||||
|
|
||||||
docker compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Comparativo
|
|
||||||
|
|
||||||
| O que quero fazer | Comandos principais |
|
|
||||||
|---|---|
|
|
||||||
| Só usar, da forma mais simples | `docker-compose.yml` → `docker compose --profile local up` |
|
|
||||||
| Usar com Google OAuth, e-mail ou IA | `node setup.mjs` → `docker compose --profile local up` |
|
|
||||||
| Desenvolver e contribuir com o código | `node setup.mjs` → `pnpm docker:up:db` → `pnpm dev` |
|
|
||||||
| Usar com banco remoto (Supabase etc.) | `node setup.mjs` → `docker compose up` |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -263,75 +218,49 @@ pnpm backup # Backup completo do banco (ver seção Backup)
|
|||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm docker:up:local # Sobe app + banco PostgreSQL juntos (imagem do Hub)
|
pnpm docker:up # Sobe app (Docker Hub) + banco em background
|
||||||
pnpm docker:up # Sobe apenas o app com build local
|
pnpm docker:db # Sobe apenas o banco em background (usar com pnpm dev)
|
||||||
pnpm docker:up:d # Sobe apenas o app com build local em background
|
pnpm docker:down # Para e remove os containers
|
||||||
pnpm docker:up:db # Sobe apenas o banco em background
|
pnpm docker:logs # Logs em tempo real (todos os containers)
|
||||||
pnpm docker:down # Para e remove os containers
|
pnpm docker:update # Atualiza para a imagem mais recente do Hub e reinicia
|
||||||
pnpm docker:down:volumes # Para containers e remove volumes (⚠️ apaga dados!)
|
|
||||||
pnpm docker:logs # Logs em tempo real (todos os containers)
|
|
||||||
pnpm docker:logs:app # Logs do container da aplicação
|
|
||||||
pnpm docker:logs:db # Logs do container do banco
|
|
||||||
pnpm docker:restart # Reinicia todos os containers
|
|
||||||
pnpm docker:rebuild # Rebuild completo forçando recriação
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🐳 Docker
|
## 🐳 Docker
|
||||||
|
|
||||||
O `Dockerfile` usa multi-stage build (deps → builder → runner) com imagem final ~200MB rodando como usuário não-root.
|
O `Dockerfile` usa multi-stage build (deps → builder → runner) com imagem final ~200MB rodando como usuário não-root. Health checks configurados para ambos os serviços (PostgreSQL via `pg_isready`, app via `GET /api/health`).
|
||||||
|
|
||||||
Health checks configurados para ambos os serviços (PostgreSQL via `pg_isready`, app via `GET /api/health`).
|
### Self-hosting (recomendado)
|
||||||
|
|
||||||
### Modos de uso
|
Baixe apenas o `docker-compose.yml` e suba tudo — sem clonar o repositório, sem instalar dependências:
|
||||||
|
|
||||||
**Modo 1 — App + banco local (recomendado para self-hosting)**
|
|
||||||
|
|
||||||
Puxa a imagem pronta do Docker Hub e sobe app + banco juntos. Não precisa de Node.js instalado nem de arquivo `.env` para começar — as credenciais padrão já estão configuradas.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Baixar o docker-compose.yml
|
|
||||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml
|
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml
|
||||||
|
docker compose up -d
|
||||||
# 2. Subir (sem precisar de .env)
|
|
||||||
docker compose --profile local up
|
|
||||||
|
|
||||||
# ou, se tiver o projeto clonado:
|
|
||||||
pnpm docker:up:local
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> Se quiser personalizar senhas ou ativar opcionais, crie um arquivo `.env` na mesma pasta antes de subir. Veja a seção [Variáveis de Ambiente](#-variáveis-de-ambiente).
|
As credenciais padrão do banco já estão configuradas. Para personalizar (senhas, opcionais), crie um `.env` na mesma pasta antes de subir — veja [Variáveis de Ambiente](#-variáveis-de-ambiente).
|
||||||
|
|
||||||
**Modo 2 — App com banco remoto**
|
### Banco remoto (Supabase, Neon, Railway...)
|
||||||
|
|
||||||
Use quando o banco está em um provider externo (Supabase, Neon, Railway...). Configure o `DATABASE_URL` no `.env` com a URL do seu banco e suba só o app.
|
Suba apenas o app e aponte para o banco externo via `DATABASE_URL` no `.env`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# DATABASE_URL deve apontar para o banco remoto no .env
|
docker compose up -d app
|
||||||
docker compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
**Modo 3 — Build local (desenvolvimento)**
|
|
||||||
|
|
||||||
Builda a imagem localmente a partir do código-fonte em vez de usar a imagem do Docker Hub. Útil para testar mudanças antes de publicar.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm docker:up:db # sobe o banco em background
|
|
||||||
pnpm docker:up # builda e sobe o app localmente
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Comandos úteis
|
### Comandos úteis
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose exec app sh # Shell da aplicação
|
docker compose exec app sh # Shell da aplicação
|
||||||
docker compose exec db psql -U openmonetis -d openmonetis_db # Shell do banco
|
docker compose exec db psql -U openmonetis -d openmonetis_db # Shell do banco
|
||||||
docker compose ps # Status
|
docker compose ps # Status
|
||||||
docker compose exec db pg_dump -U openmonetis openmonetis_db > backup.sql # Backup
|
docker compose exec db pg_dump -U openmonetis openmonetis_db > backup.sql # Backup
|
||||||
docker compose exec -T db psql -U openmonetis -d openmonetis_db < backup.sql # Restore
|
docker compose exec -T db psql -U openmonetis -d openmonetis_db < backup.sql # Restore
|
||||||
```
|
```
|
||||||
|
|
||||||
### Customizando Portas
|
### Customizando portas
|
||||||
|
|
||||||
```env
|
```env
|
||||||
APP_PORT=3001 # Padrão: 3000
|
APP_PORT=3001 # Padrão: 3000
|
||||||
|
|||||||
@@ -1,147 +1,51 @@
|
|||||||
# Docker Compose para Next.js + PostgreSQL
|
|
||||||
name: openmonetis
|
name: openmonetis
|
||||||
|
|
||||||
# MODOS DE USO:
|
|
||||||
# 1. Banco LOCAL (PostgreSQL em container):
|
|
||||||
# - Configure DATABASE_URL com host "db" no .env
|
|
||||||
# - Execute: docker compose --profile local up
|
|
||||||
#
|
|
||||||
# 2. Banco REMOTO (ex: Supabase, Neon, etc):
|
|
||||||
# - Configure DATABASE_URL com a URL do banco remoto no .env
|
|
||||||
# - Execute: docker compose up
|
|
||||||
#
|
|
||||||
# 3. Build local (desenvolvimento):
|
|
||||||
# - Execute: docker compose --profile local up --build
|
|
||||||
#
|
|
||||||
# 4. Para parar todos os serviços:
|
|
||||||
# - Execute: docker compose down
|
|
||||||
#
|
|
||||||
# 5. Para remover volumes (CUIDADO: apaga dados do banco local):
|
|
||||||
# - Execute: docker compose down -v
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# ============================================
|
|
||||||
# Serviço: PostgreSQL (Banco de dados local)
|
|
||||||
# Ativado apenas com: --profile local
|
|
||||||
# ============================================
|
|
||||||
db:
|
db:
|
||||||
profiles: ["local"]
|
|
||||||
image: postgres:18-alpine
|
image: postgres:18-alpine
|
||||||
container_name: openmonetis_postgres
|
container_name: openmonetis_postgres
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: ${POSTGRES_USER:-openmonetis}
|
POSTGRES_USER: ${POSTGRES_USER:-openmonetis}
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-openmonetis_dev_password}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-openmonetis_dev_password}
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-openmonetis_db}
|
POSTGRES_DB: ${POSTGRES_DB:-openmonetis_db}
|
||||||
PGDATA: /var/lib/postgresql/data
|
|
||||||
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
|
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "${DB_PORT:-5432}:5432"
|
- "${DB_PORT:-5432}:5432"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
|
|
||||||
# Cria extensão pgcrypto inline (necessária para gen_random_bytes no schema)
|
|
||||||
entrypoint: ["/bin/sh", "-c"]
|
|
||||||
command:
|
|
||||||
- |
|
|
||||||
echo 'CREATE EXTENSION IF NOT EXISTS pgcrypto;' > /docker-entrypoint-initdb.d/init.sql
|
|
||||||
exec docker-entrypoint.sh postgres
|
|
||||||
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test:
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-openmonetis} -d ${POSTGRES_DB:-openmonetis_db}"]
|
||||||
[
|
|
||||||
"CMD-SHELL",
|
|
||||||
"pg_isready -U ${POSTGRES_USER:-openmonetis} -d ${POSTGRES_DB:-openmonetis_db}",
|
|
||||||
]
|
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
|
||||||
# Para ativar logs de queries (debug), adicione ao command acima:
|
|
||||||
# exec docker-entrypoint.sh postgres -c log_statement=all
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# Serviço: Aplicação Next.js
|
|
||||||
# ============================================
|
|
||||||
app:
|
app:
|
||||||
build: .
|
|
||||||
image: felipegcoutinho/openmonetis:latest
|
image: felipegcoutinho/openmonetis:latest
|
||||||
|
|
||||||
container_name: openmonetis_app
|
container_name: openmonetis_app
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "${APP_PORT:-3000}:3000"
|
- "${APP_PORT:-3000}:3000"
|
||||||
|
env_file:
|
||||||
|
- path: .env
|
||||||
|
required: false
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|
||||||
# Banco local: use host "db" | Banco remoto: URL completa do provider
|
|
||||||
# O entrypoint converte automaticamente "localhost" → "db" se necessário
|
|
||||||
DATABASE_URL: ${DATABASE_URL:-postgresql://openmonetis:openmonetis_dev_password@db:5432/openmonetis_db}
|
DATABASE_URL: ${DATABASE_URL:-postgresql://openmonetis:openmonetis_dev_password@db:5432/openmonetis_db}
|
||||||
|
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-}
|
||||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
|
|
||||||
BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000}
|
BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000}
|
||||||
|
|
||||||
# S3 (opcional)
|
|
||||||
S3_ENDPOINT: ${S3_ENDPOINT:-}
|
|
||||||
S3_REGION: ${S3_REGION:-}
|
|
||||||
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-}
|
|
||||||
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-}
|
|
||||||
S3_BUCKET: ${S3_BUCKET:-}
|
|
||||||
|
|
||||||
# Email (opcional)
|
|
||||||
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
|
||||||
RESEND_FROM_EMAIL: ${RESEND_FROM_EMAIL:-}
|
|
||||||
|
|
||||||
# OAuth (opcional)
|
|
||||||
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-}
|
|
||||||
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-}
|
|
||||||
GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-}
|
|
||||||
GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-}
|
|
||||||
|
|
||||||
# AI providers (opcional)
|
|
||||||
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
|
||||||
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
||||||
GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-}
|
|
||||||
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
|
|
||||||
|
|
||||||
# Multi-domínio (opcional)
|
|
||||||
PUBLIC_DOMAIN: ${PUBLIC_DOMAIN:-}
|
|
||||||
|
|
||||||
# Analytics (opcional)
|
|
||||||
UMAMI_URL: ${UMAMI_URL:-}
|
|
||||||
UMAMI_WEBSITE_ID: ${UMAMI_WEBSITE_ID:-}
|
|
||||||
UMAMI_DOMAINS: ${UMAMI_DOMAINS:-}
|
|
||||||
|
|
||||||
# required: false permite subir sem banco local (banco remoto via DATABASE_URL)
|
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test:
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"]
|
||||||
[
|
|
||||||
"CMD",
|
|
||||||
"wget",
|
|
||||||
"--quiet",
|
|
||||||
"--tries=1",
|
|
||||||
"--spider",
|
|
||||||
"http://localhost:3000/api/health",
|
|
||||||
]
|
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 40s
|
start_period: 40s
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# Volumes
|
|
||||||
# ============================================
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
driver: local
|
driver: local
|
||||||
|
|||||||
@@ -1,23 +1,26 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Dentro do container Docker, "localhost" não alcança o serviço de banco.
|
echo "Habilitando extensão pgcrypto..."
|
||||||
# Substitui automaticamente para o nome do serviço "db" da rede Docker.
|
node -e "
|
||||||
# Não afeta URLs de bancos remotos (não contêm "@localhost:").
|
const { Client } = require('/app/migrate/node_modules/pg');
|
||||||
if [ -n "$DATABASE_URL" ]; then
|
const c = new Client({ connectionString: process.env.DATABASE_URL });
|
||||||
DATABASE_URL=$(echo "$DATABASE_URL" | sed 's|@localhost:|@db:|g')
|
c.connect()
|
||||||
export DATABASE_URL
|
.then(() => c.query('CREATE EXTENSION IF NOT EXISTS pgcrypto'))
|
||||||
fi
|
.then(() => c.end())
|
||||||
|
.catch((e) => { console.error('Aviso pgcrypto:', e.message); process.exit(0); });
|
||||||
|
"
|
||||||
|
|
||||||
echo "Rodando migrations..."
|
echo "Rodando migrations..."
|
||||||
RETRIES=5
|
MIGRATED=0
|
||||||
until NODE_PATH=/app/migrate/node_modules /app/migrate/node_modules/.bin/drizzle-kit push || [ "$RETRIES" -eq 0 ]; do
|
for i in 1 2 3 4 5; do
|
||||||
RETRIES=$((RETRIES - 1))
|
if NODE_PATH=/app/migrate/node_modules /app/migrate/node_modules/.bin/drizzle-kit push; then
|
||||||
echo "Migration falhou, aguardando banco... ($RETRIES tentativas restantes)"
|
MIGRATED=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo "Tentativa $i/5 falhou. Aguardando 5s..."
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$RETRIES" -eq 0 ]; then
|
[ "$MIGRATED" -eq 0 ] && echo "Aviso: migrations não foram aplicadas."
|
||||||
echo "Aviso: migrations nao foram aplicadas"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
32
package.json
32
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "openmonetis",
|
"name": "openmonetis",
|
||||||
"version": "2.3.7",
|
"version": "2.3.8",
|
||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "pnpm@10.33.0",
|
"packageManager": "pnpm@10.33.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -21,38 +21,20 @@
|
|||||||
|
|
||||||
"// --- Docker ---": "---",
|
"// --- Docker ---": "---",
|
||||||
|
|
||||||
"docker:up:local": "docker compose --profile local up",
|
"docker:up": "docker compose up -d",
|
||||||
"//docker:up:local": "Sobe app + banco PostgreSQL local juntos (imagem do Docker Hub)",
|
"//docker:up": "Sobe app (Docker Hub) + banco PostgreSQL em background",
|
||||||
|
|
||||||
"docker:up": "docker compose up --build",
|
"docker:db": "docker compose up -d db",
|
||||||
"//docker:up": "Sobe apenas o app com build local (banco deve estar rodando separado)",
|
"//docker:db": "Sobe apenas o banco em background (para usar com pnpm dev)",
|
||||||
|
|
||||||
"docker:up:d": "docker compose up --build -d",
|
|
||||||
"//docker:up:d": "Sobe apenas o app com build local em background (detached)",
|
|
||||||
|
|
||||||
"docker:up:db": "docker compose up -d db",
|
|
||||||
"//docker:up:db": "Sobe apenas o banco PostgreSQL em background",
|
|
||||||
|
|
||||||
"docker:down": "docker compose down",
|
"docker:down": "docker compose down",
|
||||||
"//docker:down": "Para e remove os containers",
|
"//docker:down": "Para e remove os containers",
|
||||||
|
|
||||||
"docker:down:volumes": "docker compose down -v",
|
|
||||||
"//docker:down:volumes": "Para containers e remove volumes (APAGA os dados!)",
|
|
||||||
|
|
||||||
"docker:logs": "docker compose logs -f",
|
"docker:logs": "docker compose logs -f",
|
||||||
"//docker:logs": "Acompanha logs de todos os containers em tempo real",
|
"//docker:logs": "Acompanha logs de todos os containers em tempo real",
|
||||||
|
|
||||||
"docker:logs:app": "docker compose logs -f app",
|
"docker:update": "docker compose pull && docker compose up -d",
|
||||||
"//docker:logs:app": "Acompanha logs do container da aplicação",
|
"//docker:update": "Atualiza para a imagem mais recente do Docker Hub e reinicia",
|
||||||
|
|
||||||
"docker:logs:db": "docker compose logs -f db",
|
|
||||||
"//docker:logs:db": "Acompanha logs do container do banco",
|
|
||||||
|
|
||||||
"docker:restart": "docker compose restart",
|
|
||||||
"//docker:restart": "Reinicia todos os containers",
|
|
||||||
|
|
||||||
"docker:rebuild": "docker compose up --build --force-recreate",
|
|
||||||
"//docker:rebuild": "Rebuild completo forçando recriação dos containers",
|
|
||||||
|
|
||||||
"backup": "bash scripts/backup.sh"
|
"backup": "bash scripts/backup.sh"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user