Admins/Multidomínio

De Wiki Expresso V3
Ir para: navegação, pesquisa

Conteúdo

Configuração de Multidomínio

Objetivo

Com o constante aumento de clientes que utilizam o expresso, a administração destes ambientes tendem a tornarem-se bastante complexas.

O objetivo principal da disponibilização de suporte a multidomínios é proporcionar maior escalabilidade ao ambiente, adequando a administração ao suporte, considerando diversos clientes(domínios), conservando uma única instância da aplicação e consequentemente reduzindo a complexidade e infraestrutura para este fim. Além de possibilitar uma única instância da aplicação os domínios poderão ficar totalmente independentes em relação aos serviços geridos por esta instância única, como banco de dados, imap, ldap, etc.

Descrição resumida: De acordo com o logon do usuário(usuário@cliente ou seja o email) a instância de código único carregará a respectiva configuração para aquela empresa, considerando os diversos serviços como banco de dados, ldap, dentre outros. Para a administração, isso permite que se tenha um código único para todos os clientes, única URL de acesso e logo, única assinatura de applets JARs bem como uso único de certificado de servidor.

Os requisitos são compostos de:

  • Descrição/Estrutura de pastas de domínios (configuração/particularidades de dominios);
  • Cenário de uso;
  • Passo-a-passo para criação (ainda)manual de domínios;

Descrição/Estrutura de Pastas de Domínios

Cada domínio corresponderá a uma subpasta da pasta domains, e cada pasta terá como nome o domínio exatamente na forma como é informado no login do usuário. Por exemplo, para usuario@serpro.gov.br, a pasta será serpro.gov.br. Isso torna a localização rápida, sem necessidade de parsing. Estas subpastas comportarão seus respectivos config.inc.php bem como outras particularidades daquele domínio, como, por exemplo, catálogos externos.

Os dominios serão configurados manualmente para essa primeira entrega e em seguida serão administrados dentro da aplicação Setup via ambiente gráfico conforme segunda etapa do projeto.

Se o domínio não for identificado, será usada somente a configuração do arquivo config.inc.php global e o usuário não irá conseguir efetuar login.

Estrutura de pastas:

Arquivos e pastas obrigatórios:

  • /tine20/config.inc.php: Manterá somente o usuário de instalação, o domínio a ser configurado e os dados de configuração globais, que afetam todos os domínios. Exemplo: configuração de temas e captcha da página de login.
  • /tine20/domains/template/config.inc.php: Um modelo de arquivo de configuração padrão para novos domínios.

Exemplos de pastas e arquivos de domínios

  • /tine20/domains/xpto.gov.br/config.inc.php: Arquivo de configuração para o dominio xpto.gov.br;
  • /tine20/domains/fulano.gov.br/config.inc.php: Arquivo de configuração para o dominio fulano.gov.br;

IMPORTANTE!

A modificação implementada para habilitar o multidomínio permite que o objeto de configuração leia dados da pasta do domínio identificado, mas apenas do arquivo config.inc.php.

Migração para a configuração de multidomínios

Considerando uma instalação existente de Expresso V3, os seguintes passos devem ser feitos antes da atualização para o release contendo a habilitação do modo de multidomínio:

1. Criar na pasta domains uma subpasta para o domínio utilizado na instalação. Por exemplo, se o domínio for teste.gov.br, criar a pasta tine20/domains/teste.gov.br;

2. Criar o arquivo config.inc.php dentro da pasta do domínio;

3. Executar o script migrateConfigFromDatabaseToFile.php informando o nome do domínio, para transferir os dados da tabela config para o arquivo de configuração do domínio. O script deve ser executado na raiz da aplicação.

Exemplo, migrar o domínio serpro.gov.br

cd tine20
php migrateConfigFromDatabaseToFile.php -d serpro.gov.br

Se o diretório onde estiver instalado o Expresso for diferente de tine20, deve-se usar o argumento t=[diretório], como no exemplo abaixo:

