Instalar com Docker
Um servidor do Cofre Ink só seu traz contas com email e senha, os mesmos dados em todo aparelho que entra nele e espaços compartilhados em que você convida outras pessoas. É um container só, que serve a interface e os dados numa mesma porta. Esta página vai de uma máquina vazia até o primeiro acesso, e depois explica como atualizar, fazer backup e o que pode dar errado.
Se só você vai usar o Cofre Ink, num aparelho só, nada disto é necessário: app.cofre.ink guarda o banco de dados no seu navegador, sem conta. Onde os dados ficam compara as duas formas. Lembre que, com um servidor, todo aparelho precisa alcançar esse servidor para funcionar.
O que você precisa
Seção intitulada “O que você precisa”- Docker, com o comando
docker compose. O repositório não diz uma versão mínima, nem quanto de memória ou de disco. - Git, para baixar o código.
- Node, só para gerar o segredo no passo 3, porque o container traz o dele. Qualquer sequência aleatória de pelo menos 32 caracteres também serve.
- Internet no primeiro build. Construir a imagem baixa o pnpm e os pacotes que o Cofre Ink usa.
- A porta 4321 livre na máquina, ou outra que você escolher com
COFRE_PORT.
Todo comando desta página é do próprio repositório ou foi rodado enquanto este guia era escrito, no PowerShell, no Windows 11 com o Docker Desktop. Eles valem igual num terminal de Linux ou de macOS. O Prompt de Comando do Windows (cmd.exe) não entende o ${PWD} dos comandos de backup: use o PowerShell nesse caso.
O compose.yaml, parte por parte
Seção intitulada “O compose.yaml, parte por parte”O repositório traz este arquivo na raiz. Você não mexe nele: o que você define vai no .env, e o Compose preenche as partes ${...} a partir de lá.
# Cofre on your own machine.## 1. cp .env.example .env# 2. fill COFRE_SECRET# 3. docker compose up -d## The data lives in the named volume below, so it survives an update of the image.# For PostgreSQL instead of SQLite, read the note above the database service further# down: there are four things to uncomment, and leaving one out stops the whole file.
# The project name comes from here and not from the folder, so the container and the# volume are called the same thing on every machine.name: cofre
services: cofre: build: . restart: unless-stopped ports: - "${COFRE_PORT:-4321}:4321" environment: COFRE_PORT: 4321 COFRE_DATABASE: ${COFRE_DATABASE:-/data/cofre.db} COFRE_SECRET: ${COFRE_SECRET:?set COFRE_SECRET in .env} COFRE_WEB_ORIGIN: ${COFRE_WEB_ORIGIN:-http://localhost:4321} COFRE_PUBLIC_URL: ${COFRE_PUBLIC_URL:-http://localhost:4321} # The rest of what .env.example offers. Without these lines a person fills the # file, brings the container up and finds the widget they asked for is not there, # which is worse than not offering it: they think something is guarding the door. COFRE_PROOF_BITS: ${COFRE_PROOF_BITS:-18} COFRE_CLIENT_IP_HEADER: ${COFRE_CLIENT_IP_HEADER:-} COFRE_TURNSTILE_SITE_KEY: ${COFRE_TURNSTILE_SITE_KEY:-} COFRE_TURNSTILE_SECRET: ${COFRE_TURNSTILE_SECRET:-} NODE_ENV: production volumes: - cofreData:/data healthcheck: test: ["CMD", "node", "-e", "fetch('http://localhost:4321/health').then(r => process.exit(r.ok ? 0 : 1))"] interval: 30s timeout: 5s retries: 3 # Uncomment this with the database service below, and not on its own: Compose # refuses the whole project when a service depends on one that is not there. # # Waiting for the container to exist is not enough, which is why this waits for it # to be healthy. PostgreSQL starts, writes its own files, restarts itself once and # only then opens the socket, so a server that connects the moment the container # appears is refused and dies on the first boot. # depends_on: # database: # condition: service_healthy
# PostgreSQL instead of SQLite. Four things to uncomment, not one: this service, the # depends_on above, the volume it writes to at the bottom of this file, and # POSTGRES_PASSWORD in .env. Then point COFRE_DATABASE at it: # COFRE_DATABASE=postgres://cofre:${POSTGRES_PASSWORD}@database:5432/cofre # The host is `database`, the name of the service, because that is what the address # resolves to from inside this network. It is not localhost, which in there is the # container asking itself. # database: # image: postgres:17-alpine # restart: unless-stopped # environment: # POSTGRES_USER: cofre # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} # POSTGRES_DB: cofre # volumes: # - cofrePostgres:/var/lib/postgresql/data # # What the depends_on above waits for. Asking the database itself, rather than # # watching a port, because the port is open for a moment during the start before # # it is ready to answer. # healthcheck: # test: ["CMD-SHELL", "pg_isready -U cofre -d cofre"] # interval: 5s # timeout: 5s # retries: 12
volumes: cofreData: # The other half of the database service above. Compose refuses the whole project when # a service mounts a volume nothing declares, so uncommenting one without the other # brings nothing up at all. # cofrePostgres:name: cofrefixa o nome do projeto, seja qual for o nome da pasta. O container e o volume levam esse nome, e é por isso que o volume se chamacofre_cofreDatanos comandos de backup mais abaixo.build: .constrói a imagem na sua máquina, a partir doDockerfileque fica ao lado deste arquivo. Primeiro ele monta a interface, depois uma imagem sobrenode:24-alpineque roda o servidor com o usuárionode, e não como root.restart: unless-stoppedsobe o container de novo depois de uma queda ou de um reinício do Docker, a não ser que você mesmo tenha parado.portspublica o servidor na porta da sua máquina indicada porCOFRE_PORT, ou 4321 quando nada a define. Dentro do container o servidor escuta sempre na 4321.environmententrega as configurações ao servidor.${NOME:-valor}pega a linhaNOME=do.enve só usa o valor depois de:-quando o.envnão tem essa linha ou a deixa vazia. Ou seja, uma linha no.envsempre vence o padrão escrito aqui.${COFRE_SECRET:?...}não tem padrão: sem segredo, o Compose não sobe o container.NODE_ENVfica fixo emproduction.volumesmonta o volumecofreDataem/data, dentro do container. O que é gravado em/datasobrevive quando o container é trocado. O que é gravado em qualquer outro lugar, não.healthcheckpergunta ao servidor em/healtha cada 30 segundos. Odocker compose psmostra a resposta como(healthy).- O
depends_on, o serviçodatabasee o volumecofrePostgrescomentados são o caminho do PostgreSQL. Eles são descomentados juntos, com uma linha no.env, como dizem os comentários do arquivo. Veja PostgreSQL.
Instalar, passo a passo
Seção intitulada “Instalar, passo a passo”1. Baixe o código
Seção intitulada “1. Baixe o código”git clone https://github.com/AndreiLud/app-cofre-inkcd app-cofre-inkTodos os comandos daqui em diante rodam dentro dessa pasta.
2. Crie o arquivo .env
Seção intitulada “2. Crie o arquivo .env”cp .env.example .envO .env.example lista todas as configurações, com um comentário em cada uma. O cp funciona no PowerShell também. Ele substitui um .env que já exista sem perguntar, então rode uma vez só: num servidor que já está em uso, você perderia o segredo e os endereços do passo 4.
3. Gere um segredo
Seção intitulada “3. Gere um segredo”node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))"Sai uma sequência de 64 caracteres. Abra o .env num editor de texto e cole logo depois de COFRE_SECRET=, na mesma linha. Sem Node, qualquer sequência aleatória de pelo menos 32 caracteres serve. Uma mais curta impede o servidor de subir.
O segredo assina as sessões de quem está conectado. Ele não é a sua senha. Guarde longe dos olhos dos outros, e não troque: trocar desconecta todo mundo.
4. Deixe o resto comentado, até o endereço mudar
Seção intitulada “4. Deixe o resto comentado, até o endereço mudar”O COFRE_SECRET é a única linha que precisa ser preenchida para o container. Nas palavras do .env.example, “everything left commented falls through to a default that already suits it”, ou seja, tudo o que fica comentado cai num padrão que já serve. Uma linha comentada continua importando, porque o que o .env define vence o compose.yaml, então não mexa nestas a menos que seja de propósito:
# COFRE_DATABASE=fica comentada. Aí o Compose usa o padrão docompose.yaml,/data/cofre.db, na pasta em que o volume é montado, e o banco sobrevive às atualizações. Um caminho escrito ali que não fique dentro de/datacoloca o banco dentro do container, e a próxima atualização apaga. Preencha só para PostgreSQL.# COFRE_WEB_ORIGIN=e# COFRE_PUBLIC_URL=ficam comentadas enquanto o Cofre Ink for usado só na máquina que roda o Docker. Os dois ficam então emhttp://localhost:4321, porque o container serve a própria interface e os dois são o mesmo endereço. OCOFRE_WEB_ORIGINé onde a interface é aberta, e todo link de convite é montado com ele. OCOFRE_PUBLIC_URLé onde o servidor responde, visto de fora.
No momento em que o servidor for alcançado por algo que não seja localhost (de outro aparelho, por um domínio, em https://), tire o # das duas linhas de endereço e coloque o endereço real nas duas:
COFRE_WEB_ORIGIN=https://cofre.suacasa.comCOFRE_PUBLIC_URL=https://cofre.suacasa.comOs dois endereços são o que as pessoas digitam no navegador para abrir o Cofre Ink, com http:// ou https:// no começo e sem barra no fim. http://localhost:4321 só funciona na máquina que roda o Docker. Se outros aparelhos vão usar o servidor, um celular na sua casa por exemplo, coloque nas duas linhas o endereço que esses aparelhos usam, e abra o Cofre Ink por esse mesmo endereço em todos eles, inclusive nesta máquina: o servidor só aceita entrar a partir de uma página aberta num desses dois endereços. Para um endereço na internet, leia antes HTTPS e proxy reverso.
5. Suba o servidor
Seção intitulada “5. Suba o servidor”docker compose up -dNa primeira vez, o Compose constrói a imagem antes de subir. Isso precisa de internet e leva um tempo: cerca de um minuto na máquina usada neste guia, que já tinha a imagem base do Node. Das próximas vezes, sobe em segundos.
6. Confira se está rodando
Seção intitulada “6. Confira se está rodando”docker compose psO estado aparece como (health: starting) por uns 30 segundos, depois como (healthy).
docker compose logs --tail 50No meio das linhas, procure estas duas:
Cofre Ink is listening on http://localhost:4321storing data in /data/cofre.dbA primeira diz sempre localhost, seja qual for o endereço que você definiu. A segunda precisa apontar para um arquivo dentro de /data. Se ela disser storing data in ./data/cofre.db, o .env ainda tem a linha do banco de uma cópia antiga, como descreve o aviso do passo 4: coloque um # na frente dela, rode docker compose up -d de novo e confira outra vez antes que alguém crie uma conta.
O primeiro acesso
Seção intitulada “O primeiro acesso”Abra http://localhost:4321 num navegador da mesma máquina, ou o endereço que você definiu no passo 4.
A interface abre em português num aparelho com o relógio num fuso horário do Brasil, e em inglês em qualquer outro lugar. O botão PT EN no alto, chamado Idioma, troca o idioma, e aquele navegador guarda a escolha. Os nomes abaixo são os da interface em português.
- A primeira tela pergunta Como você quer usar o Cofre Ink?. O container serve a mesma interface de app.cofre.ink, e ela não sabe sozinha que veio do seu servidor, então você diz.
- Em Sincronizar entre os meus aparelhos, aperte Ver as duas formas.
- Um servidor meu já vem escolhido, e o Endereço do servidor vem preenchido com
http://localhost:4321. Na máquina que roda o Docker, deixe assim. Em qualquer outro lugar, digite o endereço do passo 4 comhttp://no começo: um endereço digitado semhttp://nemhttps://é lido comohttps://, e este servidor não responde assim. - Aperte Conectar.
- A tela diz Crie o seu acesso, com um quadro que avisa Este servidor ainda não tem ninguém. Preencha Como você se chama, Email e Senha, que pede Pelo menos dez caracteres.
- Aperte Criar conta e entrar. Leva alguns segundos, porque o navegador primeiro resolve um cálculo que deixa lento quem tenta adivinhar senhas em massa.
Captura de tela pendente
A tela de entrar de um servidor novo, Crie o seu acesso, antes de criar a conta.
src/assets/shots/pt/signInFirst.light.pngAbre o Painel do seu espaço pessoal, Pessoal, vazio. Se Categorias, em Ajustes, estiver sem nenhuma, aperte Usar o conjunto inicial ali. Primeiros passos segue daqui.
O que saber sobre as contas:
- Não existe senha padrão, nem senha escrita em lugar nenhum. A que você escolheu é a única.
- Não existe recuperação de senha, nem um jeito de trocar a senha pela interface, e o servidor não manda email. Guarde a senha num lugar seguro.
- O cadastro fica aberto para qualquer pessoa que chegue ao endereço. A conta nova começa vazia e não vê nada do que é seu. A primeira conta não tem nenhum poder especial sobre o servidor: os papéis existem dentro de cada espaço.
- Daqui em diante a tela de entrar deste servidor abre em Entrar. Quem é novo aperta Ainda não tenho conta.
- A escolha do servidor fica guardada em cada navegador. Cada um dos outros aparelhos passa pelos passos 1 a 4 acima, com o mesmo endereço.
Convidar alguém
Seção intitulada “Convidar alguém”Convites precisam de um espaço compartilhado, porque o espaço pessoal não aceita membros.
- Abra o menu de espaços (o botão com o nome do espaço, no alto), escolha Gerenciar espaços e depois Novo espaço. Dê um nome e aperte Salvar.
- Com esse espaço aberto, escolha Membros no mesmo menu e aperte Convidar.
- Escolha um Papel, aperte Gerar link e depois Copiar link.
O link começa com o endereço de COFRE_WEB_ORIGIN e Vale por sete dias e serve para uma pessoa só. A outra pessoa abre o link, conecta ao mesmo servidor como em O primeiro acesso, cria uma conta e entra. Membros e convites explica os papéis e o resto.
(abre a imagem em tamanho real)HTTPS e proxy reverso
Seção intitulada “HTTPS e proxy reverso”O servidor fala HTTP simples na porta 4321 e não tem certificado próprio. Numa máquina só, ou numa rede de casa em que você confia, isso basta. Para alcançar o servidor pela internet, você precisa de um proxy reverso na frente dele, com um certificado de verdade. O repositório não traz configuração de proxy, então use o que você conhece. Depois, no .env:
- Tire o
#da frente deCOFRE_PUBLIC_URLe deCOFRE_WEB_ORIGINe coloque nas duas o endereço público, começando comhttps://. - Tire o
#da frente deCOFRE_CLIENT_IP_HEADERe coloque nela o cabeçalho em que o seu proxy escreve o endereço de quem chama, normalmentex-forwarded-for: é dele que o limite de tentativas de entrar lê quem está chamando. Deixe vazio quando nada estiver na frente. - Rode
docker compose up -dde novo, para o container subir com os valores novos.
Com https:// em COFRE_PUBLIC_URL, o navegador só guarda a sessão em https, então o proxy precisa responder com um certificado válido, senão ninguém continua conectado.
A interface de app.cofre.ink com o seu servidor. Também dá para conectar a interface de app.cofre.ink ao seu servidor, no lugar da que o próprio servidor serve. Nesse caso COFRE_WEB_ORIGIN precisa ser https://app.cofre.ink e COFRE_PUBLIC_URL o endereço do seu servidor, que é o único caso em que os dois são diferentes, e o seu servidor precisa responder em https com certificado de verdade, senão ninguém continua conectado: para o navegador, são dois sites diferentes. Os testes automáticos do projeto não cobrem essa combinação. Abrir o endereço do seu próprio servidor evita tudo isso.
PostgreSQL
Seção intitulada “PostgreSQL”Esta página monta o SQLite, um arquivo só dentro do volume, que é o padrão. Para PostgreSQL, o compose.yaml traz um serviço database sobre postgres:17-alpine, e quatro coisas são descomentadas juntas. Deixar uma de fora trava o arquivo inteiro, porque o Compose recusa um serviço que monta um volume, ou que depende de um serviço, que ninguém declarou.
- O serviço
database, nocompose.yaml, com ohealthcheckdele. - O
depends_ondo serviçocofre, mais acima no mesmo arquivo. - O volume
cofrePostgres, no fim do arquivo. Ele fica longe do serviço, então é o mais fácil de esquecer. POSTGRES_PASSWORD, no.env, a senha com que o banco é criado.
O segundo impede o servidor de procurar o banco cedo demais: o PostgreSQL reinicia a si mesmo uma vez enquanto sobe, então o Compose espera o healthcheck dele responder antes de subir o servidor.
Depois aponte o servidor para ele, no mesmo .env:
POSTGRES_PASSWORD=alguma coisa longaCOFRE_DATABASE=postgres://cofre:${POSTGRES_PASSWORD}@database:5432/cofreO Compose expande o ${POSTGRES_PASSWORD}, então a senha é escrita uma vez só. O host é database, o nome do serviço, e não localhost, que dentro do container é o próprio container. Rode docker compose up -d, e o log diz storing data in postgres://cofre:***@database:5432/cofre.
Este caminho foi rodado enquanto este guia era escrito: o docker compose up -d esperou o banco ficar saudável, depois subiu o servidor, que conectou de primeira.
Ele continua sendo o caminho menos provado: os testes automáticos do projeto só rodam o PostgreSQL no PGlite, dentro do processo de teste. A cópia do volume descrita abaixo copia o cofreData, que aqui fica vazio, então faça o backup do PostgreSQL com pg_dump, ou com a cópia pela interface, que funciona igual com qualquer um dos dois bancos.
Atualizar
Seção intitulada “Atualizar”- Faça um backup antes, como explicado abaixo. O repositório não descreve como voltar para uma versão anterior, então essa cópia é o seu caminho de volta.
- Leia o changelog: ele diz o que mudou em cada versão, e o que fazer a respeito se você roda um servidor.
- Na pasta do clone, rode:
git pulldocker compose up -d --buildO git pull traz o código novo e o --build reconstrói a imagem com ele. Quando a imagem mudou, o Compose troca o container. Quando o banco precisa mudar de formato, o servidor faz isso sozinho ao subir. Os seus lançamentos continuam no volume desde que o banco fique dentro de /data, o que acontece enquanto a linha COFRE_DATABASE estiver comentada: depois da atualização, docker compose logs --tail 50 deve dizer de novo storing data in /data/cofre.db. O git pull deixa o .env como estava, então, se o seu veio de uma cópia antiga do repositório, leia o aviso do passo 4 antes de atualizar.
Backup e restauração
Seção intitulada “Backup e restauração”São dois tipos de cópia, e cada um guarda uma coisa:
- Uma cópia do volume, feita pela linha de comando, guarda o servidor inteiro: todas as contas, espaços, membros e convites.
- Uma cópia pela interface guarda os espaços de quem está conectado, num arquivo que qualquer Cofre Ink traz de volta. Ela não leva contas, nem quem participa de cada espaço.
Uma cópia do volume
Seção intitulada “Uma cópia do volume”Rode estes comandos na pasta do clone. O servidor para por alguns segundos, e o arquivo cofre.tar.gz aparece nessa pasta.
docker compose stopdocker run --rm -v cofre_cofreData:/data -v ${PWD}:/out alpine tar czf /out/cofre.tar.gz /datadocker compose startNa primeira vez, o Docker baixa a imagem alpine. A linha tar: removing leading '/' from member names é esperada. O arquivo guarda data/cofre.db, às vezes com cofre.db-wal e cofre.db-shm ao lado, o que não faz mal. Ele não tem senha e guarda todas as contas e lançamentos, então deixe num lugar que só você acessa.
Restaurar uma cópia do volume
Seção intitulada “Restaurar uma cópia do volume”Isto troca tudo o que está no volume pelo conteúdo do arquivo: o que foi escrito depois da cópia se perde. Coloque o cofre.tar.gz na pasta do clone e rode:
docker compose stopdocker run --rm -v cofre_cofreData:/data -v ${PWD}:/out alpine sh -c "find /data -mindepth 1 -delete && tar xzf /out/cofre.tar.gz -C /"docker compose startO segundo comando esvazia o volume antes de desempacotar, para nenhum arquivo do banco atual se misturar com o restaurado. Numa máquina nova, siga a instalação até o passo 6 primeiro, para o Compose criar o volume, e depois rode os três comandos.
Uma cópia pela interface
Seção intitulada “Uma cópia pela interface”Em Ajustes, Dados, Guardar uma cópia grava um arquivo com tudo do espaço aberto quando você aperta Guardar, e Trazer de volta, com Escolher arquivo, junta um arquivo desses com o que já existe. Com mais de um espaço, Backup de todos os espaços, dentro de Levar os dados para outro programa, guarda num arquivo só todos os espaços em que você é Dono ou Administrador. Essas cópias funcionam igual com SQLite e com PostgreSQL. Backup e restauração tem os detalhes.
Todas as variáveis
Seção intitulada “Todas as variáveis”O servidor lê estas e nenhuma outra. O Compose passa os valores do .env, e uma linha no .env substitui o valor mostrado depois de “Com o Compose”.
COFRE_SECRETobrigatóriaCom o Compose: nenhum, e sem ela o Compose não sobe
COFRE_DATABASEopcionalCom o Compose: /data/cofre.db
postgres é PostgreSQL. O .env.example deixa essa linha comentada. Deixe o arquivo SQLite dentro de /data, para ele ficar no volume.COFRE_WEB_ORIGINopcionalCom o Compose: http://localhost:4321
.env.example deixa essa linha comentada, como a próxima: defina as duas assim que o servidor for alcançado por algo que não seja localhost.COFRE_PUBLIC_URLopcionalCom o Compose: http://localhost:4321
https://, a sessão só fica guardada em https.COFRE_PORTopcionalCom o Compose: 4321
COFRE_CLIENT_IP_HEADERopcionalCom o Compose: vazio
x-forwarded-for. Só com um proxy na frente.COFRE_PROOF_BITSopcionalCom o Compose: 18
COFRE_TURNSTILE_SITE_KEYopcionalCom o Compose: vazio
COFRE_TURNSTILE_SECRETopcionalCom o Compose: vazio
NODE_ENVfixaCom o Compose: production, escrito no compose.yaml
COFRE_STATIC_DIRfixaCom o Compose: /app/apps/server/public, definido pela imagem
Algumas se comportam diferente com o Compose:
NODE_ENVeCOFRE_STATIC_DIRnão fazem nada quando escritas no.env. Ocompose.yamlfixa a primeira, e a segunda vem da imagem e não é repassada.COFRE_PORTsó muda a porta na sua máquina. Se você trocar, coloque a porta nova nos dois endereços também.- O Turnstile fica desligado a menos que as duas linhas estejam preenchidas, e o servidor não sobe com uma só. Ligado, ele conta à Cloudflare o endereço de todo mundo que abre a sua tela de entrar, e a entrada é recusada sempre que a Cloudflare não responde. O projeto só testou o Turnstile contra um substituto, nunca contra a própria Cloudflare.
POSTGRES_PASSWORDé lida pelo serviço PostgreSQL e pela linhaCOFRE_DATABASEque a usa, não pelo servidor em si.
Problemas comuns
Seção intitulada “Problemas comuns”Para ver o que o servidor disse, rode docker compose logs --tail 50 na pasta do clone.
O Compose diz set COFRE_SECRET in .env
Seção intitulada “O Compose diz set COFRE_SECRET in .env”A linha COFRE_SECRET= do .env está vazia. Gere um segredo como no passo 3, cole ali e rode docker compose up -d de novo.
the configuration is not complete
Seção intitulada “the configuration is not complete”O container para assim que sobe, e o log diz isso, depois onde os valores vão (com Docker, no .env), depois qual configuração e por quê. O mais comum é um COFRE_SECRET com menos de 32 caracteres. Corrija a linha no .env e rode docker compose up -d.
COFRE_TURNSTILE_SECRET is set without COFRE_TURNSTILE_SITE_KEY
Seção intitulada “COFRE_TURNSTILE_SECRET is set without COFRE_TURNSTILE_SITE_KEY”Ou o contrário. As duas linhas do Turnstile andam juntas: preencha as duas, ou esvazie as duas.
O primeiro build para no meio do download
Seção intitulada “O primeiro build para no meio do download”O build baixa o pnpm e os pacotes pela internet, e para, com mensagens como connect ETIMEDOUT, quando não consegue alcançar esses arquivos. Confira a conexão e rode docker compose up -d de novo.
Cannot find package '@cofre/...'
Seção intitulada “Cannot find package '@cofre/...'”O container sobe e morre porque a imagem está incompleta. Reconstrua do zero e suba de novo:
docker compose build --no-cachedocker compose up -dTudo sumiu depois de uma atualização
Seção intitulada “Tudo sumiu depois de uma atualização”Isto acontece com um .env feito a partir de uma cópia antiga do repositório. Se o log dizia storing data in ./data/cofre.db, o .env ainda tinha a linha COFRE_DATABASE=./data/cofre.db, e o banco ficava dentro do container que a atualização trocou. O que foi escrito assim não volta pelo servidor. Coloque um # na frente da linha, como diz o aviso do passo 4, e rode docker compose up -d. Daí em diante os dados ficam no volume. Se você guardou cópias pela interface, crie a sua conta de novo e traga as cópias com Trazer de volta.
Se você perceber a linha antes de qualquer atualização, guarde primeiro uma cópia de cada espaço pela interface, como explica Backup e restauração, e não rode nem docker compose down nem docker compose up -d --build antes disso: é recriar o container que apaga o arquivo. Depois comente a linha, rode docker compose up -d, crie a conta de novo e traga as cópias de volta.
Os links de convite apontam para localhost:5174
Seção intitulada “Os links de convite apontam para localhost:5174”O .env veio de uma cópia antiga do repositório e ainda tem COFRE_WEB_ORIGIN=http://localhost:5174. Coloque um # na frente da linha numa máquina só, ou defina os dois endereços com o real como no passo 4, depois rode docker compose up -d e gere um link novo.
Não consegui falar com um endereço que começa com https://
Seção intitulada “Não consegui falar com um endereço que começa com https://”A linha embaixo do título da tela de entrar, No servidor, mostra o endereço que este navegador está usando. Um endereço digitado sem http:// virou https://, e este servidor não responde assim, então enviar o formulário diz Não consegui falar com esse endereço. A mesma mensagem aparece quando o servidor está desligado, então confira também o docker compose ps.
Este navegador guarda o endereço que recebeu. Para ser perguntado de novo, apague os dados que o navegador guarda para a página, nas configurações do site, abra a página outra vez e digite o endereço com http://. No endereço do seu servidor esses dados guardam essa escolha e preferências como o idioma e o tema, a não ser que você também tenha usado Só neste navegador ali, e nesse caso o banco dele vai junto.
Email ou senha não conferem
Seção intitulada “Email ou senha não conferem”A tela de entrar mostra isso para uma senha errada e para toda outra recusa: tentativas demais, uma página aberta num endereço em que o servidor não confia, ou o Turnstile. Ao criar uma conta, vale o mesmo para Não consegui criar a conta. Talvez esse email já esteja em uso.
- Espere um minuto e tente de novo. O servidor aceita cinco tentativas de entrar por minuto e cinco contas novas por hora. Sem nada na frente e sem
COFRE_CLIENT_IP_HEADER, ele não consegue separar quem chama e conta todo mundo junto, e é por isso também que o log mostra um aviso que começa comRate limiting could not determine a client IP, uma vez a cada vez que o servidor sobe. - Confira se o endereço no navegador é exatamente o de
COFRE_WEB_ORIGINou o deCOFRE_PUBLIC_URL.
Ninguém continua conectado
Seção intitulada “Ninguém continua conectado”Entrar funciona, e a tela seguinte pede para entrar de novo.
- A interface e o servidor estão em sites diferentes, como app.cofre.ink e um servidor seu. Confira se
COFRE_WEB_ORIGINé o endereço de onde a interface realmente vem, seCOFRE_PUBLIC_URLcomeça comhttps://e se o certificado é de verdade, não autoassinado. Servir a interface pelo seu próprio container evita isso. - O
COFRE_SECRETmudou, o que desconecta todo mundo. Entre de novo.
Ainda com problema
Seção intitulada “Ainda com problema”O guia de deploy e o guia de solução de problemas do próprio repositório, escritos junto com o código, cobrem mais casos do que esta página. Seja quem for que você procurar para ajudar, nunca mande o seu .env: ele guarda o segredo.
Páginas relacionadas: Onde os dados ficam, Membros e convites, Mudar onde os dados ficam, Backup e restauração.