🎉 begin project
This commit is contained in:
parent
54a5d8d822
commit
874907d167
145
.env.example
Normal file
145
.env.example
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
# ========================================
|
||||||
|
# Gatoflix Media Center - Environment Variables
|
||||||
|
# ========================================
|
||||||
|
# Copie este arquivo para .env e ajuste os valores conforme necessário
|
||||||
|
# cp .env.example .env
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# DOMÍNIO E REDE
|
||||||
|
# ========================================
|
||||||
|
# Domínio raiz para acesso aos serviços
|
||||||
|
# Os subdomínios serão: plex.DOMAIN, sonarr.DOMAIN, radarr.DOMAIN, etc.
|
||||||
|
#
|
||||||
|
# REDE LOCAL (recomendado para uso doméstico):
|
||||||
|
# - Use .local (ex: media.local, gatoflix.local)
|
||||||
|
# - Caddy usará certificados auto-assinados (TLS interno)
|
||||||
|
# - Configure /etc/hosts ou DNS local
|
||||||
|
#
|
||||||
|
# REDE EXTERNA (exposto na internet):
|
||||||
|
# - Use um domínio real (ex: gatoflix.com.br)
|
||||||
|
# - Caddy usará Let's Encrypt automaticamente
|
||||||
|
# - Requer portas 80 e 443 abertas e DNS configurado
|
||||||
|
#
|
||||||
|
DOMAIN=media.local
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# USUÁRIO E PERMISSÕES
|
||||||
|
# ========================================
|
||||||
|
# ID do usuário e grupo para execução dos containers
|
||||||
|
# Use 'id -u' e 'id -g' no terminal para obter seus valores
|
||||||
|
PUID=1000
|
||||||
|
PGID=1000
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# TIMEZONE
|
||||||
|
# ========================================
|
||||||
|
# Fuso horário para todos os containers
|
||||||
|
# Lista completa: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
TZ=America/Sao_Paulo
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# VERSÕES DOS CONTAINERS
|
||||||
|
# ========================================
|
||||||
|
# Versão dos containers LinuxServer
|
||||||
|
# Use 'latest' para sempre puxar a versão mais recente
|
||||||
|
# Ou especifique uma versão específica para maior controle
|
||||||
|
VERSION=latest
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# DIRETÓRIOS DE DADOS
|
||||||
|
# ========================================
|
||||||
|
# Caminho base para dados de aplicação
|
||||||
|
# Cada serviço terá seu subdiretório: appdata/plex, appdata/sonarr, etc.
|
||||||
|
APPDATA_DIR='~/gatoflix/appdata'
|
||||||
|
|
||||||
|
# Caminho para biblioteca de mídia
|
||||||
|
# Estrutura sugerida:
|
||||||
|
# - MEDIA_DIR/Filmes
|
||||||
|
# - MEDIA_DIR/Series
|
||||||
|
MEDIA_DIR='~/gatoflix/MEDIA'
|
||||||
|
|
||||||
|
# Caminho para downloads de torrents
|
||||||
|
# Estrutura sugerida:
|
||||||
|
# - TORRENT_DIR/complete
|
||||||
|
# - TORRENT_DIR/incomplete
|
||||||
|
# - TORRENT_DIR/watch
|
||||||
|
TORRENT_DIR='~/gatoflix/torrent'
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# FLARESOLVERR - Bypass Cloudflare
|
||||||
|
# ========================================
|
||||||
|
# Nível de log do FlareSolverr
|
||||||
|
# Opções: info, debug, warning, error
|
||||||
|
FLARE_LOG_LEVEL=info
|
||||||
|
|
||||||
|
# Registrar HTML das páginas (útil para debug)
|
||||||
|
# Opções: true, false
|
||||||
|
FLARE_LOG_HTML=false
|
||||||
|
|
||||||
|
# Solver de CAPTCHA
|
||||||
|
# Opções: none, hcaptcha-solver, recaptcha-solver
|
||||||
|
# IMPORTANTE: Solvers externos podem requerer configuração adicional
|
||||||
|
FLARE_CAPTCHA_SOLVER=none
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# CADDY - Proxy Reverso (Opcional)
|
||||||
|
# ========================================
|
||||||
|
# Usuário para autenticação básica em serviços sensíveis
|
||||||
|
# ADMIN_USER=admin
|
||||||
|
|
||||||
|
# Hash da senha para autenticação básica
|
||||||
|
# Gere com: caddy hash-password --plaintext 'sua-senha'
|
||||||
|
# ADMIN_PASSWORD_HASH=
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# PLEX - Configurações Específicas
|
||||||
|
# ========================================
|
||||||
|
# Claim Token para vincular servidor Plex à sua conta
|
||||||
|
# Obtenha em: https://www.plex.tv/claim/
|
||||||
|
# IMPORTANTE: O token expira em 4 minutos após gerado
|
||||||
|
# PLEX_CLAIM=
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# OBSERVAÇÕES IMPORTANTES
|
||||||
|
# ========================================
|
||||||
|
# 1. Crie os diretórios antes de iniciar os containers:
|
||||||
|
# mkdir -p ${APPDATA_DIR}/{plex,sonarr,radarr,bazarr,jackett,transmission,caddy/{data,config}}
|
||||||
|
# mkdir -p ${MEDIA_DIR}/{Filmes,Series}
|
||||||
|
# mkdir -p ${TORRENT_DIR}/{complete,incomplete,watch}
|
||||||
|
#
|
||||||
|
# 2. Ajuste as permissões dos diretórios:
|
||||||
|
# sudo chown -R ${PUID}:${PGID} ${APPDATA_DIR} ${MEDIA_DIR} ${TORRENT_DIR}
|
||||||
|
#
|
||||||
|
# 3. REDE LOCAL (uso doméstico - SEM acesso internet):
|
||||||
|
# a) Configure /etc/hosts com suas entradas:
|
||||||
|
# sudo nano /etc/hosts
|
||||||
|
# # Adicione:
|
||||||
|
# 127.0.0.1 plex.media.local
|
||||||
|
# 127.0.0.1 transmission.media.local
|
||||||
|
# 127.0.0.1 jackett.media.local
|
||||||
|
# 127.0.0.1 sonarr.media.local
|
||||||
|
# 127.0.0.1 radarr.media.local
|
||||||
|
# 127.0.0.1 bazarr.media.local
|
||||||
|
#
|
||||||
|
# b) Acesse via HTTPS com certificados auto-assinados:
|
||||||
|
# - https://plex.media.local
|
||||||
|
# - Navegador mostrará aviso de segurança (é normal!)
|
||||||
|
# - Aceite o certificado para continuar
|
||||||
|
#
|
||||||
|
# c) OU use HTTP sem SSL (descomente seção HTTP no Caddyfile):
|
||||||
|
# - http://plex.media.local
|
||||||
|
# - Sem avisos de segurança
|
||||||
|
# - Menos seguro, mas funciona
|
||||||
|
#
|
||||||
|
# 4. REDE EXTERNA (exposto na internet):
|
||||||
|
# IMPORTANTE: Let's Encrypt SÓ funciona com domínio real e acesso internet!
|
||||||
|
# a) Registre um domínio (ex: gatoflix.com.br)
|
||||||
|
# b) Configure DNS A/AAAA apontando *.seudominio.com para seu IP público
|
||||||
|
# c) Abra portas 80 e 443 no roteador para o servidor
|
||||||
|
# d) Altere Caddyfile: remova "tls internal" e adicione email no global options
|
||||||
|
# e) Caddy gerará certificados SSL automaticamente via Let's Encrypt
|
||||||
|
#
|
||||||
|
# 5. Migração dos dados existentes:
|
||||||
|
# - Os volumes já apontam para os diretórios existentes
|
||||||
|
# - Verifique se os caminhos estão corretos antes de iniciar
|
||||||
|
# - Faça backup antes de migrar!
|
||||||
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Caddy data
|
||||||
|
caddy/
|
||||||
|
|
||||||
|
# Docker volumes
|
||||||
|
appdata/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
163
Caddyfile
Normal file
163
Caddyfile
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
# ==============================================
|
||||||
|
# Gatoflix Media Center - Caddy Configuration
|
||||||
|
# CONFIGURAÇÃO PARA REDE LOCAL
|
||||||
|
# ==============================================
|
||||||
|
|
||||||
|
# Global options
|
||||||
|
# {
|
||||||
|
# # Para rede local, desabilitar ACME (Let's Encrypt)
|
||||||
|
# # Caddy gerará certificados auto-assinados automaticamente
|
||||||
|
# auto_https disable_redirects
|
||||||
|
#
|
||||||
|
# # OU use certificados internos do Caddy (recomendado)
|
||||||
|
# # Descomente a linha abaixo para usar PKI interno do Caddy
|
||||||
|
# # local_certs
|
||||||
|
# }
|
||||||
|
|
||||||
|
# ==============================================
|
||||||
|
# Media Server - Plex
|
||||||
|
# ==============================================
|
||||||
|
# plex.{$DOMAIN} {
|
||||||
|
# # TLS interno (certificado auto-assinado)
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy plex:32400
|
||||||
|
#
|
||||||
|
# # Headers específicos para Plex
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "SAMEORIGIN"
|
||||||
|
# Referrer-Policy "no-referrer-when-downgrade"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # Logs
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/plex.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
# ==============================================
|
||||||
|
# Download Manager - Transmission
|
||||||
|
# ==============================================
|
||||||
|
# transmission.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy transmission:9091
|
||||||
|
#
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "DENY"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/transmission.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # ==============================================
|
||||||
|
# # Indexer - Jackett
|
||||||
|
# # ==============================================
|
||||||
|
# jackett.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy jackett:9117
|
||||||
|
#
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "DENY"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/jackett.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # ==============================================
|
||||||
|
# # TV Shows Manager - Sonarr
|
||||||
|
# # ==============================================
|
||||||
|
# sonarr.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy sonarr:8989
|
||||||
|
#
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "DENY"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/sonarr.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # ==============================================
|
||||||
|
# # Movies Manager - Radarr
|
||||||
|
# # ==============================================
|
||||||
|
# radarr.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy radarr:7878
|
||||||
|
#
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "DENY"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/radarr.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # ==============================================
|
||||||
|
# # Subtitles Manager - Bazarr
|
||||||
|
# # ==============================================
|
||||||
|
# bazarr.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
#
|
||||||
|
# reverse_proxy bazarr:6767
|
||||||
|
#
|
||||||
|
# header {
|
||||||
|
# X-Content-Type-Options "nosniff"
|
||||||
|
# X-Frame-Options "DENY"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# log {
|
||||||
|
# output file /var/log/caddy/bazarr.log
|
||||||
|
# format json
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
# ==============================================
|
||||||
|
# ALTERNATIVA: SEM HTTPS (HTTP apenas)
|
||||||
|
# ==============================================
|
||||||
|
# Se preferir não usar HTTPS em rede local, descomente abaixo
|
||||||
|
# e comente todos os blocos acima
|
||||||
|
#
|
||||||
|
http://plex.{$DOMAIN} {
|
||||||
|
reverse_proxy plex:32400
|
||||||
|
}
|
||||||
|
|
||||||
|
http://transmission.{$DOMAIN} {
|
||||||
|
reverse_proxy transmission:9091
|
||||||
|
}
|
||||||
|
|
||||||
|
http://jackett.{$DOMAIN} {
|
||||||
|
reverse_proxy jackett:9117
|
||||||
|
}
|
||||||
|
|
||||||
|
http://sonarr.{$DOMAIN} {
|
||||||
|
reverse_proxy sonarr:8989
|
||||||
|
}
|
||||||
|
|
||||||
|
http://radarr.{$DOMAIN} {
|
||||||
|
reverse_proxy radarr:7878
|
||||||
|
}
|
||||||
|
|
||||||
|
http://bazarr.{$DOMAIN} {
|
||||||
|
reverse_proxy bazarr:6767
|
||||||
|
}
|
||||||
276
README.md
276
README.md
@ -1,2 +1,276 @@
|
|||||||
# gatoflix
|
# Gatoflix Media Center
|
||||||
|
|
||||||
|
Stack completa de servidor de mídia com Plex, Sonarr, Radarr, Bazarr, Jackett, Transmission e FlareSolverr, gerenciados via Docker Compose com proxy reverso Caddy.
|
||||||
|
|
||||||
|
## Serviços Incluídos
|
||||||
|
|
||||||
|
### Media Server
|
||||||
|
- **Plex** - Servidor de streaming de mídia
|
||||||
|
|
||||||
|
### Download
|
||||||
|
- **Transmission** - Cliente BitTorrent
|
||||||
|
|
||||||
|
### Indexers & Resolvers
|
||||||
|
- **Jackett** - Agregador de indexadores/trackers
|
||||||
|
- **FlareSolverr** - Bypass de proteção Cloudflare
|
||||||
|
|
||||||
|
### PVR (Personal Video Recorder)
|
||||||
|
- **Sonarr** - Gerenciador de séries de TV
|
||||||
|
- **Radarr** - Gerenciador de filmes
|
||||||
|
|
||||||
|
### Subtitles
|
||||||
|
- **Bazarr** - Gerenciador de legendas
|
||||||
|
|
||||||
|
### Proxy Reverso
|
||||||
|
- **Caddy** - Servidor web com HTTPS automático
|
||||||
|
|
||||||
|
## Estrutura de Subdomínios
|
||||||
|
|
||||||
|
Todos os serviços são acessíveis via subdomínios:
|
||||||
|
|
||||||
|
- `plex.SEU_DOMINIO` - Plex Media Server
|
||||||
|
- `transmission.SEU_DOMINIO` - Transmission Web UI
|
||||||
|
- `jackett.SEU_DOMINIO` - Jackett
|
||||||
|
- `sonarr.SEU_DOMINIO` - Sonarr
|
||||||
|
- `radarr.SEU_DOMINIO` - Radarr
|
||||||
|
- `bazarr.SEU_DOMINIO` - Bazarr
|
||||||
|
|
||||||
|
## Instalação
|
||||||
|
|
||||||
|
### 1. Configurar variáveis de ambiente
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copiar arquivo de exemplo
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# Editar com seus valores
|
||||||
|
nano .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Criar estrutura de diretórios
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Criar diretórios de aplicação
|
||||||
|
mkdir -p ~/gatoflix/appdata/{plex,plex/transcode,sonarr,radarr,bazarr,jackett,transmission,caddy/{data,config},downloads}
|
||||||
|
|
||||||
|
# Criar diretórios de mídia (se ainda não existirem)
|
||||||
|
mkdir -p ~/gatoflix/MEDIA/{Filmes,Series}
|
||||||
|
|
||||||
|
# Criar diretórios de torrents
|
||||||
|
mkdir -p ~/gatoflix/torrent/{complete/{radarr,tv-sonarr},incomplete,watch}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Ajustar permissões
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Obter seu UID e GID
|
||||||
|
id -u # Geralmente 1000
|
||||||
|
id -g # Geralmente 1000
|
||||||
|
|
||||||
|
# Ajustar permissões (use os valores corretos de PUID e PGID)
|
||||||
|
sudo chown -R 1000:1000 ~/gatoflix/appdata
|
||||||
|
sudo chown -R 1000:1000 ~/gatoflix/MEDIA
|
||||||
|
sudo chown -R 1000:1000 ~/gatoflix/torrent
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Configurar DNS
|
||||||
|
|
||||||
|
#### Para acesso local (desenvolvimento/rede interna)
|
||||||
|
|
||||||
|
Edite o arquivo `/etc/hosts` e adicione:
|
||||||
|
|
||||||
|
```
|
||||||
|
127.0.0.1 plex.media.local
|
||||||
|
127.0.0.1 transmission.media.local
|
||||||
|
127.0.0.1 jackett.media.local
|
||||||
|
127.0.0.1 sonarr.media.local
|
||||||
|
127.0.0.1 radarr.media.local
|
||||||
|
127.0.0.1 bazarr.media.local
|
||||||
|
```
|
||||||
|
|
||||||
|
No `.env`, configure `DOMAIN=media.local`
|
||||||
|
|
||||||
|
#### Para acesso externo (produção)
|
||||||
|
|
||||||
|
1. Configure registros DNS A/AAAA apontando para seu IP público:
|
||||||
|
- `*.seudominio.com` → `SEU_IP_PUBLICO`
|
||||||
|
|
||||||
|
2. Configure port forwarding no roteador:
|
||||||
|
- Porta 80 → 80 (HTTP)
|
||||||
|
- Porta 443 → 443 (HTTPS)
|
||||||
|
|
||||||
|
3. No `.env`, configure `DOMAIN=seudominio.com`
|
||||||
|
|
||||||
|
### 5. Iniciar serviços
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Subir todos os containers
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Verificar status
|
||||||
|
docker-compose ps
|
||||||
|
|
||||||
|
# Ver logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Ver logs de um serviço específico
|
||||||
|
docker-compose logs -f plex
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Verificar e ajustar
|
||||||
|
|
||||||
|
1. Acesse cada serviço via navegador
|
||||||
|
2. Verifique se as configurações estão corretas
|
||||||
|
3. Ajuste URLs internas se necessário (ex: Sonarr/Radarr → Transmission)
|
||||||
|
|
||||||
|
## Configuração dos Serviços
|
||||||
|
|
||||||
|
### URLs Internas (para configuração entre serviços)
|
||||||
|
|
||||||
|
Use os nomes dos containers como hostname:
|
||||||
|
|
||||||
|
- Transmission: `http://transmission:9091`
|
||||||
|
- Jackett: `http://jackett:9117`
|
||||||
|
- FlareSolverr: `http://flaresolverr:8191`
|
||||||
|
|
||||||
|
### Exemplos de Configuração
|
||||||
|
|
||||||
|
#### Sonarr/Radarr → Transmission
|
||||||
|
- Host: `transmission`
|
||||||
|
- Port: `9091`
|
||||||
|
- URL Base: (vazio)
|
||||||
|
|
||||||
|
#### Sonarr/Radarr → Jackett
|
||||||
|
- Host: `http://jackett:9117`
|
||||||
|
|
||||||
|
#### Jackett → FlareSolverr
|
||||||
|
- FlareSolverr URL: `http://flaresolverr:8191`
|
||||||
|
|
||||||
|
## Comandos Úteis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Parar todos os serviços
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Reiniciar um serviço específico
|
||||||
|
docker-compose restart plex
|
||||||
|
|
||||||
|
# Ver logs em tempo real
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Atualizar images
|
||||||
|
docker-compose pull
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Remover containers, networks e volumes (CUIDADO!)
|
||||||
|
docker-compose down -v
|
||||||
|
|
||||||
|
# Executar comando em um container
|
||||||
|
docker-compose exec plex bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup
|
||||||
|
|
||||||
|
### Backup dos dados de configuração
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Criar backup
|
||||||
|
tar -czf backup-gatoflix-$(date +%Y%m%d).tar.gz \
|
||||||
|
~/gatoflix/appdata
|
||||||
|
|
||||||
|
# Restaurar backup
|
||||||
|
tar -xzf backup-gatoflix-YYYYMMDD.tar.gz -C /
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup da biblioteca de mídia
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use rsync para backups incrementais
|
||||||
|
rsync -av --progress \
|
||||||
|
~/gatoflix/MEDIA/ \
|
||||||
|
/caminho/destino/backup/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Segurança
|
||||||
|
Segurança
|
||||||
|
|
||||||
|
### Recomendações
|
||||||
|
Recomendações
|
||||||
|
1. **Autenticação**: Configure senhas fortes em todos os serviços
|
||||||
|
2. **Firewall**: Mantenha apenas portas 80, 443 abertas externamente
|
||||||
|
3. **Atualizações**: Execute `docker-compose pull` regularmente
|
||||||
|
4. **Backups**: Configure backups automáticos regulares
|
||||||
|
5. **HTTPS**: Caddy gerencia certificados SSL automaticamente
|
||||||
|
|
||||||
|
### Autenticação Básica no Caddy (Opcional)
|
||||||
|
|
||||||
|
Para adicionar camada extra de segurança:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Gerar hash de senha
|
||||||
|
docker run --rm caddy caddy hash-password --plaintext 'sua-senha-forte'
|
||||||
|
|
||||||
|
# Adicionar ao .env
|
||||||
|
ADMIN_USER=admin
|
||||||
|
ADMIN_PASSWORD_HASH=<hash_gerado>
|
||||||
|
```
|
||||||
|
|
||||||
|
Descomente as linhas de `basicauth` no Caddyfile.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Containers não iniciam
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar logs
|
||||||
|
docker-compose logs
|
||||||
|
|
||||||
|
# Verificar permissões
|
||||||
|
ls -la ~/gatoflix/appdata
|
||||||
|
```
|
||||||
|
|
||||||
|
### Erro de permissões
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ajustar owner dos diretórios
|
||||||
|
sudo chown -R 1000:1000 ~/gatoflix/appdata
|
||||||
|
```
|
||||||
|
|
||||||
|
### Certificados SSL não geram
|
||||||
|
|
||||||
|
1. Verifique se portas 80 e 443 estão acessíveis externamente
|
||||||
|
2. Confirme que DNS está apontando corretamente
|
||||||
|
3. Veja logs do Caddy: `docker-compose logs caddy`
|
||||||
|
|
||||||
|
### Serviços não se comunicam
|
||||||
|
|
||||||
|
1. Verifique se estão na mesma rede: `docker network ls`
|
||||||
|
2. Use nomes de container como hostname
|
||||||
|
3. Não use `localhost` ou `127.0.0.1` entre containers
|
||||||
|
|
||||||
|
## Estrutura do Projeto
|
||||||
|
|
||||||
|
```
|
||||||
|
gatoflix/
|
||||||
|
├── docker-compose.yml # Definição de todos os serviços
|
||||||
|
├── Caddyfile # Configuração do proxy reverso
|
||||||
|
├── .env # Variáveis de ambiente (não versionado)
|
||||||
|
├── .env.example # Template de variáveis de ambiente
|
||||||
|
├── .gitignore # Arquivos ignorados pelo git
|
||||||
|
└── README.md # Esta documentação
|
||||||
|
```
|
||||||
|
|
||||||
|
## Licença
|
||||||
|
|
||||||
|
Este é um projeto pessoal de gerenciamento de mídia.
|
||||||
|
|
||||||
|
## Suporte
|
||||||
|
|
||||||
|
Para problemas específicos dos serviços:
|
||||||
|
- [Plex](https://support.plex.tv/)
|
||||||
|
- [Sonarr](https://wiki.servarr.com/sonarr)
|
||||||
|
- [Radarr](https://wiki.servarr.com/radarr)
|
||||||
|
- [Bazarr](https://wiki.bazarr.media/)
|
||||||
|
- [Jackett](https://github.com/Jackett/Jackett)
|
||||||
|
- [Transmission](https://transmissionbt.com/)
|
||||||
|
- [Caddy](https://caddyserver.com/docs/)
|
||||||
|
|||||||
233
REDE-LOCAL.md
Normal file
233
REDE-LOCAL.md
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
# Configuração para Rede Local
|
||||||
|
|
||||||
|
Este guia explica como configurar o Gatoflix Media Center para uso em rede doméstica **SEM exposição à internet**.
|
||||||
|
|
||||||
|
## Por que Let's Encrypt não funciona?
|
||||||
|
|
||||||
|
**Let's Encrypt NÃO funciona em redes locais** porque:
|
||||||
|
|
||||||
|
1. Let's Encrypt precisa validar que você controla o domínio
|
||||||
|
2. Servidores do Let's Encrypt acessam seu servidor via internet (porta 80 ou 443)
|
||||||
|
3. Em rede local doméstica sem IP público acessível, isso é impossível
|
||||||
|
|
||||||
|
## Opções para Rede Local
|
||||||
|
|
||||||
|
### Opção 1: HTTPS com Certificados Auto-Assinados (Configuração Atual)
|
||||||
|
|
||||||
|
O Caddyfile está configurado para usar `tls internal`, que gera certificados auto-assinados automaticamente.
|
||||||
|
|
||||||
|
**Vantagens:**
|
||||||
|
- Conexão criptografada (HTTPS)
|
||||||
|
- Zero configuração adicional
|
||||||
|
- Funciona offline
|
||||||
|
|
||||||
|
**Desvantagens:**
|
||||||
|
- Navegador mostrará aviso de certificado não confiável
|
||||||
|
- Precisa aceitar o certificado manualmente em cada dispositivo
|
||||||
|
|
||||||
|
**Como usar:**
|
||||||
|
1. Configure o `.env` com `DOMAIN=media.local`
|
||||||
|
2. Adicione entradas ao `/etc/hosts`:
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/hosts
|
||||||
|
|
||||||
|
# Adicione estas linhas:
|
||||||
|
127.0.0.1 plex.media.local
|
||||||
|
127.0.0.1 transmission.media.local
|
||||||
|
127.0.0.1 jackett.media.local
|
||||||
|
127.0.0.1 sonarr.media.local
|
||||||
|
127.0.0.1 radarr.media.local
|
||||||
|
127.0.0.1 bazarr.media.local
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Inicie os containers:
|
||||||
|
```bash
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Acesse via HTTPS:
|
||||||
|
- `https://plex.media.local`
|
||||||
|
- `https://sonarr.media.local`
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
5. **Aceite o aviso de segurança:**
|
||||||
|
- Chrome/Edge: Clique em "Avançado" → "Continuar para media.local"
|
||||||
|
- Firefox: Clique em "Avançado" → "Aceitar o risco e continuar"
|
||||||
|
|
||||||
|
### Opção 2: HTTP sem SSL (Mais Simples)
|
||||||
|
|
||||||
|
Se preferir evitar avisos de certificado, use HTTP puro (sem criptografia).
|
||||||
|
|
||||||
|
**Vantagens:**
|
||||||
|
- Sem avisos de certificado
|
||||||
|
- Acesso direto sem aceitar nada
|
||||||
|
|
||||||
|
**Desvantagens:**
|
||||||
|
- Conexão não criptografada
|
||||||
|
- Senhas trafegam em texto claro na rede
|
||||||
|
|
||||||
|
**Como usar:**
|
||||||
|
|
||||||
|
1. Edite o `Caddyfile` e **comente** todos os blocos HTTPS:
|
||||||
|
```caddyfile
|
||||||
|
# plex.{$DOMAIN} {
|
||||||
|
# tls internal
|
||||||
|
# reverse_proxy plex:32400
|
||||||
|
# }
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Descomente** os blocos HTTP no final do arquivo:
|
||||||
|
```caddyfile
|
||||||
|
http://plex.{$DOMAIN} {
|
||||||
|
reverse_proxy plex:32400
|
||||||
|
}
|
||||||
|
|
||||||
|
http://transmission.{$DOMAIN} {
|
||||||
|
reverse_proxy transmission:9091
|
||||||
|
}
|
||||||
|
|
||||||
|
# ... etc
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Reinicie o Caddy:
|
||||||
|
```bash
|
||||||
|
docker-compose restart caddy
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Acesse via HTTP:
|
||||||
|
- `http://plex.media.local`
|
||||||
|
- `http://sonarr.media.local`
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
### Opção 3: Sem Caddy - Portas Diretas
|
||||||
|
|
||||||
|
Se não quiser usar proxy reverso, pode acessar diretamente pelas portas.
|
||||||
|
|
||||||
|
**Como usar:**
|
||||||
|
|
||||||
|
1. Edite `docker-compose.yml` e exponha as portas:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
sonarr:
|
||||||
|
ports:
|
||||||
|
- 8989:8989
|
||||||
|
|
||||||
|
radarr:
|
||||||
|
ports:
|
||||||
|
- 7878:7878
|
||||||
|
|
||||||
|
bazarr:
|
||||||
|
ports:
|
||||||
|
- 6767:6767
|
||||||
|
|
||||||
|
jackett:
|
||||||
|
ports:
|
||||||
|
- 9117:9117
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Remova ou pare o container do Caddy:
|
||||||
|
```bash
|
||||||
|
docker-compose stop caddy
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Acesse diretamente pelo IP:
|
||||||
|
- `http://localhost:8989` (Sonarr)
|
||||||
|
- `http://localhost:7878` (Radarr)
|
||||||
|
- `http://localhost:32400/web` (Plex)
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
## Acesso de outros dispositivos na rede
|
||||||
|
|
||||||
|
### Configurar /etc/hosts em outros dispositivos
|
||||||
|
|
||||||
|
**Linux/macOS:**
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/hosts
|
||||||
|
|
||||||
|
# Substitua 192.168.1.100 pelo IP do seu servidor
|
||||||
|
192.168.1.100 plex.media.local
|
||||||
|
192.168.1.100 sonarr.media.local
|
||||||
|
192.168.1.100 radarr.media.local
|
||||||
|
192.168.1.100 transmission.media.local
|
||||||
|
192.168.1.100 jackett.media.local
|
||||||
|
192.168.1.100 bazarr.media.local
|
||||||
|
```
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
|
1. Abra o Bloco de Notas como Administrador
|
||||||
|
2. Abra: `C:\Windows\System32\drivers\etc\hosts`
|
||||||
|
3. Adicione as mesmas linhas acima
|
||||||
|
|
||||||
|
**Android:**
|
||||||
|
- Requer root ou app como "Hosts Editor"
|
||||||
|
|
||||||
|
**iOS:**
|
||||||
|
- Requer jailbreak ou usar DNS local
|
||||||
|
|
||||||
|
### Opção Melhor: DNS Local
|
||||||
|
|
||||||
|
Configure um servidor DNS local (Pi-hole, AdGuard Home, ou router DNS):
|
||||||
|
|
||||||
|
1. Adicione registros A apontando para o IP do servidor:
|
||||||
|
```
|
||||||
|
plex.media.local → 192.168.1.100
|
||||||
|
sonarr.media.local → 192.168.1.100
|
||||||
|
radarr.media.local → 192.168.1.100
|
||||||
|
transmission.media.local → 192.168.1.100
|
||||||
|
jackett.media.local → 192.168.1.100
|
||||||
|
bazarr.media.local → 192.168.1.100
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Configure DHCP do roteador para usar o DNS local
|
||||||
|
|
||||||
|
3. Todos os dispositivos da rede resolverão automaticamente!
|
||||||
|
|
||||||
|
## mDNS/Avahi (Alternativa Avançada)
|
||||||
|
|
||||||
|
Para usar `.local` sem editar hosts:
|
||||||
|
|
||||||
|
1. Instale Avahi no servidor:
|
||||||
|
```bash
|
||||||
|
sudo apt install avahi-daemon
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Configure para responder por múltiplos nomes
|
||||||
|
|
||||||
|
3. Dispositivos Apple (macOS, iOS) resolverão automaticamente
|
||||||
|
4. Linux com avahi também resolve
|
||||||
|
5. Windows precisa de Bonjour Print Services
|
||||||
|
|
||||||
|
## Resumo - Recomendação
|
||||||
|
|
||||||
|
**Para uso doméstico simples:**
|
||||||
|
- Use **Opção 2 (HTTP sem SSL)**
|
||||||
|
- Configure `/etc/hosts` em cada dispositivo
|
||||||
|
- OU configure DNS local no roteador
|
||||||
|
|
||||||
|
**Para segurança adicional:**
|
||||||
|
- Use **Opção 1 (HTTPS com certificados auto-assinados)**
|
||||||
|
- Aceite os certificados uma vez em cada navegador/dispositivo
|
||||||
|
- Conexão criptografada mesmo em rede local
|
||||||
|
|
||||||
|
**Para máxima simplicidade:**
|
||||||
|
- Use **Opção 3 (sem Caddy)**
|
||||||
|
- Acesse direto pelo IP:porta
|
||||||
|
- Sem subdomínios, sem proxy
|
||||||
|
|
||||||
|
## Migração para Internet (Futuro)
|
||||||
|
|
||||||
|
Se futuramente quiser expor na internet com Let's Encrypt:
|
||||||
|
|
||||||
|
1. Registre um domínio real
|
||||||
|
2. Configure DNS A/AAAA para seu IP público
|
||||||
|
3. Abra portas 80 e 443 no roteador
|
||||||
|
4. Edite `Caddyfile`:
|
||||||
|
- Remova `tls internal` de todos os serviços
|
||||||
|
- Adicione email no global options:
|
||||||
|
```caddyfile
|
||||||
|
{
|
||||||
|
email seu@email.com
|
||||||
|
}
|
||||||
|
```
|
||||||
|
5. Reinicie: `docker-compose restart caddy`
|
||||||
|
6. Caddy obterá certificados Let's Encrypt automaticamente!
|
||||||
167
docker-compose.yml
Normal file
167
docker-compose.yml
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# ======================
|
||||||
|
# Media Server
|
||||||
|
# ======================
|
||||||
|
plex:
|
||||||
|
image: linuxserver/plex:latest
|
||||||
|
container_name: gatoflix-plex
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
# Plex precisa de algumas portas UDP para descoberta na rede local
|
||||||
|
# Comente estas linhas se não precisar de acesso direto
|
||||||
|
ports:
|
||||||
|
- 32400:32400 # Web UI (será também acessível via Caddy)
|
||||||
|
- 32400:32400/udp # Plex DLNA Server
|
||||||
|
- 32469:32469 # Plex DLNA Server
|
||||||
|
- 32469:32469/udp # Plex DLNA Server
|
||||||
|
- 5354:5353/udp # Plex Companion
|
||||||
|
- 1900:1900/udp # Plex DLNA Server
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/plex:/config
|
||||||
|
- ${APPDATA_DIR}/plex/transcode:/transcode
|
||||||
|
- ${MEDIA_DIR}:/data
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
VERSION: ${VERSION}
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# Download Clients
|
||||||
|
# ======================
|
||||||
|
transmission:
|
||||||
|
image: linuxserver/transmission:latest
|
||||||
|
container_name: gatoflix-transmission
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
# Porta 51413 necessária para conexões P2P
|
||||||
|
# Pode ser comentada se usar VPN ou não precisar de seeding
|
||||||
|
ports:
|
||||||
|
- 51413:51413
|
||||||
|
- 51413:51413/udp
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/transmission:/config
|
||||||
|
- ${TORRENT_DIR}:/downloads
|
||||||
|
- ${TORRENT_DIR}/watch:/watch
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# Indexers & Searchers
|
||||||
|
# ======================
|
||||||
|
jackett:
|
||||||
|
image: linuxserver/jackett:latest
|
||||||
|
container_name: gatoflix-jackett
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/jackett:/config
|
||||||
|
#- ${APPDATA_DIR}/downloads:/downloads
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
flaresolverr:
|
||||||
|
image: ghcr.io/flaresolverr/flaresolverr:latest
|
||||||
|
container_name: gatoflix-flaresolverr
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
environment:
|
||||||
|
LOG_LEVEL: ${FLARE_LOG_LEVEL:-info}
|
||||||
|
LOG_HTML: ${FLARE_LOG_HTML:-false}
|
||||||
|
CAPTCHA_SOLVER: ${FLARE_CAPTCHA_SOLVER:-none}
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# PVR - TV Shows
|
||||||
|
# ======================
|
||||||
|
sonarr:
|
||||||
|
image: linuxserver/sonarr:latest
|
||||||
|
container_name: gatoflix-sonarr
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/sonarr:/config
|
||||||
|
# - ${APPDATA_DIR}/downloads:/downloads
|
||||||
|
- ${MEDIA_DIR}/Series:/tv
|
||||||
|
- ${TORRENT_DIR}/complete/tv-sonarr:/supercousas/MEDIACENTER/torrent
|
||||||
|
- ${TORRENT_DIR}/complete/tv-sonarr:/downloads/complete/tv-sonarr
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# PVR - Movies
|
||||||
|
# ======================
|
||||||
|
radarr:
|
||||||
|
image: linuxserver/radarr:latest
|
||||||
|
container_name: gatoflix-radarr
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/radarr:/config
|
||||||
|
- ${MEDIA_DIR}/Filmes:/movies
|
||||||
|
- ${TORRENT_DIR}:/supercousas/MEDIACENTER/torrent
|
||||||
|
- ${TORRENT_DIR}/complete/radarr:/downloads/complete/radarr
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# Subtitles
|
||||||
|
# ======================
|
||||||
|
bazarr:
|
||||||
|
image: linuxserver/bazarr:latest
|
||||||
|
container_name: gatoflix-bazarr
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
volumes:
|
||||||
|
- ${APPDATA_DIR}/bazarr:/config
|
||||||
|
- ${MEDIA_DIR}/Filmes:/movies
|
||||||
|
- ${MEDIA_DIR}/Series:/tv
|
||||||
|
environment:
|
||||||
|
PUID: ${PUID}
|
||||||
|
PGID: ${PGID}
|
||||||
|
TZ: ${TZ}
|
||||||
|
UMASK: 022
|
||||||
|
|
||||||
|
# ======================
|
||||||
|
# Reverse Proxy
|
||||||
|
# ======================
|
||||||
|
caddy:
|
||||||
|
image: caddy:latest
|
||||||
|
container_name: gatoflix-caddy
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- media
|
||||||
|
ports:
|
||||||
|
- 80:80
|
||||||
|
# - 443:443
|
||||||
|
# - 443:443/udp # HTTP/3
|
||||||
|
volumes:
|
||||||
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
- ${APPDATA_DIR}/caddy/data:/data
|
||||||
|
- ${APPDATA_DIR}/caddy/config:/config
|
||||||
|
environment:
|
||||||
|
DOMAIN: ${DOMAIN}
|
||||||
|
|
||||||
|
networks:
|
||||||
|
media:
|
||||||
|
driver: bridge
|
||||||
Loading…
x
Reference in New Issue
Block a user