Como instalar e configurar um servidor REST REST no Linux
Restic é um sistema de backup com desduplicação eficiente e moderno que suporta criptografia; ele é capaz de armazenar backups local e remotamente, por meio de uma conexão SFTP ou em uma das muitas plataformas de armazenamento suportadas, como buckets Amazon S3 e armazenamento Google Cloud. Ao usar a API de back-end REST REST, também é possível enviar backups usando os protocolos HTTP ou HTTPS para um servidor remoto que implementa a API REST REST.
Neste tutorial, aprendemos como usar o Docker para implantar e configurar uma instância de servidor REST REST no Linux.
Neste tutorial você aprenderá:
- Como implantar um servidor REST REST usando Docker no Linux
- Como configurar a autenticação e usar criptografia SSL/TLS
Criando o diretório do repositório e gerando credenciais
Antes de podermos implantar nosso servidor REST REST usando docker, precisamos escolher o diretório que hospedará nosso repositório e dados de backup. Para fins deste tutorial, criarei um diretório “data” dentro do meu HOME. Este diretório será montado em bind dentro do contêiner:
$ mkdir ~/data
O servidor REST RESTic em execução dentro do contêiner docker vem com autenticação habilitada por padrão. Isto é importante para evitar o acesso não autorizado aos nossos dados. A autenticação do servidor REST REST é implementada por meio de um arquivo .htpasswd; o servidor REST procura esse arquivo no mesmo diretório onde os instantâneos estão armazenados.
Para gerar nossas credenciais de autenticação, precisamos usar o utilitário htpasswd. No Fedora e nas distribuições baseadas no Fedora, o utilitário está incluído no pacote httpd-tools. Podemos instalá-lo com dnf:
$ sudo dnf install httpd-tools
Em vez disso, em distribuições Debian e baseadas em Debian, o pacote é chamado apache2-utils:
$ sudo apt-get update && sudo apt-get install apache2-utils
Para preencher o arquivo .htpasswd, executamos:
$ htpasswd -B -c ~/data/.htpasswd resticuser
Com o comando acima, criamos a configuração necessária para acessar o servidor com o nome de usuário “resticuser”. Se não fornecermos uma senha diretamente como argumento do comando, seremos solicitados a inseri-la interativamente:
New password:
Re-type new password:
Adding password for user restserver
Como usamos a opção -B
, a senha será criptografada usando o algoritmo bcrypt, que é considerado muito seguro.
Executando o contêiner do servidor REST RESTIC
O servidor RESTic REST é um software gratuito e de código aberto; assim como o aplicativo restic, ele é escrito em Go e desenvolvido no GitHub. A maneira mais rápida e fácil de implantar um servidor REST restic é usar Docker (ou Podman), para executar um contêiner baseado na imagem do servidor fornecida pelo projeto, que está disponível no DockerHub. Para criar e gerar um contêiner de servidor REST restic, tudo o que precisamos fazer é usar o seguinte comando:
$ docker run -p 8000:8000 -v ~/data:/data:z --name restic_rest_server docker.io/restic/rest-server
Vamos dar uma olhada nas opções que usamos com o comando. Por padrão, o servidor REST dentro do contêiner escuta na porta 8000, portanto usamos a opção -p
para mapear a porta 8000 no host para a mesma porta dentro do contêiner (poderíamos ter usado qualquer porta do host , como a porta 80, mas usando uma porta sem privilégios, podemos facilmente gerar o contêiner como um usuário não root (dê uma olhada neste tutorial se você quiser usar uma porta mais alta ao executar o Docker ou Podman sem privilégios de root).
Para tornar os backups persistentes, como dito anteriormente, montamos por bind o diretório ~/data
no host, para o mesmo diretório dentro do contêiner, que é onde os snapshots são armazenados. No exemplo usamos a opção :z para a montagem bind: isso é necessário apenas se o SELinux estiver ativo e causa uma mudança de contexto para o diretório montado, para que ele fique acessível a partir do contêiner.
Inicializando um repositório
Neste ponto, já devemos ser capazes de inicializar um repositório restic com o cliente restic, usando a URL rest:http://resticuser:resticpassword@localhost:8000:
restic -r rest:http://resticuser:resticpassword@localhost:8000 init
Se tudo correr conforme o esperado, o repositório será gerado e inicializado corretamente:
created restic repository 0216975ff5 at rest:http://resticuser:***@localhost:8000/
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
Embora o repositório tenha sido gerado corretamente, passar credenciais através de uma conexão HTTP de texto simples é algo que realmente devemos evitar. Para usar o servidor REST REST via HTTPS, precisamos usar um certificado SSL/TLS. Vamos ver como fazer isso.
Usando uma conexão HTTPS segura
Há muitas maneiras de obter um certificado SSL/TLS. Se pretendemos expor nosso servidor REST REST à Internet, precisamos usar um certificado de terceiros válido para nosso domínio. Podemos obter facilmente um em Let's Encrypt, usando certbot. Se quisermos apenas realizar alguns testes, ou pretendemos utilizar nosso servidor exclusivamente em nossa própria rede, porém, basta gerar um certificado autoassinado.
Aqui assumirei que já temos o certificado (que contém a chave pública) e a chave privada, armazenada como public_key e private_key, respectivamente. A maneira mais fácil de usá-los com o servidor REST rodando dentro de um contêiner docker é colocar ambos no diretório de dados que montamos por bind dentro do contêiner (o mesmo diretório onde o arquivo .htpasswd está localizado ) e execute o servidor usando a opção --tls
. Porém, como não estamos executando o servidor diretamente, precisamos passar esta opção através da variável de ambiente OPTIONS
, ao executar o contêiner:
$ docker run -p 8000:8000 -v ~/data:/data:z -e OPTIONS="--tls" --name restic_rest_server docker.io/restic/rest-server
Agora podemos nos comunicar com o servidor por HTTPS. Como neste caso usamos um certificado autoassinado inválido, precisamos executar o cliente restic com a opção --insecure-tls
, que ignora a verificação do certificado TLS ao conectar-se a um repositório:
$ restic -r rest:https://resticuser:resticpassword@localhost:8000 --insecure-tls init
Conclusões
Neste tutorial, aprendemos como implantar um servidor REST restic usando Docker no Linux. Com o restic podemos criar backups local ou remotamente, usando conexões SFTP, um dos serviços de armazenamento de terceiros suportados ou para um servidor REST restic. Este último oferece melhor desempenho se comparado ao SFTP e nos dá a capacidade de executar conexões somente anexadas. Para saber mais sobre o restic e como realizar backups eficientes, você pode dar uma olhada em nosso tutorial passo a passo.