mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 19:01:47 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1161e97d9e | ||
|
|
55d7dedd9a | ||
|
|
ad2752b7b0 | ||
|
|
58db357cde | ||
|
|
99a9ff5512 | ||
|
|
5bcf4f69d3 | ||
|
|
95099c1a94 | ||
|
|
94912f7edc |
@@ -48,7 +48,6 @@ GOOGLE_CLIENT_SECRET=
|
||||
# Umami: https://umami.is — self-hosted ou cloud
|
||||
UMAMI_URL=
|
||||
UMAMI_WEBSITE_ID=
|
||||
# Domínios rastreados (ex: openmonetis.com) — corresponde ao data-domains do script
|
||||
UMAMI_DOMAINS=
|
||||
|
||||
# === AI Providers (Opcional) ===
|
||||
|
||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -7,6 +7,15 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
|
||||
|
||||
## [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
|
||||
|
||||
### Adicionado
|
||||
@@ -15,6 +24,7 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
|
||||
- Lançamentos: filtro por status de pagamento (somente pagos / somente não pagos) e filtro por presença de anexo
|
||||
- Lançamentos: indicador visual no status de liquidação para lançamentos de cartão de crédito com fatura paga — exibe ícone verde com tooltip explicativo
|
||||
- Scripts: `scripts/install-deps.sh` — script de preparação para servidores Ubuntu 24.04 limpos (instala Docker, Node.js 22, pnpm via Homebrew)
|
||||
- Docker: variáveis `PUBLIC_DOMAIN`, `UMAMI_URL`, `UMAMI_WEBSITE_ID` e `UMAMI_DOMAINS` passadas ao container da aplicação no `docker-compose.yml`
|
||||
|
||||
### Alterado
|
||||
|
||||
@@ -32,6 +42,15 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
|
||||
- S3: corrigido `Error: Region is missing` ao usar o app sem S3 configurado — `S3_REGION` vazio (string vazia) não era tratado pelo operador `??`; substituído por `||` em todo o `s3-client.ts`
|
||||
- i18n: corrigidas mensagens de erro que exibiam "Payer" em inglês em vez de "Pagador"
|
||||
- Logos: corrigido modal seletor de logos de cartões e contas para renderizar miniaturas sem avisos de proporção
|
||||
- Scripts: `install-deps.sh` — spinner travava o script por `wait` retornar código não-zero com `set -e` ativo; corrigido com `|| true`
|
||||
- Scripts: `install-deps.sh` — prompt interativo do corepack suprimido com `COREPACK_ENABLE_DOWNLOAD_PROMPT=0`
|
||||
- Scripts: `install-deps.sh` — PATH do Homebrew não estava configurado na seção de resumo
|
||||
|
||||
### Removido
|
||||
|
||||
- Scripts: removidos arquivos órfãos `scripts/dev.ts` e `scripts/setup-env.sh` (substituídos pelo `setup.mjs`)
|
||||
- Docker: `docker-compose.yml` agora funciona sem arquivo `.env` — `DATABASE_URL` tem valor padrão com credenciais de desenvolvimento
|
||||
- Docker: `docker-entrypoint.sh` converte automaticamente `@localhost:` para `@db:` na `DATABASE_URL` ao iniciar o container, eliminando a necessidade de usar hosts diferentes no `.env` para desenvolvimento local e Docker
|
||||
|
||||
## [2.3.6] - 2026-04-09
|
||||
|
||||
|
||||
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.
|
||||
|
||||
[](CHANGELOG.md)
|
||||
[](CHANGELOG.md)
|
||||
[](https://nextjs.org/)
|
||||
[](https://www.typescriptlang.org/)
|
||||
[](https://www.postgresql.org/)
|
||||
@@ -32,9 +32,9 @@
|
||||
## 📖 Índice
|
||||
|
||||
- [Sobre o Projeto](#-sobre-o-projeto)
|
||||
- [Instalação via Script](#-instalação-via-script)
|
||||
- [Preparar o servidor (Ubuntu 24.04)](#-preparar-o-servidor-ubuntu-2404)
|
||||
- [Início Rápido (manual)](#-início-rápido)
|
||||
- [Como rodar o OpenMonetis](#-como-rodar-o-openmonetis)
|
||||
- [Perfil 1 — Usar](#perfil-1--usar-self-hosting)
|
||||
- [Perfil 2 — Desenvolver](#perfil-2--desenvolver)
|
||||
- [Scripts Disponíveis](#-scripts-disponíveis)
|
||||
- [Docker](#-docker)
|
||||
- [Backup](#-backup)
|
||||
@@ -103,107 +103,87 @@ A ideia é simples: ter um lugar onde consigo ver todas as minhas contas, cartõ
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Instalação via Script
|
||||
## 🚀 Como rodar o OpenMonetis
|
||||
|
||||
A forma mais rápida de instalar. O script verifica dependências, configura o `.env` interativamente e sobe o banco automaticamente.
|
||||
Escolha o perfil que corresponde ao seu objetivo:
|
||||
|
||||
### 🖥️ Preparar o servidor (Ubuntu 24.04)
|
||||
---
|
||||
|
||||
Se você está num **servidor Ubuntu limpo** (VPS, Oracle Cloud, DigitalOcean...) sem Node.js, Docker ou pnpm instalados, use o script de preparação antes de continuar.
|
||||
### Perfil 1 — Usar (self-hosting)
|
||||
|
||||
> ⚠️ **Testado apenas em Ubuntu Server 24.04 LTS.** Em outras distribuições ou versões é necessário testar ou ajustar o script.
|
||||
Só quer rodar o OpenMonetis. **Não precisa clonar o repositório nem instalar Node.js** — apenas Docker.
|
||||
|
||||
```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
|
||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/scripts/install-deps.sh -o install-deps.sh
|
||||
sudo sh install-deps.sh
|
||||
```
|
||||
|
||||
O script instala (e pula o que já estiver presente):
|
||||
|
||||
| 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 |
|
||||
|
||||
Após a conclusão, adiciona o usuário atual ao grupo `docker` — faça logout/login para ativar. Em seguida, prossiga com o `setup.mjs` abaixo.
|
||||
> Ao final, faça **logout e login** para as permissões do grupo `docker` terem efeito.
|
||||
|
||||
---
|
||||
|
||||
**Pré-requisito:** Node.js 22+
|
||||
### Perfil 2 — Desenvolver
|
||||
|
||||
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
|
||||
# Mac / Linux / WSL
|
||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/setup.mjs -o setup.mjs && node setup.mjs
|
||||
# 1. Clone o repositório
|
||||
git clone https://github.com/felipegcoutinho/openmonetis.git
|
||||
cd openmonetis
|
||||
|
||||
# Windows (PowerShell)
|
||||
curl -o setup.mjs https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/setup.mjs ; node setup.mjs
|
||||
# 2. Instale as dependências
|
||||
pnpm install
|
||||
|
||||
# 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
|
||||
```
|
||||
|
||||
O script irá:
|
||||
- Verificar Node, pnpm, Git e Docker
|
||||
- Perguntar se quer banco local (Docker) ou remoto (Supabase, Neon, etc.)
|
||||
- Gerar o `BETTER_AUTH_SECRET` automaticamente
|
||||
- Configurar opcionais: Google OAuth, e-mail, IA, domínio público
|
||||
- Clonar o repositório, instalar dependências e aplicar o schema
|
||||
Acesse em: `http://localhost:3000`
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Início Rápido (manual)
|
||||
|
||||
### Pré-requisitos
|
||||
|
||||
- Node.js 22+ e pnpm
|
||||
- Docker e Docker Compose
|
||||
|
||||
### Passo a Passo
|
||||
|
||||
1. **Clone e instale**
|
||||
|
||||
```bash
|
||||
git clone https://github.com/felipegcoutinho/openmonetis.git
|
||||
cd openmonetis
|
||||
pnpm install
|
||||
```
|
||||
|
||||
2. **Configure o `.env`**
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
Edite o `.env` com suas credenciais. O principal é o `DATABASE_URL` e o `BETTER_AUTH_SECRET`:
|
||||
|
||||
```env
|
||||
# Banco local (Docker): use host "localhost"
|
||||
DATABASE_URL=postgresql://openmonetis:openmonetis_dev_password@localhost:5432/openmonetis_db
|
||||
|
||||
# Banco remoto (Supabase, Neon, etc): use a URL completa do provider
|
||||
# DATABASE_URL=postgresql://user:password@host:5432/database?sslmode=require
|
||||
|
||||
BETTER_AUTH_SECRET=seu-secret-aqui # gere com: openssl rand -base64 32
|
||||
BETTER_AUTH_URL=http://localhost:3000
|
||||
```
|
||||
|
||||
3. **Suba o banco de dados** (pule se estiver usando banco remoto)
|
||||
|
||||
```bash
|
||||
docker compose up db -d
|
||||
pnpm db:extensions
|
||||
```
|
||||
|
||||
4. **Execute as migrations e inicie**
|
||||
|
||||
```bash
|
||||
pnpm db:push
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
5. Acesse `http://localhost:3000`
|
||||
|
||||
> **Docker completo** (app + banco em containers): use `pnpm docker:up:local` ao invés dos passos 3-4.
|
||||
Toda vez que salvar um arquivo, o app atualiza automaticamente sem precisar reiniciar.
|
||||
|
||||
---
|
||||
|
||||
@@ -238,78 +218,49 @@ pnpm backup # Backup completo do banco (ver seção Backup)
|
||||
### Docker
|
||||
|
||||
```bash
|
||||
pnpm docker:up:local # Sobe app + banco PostgreSQL juntos (imagem do Hub)
|
||||
pnpm docker:up # Sobe apenas o app com build local
|
||||
pnpm docker:up:d # Sobe apenas o app com build local em background
|
||||
pnpm docker:up:db # Sobe apenas o banco em background
|
||||
pnpm docker:down # Para e remove os containers
|
||||
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
|
||||
pnpm docker:up # Sobe app (Docker Hub) + banco em background
|
||||
pnpm docker:db # Sobe apenas o banco em background (usar com pnpm dev)
|
||||
pnpm docker:down # Para e remove os containers
|
||||
pnpm docker:logs # Logs em tempo real (todos os containers)
|
||||
pnpm docker:update # Atualiza para a imagem mais recente do Hub e reinicia
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐳 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
|
||||
|
||||
**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.
|
||||
Baixe apenas o `docker-compose.yml` e suba tudo — sem clonar o repositório, sem instalar dependências:
|
||||
|
||||
```bash
|
||||
# 1. Baixar o docker-compose.yml
|
||||
curl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml
|
||||
|
||||
# 2. Criar o .env (copie o .env.example como referência)
|
||||
# DATABASE_URL=postgresql://openmonetis:SUA_SENHA@db:5432/openmonetis_db
|
||||
# POSTGRES_PASSWORD=SUA_SENHA
|
||||
# BETTER_AUTH_SECRET=string-longa-aleatoria
|
||||
# BETTER_AUTH_URL=http://localhost:3000
|
||||
|
||||
# 3. Subir
|
||||
docker compose --profile local up
|
||||
# ou, se tiver o projeto clonado:
|
||||
pnpm docker:up:local
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
**Modo 2 — App com banco remoto**
|
||||
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).
|
||||
|
||||
Use quando o banco está em um provider externo (Supabase, Neon, Railway...).
|
||||
### Banco remoto (Supabase, Neon, Railway...)
|
||||
|
||||
Suba apenas o app e aponte para o banco externo via `DATABASE_URL` no `.env`:
|
||||
|
||||
```bash
|
||||
# DATABASE_URL deve apontar para o banco remoto no .env
|
||||
docker compose up
|
||||
```
|
||||
|
||||
**Modo 3 — Build local (desenvolvimento)**
|
||||
|
||||
Builda a imagem localmente a partir do código-fonte.
|
||||
|
||||
```bash
|
||||
pnpm docker:up # app apenas (banco separado)
|
||||
pnpm docker:up:db # sobe o banco em background
|
||||
docker compose up -d app
|
||||
```
|
||||
|
||||
### Comandos úteis
|
||||
|
||||
```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 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
|
||||
```
|
||||
|
||||
### Customizando Portas
|
||||
### Customizando portas
|
||||
|
||||
```env
|
||||
APP_PORT=3001 # Padrão: 3000
|
||||
|
||||
@@ -1,138 +1,51 @@
|
||||
# Docker Compose para Next.js + PostgreSQL
|
||||
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:
|
||||
# ============================================
|
||||
# Serviço: PostgreSQL (Banco de dados local)
|
||||
# Ativado apenas com: --profile local
|
||||
# ============================================
|
||||
db:
|
||||
profiles: ["local"]
|
||||
image: postgres:18-alpine
|
||||
container_name: openmonetis_postgres
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
POSTGRES_USER: ${POSTGRES_USER:-openmonetis}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-openmonetis_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-openmonetis_db}
|
||||
PGDATA: /var/lib/postgresql/data
|
||||
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
|
||||
|
||||
ports:
|
||||
- "${DB_PORT:-5432}:5432"
|
||||
|
||||
volumes:
|
||||
- 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:
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"pg_isready -U ${POSTGRES_USER:-openmonetis} -d ${POSTGRES_DB:-openmonetis_db}",
|
||||
]
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-openmonetis} -d ${POSTGRES_DB:-openmonetis_db}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
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:
|
||||
build: .
|
||||
image: felipegcoutinho/openmonetis:latest
|
||||
|
||||
container_name: openmonetis_app
|
||||
restart: unless-stopped
|
||||
|
||||
ports:
|
||||
- "${APP_PORT:-3000}:3000"
|
||||
|
||||
env_file:
|
||||
- path: .env
|
||||
required: false
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
|
||||
# Banco local: use host "db" | Banco remoto: URL completa do provider
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
|
||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
|
||||
DATABASE_URL: ${DATABASE_URL:-postgresql://openmonetis:openmonetis_dev_password@db:5432/openmonetis_db}
|
||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-}
|
||||
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:-}
|
||||
|
||||
# required: false permite subir sem banco local (banco remoto via DATABASE_URL)
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
required: false
|
||||
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"wget",
|
||||
"--quiet",
|
||||
"--tries=1",
|
||||
"--spider",
|
||||
"http://localhost:3000/api/health",
|
||||
]
|
||||
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
# ============================================
|
||||
# Volumes
|
||||
# ============================================
|
||||
volumes:
|
||||
postgres_data:
|
||||
driver: local
|
||||
|
||||
@@ -1,15 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "Habilitando extensão pgcrypto..."
|
||||
node -e "
|
||||
const { Client } = require('/app/migrate/node_modules/pg');
|
||||
const c = new Client({ connectionString: process.env.DATABASE_URL });
|
||||
c.connect()
|
||||
.then(() => c.query('CREATE EXTENSION IF NOT EXISTS pgcrypto'))
|
||||
.then(() => c.end())
|
||||
.catch((e) => { console.error('Aviso pgcrypto:', e.message); process.exit(0); });
|
||||
"
|
||||
|
||||
echo "Rodando migrations..."
|
||||
RETRIES=5
|
||||
until NODE_PATH=/app/migrate/node_modules /app/migrate/node_modules/.bin/drizzle-kit push || [ "$RETRIES" -eq 0 ]; do
|
||||
RETRIES=$((RETRIES - 1))
|
||||
echo "Migration falhou, aguardando banco... ($RETRIES tentativas restantes)"
|
||||
MIGRATED=0
|
||||
for i in 1 2 3 4 5; do
|
||||
if NODE_PATH=/app/migrate/node_modules /app/migrate/node_modules/.bin/drizzle-kit push; then
|
||||
MIGRATED=1
|
||||
break
|
||||
fi
|
||||
echo "Tentativa $i/5 falhou. Aguardando 5s..."
|
||||
sleep 5
|
||||
done
|
||||
|
||||
if [ "$RETRIES" -eq 0 ]; then
|
||||
echo "Aviso: migrations nao foram aplicadas"
|
||||
fi
|
||||
[ "$MIGRATED" -eq 0 ] && echo "Aviso: migrations não foram aplicadas."
|
||||
|
||||
exec "$@"
|
||||
|
||||
34
package.json
34
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "openmonetis",
|
||||
"version": "2.3.7",
|
||||
"version": "2.3.8",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.33.0",
|
||||
"scripts": {
|
||||
@@ -11,7 +11,7 @@
|
||||
"lint": "biome check .",
|
||||
"lint:deadcode": "knip --reporter compact",
|
||||
"lint:fix": "biome check --write .",
|
||||
"env:setup": "bash scripts/setup-env.sh",
|
||||
"env:setup": "node setup.mjs",
|
||||
"db:generate": "drizzle-kit generate",
|
||||
"db:migrate": "drizzle-kit migrate",
|
||||
"db:push": "drizzle-kit push",
|
||||
@@ -21,38 +21,20 @@
|
||||
|
||||
"// --- Docker ---": "---",
|
||||
|
||||
"docker:up:local": "docker compose --profile local up",
|
||||
"//docker:up:local": "Sobe app + banco PostgreSQL local juntos (imagem do Docker Hub)",
|
||||
"docker:up": "docker compose up -d",
|
||||
"//docker:up": "Sobe app (Docker Hub) + banco PostgreSQL em background",
|
||||
|
||||
"docker:up": "docker compose up --build",
|
||||
"//docker:up": "Sobe apenas o app com build local (banco deve estar rodando separado)",
|
||||
|
||||
"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:db": "docker compose up -d db",
|
||||
"//docker:db": "Sobe apenas o banco em background (para usar com pnpm dev)",
|
||||
|
||||
"docker:down": "docker compose down",
|
||||
"//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": "Acompanha logs de todos os containers em tempo real",
|
||||
|
||||
"docker:logs:app": "docker compose logs -f app",
|
||||
"//docker:logs:app": "Acompanha logs do container da aplicação",
|
||||
|
||||
"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",
|
||||
"docker:update": "docker compose pull && docker compose up -d",
|
||||
"//docker:update": "Atualiza para a imagem mais recente do Docker Hub e reinicia",
|
||||
|
||||
"backup": "bash scripts/backup.sh"
|
||||
},
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env tsx
|
||||
|
||||
import { execSync } from "node:child_process";
|
||||
import { config } from "dotenv";
|
||||
|
||||
// Carregar variáveis de ambiente
|
||||
config();
|
||||
|
||||
const port = process.env.PORT || "3000";
|
||||
|
||||
console.log(`Starting Next.js development server on port ${port}...`);
|
||||
|
||||
// Executar next dev com a porta especificada
|
||||
execSync(`npx next dev --turbopack --port ${port}`, {
|
||||
stdio: "inherit",
|
||||
env: { ...process.env, PORT: port },
|
||||
});
|
||||
@@ -9,6 +9,9 @@ set -e
|
||||
LOG_FILE="/tmp/openmonetis-install.log"
|
||||
> "$LOG_FILE"
|
||||
|
||||
# Suprimir prompt interativo do corepack ao chamar pnpm/node versioning
|
||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||
|
||||
# ── Cores ──────────────────────────────────────────────────────────────────────
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
@@ -51,8 +54,8 @@ spinner_start() {
|
||||
|
||||
spinner_stop() {
|
||||
if [ -n "$_spin_pid" ]; then
|
||||
kill "$_spin_pid" 2>/dev/null
|
||||
wait "$_spin_pid" 2>/dev/null
|
||||
kill "$_spin_pid" 2>/dev/null || true
|
||||
wait "$_spin_pid" 2>/dev/null || true
|
||||
_spin_pid=""
|
||||
printf "\r\033[2K"
|
||||
fi
|
||||
@@ -220,15 +223,19 @@ if command -v pnpm > /dev/null 2>&1; then
|
||||
else
|
||||
if [ -n "$CURRENT_USER" ] && [ "$CURRENT_USER" != "root" ]; then
|
||||
run_as_user "Instalando pnpm via corepack" \
|
||||
'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" && corepack enable && corepack prepare pnpm@latest --activate'
|
||||
'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" && corepack enable && COREPACK_ENABLE_DOWNLOAD_PROMPT=0 corepack prepare pnpm@latest --activate'
|
||||
else
|
||||
run_quiet "Instalando pnpm via corepack" \
|
||||
sh -c 'corepack enable && corepack prepare pnpm@latest --activate'
|
||||
sh -c 'corepack enable && COREPACK_ENABLE_DOWNLOAD_PROMPT=0 corepack prepare pnpm@latest --activate'
|
||||
fi
|
||||
ok "pnpm instalado"
|
||||
fi
|
||||
|
||||
# ── Resumo ─────────────────────────────────────────────────────────────────────
|
||||
# Garantir que node/pnpm do brew estejam no PATH para o resumo
|
||||
export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"
|
||||
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" 2>/dev/null || true
|
||||
|
||||
printf "\n${BOLD}Concluído em $(elapsed)${RESET}\n"
|
||||
|
||||
ok "git: $(git --version | cut -d' ' -f3)"
|
||||
@@ -236,6 +243,3 @@ ok "docker: $(docker --version | cut -d',' -f1 | cut -d' ' -f3)"
|
||||
ok "docker compose: $(docker compose version | cut -d' ' -f4)"
|
||||
ok "node: $(node --version)"
|
||||
ok "pnpm: $(pnpm --version)"
|
||||
|
||||
printf "\n${CYAN}Próximo passo:${RESET}\n"
|
||||
printf " node setup.mjs\n\n"
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script para configurar ambiente de forma segura
|
||||
# Cria backup do .env atual antes de sobrescrever
|
||||
|
||||
set -e
|
||||
|
||||
echo "🔧 Configurando ambiente..."
|
||||
|
||||
# Se .env já existe, criar backup
|
||||
if [ -f .env ]; then
|
||||
BACKUP_FILE=".env.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
echo "⚠️ Arquivo .env existente detectado!"
|
||||
echo "📦 Criando backup em: $BACKUP_FILE"
|
||||
cp .env "$BACKUP_FILE"
|
||||
echo "✅ Backup criado com sucesso!"
|
||||
echo ""
|
||||
read -p "Deseja sobrescrever o .env atual com .env.example? (s/N) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Ss]$ ]]; then
|
||||
echo "❌ Operação cancelada. Seu .env não foi modificado."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Copiar .env.example para .env
|
||||
if [ -f .env.example ]; then
|
||||
cp .env.example .env
|
||||
echo "✅ Arquivo .env criado a partir de .env.example"
|
||||
else
|
||||
echo "❌ Erro: .env.example não encontrado!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Gerar BETTER_AUTH_SECRET automaticamente
|
||||
if command -v openssl &> /dev/null; then
|
||||
SECRET=$(openssl rand -base64 32)
|
||||
sed -i.bak "s|BETTER_AUTH_SECRET=.*|BETTER_AUTH_SECRET=$SECRET|" .env && rm -f .env.bak
|
||||
echo "✅ BETTER_AUTH_SECRET gerado automaticamente"
|
||||
else
|
||||
echo "⚠️ openssl não encontrado — configure BETTER_AUTH_SECRET manualmente:"
|
||||
echo " openssl rand -base64 32"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "⚠️ IMPORTANTE: Edite o arquivo .env e configure:"
|
||||
echo " - DATABASE_URL"
|
||||
echo " - BETTER_AUTH_URL"
|
||||
echo " - Demais variáveis opcionais (OAuth, e-mail, IA)"
|
||||
Reference in New Issue
Block a user