Overleaf Community Edition — VPS ARM64 (Oracle Cloud Ampere)
Data: 09/05/2026
Ambiente: Oracle Cloud Free Tier — ARM64 Ampere, 24 GB RAM, 4 vCPUs
Domínio: overleaf.ruiogawa.net
Stack: Docker Rootless · Nginx Proxy Manager · Let's Encrypt
Índice
- Contexto e Limitações ARM64
- Build da Imagem para ARM64
- Configuração do Stack Docker Compose
- Nginx Proxy Manager
- Criação do Usuário Admin
- TeX Live Completo
- Persistência da Imagem com TeX Live
- Estabilidade do Docker Rootless
- Swap
- Backup Automático no Google Drive
- Integrações — Zotero e GitHub
- Manutenção
- Estrutura de Diretórios
1. Contexto e Limitações ARM64
A imagem oficial do Overleaf (sharelatex/sharelatex) não possui build para linux/arm64/v8. Tentativas de pull falham com:
no matching manifest for linux/arm64/v8 in the manifest list entries
A solução adotada foi buildar a imagem localmente no VPS a partir do código-fonte oficial do repositório overleaf/overleaf.
O Overleaf Toolkit (bin/build) também não está disponível na versão CE — o toolkit apenas faz pull de imagens prontas, sem suporte a build.
2. Build da Imagem para ARM64
2.1 Clonar o repositório fonte
git clone https://github.com/overleaf/overleaf.git /home/ubuntu/stacks/overleaf-src
2.2 Buildar a imagem base
A imagem base (sharelatex-base) precisa ser buildada primeiro para ARM64, pois a versão do Docker Hub é x86_64:
cd /home/ubuntu/stacks/overleaf-src
docker build --platform linux/arm64 \
-t sharelatex/sharelatex-base:latest \
-f server-ce/Dockerfile-base .
2.3 Buildar a imagem principal
docker build --platform linux/arm64 \
-t sharelatex/sharelatex:latest \
-f server-ce/Dockerfile .
Tempo estimado: 20–30 minutos no Ampere ARM64.
2.4 Criar a tag de versão
O toolkit gera composes que referenciam uma tag de versão específica (ex: 6.1.2). Após cada build, retaguear:
docker tag sharelatex/sharelatex:latest sharelatex/sharelatex:6.1.2
Atenção: ao recriar o container, a tag deve existir localmente. Se o container for destruído e recriado, use a imagem commitada com TeX Live (seção 7).
3. Configuração do Stack Docker Compose
3.1 Inicializar o Toolkit (apenas para gerar a config base)
git clone https://github.com/overleaf/toolkit.git /home/ubuntu/stacks/overleaf
cd /home/ubuntu/stacks/overleaf && bin/init
3.2 Editar config/overleaf.rc
# Escutar em todas as interfaces (necessário para o NPM alcançar)
sed -i 's/OVERLEAF_LISTEN_IP=127.0.0.1/OVERLEAF_LISTEN_IP=0.0.0.0/' config/overleaf.rc
# Porta alternativa para não conflitar com o NPM
sed -i 's/OVERLEAF_PORT=80/OVERLEAF_PORT=8070/' config/overleaf.rc
# Usar imagem local (não puxar do Docker Hub)
sed -i 's/# OVERLEAF_IMAGE_NAME=sharelatex\/sharelatex/OVERLEAF_IMAGE_NAME=sharelatex\/sharelatex/' config/overleaf.rc
sed -i 's/# PULL_BEFORE_UPGRADE=false/PULL_BEFORE_UPGRADE=false/' config/overleaf.rc
sed -i 's/# SIBLING_CONTAINERS_PULL=false/SIBLING_CONTAINERS_PULL=false/' config/overleaf.rc
sed -i 's/SIBLING_CONTAINERS_ENABLED=true/SIBLING_CONTAINERS_ENABLED=false/' config/overleaf.rc
Nota:
SIBLING_CONTAINERS_ENABLED=falseé obrigatório — sibling containers são feature exclusiva do Server Pro.
3.3 docker-compose.yml
O arquivo abaixo é o definitivo, com pull_policy: never para o sharelatex (usa imagem local) e network external para compatibilidade:
name: overleaf
services:
mongo:
command: ["--replSet", "overleaf"]
container_name: mongo
expose:
- "27017"
healthcheck:
test: ["CMD-SHELL", "echo 'db.stats().ok' | mongosh localhost:27017/test --quiet"]
timeout: 10s
interval: 10s
retries: 5
image: mongo:8.0
networks:
- overleaf_default
restart: always
volumes:
- /home/ubuntu/stacks/overleaf/data/mongo:/data/db
redis:
command: ["redis-server", "--appendonly", "yes"]
container_name: redis
expose:
- "6379"
image: redis:7.4
networks:
- overleaf_default
restart: always
volumes:
- /home/ubuntu/stacks/overleaf/data/redis:/data
sharelatex:
container_name: sharelatex
pull_policy: never
depends_on:
mongo:
condition: service_healthy
redis:
condition: service_started
environment:
EMAIL_CONFIRMATION_DISABLED: "true"
ENABLE_CONVERSIONS: "true"
ENABLED_LINKED_FILE_TYPES: project_file,project_output_file
EXTERNAL_AUTH: none
GIT_BRIDGE_ENABLED: "false"
GIT_BRIDGE_HOST: git-bridge
GIT_BRIDGE_PORT: "8000"
OVERLEAF_APP_NAME: Our Overleaf Instance
OVERLEAF_MONGO_URL: mongodb://mongo/sharelatex
OVERLEAF_REDIS_HOST: redis
REDIS_HOST: redis
REDIS_PORT: "6379"
V1_HISTORY_URL: http://sharelatex:3100/api
OVERLEAF_ZOTERO_SERVER: "https://api.zotero.org"
OVERLEAF_ZOTERO_CLIENT_KEY: "335a23c2058c77a0c397"
OVERLEAF_ZOTERO_CLIENT_SECRET: "362c6992403bc83c3be7"
image: sharelatex/sharelatex:6.1.2-texfull
networks:
- overleaf_default
ports:
- "0.0.0.0:8070:80"
restart: always
stop_grace_period: 1m
volumes:
- /home/ubuntu/stacks/overleaf/data/overleaf:/var/lib/overleaf
networks:
overleaf_default:
external: true
3.4 Criar a network e subir o stack
docker network create overleaf_default
docker compose -f /home/ubuntu/stacks/overleaf/docker-compose.yml up -d
3.5 Retagear a imagem após reinicializações
Se o container for recriado e a tag sumir:
docker tag sharelatex/sharelatex:latest sharelatex/sharelatex:6.1.2-texfull
docker compose -f /home/ubuntu/stacks/overleaf/docker-compose.yml up -d
4. Nginx Proxy Manager
4.1 Configuração do Proxy Host
| Campo | Valor |
|---|---|
| Domain Names | overleaf.ruiogawa.net |
| Scheme | http |
| Forward Hostname/IP | 172.17.0.1 |
| Forward Port | 8070 |
| Websockets Support | ✅ ativado |
| SSL | Let's Encrypt ✅ |
172.17.0.1é o IP da interfacedocker0no host — alcançável por todos os containers.
4.2 Configuração Advanced (necessária para git)
Na aba Advanced do proxy host, adicionar:
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
5. Criação do Usuário Admin
Localizar o script de criação de usuário:
docker exec sharelatex find / -name "create-user.js" 2>/dev/null
# /overleaf/services/web/modules/server-ce-scripts/scripts/create-user.js
Criar o usuário admin:
docker exec sharelatex /bin/bash -c \
"cd /overleaf/services/web && node modules/server-ce-scripts/scripts/create-user.js --admin --email=seu@email.com"
O script retorna uma URL do tipo:
http://localhost/user/activate?token=TOKEN&user_id=ID
Substituir localhost por overleaf.ruiogawa.net para acessar a URL de ativação no browser.
6. TeX Live Completo
A imagem padrão vem com uma instalação mínima do TeX Live. Para documentos acadêmicos brasileiros (abntex2, memoir, etc.), é necessário o esquema completo.
6.1 Instalar o scheme-full
docker exec sharelatex tlmgr install scheme-full
Tempo estimado: 30–60 minutos. Instala ~4.000 pacotes.
6.2 Atualizar o índice após instalações
docker exec sharelatex mktexlsr
6.3 Instalar pacotes individuais (se necessário)
docker exec sharelatex tlmgr install NOME_DO_PACOTE
6.4 Warning do abntex2 com babel
O aviso abaixo é inofensivo e não afeta a compilação:
Package babel Warning: Name 'brazil' is deprecated. Use 'brazilian' instead.
Caso apareça no seu próprio documento, substituir:
% De:
\usepackage[brazil]{babel}
% Para:
\usepackage[brazilian]{babel}
7. Persistência da Imagem com TeX Live
O tlmgr install modifica o container em execução. Se o container for recriado, os pacotes são perdidos. Para preservar:
docker commit sharelatex sharelatex/sharelatex:6.1.2-texfull
O docker-compose.yml já referencia sharelatex/sharelatex:6.1.2-texfull. Após qualquer instalação significativa de pacotes, repetir o commit.
8. Estabilidade do Docker Rootless
8.1 Problema
O VPS usa Docker no modo rootless (dockerd-rootless.sh). Quando a sessão SSH encerra, o systemd termina a sessão do usuário e envia SIGTERM ao daemon Docker, derrubando todos os containers.
8.2 Solução — Loginctl Linger
sudo loginctl enable-linger ubuntu
Verificar:
loginctl show-user ubuntu | grep Linger
# Linger=yes
Com o linger ativo, o systemd mantém a sessão do usuário ubuntu mesmo após o logout, e o Docker rootless continua rodando.
9. Swap
O VPS não tem swap por padrão. Compilações LaTeX pesadas podem causar picos de memória.
9.1 Criar swap de 4 GB
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Verificar:
free -h
# Swap: 4.0Gi
10. Backup Automático no Google Drive
10.1 Configurar rclone com Google Drive no VPS
Copiar a configuração do remote gdrive do Linux Mint local para o VPS:
# No Linux Mint local, obter a config:
cat ~/.config/rclone/rclone.conf # copiar o bloco [gdrive]
# No VPS:
mkdir -p ~/.config/rclone
nano ~/.config/rclone/rclone.conf # colar o bloco [gdrive]
Verificar:
rclone listremotes
# gdrive:
10.2 Script de backup
Arquivo: /home/ubuntu/stacks/overleaf/backup-gdrive.sh
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H:%M:%S)
LOG="/home/ubuntu/stacks/overleaf/backup.log"
SRC="/home/ubuntu/stacks/overleaf/data/overleaf"
DEST="gdrive:doutorado-unb-2026/tese-overleaf"
echo "[$DATE] Iniciando backup..." >> "$LOG"
rclone sync "$SRC" "$DEST" \
--log-file="$LOG" \
--log-level INFO \
--transfers 4 \
--retries 3
if [ $? -eq 0 ]; then
echo "[$DATE] Backup concluído com sucesso." >> "$LOG"
else
echo "[$DATE] ERRO no backup." >> "$LOG"
fi
chmod +x /home/ubuntu/stacks/overleaf/backup-gdrive.sh
O rclone sync é incremental — transfere apenas arquivos novos ou modificados, mantendo sempre uma cópia fiel e atualizada no Drive.
10.3 Agendamento via cron
(crontab -l 2>/dev/null; echo "0 3 * * * /home/ubuntu/stacks/overleaf/backup-gdrive.sh") | crontab -
Roda todo dia às 3h UTC (meia-noite no horário de Brasília, UTC-3).
10.4 Destino no Google Drive
Google Drive > doutorado-unb-2026 > tese-overleaf
11. Integrações — Zotero e GitHub
11.1 Zotero
A integração nativa (OAuth) não está disponível na Community Edition — é feature exclusiva do Server Pro. As variáveis OVERLEAF_ZOTERO_* estão presentes no compose mas não produzem efeito na interface.
Alternativa recomendada: usar o plugin Better BibTeX no Zotero desktop.
- Instalar o Better BibTeX no Zotero
- Selecionar a coleção → botão direito → Export Collection → formato Better BibTeX
- Fazer upload do arquivo
.bibgerado no projeto Overleaf - Usar normalmente com
\cite{chave}
11.2 GitHub
O endpoint /git/ não está implementado na Community Edition. Git Bridge é feature exclusiva do Server Pro.
Alternativa: o backup incremental no Google Drive (seção 10) cumpre o papel de redundância. Para versionamento explícito, é possível baixar o projeto via Menu → Download → Source e commitar manualmente.
12. Manutenção
12.1 Reiniciar o stack
docker compose -f /home/ubuntu/stacks/overleaf/docker-compose.yml restart
12.2 Ver logs do Overleaf
docker logs sharelatex --tail 50 -f
12.3 Verificar status dos containers
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
12.4 Parar o stack
docker compose -f /home/ubuntu/stacks/overleaf/docker-compose.yml down
12.5 Atualizar pacotes TeX Live
docker exec sharelatex tlmgr update --all
docker exec sharelatex mktexlsr
docker commit sharelatex sharelatex/sharelatex:6.1.2-texfull
12.6 Verificar log de backup
tail -20 /home/ubuntu/stacks/overleaf/backup.log
12.7 Executar backup manualmente
/home/ubuntu/stacks/overleaf/backup-gdrive.sh
13. Estrutura de Diretórios
/home/ubuntu/stacks/overleaf/
├── config/
│ └── overleaf.rc # Configurações do toolkit
├── data/
│ ├── overleaf/ # Dados dos projetos (volume do sharelatex)
│ ├── mongo/ # Dados do MongoDB
│ └── redis/ # Dados do Redis
├── docker-compose.yml # Stack definitivo
├── backup-gdrive.sh # Script de backup
└── backup.log # Log dos backups
/home/ubuntu/stacks/overleaf-src/
└── server-ce/
├── Dockerfile # Imagem principal
└── Dockerfile-base # Imagem base
Resumo das Imagens Docker
| Imagem | Origem | Descrição |
|---|---|---|
sharelatex/sharelatex-base:latest |
Build local ARM64 | Imagem base do Overleaf |
sharelatex/sharelatex:latest |
Build local ARM64 | Overleaf CE sem TeX completo |
sharelatex/sharelatex:6.1.2 |
Tag alias do latest | Referenciada pelo toolkit |
sharelatex/sharelatex:6.1.2-texfull |
docker commit | Imagem em produção com TeX Live completo |
mongo:8.0 |
Docker Hub (ARM64 ✅) | Banco de dados |
redis:7.4 |
Docker Hub (ARM64 ✅) | Cache e filas |
Documentação gerada em 09/05/2026.