cd tine20
php migrateConfigFromDatabaseToFile.php -d serpro.gov.br t=outrapasta

O diretório indicado por t= é apenas o nível que contém o Expresso, não é o caminho absoluto do sistema de arquivos.


IMPORTANTE! No multidomínio, a tabela config não é utilizada. No entanto, se ela tiver dados e eles não forem removidos na migração, ocorrerá um erro na desinstalação de um módulo, por causa do relacionamento entre as tabelas applications e config. Para corrigir isso, a tabela config deve ser limpa: todos os seus registros devem ser excluídos. Como a tabela não é usada no multidomínio, se o relacionamento for eliminado, ela pode ser até removida do banco de dados.

Passo-a-Passo para a criação (manual) de domínios

Modelo de arquivo de configuração global

1. Preencher o arquivo config.inc.php da pasta raiz (tine20) com o seguinte conteúdo (e demais itens globais se necessário):

O que é global? Todos os dados que são necessários para a aplicação antes do login: captcha, cache, log, sessão, tema e dados do usuário de instalação são alguns deles.

<?php
// NOTE: You can either:
//  - copy this file to config.inc.php and add change config values
//  - create an empty config.inc.php, make it writeable to the webserver and edit config via the setup.php interface
//  - make this directory temporary writeable to the webserver and edit config via the setup.php interface

// minimal configuration
return array(
    // A LINHA ABAIXO SÓ DEVE EXISTIR PARA INSTALAÇÃO OU ATUALIZAÇÃO DE UM DOMÍNIO
    'domain' => 'meudominio.com.br', // SÓ USE PARA INSTALAÇÃO OU ALTERAÇÃO DA CONFIGURAÇÃO!
     // SEM A LINHA ABAIXO, O JAVASCRIPT NÃO SERÁ CARREGADO PARA MULTIDOMÍNIO
    'enabledApplications' => 'Tinebase,Admin,Addressbook,Calendar,Tasks,Webconference,Messenger,Expressomail,AppLauncher,ActiveSync',

    // set 'count' equal zero to disable captcha, or set to number of invalid logins before request captcha. 
    'captcha' => array('count'=>0), 
    'themes' => array(
        'default' =>  0,
        'themelist' => array(
            0 => array(
                'name' => 'Tema padrão do Expresso 3.0', 
                'path' => 'expresso30',
                'useBlueAsBase' => 1,
            )
        )
    ),
    'setupuser' => array(
        'username'      => 'setup',
        'password'      => 'setup' 
    ),
    // optional cache (recommended)
    'caching' => 
        array (
            'active' => false,
            'path' => '',
            'lifetime' => 3600,
            'backend' => 'File',
            'redis' => 
                array (
                   'host' => 'localhost',
                   'port' => 6379,
                ),
            'memcached' => 
                array (
                  'host' => 'localhost',
                  'port' => 11211,
                ),
    ),
    'actionqueue' => 
        array (
            'active' => false,
            'backend' => 'Redis',
            'host' => 'localhost',
            'port' => 6379,
     ),
     'session' => 
          array (
            'lifetime' => 86400,
            'backend' => 'File',
            'path' => '',
            'host' => 'localhost',
           'port' => 6379,
    ),    
    // optional logger
    'logger' => array (
        'active' => true,
        'filename' => '',
        // queries backtrace
        'traceQueryOrigins' => FALSE,
        'priority' => 7,
    ),
    'tmpdir' => '',
    'filesdir' => '',
    'redirectAlways' => '0',
    'redirectToReferrer' => '0',
    'acceptedTermsVersion' => 1,
    'Addressbook' => 
         array (
             'contactSalutation' => '{"name":"contactSalutation","records":[{"id":"MR","value":"Mr","gender":"male","image":"images\\/empty_photo_male.png","system":true},  {"id":"MS","value":"Ms","gender":"female","image":"images\\/empty_photo_female.png","system":true},{"id":"COMPANY","value":"Company","gender":"other","image":"images\\/empty_photo_company.png","system":true}]}',
         ),
    'appdefaults' => 
        array (
          'defaultInternalAddressbook' => 1,
        ), 
  'Calendar' => 
  array (
    'attendeeRoles' => '{"name":"attendeeRoles","records":[{"id":"REQ","value":"Required","system":true},{"id":"OPT","value":"Optional","system":true}]}',
    'attendeeStatus' => '{"name":"attendeeStatus","records":[{"id":"NEEDS-ACTION","value":"No response","icon":"images\\/oxygen\\/16x16\\/actions\\/mail-mark-unread-new.png","system":true},{"id":"ACCEPTED","value":"Accepted","icon":"images\\/oxygen\\/16x16\\/actions\\/ok.png","system":true},{"id":"DECLINED","value":"Declined","icon":"images\\/oxygen\\/16x16\\/actions\\/dialog-cancel.png","system":true},{"id":"TENTATIVE","value":"Tentative","icon":"images\\/calendar-response-tentative.png","system":true}]}',
  ),
);


