Manual de instalação

WoofedCRM

Hospede o Woofed CRM em seu servidor. Seja o proprietário dos dados de seus clientes e cresça com baixo custo.

Portainer & Traefik

Passo a passo

Este guia visa uma instalação limpa em uma vps com ubuntu 20.04

Obs: Todo local que estiver < NOME > você deverá subistituir pelo nome que deseja removendo os sinais "< >" .

Configurando a VPS

Atualizando

							
							
					sudo apt update && sudo apt upgrade -y				
			

Definindo Time zone

							
							
					sudo timedatectl set-timezone America/Sao_Paulo				
			

Definindo nome do Host do servidor

							
							
					hostnamectl set-hostname <NOME_DO_SERVIDOR>				
			
							
							
					sudo sed -i "s/127.0.0.1[[:space:]]localhost/127.0.0.1 <NOME_DO_SERVIDOR>/g" /etc/hosts				
			
							
							
					sudo apt-get update				
			

Instalando dependencia

							
							
					sudo apt-get install -y apparmor-utils				
			

Docker Swarm

Guardar ip da VPS em uma variável

							
							
					ip=$(curl -s ifconfig.me)				
			

Instalando docker

							
							
					curl -fsSL https://get.docker.com | bash				
			

iniciando Swarm

							
							
					docker swarm init --advertise-addr $ip				
			

Criando rede interna

							
							
					docker network create --driver=overlay <NOME_DA_REDE_INTERNA>				
			

Traefik

Criando stack do traefik

							
							
					nano traefik.yaml				
			

Edite todos os campos comentados com #

							
							
					version: "3.7"

services:
  traefik:
    image: traefik:latest
    command:
      - "--api.dashboard=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=NOME_DA_REDE_INTERNA" ## ---> NOME DA REDE INTERNA <--- ##
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencryptresolver.acme.storage=/etc/traefik/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencryptresolver.acme.email=SEU_EMAIL_AQUI" ## ---> SEU EMAIL <--- ##
      - "--log.level=DEBUG"
      - "--log.format=common"
      - "--log.filePath=/var/log/traefik/traefik.log"
      - "--accesslog=true"
      - "--accesslog.filepath=/var/log/traefik/access-log"
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        - "traefik.enable=true"
        - "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
        - "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true"
        - "traefik.http.routers.http-catchall.rule=Host(\`{host:.+}\`)"
        - "traefik.http.routers.http-catchall.entrypoints=web"
        - "traefik.http.routers.http-catchall.middlewares=redirect-https@docker"
        - "traefik.http.routers.http-catchall.priority=1"
    volumes:
      - "vol_certificates:/etc/traefik/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    ports:
      - target: 80
        published: 80
        mode: host
      - target: 443
        published: 443
        mode: host
    networks:
      - NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##

volumes:
  vol_shared:
    external: true
    name: volume_swarm_shared
  vol_certificates:
    external: true
    name: volume_swarm_certificates

networks:
  NOME_DA_REDE_INTERNA: ## ---> NOME DA REDE INTERNA <--- ##
    external: true
    name: NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##				
			

Subindo o a stack do traefik

							
							
					docker stack deploy --prune --resolve-image always -c traefik.yaml traefik > /dev/null 2>&1				
			

Portainer

Criando stack do Portainer

							
							
					nano portainre.yaml				
			

Edite todos os campos comentados com #

							
							
					version: "3.7"

services:
  agent:
    image: portainer/agent:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:latest
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    volumes:
      - portainer_data:/data
    networks:
      - NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.portainer.rule=Host(`URL_DO_PORTAINER`)" ## ---> URL DO PORTAINER <--- ##
        - "traefik.http.services.portainer.loadbalancer.server.port=9000"
        - "traefik.http.routers.portainer.tls.certresolver=letsencryptresolver"
        - "traefik.http.routers.portainer.service=portainer"
        - "traefik.docker.network=NOME_DA_REDE_INTERNA" ## ---> NOME DA REDE INTERNA <--- ##
        - "traefik.http.routers.portainer.entrypoints=websecure"
        - "traefik.http.routers.portainer.priority=1"

networks:
  NOME_DA_REDE_INTERNA: ## ---> NOME DA REDE INTERNA <--- ##
    external: true
    attachable: true
    name: NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##

volumes:
  portainer_data:
    external: true
    name: portainer_data				
			

Edite todos os campos comentados com #

							
							
					docker stack deploy --prune --resolve-image always -c portainer.yaml portainer				
			

