Por que isso é necessário?
Entrega conveniente de conteúdo para o usuário final, evitando o incômodo com FTP e a incapacidade (devido ao NDA) de usar serviços públicos e nuvens para transferência de arquivos (BTsync, Google- \ Mail- \ Yandex-Disk \ Dropbox \ etc).
Prefácio
Nosso escritório conta com uma determinada infraestrutura, inclui Active Directory, no qual temos funcionários que estão em grupos.
Durante uma sessão em um PC, após o login, por meio de políticas configuradas, um drive de rede é montado para cada funcionário. Por meio dele, de tempos em tempos, são trocados dados. O disco possui uma estrutura de pastas específica, cujos direitos são configurados por meio desses mesmos grupos. Todo mundo vê o que as configurações permitem.
Normalmente, para enviar dados para o mundo exterior, ou um FTP separado é criado ou os dados são carregados para um existente. Admito que isso está longe de ser sempre conveniente - pelo menos, criar e gerenciar logins e senhas temporários (por exemplo, quando os parceiros precisam fornecer conteúdo pronto), controlar o espaço em um servidor FTP, enviar manualmente para um servidor FTP antes de "enviar".
Em algum momento, precisávamos ser capazes de fornecer dados aos usuários finais diretamente para o mundo externo a partir de nossa unidade de rede e, de preferência, deveria ser relativamente seguro: você pode criar um link de download (ele tinha uma vida inteira, senha, diferenciação de direitos em relação ao original dados e assim por diante).
Essa ideia nos foi passada por um dos sócios, já que eles tinham um serviço interno, mas lá foi escrito pelo próprio.
Não havia opções prontas no mecanismo de pesquisa (se você as tiver em mente, cancele a inscrição nos comentários) e ninguém tinha o desejo e os recursos para gastar potencialmente muitas horas de trabalho no desenvolvimento do zero, testes e suporte. E por que reinventar a roda, se muitas vezes tudo já foi inventado antes. Foi assim que surgiu o serviço NextCloud, que sabe conectar recursos externos a si mesmo.
Falaremos sobre a versão estável mais recente, atualmente a versão 19, mas nosso método de configuração também funcionará para as versões anteriores - inicialmente o implementamos na versão 16 e depois atualizamos gradualmente. Recentemente, eu apenas levantei do zero no último (19) e, com base nisso, estou escrevendo um artigo.
O que queremos obter no final:
- ActiveDirectoty\LDAP, , Jira, Confluence, Nexus .
- NextCloud, , , .
- NextCloud — - , . , .
- -, , NextCloud .* , — .
- Um funcionário pode criar links temporários protegidos por senha para qualquer recurso disponível para ele - seja uma pasta ou um arquivo separado. E também gerenciá-los (links) - revogar, alterar a vida útil, etc.
- O usuário final, para quem o link seguro foi enviado, só precisa abri-lo e digitar a senha para fazer o download dos dados compartilhados com ele.
Desdobrando e configurando dependências
Para começar, precisamos ter uma máquina virtual ou servidor separado onde podemos instalar o sistema operacional e, em seguida, NextCloud.
Existe mais de um artigo sobre Habré dedicado à implantação do sistema e serviço.
AlexanderSmuito bem e descreveu em detalhes o processo desde a instalação do sistema até a própria configuração da nuvem (incluindo a atualização dos artigos por ano). Não vejo razão para repetir tudo isso novamente.
1. Como estamos conectando uma unidade de rede ao NextCloud, precisamos dos pacotes do sistema: smbclient , libsmbclient , php-ldap e php-smbclient .
Observação, no caso de usar Docker
2. Devido às peculiaridades das configurações do nosso servidor samba (o suporte smb1 está desabilitado), na máquina com nextcloud, nos arquivos /etc/samba/smb.conf e /usr/share/samba/smb.conf, tivemos que alterar as linhas responsáveis pelo protocolo:
[global]
client min protocol = SMB2
client max protocol = SMB3
Continuação do exemplo do Dockerfile
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/
Caso contrário, nextcloud nunca foi capaz de se conectar à unidade.
Configuração do Nextcloud
Portanto, o Nextcloud já está instalado, as dependências estão instaladas e o serviço tem um usuário interno que foi criado durante a instalação.
Passo um. Preparando um modelo para contas de funcionários.
Como teremos mais de um funcionário no sistema, e gradualmente seu número mudará - se você não pré-configurar o modelo do usuário que está sendo criado - todos terão vários arquivos de exemplo em sua pasta pessoal. É bom que nextcloud tenha uma configuração separada para isso - arquivos de esqueleto , que são configurados em config.php .
'skeletondirectory' => '/var/www/html/data/donotdeletme',
Ou seja, você pode criar uma pasta vazia e especificar o caminho completo para ela na configuração.
Passo dois. Tornando os usuários "somente leitura"
Basta especificar a cota em "1 B" (1 byte) na seção de configurações do usuário ( http (s): //nextcloud.domain.tld/settings/users ).
Etapa três - consertar o ZipStreamer com antecedência
ZipStreamer é uma biblioteca usada no backend NextCloud, é usada para criar arquivos "em tempo real", isto é, durante o download de um monte de arquivos.
Como funciona
, "Dowload All Files"/" ", , ( ) , .
, ( .zip, — .tar)
, , .
: Google Drive, ., ..
, ( .zip, — .tar)
, , .
: Google Drive, ., ..
O problema reside no fato de que, por razões desconhecidas, a lógica de alternar zip para zip64 embutido no NextCloud falha, e se houver mais de 65536 arquivos na pasta e / ou seu peso total exceder 4 GB, você provavelmente enfrentará um problema de download o arquivo será vencido ou o download será interrompido após o download de 4 GB.
Este problema foi alocado com tempo suficiente, no GitHub há até mesmo, e não um, tíquete fechado (# 1755 , # 15871 , # 8798 ), mas apesar do fato de que o problema foi supostamente resolvido , ainda o temos e reproduzido com sucesso variável , interferindo muito no trabalho. Tive que resolver isso de forma mais radical.
Decisão
100% 64 , 64- . « ».
<, nextcloud>/lib/private/Streamer.php:
, -, , .
.
<, nextcloud>/lib/private/Streamer.php:
- $this->streamerInstance = new ZipStreamer(['zip64' => false]);
+ $this->streamerInstance = new ZipStreamer(['zip64' => true]);
, Docker
Integrity Check ( /usr/src/nextcloud/* /var/www/html/*).
/var/www — , .
/usr/src/nextcloud/lib/private/ CI . , .
/var/www — , .
/usr/src/nextcloud/lib/private/ CI . , .
Dockerfile
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php
, -, , .
.
Etapa quatro - configurar os parâmetros do link
Nos parâmetros de publicação, configuramos as regras como é conveniente. Por exemplo, tornamos a proteção de senha obrigatória e definimos uma vida útil obrigatória.
Etapa cinco - conectar a unidade de rede
- Vamos configurar armazenamentos externos . ( http (s): //nextcloud.domain.tld/settings/admin/externalstorages )
- Selecionamos adicionar armazenamento SMB \ CIFS.
- Preenchemos os campos de nome, domínio, pasta, etc.
- Selecionamos "Credenciais, armazenar no banco de dados" - é este item que permite ao usuário conectar o disco à sua conta no NextCloud quando o usuário entra usando seu link de login e senha. (O item que armazenava o login e a senha durante a sessão não decolou).
- Não se esqueça no menu <...> de marcar as caixas de seleção "Somente leitura" e a permissão para compartilhamento.
Etapa seis - lançando usuários por meio do LDAP
Agora que temos tudo pronto, instalamos o plugin do marketplace e imediatamente após conectarmos o LDAP. Em nosso sistema, concedemos acesso aos funcionários que estão no grupo NextcloudAccess . Você pode fazer o mesmo.
Conclusão
É isso, depois de todas essas manipulações simples, mas às vezes não as mais óbvias - o serviço está funcionando, o disco está conectado, os funcionários são adicionados e os usuários estão baixando e felizes.
Exemplo completo de nosso Dockerfile
FROM nextcloud:latest
ENV DEBIAN_FRONTEND noninteractive
#installing smbclient
RUN apt update -y && apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-dev
RUN pecl install smbclient
RUN docker-php-ext-enable smbclient
#fix of ZipStreammer
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php
#fix of smb config
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/
Teste de Estresse
"Como você está fazendo com a carga?" - você pergunta finalmente.
Medições durante a hora do rush
Nossa instância de serviço é executada em ~ 6 Gb Ram + 6CPU em uma máquina virtual entre outras VMs.
No pico de carga da rede, foi utilizado um pouco mais de 2,5 Gb de RAM, o processador não estava entupido e o retorno em média foi de cerca de 5 Gbit / s (o recorde chegou a 8 Gbit / s).
A única coisa que notamos é que quando transferimos mais de 6 Gbit / s para o mundo exterior, nossa interface da web cai periodicamente, mas os downloads dos usuários continuam a ocorrer.
Desvantagens identificadas:
- NextCloud não tem a capacidade de ter controle global sobre todos os links criados. Eles são exibidos apenas dentro de cada conta em uma seção separada.
- Se você compartilhar a raiz de uma unidade conectada usando um link, isso pode servir como um vazamento de dados potencial, já que todas as pastas disponíveis para sua conta serão compartilhadas no link.
- Percebi que por um ano de uso do serviço gerado, no momento, a tabela oc_filecache no banco de dados pesa ~ 29Gb e tem cerca de ~ 100k linhas (estamos usando o MySQL básico 5.7.x). Isso se deve aos bugs # 16834 , # 6395 , # 7312 , # 20349 . Enquanto houver vigilância na segunda instância.
Obrigado pela leitura. Se você tiver dúvidas, comentários ou sugestões - não hesite, sempre fico feliz em receber críticas construtivas.
: nextcloud 16, 17, 18, 19
: 26.07.2020
: 24.09.2020
: . Areso.
: 1.0.0.9