2. Criar a pasta /tine20/domains

3. Criar uma pasta para o domínio a ser configurado. Por exemplo, se o domínio for teste.gov.br, criar a pasta tine20/domains/teste.gov.br;

4. Criar o arquivo config.inc.php dentro da pasta do domínio;

Modelo de arquivo de configuração de domínio

5. Preencher o arquivo de acordo com o modelo abaixo:

<?php
// NOTE: You can either:
//  - copy this file to config.inc.php and add change config values
//  - create an empty config.inc.php, make it writeable to the webserver and edit config via the setup.php interface
//  - make this directory temporary writeable to the webserver and edit config via the setup.php interface

// minimal configuration
return array(
    'database' => array(
        'host'          => 'localhost',
        'dbname'	=> '',
        'username'      => '',
        'password'      => '',
        'adapter'       => 'pdo_pgsql',
        'port'          => '5432',
        'tableprefix'   => '',
    ),    
  'Tinebase_Authentication_BackendConfiguration' => 
      array (
        'tryUsernameSplit' => FALSE,
        'accountCanonicalForm' => '2',
        'accountDomainName' => '',
        'accountDomainNameShort' => '',
        'host' => '',
        'username' => '',
        'password' => 'xxxxx',
        'bindRequiresDn' => true,
        'baseDn' => '',
        'accountFilterFormat' => '(&(objectclass=posixaccount)(phpgwaccounttype=u)(mail=%s))',
      ),
  'Tinebase_Authentication_BackendType' => 'Ldap',
  'Tinebase_User_BackendConfiguration' => 
      array (
        'defaultUserGroupName' => '',
        'defaultAdminGroupName' => '',
        'host' => '',
        'username' => '',
        'password' => '',
        'bindRequiresDn' => true,
        'userDn' => '',
        'userFilter' => '&(objectclass=posixaccount)(phpgwaccounttype=u)',
        'userSearchScope' => 1,
        'groupsDn' => '',
        'groupFilter' => '',
        'groupSearchScope' => 1,
        'pwEncType' => '',
        'useRfc2307bis' => false,
        'minUserId' => '100',
        'maxUserId' => '100000000000',
        'minGroupId' => '110',
        'maxGroupId' => '11000000000',
        'groupUUIDAttribute' => 'gidnumber',
        'userUUIDAttribute' => 'uidnumber',
        'readonly' => '1',
        'masterLdapHost' => '',
        'masterLdapUsername' => '',
        'masterLdapPassword' => '',
        'checkExpiredPassword' => '0',
        'passwordExpirationAttribute' => '',
        'passwordExpirationInterval' => '',
      ),
  'imap' => 
      array (
        'active' => true,
        'backend' => 'standard',
        'host' => '',
        'port' => 143,
        'ssl' => 'none',
        'useSystemAccount' => 0,
        'domain' => '',
        'dbmail' => 
            array (
              'port' => 3306,
            ),
        'cyrus' => 
            array (
              'useProxyAuth' => 0,
            ),
        'dovecot' => 
           array (
             'port' => 3306,
             'scheme' => '',
           ),
      ),
  'smtp' => 
      array (
        'active' => true,
        'backend' => 'standard',
        'hostname' => '',
        'port' => 25,
        'ssl' => 'none',
        'auth' => 'login',
        'primarydomain' => '',
        'secondarydomains' => '',
        'from' => '',
        'username' => '',
        'password' => '',
        'name' => 'localhost',
        'postfix' => 
            array (
              'port' => 3306,
            ),
      ),
  'sieve' => 
      array (
        'active' => true,
        'hostname' => '',
        'port' => 2000,
        'ssl' => 'none',
        'proxy' => 
            array (
              'user' => '',
              'password' => '',
              'useAuth' => 0,
        ),
     ),
);