Aguarde de 1 a 2 minutos após esse comando e entre na URL que definiu para o Portainer, após isso, crie uma conta no portainer.

Postgres

Agora que estamos dentro do portainer, vá até a seção Stacks

depois clique em Add stack:

Preencha com um nome para a stack (recomendamos deixar postgres:

Cole a stack do postgres abaixo no seu portainer:

							
							
					version: "3.7"

services:
  postgres:
    image: postgres:14
    environment:
      - POSTGRES_PASSWORD=SENHA_POSTGRES ## ---> SENHA POSTGRES <--- ##
    networks:
      - NOME_DA_REDE_INTERNA ## ---> REDE INTERNA <--- ##
    #ports: ## ---> DESCOMENTAR CASO DESEJE ACESSAR O POSTGRES EXTERNAMENTE <--- ##
    #  - 5432:5432 ## ---> DESCOMENTAR CASO DESEJE ACESSAR O POSTGRES EXTERNAMENTE <--- ##
    volumes:
      - postgres_data:/var/lib/postgresql/data
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "0.5"
          memory: 1024M

volumes:
  postgres_data:
    external: true
    name: postgres_data

networks:
  NOME_DA_REDE_INTERNA: ## ---> SENHA POSTGRES <--- ##
    external: true
    name: NOME_DA_REDE_INTERNA ## ---> SENHA POSTGRES <--- ##				
			

Obs: Lembre-se de alterar todos os campos comentados com as informações necessárias.

Após toda alteração, podemos desativar o Enable access control e clicar em Deploy the stack

Obs: Lembre-se de alterar todos os campos comentados com as informações necessárias.

Agora que fizemos o deploy, precisamos de criar um banco de dados dentro do postgres para o woofedCRM. Para isso vamos até Containers

E clicamos no simbolo do console

Nessa nova tela podemos clicar em Connect

Por fim no terminal que abriu vamos colocar esses dois comandos:

comando 1

							
							
					psql -U postgres				
			

comando 2

							
							
					create database woofedcrm;				
			

Assim teremos a confirmação que criamos o banco de dados woofedcrm dentro do postgres

Redis

Para instalar o redis vamos fazer as mesmas etapas que fizemos no postgres: Vamos para aba Stacks e depois em add Stack

Colocamos o nome da stack (recomendo deixar reids)

Cole a stack do redis abaixo no seu portainer:

							
							
					version: '3.7'

services:
  redis:
    image: redis:latest
    command: [
        "redis-server",
        "--appendonly",
        "yes",
        "--port",
        "6379"
      ]
    volumes:
      - redis_data:/data
    networks:
      - NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##
    deploy:
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "0.5"
          memory: 1024M

volumes:
  redis_data:
    external: true
    name: redis_data

networks:
  NOME_DA_REDE_INTERNA: ## ---> NOME DA REDE INTERNA <--- ##
    external: true
    name: NOME_DA_REDE_INTERNA ## ---> NOME DA REDE INTERNA <--- ##				
			

Obs: Lembre-se de alterar todos os campos comentados com as informações necessárias.

Após toda alteração, podemos desativar o Enable access control e clicar em Deploy the stack

e pronto, o redis esta instalado e funcionando na sua VPS

WoofedCRM

Para instalar o WoofedCRM vamos fazer as mesmas etapas que fizemos no postgres e no Redis. Vamos para aba Stacks e depois em add Stack

Colocamos o nome da stack (recomendo deixar woofedcrm)

Cole a stack do WoofedCRM abaixo no seu portainer:

Encontre a versão do woofedcrm aqui: https://hub.docker.com/r/douglara/woofedcrm/tags

							
							
					version: '3.7'

services:
  woofedcrm:
    image: douglara/woofedcrm:VERSAO ## ---> Troque para a versão que deseja usar <--- ##
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    networks:
      - NOME_DA_REDE ## ---> Defina o nome da rede interna  <--- ##
    volumes:
      - woofedcrm_data:/app
    environment:
      - ENABLE_USER_SIGNUP=true
      - RAILS_ENV=production
      - RACK_ENV=production
      - NODE_ENV=production
      - MOTOR_AUTH_USERNAME=USUARIO ## ---> Usuario para o motor <--- ##
      - MOTOR_AUTH_PASSWORD=SENHA ## ---> Senha para o motor <--- ##
      - FRONTEND_URL=https://URL_DO_WOOFED ## ---> Url para o WoofedCRM <--- ##
      - DATABASE_URL=postgres://postgres:SENHA_POSTGRES@postgres:5432/woofedcrm ## ---> Dados do postgres <--- ##
      - REDIS_URL=redis://redis:6379/0
      - ACTIVE_STORAGE_SERVICE=local
      - RAILS_LOG_LEVEL=debug
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "1"
          memory: 1024M
      labels:
        - traefik.enable=true
        - traefik.http.routers.woofedcrm.rule=Host(`URL_DO_WOOFED`) ## ---> Url para o WoofedCRM <--- ##
        - traefik.http.routers.woofedcrm.entrypoints=websecure
        - traefik.http.routers.woofedcrm.tls.certresolver=letsencryptresolver
        - traefik.http.routers.woofedcrm.priority=1
        - traefik.http.routers.woofedcrm.service=woofedcrm
        - traefik.http.services.woofedcrm.loadbalancer.server.port=3000 
        - traefik.http.services.woofedcrm.loadbalancer.passhostheader=true 
        - traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https
        - traefik.http.routers.woofedcrm.middlewares=sslheader@docker

  sidekiq:
    image: douglara/woofedcrm:VERSAO ## ---> Troque para a versão que deseja usar <--- ##
    command: bundle exec sidekiq -C config/sidekiq.yml
    networks:
      - NOME_DA_REDE ## ---> Defina o nome da rede interna  <--- ##
    volumes:
      - woofedcrm_data:/app
    environment:
      - ENABLE_USER_SIGNUP=true
      - RAILS_ENV=production
      - RACK_ENV=production
      - NODE_ENV=production
      - MOTOR_AUTH_USERNAME=USUARIO ## ---> Usuario para o motor <--- ##
      - MOTOR_AUTH_PASSWORD=SENHA ## ---> Senha para o motor <--- ##
      - FRONTEND_URL=https://URL_DO_WOOFED ## ---> Url para o WoofedCRM <--- ##
      - DATABASE_URL=postgres://postgres:SENHA_POSTGRES@postgres:5432/woofedcrm ## ---> Dados do postgres <--- ##
      - REDIS_URL=redis://redis:6379/0
      - ACTIVE_STORAGE_SERVICE=local
      - RAILS_LOG_LEVEL=debug
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "1"
          memory: 1024M
    
  good_job:
    image: douglara/woofedcrm:VERSAO ## ---> Troque para a versão que deseja usar <--- ##
    command: bundle exec good_job
    networks:
      - NOME_DA_REDE ## ---> Defina o nome da rede interna  <--- ##
    volumes:
      - woofedcrm_data:/app
    environment:
      - ENABLE_USER_SIGNUP=true
      - RAILS_ENV=production
      - RACK_ENV=production
      - NODE_ENV=production
      - MOTOR_AUTH_USERNAME=USUARIO ## ---> Usuario para o motor <--- ##
      - MOTOR_AUTH_PASSWORD=SENHA ## ---> Senha para o motor <--- ##
      - FRONTEND_URL=https://URL_DO_WOOFED ## ---> Url para o WoofedCRM <--- ##
      - DATABASE_URL=postgres://postgres:SENHA_POSTGRES@postgres:5432/woofedcrm ## ---> Dados do postgres <--- ##
      - REDIS_URL=redis://redis:6379/0
      - ACTIVE_STORAGE_SERVICE=local
      - RAILS_LOG_LEVEL=debug
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "1"
          memory: 1024M

volumes:
  woofedcrm_data:
    external: true
    name: woofedcrm_data

networks:
  NOME_DA_REDE: ## ---> Defina o nome da rede interna  <--- ##
    external: true
    name: NOME_DA_REDE ## ---> Defina o nome da rede interna  <--- ##				
			

Obs: Lembre-se de alterar todos os campos comentados com as informações necessárias.

Após toda alteração, podemos desativar o Enable access control e clicar em Deploy the stack

Após isso vamos para a seção de containers

Precisamos clicar a opção de console do container woofedcrm_woofedcrm

Nessa nova tela podemos clicar em Connect


Por fim no terminal que abriu vamos colocar esses dois comandos:

							
							
					rails db:create				
			
							
							
					rails db:migrate				
			

Vai aparecer um monte de informações no terminal, mas é normal.

Pronto agora você já terá acesso ao WoofedCRM

Lembre-se de criar uma conta para cada empresa.