Cloud storage pessoal com sync de arquivos, compartilhamento e acesso via apps mobile. Acesso externo seguro via Cloudflare Tunnel em https://drive.exemplo.com.
┌─ REDE LOCAL / EXTERNA ────────────────────────────────────┐
│ │
│ Dispositivo ──► https://drive.exemplo.com │
│ ──► Cloudflare Edge (TLS) ──► Tunnel ──► localhost:9200 │
│ ──► oCIS │
└───────────────────────────────────────────────────────────┘
Por design, o oCIS não funciona acessado por IP direto (
192.168.x.x:9200). O OIDC requer que a URL de acesso seja exatamente igual aoOCIS_URL. O acesso (mesmo local) deve ser feito sempre via domínio para garantir o HTTPS e a autenticação correta.
Porta no host:
| Porta Host | Porta Container | Uso |
|---|---|---|
9200/tcp |
9200 |
Web UI + API (WebDAV, OIDC) |
A porta
9200é a única necessária. O oCIS é um binário Go que inclui tudo: web server, autenticação (OIDC), storage, search engine. Sem PHP, sem Apache, sem banco de dados externo.
Execute todos os comandos no terminal SSH do servidor.
# Criar diretórios para config e dados
sudo mkdir -p /srv/ocis/config /srv/ocis/data
# oCIS roda como UID 1000 dentro do container
sudo chown -Rfv 1000:1000 /srv/ocis# Confirmar que a porta 9200 não está em uso
sudo ss -tlnp | grep 9200Se não retornar nada, está livre.
- Acessar o Portainer → Stacks → Add Stack
- Nome:
ocis - Colar o conteúdo do arquivo
assets/stacks/owncloud-ocis.yml - Na seção Environment variables, adicionar:
| Variável | Valor |
|---|---|
OCIS_ADMIN_PASSWORD |
Sua senha (mín. 8 chars: maiúscula + minúscula + número + especial) |
- Clicar em Deploy the stack
O entrypoint da stack executa:
ocis init || true; ocis serverocis init— Gera oocis.yamlcom JWT secrets, chaves de criptografia e configurações internas. A env varOCIS_INSECURE=trueresponde automaticamente o prompt interativo|| true— Se oinitjá rodou antes (config existe), ignora o erro e segueocis server— Inicia todos os serviços
Em deploys subsequentes, o
inité pulado automaticamente porque oocis.yamljá existe no volume persistente.
| Variável | Valor | Descrição |
|---|---|---|
OCIS_URL |
https://drive.exemplo.com |
URL pública. Obrigatória para OIDC funcionar |
PROXY_TLS |
false |
Desabilita TLS no container (Cloudflare cuida) |
OCIS_INSECURE |
true |
Desativa validação de cert interno (necessário com PROXY_TLS=false) |
PROXY_HTTP_ADDR |
0.0.0.0:9200 |
Escuta em todas as interfaces |
IDM_ADMIN_PASSWORD |
${OCIS_ADMIN_PASSWORD} |
Senha admin vinda do .env |
OCIS_LOG_LEVEL |
warn |
info para debug, warn para produção |
No painel Cloudflare Zero Trust → Networks → Tunnels:
- Selecionar o tunnel existente
- Adicionar Public Hostname:
- Subdomain:
drive - Domain:
exemplo.com - Type:
HTTP - URL:
localhost:9200
- Subdomain:
Mesmo fluxo já feito para o
adguard.exemplo.com. O registro CNAMEdrive.exemplo.comé criado automaticamente no Cloudflare DNS.
O oCIS não funciona acessado por IP direto — o OIDC exige que a URL seja idêntica ao OCIS_URL. Nenhuma configuração extra é necessária: os dispositivos da rede local acessam https://drive.exemplo.com normalmente pelo Cloudflare Tunnel.
Warning
Não use DNS rewrite no AdGuard apontando drive.exemplo.com para 192.168.x.x. Isso faz o browser tentar https://192.168.x.x:443, mas o oCIS escuta apenas na porta 9200. O resultado é que tanto o acesso local quanto o externo param de funcionar.
| Plataforma | App | Link |
|---|---|---|
| iOS | ownCloud | App Store |
| Android | ownCloud | Google Play |
| Windows | ownCloud Desktop | Download |
| macOS | ownCloud Desktop | Download |
- Abrir o app → Adicionar conta
- URL do servidor:
https://drive.exemplo.com - Login:
admin+ senha definida no deploy - Selecionar pastas para sync
# 1. Verificar se o container está rodando
docker ps | grep ocis
# 2. Testar OIDC discovery (deve retornar JSON)
curl -s http://localhost:9200/.well-known/openid-configuration | head -5
# 3. Verificar logs (procurar erros)
docker logs ocis --tail 50Com o DNS rewrite configurado no AdGuard (Parte 3.2), o acesso local é feito pelo mesmo domínio:
- Abrir
https://drive.exemplo.comna rede local - Login com
admin+ senha
Acesso por IP (
http://192.168.x.x:9200) retorna "Configuração ausente ou inválida" — isso é comportamento esperado e não é um bug. O OIDC exige que a URL seja idêntica aoOCIS_URL.
- Abrir
https://drive.exemplo.com - Login com
admin+ senha - Upload de arquivo de teste
- Verificar no app mobile que o arquivo aparece
O OCIS_URL está diferente do domínio configurado no Cloudflare. Verificar:
docker exec ocis env | grep OCIS_URLDeve retornar OCIS_URL=https://drive.exemplo.com.
O tunnel não consegue alcançar o oCIS. Verificar:
# Container rodando?
docker ps | grep ocis
# Porta respondendo?
curl -s http://localhost:9200# Reajustar permissões
sudo chown -Rfv 1000:1000 /srv/ocis# Parar o container
docker stop ocis
# Rodar reset
docker run --rm -it \
--mount type=bind,source=/srv/ocis/config,target=/etc/ocis \
--mount type=bind,source=/srv/ocis/data,target=/var/lib/ocis \
-e IDM_ADMIN_PASSWORD="NovaSenhaAqui123!" \
owncloud/ocis idm resetpassword| Recurso | URL |
|---|---|
| Web UI | https://drive.exemplo.com |
| WebDAV | https://drive.exemplo.com/dav/files/<username>/ |
| Portainer | Stack ocis |