Skip to content

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

  1. Contexto e Limitações ARM64
  2. Build da Imagem para ARM64
  3. Configuração do Stack Docker Compose
  4. Nginx Proxy Manager
  5. Criação do Usuário Admin
  6. TeX Live Completo
  7. Persistência da Imagem com TeX Live
  8. Estabilidade do Docker Rootless
  9. Swap
  10. Backup Automático no Google Drive
  11. Integrações — Zotero e GitHub
  12. Manutenção
  13. 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 interface docker0 no 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.

  1. Instalar o Better BibTeX no Zotero
  2. Selecionar a coleção → botão direito → Export Collection → formato Better BibTeX
  3. Fazer upload do arquivo .bib gerado no projeto Overleaf
  4. 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.