Habilitação do Multidomínio

Para habilitar o multidomínio, execute o seguinte script no diretório onde está instalado o Expresso:

php plugin.php -c

Isso habilitará o plugin de utilização do multidomínio. Para certificar-se de que o multidominio fora habilitado corretamente verifique no arquivo init_plugins.php a linha referente a esta habilitação(setMultidomain) deverá estar TRUE, conforme abaixo:

Tinebase_Config_Manager::setMultidomain(TRUE);

Para desabilitar o multidomínio, execute:

php plugin.php -d



IMPORTANTE!

O que identifica no Setup qual domínio está sendo instalado é a chave domain no arquivo config.inc.php da raiz (tine20).

O que identifica para a aplicação qual o domínio do usuário é o campo configurado para ser o campo de login. Então configure o campo que contém o e-mail para ser o nome do usuário.

Agora, para evitar consultas ao banco na página de login, é necessário cadastrar a chave 'enabledApplications' no arquivo config.inc.php da raiz, com os nomes das aplicações habilitadas. O administrador poderá depois alterar essa chave pela interface, mas para o primeiro uso, ela precisa existir.

Essa chave contém um array com as aplicações que devem estar habilitadas:

    'enabledApplications' => 'Tinebase,Admin,Addressbook,Calendar,Tasks,Webconference,Messenger,Expressomail,AppLauncher,ActiveSync'	 

IMPORTANTE!

Para que o multidomínio funcione com autenticação e contas em LDAP, as seguintes configurações do arquivo tine20/domains/<dominio>/config.inc.php devem existir:

...
'Tinebase_Authentication_BackendConfiguration' ⇒
array (
...
'accountFilterFormat' ⇒ '(&(objectclass=posixaccount)(phpgwaccounttype=u)(mail=%s))',
'accountCanonicalForm' ⇒ '2', 
'tryUsernameSplit' ⇒ false,
...
),
...

Em accountFilterFormat atentar para a estrutura do LDAP. A busca deve retornar exatamente uma conta.

O login deve ser o e-mail do usuário!

Precedência de Configuração

A configuração global PREVALECE sobre a configuração do domínio. Se o arquivo de configuração global tiver uma chave contida no arquivo de configuração de um domínio, o valor global é o que será utilizado.

Separação de dados globais e de domínio

Se porventura você migrar para multidomínio e seu arquivo de configuração global tiver dados de domínio, ou se inadvertidamente alguém incluiu dados globais no arquivo de domínio, você pode facilmente separar os escopos executando o script separateDomainDataFromGlobalData.php, assim, a partir da raiz da instalação do Expresso:

php separateDomainDataFromGlobalData.php -d [domínio] [t=[pasta do expresso]]

Esse script irá garantir que o arquivo config.inc.php global tenha somente dados globais e que o arquivo config.inc.php do domínio tenha somente dados de domínio.

Tutorial de Instalação de Ambiente Multi Domínios

A partir da versão Kristina.20150323 o uso de multi domínios passa a ser oficialmente suportado pelo Expresso.

Caso ainda persistam dúvidas a respeito do ambiente multi domínio seria interessante praticar este tutorial de instalação que ao final disponibiliza um ambiente multi domínio com 2 domínios exemplificados.

Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Ferramentas