L’essentiel
La configuration de Phraseanet se fait via le fichier config/configuration.yml. A chaque mise à jour de celle-ci, il est nécessaire de recompiler la configuration via la commande suivante :
`bin/console compile:configuration`.
La configuration de Phraseanet est écrite dans le fichier config/configuration.yml qui est automatiquement généré à l’installation.
Ce fichier est au format YAML, qui a pour intérêt d’être très lisible. Pour des raisons de performance, et notamment de cache opcode, la configuration est compilée.
En contre partie il est nécessaire de recompiler après une mise à jour.
La compilation de la configuration est très facile et rapide à éxecuter. Il faut utiliser la commande bin/console compile:configuration.
bin/console compile:configuration
Voici un exemple de fichier de configuration (/lib/conf.d/configuration.yml) commenté :
servername: 'http://local.phrasea/'
languages:
available:
- de
- en
- fr
- nl
default: 'en'
main:
maintenance: false
key: ''
database:
host: 'sql-host'
port: 3306
user: 'sql-user'
password: 'sql-password'
dbname: ab_phraseanet
driver: pdo_mysql
charset: UTF8
database-test:
driver: pdo_sqlite
path: '/tmp/db.sqlite'
charset: UTF8
cache:
type: ArrayCache
options: {}
search-engine:
type: elasticsearch
options:
host: elasticsearch
port: 9200
index: ''
shards: 3
replicas: 0
minScore: 2
highlight: true
maxResultWindow: 500000
populate_order: MODIFICATION_DATE
populate_direction: DESC
populate_permalinks: false
activeTab: '#elastic-search'
facets:
_base:
limit: 10
_collection:
limit: 10
_doctype:
limit: 10
_camera_model:
limit: 10
_iso:
limit: 0
_aperture:
limit: 0
_shutterspeed:
limit: 0
_flashfired:
limit: 0
_framerate:
limit: 0
_audiosamplerate:
limit: 0
_videocodec:
limit: 0
_audiocodec:
limit: 0
_orientation:
limit: 0
_colorspace:
limit: 0
_mimetype:
limit: 0
task-manager:
status: started
enabled: true
options:
protocol: tcp
host: 127.0.0.1
port: 6660
linger: 500
logger:
max-files: 10
enabled: true
level: INFO
session:
type: native
options: []
ttl: 86400
binaries:
ghostscript_binary: null
php_binary: null
unoconv_binary: null
ffmpeg_binary: null
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60
mp4box_timeout: 60
swftools_timeout: 60
unoconv_timeout: 60
exiftool_timeout: 60
storage:
subdefs: null
cache: null
log : null
download: null
lazaret: null
caption: null
worker_tmp_files: null
trusted-proxies: []
network-proxies:
http-proxy:
enabled: false
host:
port:
user:
password:
ftp-proxy:
enabled: false
host:
port:
user:
password:
debugger:
allowed-ips: []
border-manager:
enabled: true
extension-mapping:
otc: application/vnd.oasis.opendocument.chart-template
ttc: application/x-font-ttf
xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
docx: application/msword
pptx: application/vnd.ms-powerpoint
mxf: application/mxf
mp4: video/mp4
svg: image/svg+xml
checkers:
-
type: Checker\Sha256
enabled: true
-
type: Checker\UUID
enabled: true
-
type: Checker\Colorspace
enabled: false
options:
colorspaces: [cmyk, grayscale, rgb]
-
type: Checker\Dimension
enabled: false
options:
width: 80
height: 160
-
type: Checker\Extension
enabled: false
options:
extensions: [jpg, jpeg, bmp, tif, gif, png, heic, pdf, doc, docx, xls, xlsx, odt, mpg, mpeg, mov, avi, mp3, mp2, mp4, m4v, m4a, mkv, hevc, aac, aiff, wav]
-
type: Checker\Filename
enabled: false
options:
sensitive: true
-
type: Checker\MediaType
enabled: false
options:
mediatypes: [Audio, Document, Image, Video]
registry:
api-clients:
api-subdef_service: false
actions:
export-stamp-choice: false
stamp-subdefs: false
user_account:
deleting_policies:
email_confirmation: true
authentication:
auto-create:
templates: { }
providers:
facebook:
enabled: false
display: false
title: Facebook
type: facebook
options:
app-id: ''
secret: ''
default-graph-version: 'v2.10'
twitter:
enabled: false
display: false
title: Twitter
type: twitter
options:
consumer-key: ''
consumer-secret: ''
github:
enabled: false
display: false
title: Github
type: github
options:
client-id: ''
client-secret: ''
viadeo:
enabled: false
display: false
title: Viadeo
type: viadeo
options:
client-id: ''
client-secret: ''
linkedin:
enabled: false
display: false
title: LinkedIN
type: linkedin
options:
client-id: ''
client-secret: ''
openid-1:
enabled: false
display: false
title: 'openid 1'
type: openid
options:
client-id: ''
client-secret: ''
base-url: 'https://keycloak.phrasea.local'
realm-name: phrasea
exclusive: false
icon-uri: null
usegroups: false
birth-group: _firstlog
everyone-group: _everyone
metamodel: _metamodel
model-gpfx: _M_
model-upfx: _U_
debug: false
auto-logout: false
auto-connect-idp-name: null
groupmask: "/phraseanet_([^,]+)/i"
fieldmap:
id: sub
login: email
firstname: given_name
lastname: family_name
email: email
groups: group
registration-fields:
-
name: company
required: true
-
name: lastname
required: true
-
name: firstname
required: true
-
name: geonameid
required: true
download_async:
enabled: false
xsendfile:
enabled: false
type: nginx
mapping: []
h264-pseudo-streaming:
enabled: false
type: nginx
mapping: []
plugins: []
api_cors:
enabled: false
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
session:
idle: 0
# 1 week
lifetime: 604800
crossdomain:
allow-access-from:
-
domain: '*.cooliris.com'
secure: 'false'
embed_bundle:
video:
player: videojs
autoplay: false
cover_subdef: poster
message_start: StartOfMessage
available_speeds:
- 1
- 1.5
- 3
audio:
player: videojs
autoplay: false
cover_subdef: thumbnail
document:
#player: flexpaper
enable_pdfjs: true
geocoding-providers:
-
map-provider: 'mapboxWebGL'
enabled: false
public-key: ''
map-layers:
-
name: Light
value: 'mapbox://styles/mapbox/light-v9'
-
name: Streets
value: 'mapbox://styles/mapbox/streets-v9'
-
name: Basic
value: 'mapbox://styles/mapbox/basic-v9'
-
name: Satellite
value: 'mapbox://styles/mapbox/satellite-v9'
-
name: Dark
value: 'mapbox://styles/mapbox/dark-v9'
transition-mapboxgl:
-
animate: true
speed: '2.2'
curve: '1.42'
default-position:
- 42.488
- 3.779
default-zoom: 2
marker-default-zoom: 11
position-fields:
#-
# name: GpsCompositePosition
# type: latlng
-
name: Latitude
type: lat
-
name: Longitude
type: lon
geonames-field-mapping: true
cityfields: 'City, Ville'
provincefields: Province
countryfields: 'Country, Pays'
latitudefields: Latitude
longitudefields: Longitude
video-editor:
ChapterVttFieldName: VideoTextTrackChapters
seekBackwardStep: 500 # in ms
seekForwardStep: 500 # in ms
playbackRates:
- 1
- '1.5'
- 3
workers:
auto-cancelingJob: 24 # period in hours, not define or null to not execute
queue:
worker-queue:
registry: alchemy_worker.queue_registry
host: localhost
port: 5672
user: ''
password: ''
ssl: false
vhost: /
heartbeat: 60
webhook:
timeout: 30
verify_ssl: true
queues:
assetsIngest:
max_retry: 3
ttl_retry: 10000
createRecord:
max_retry: 3
ttl_retry: 10000
editRecord:
max_retry: 3
ttl_retry: 10000
exportMail:
max_retry: 3
ttl_retry: 10000
downloadAsync:
max_retry: 3
ttl_retry: 10000
exposeUpload:
max_retry: 3
ttl_retry: 10000
ftp:
max_retry: 3
ttl_retry: 180000
populateIndex:
max_retry: 3
ttl_retry: 10000
pullAssets:
max_retry: 3
ttl_retry: 10000
recordsActions:
max_retry: 3
ttl_retry: 10000
shareBasket:
max_retry: 3
ttl_retry: 10000
subdefCreation:
max_retry: 3
ttl_retry: 10000
ttl_delayed: 5000
validationReminder:
max_retry: 3
ttl_retry: 7200000
webhook:
max_retry: 3
ttl_retry: 10000
writeMetadatas:
max_retry: 3
ttl_retry: 10000
ttl_delayed: 5000
writeMetadatas:
acceptedMimeType:
- image/jpeg
- image/png
- application/postscript
- application/pdf
- image/tiff
externalservice:
pusher:
auth_key: 'pusher-auth_key'
secret: 'pusher-secret'
app_id: 'pusher-app_id'
happyscribe:
token: token
organization_id: 123456
transcript_format: vtt
subdef_source: preview
Console_logger_enabled_environments: [test]
feedback-report:
enabled: false
actions:
action_unvoted:
status_bit: 8
value: '{% if vote.votes_unvoted > 0 %} 1 {% else %} 0 {% endif %}'
action_red:
status_bit: 9
value: '{% if vote.votes_no > 0 %} 1 {% else %} 0 {% endif %}'
action_green:
status_bit: 10
value: '{% if vote.votes_no == 0 %} 1 {% else %} 0 {% endif %}'
action_log:
metadata: Validations
method: prepend
delimiter: "\n"
value: 'Vote initated on {{ vote.created }} by {{ initiator ? initiator.getEmail() : "?" }} expired {{ vote.expired }} : {{ vote.voters_count }} participants, {{ vote.votes_unvoted }} unvoted, {{ vote.votes_no }} "no", {{ vote.votes_yes}} "yes".'
translator:
jobs:
#
# - translate EN keywords to FR and EN
# nb: since we clean the destination fields, we MUST (re)write EN to EN
# - add country to keywords, both FR/EN
keywords:
active: false
databox: my_databox
if_collection: to_translate
if_status: x1xxxx
actions:
KeywordsENtoFREN:
active: true
source_field: KeywordsEN
source_lng: en
destination_fields:
- fr:keywordsFR
- en:keywordsEN
cleanup_source: if_translated
# action 1 cleans the destination fields
cleanup_destination: true
CountryENtoKeywordsFREN:
active: true
source_field: CountryEN
source_lng: en
# add translated country to the keywords
destination_fields:
- fr:keywordsFR
- en:keywordsEN
cleanup_source: if_translated
# action 2 must NOT erase what action 1 did
cleanup_destination: false
# end of job : change coll status
set_status: 10xxxx
set_collection: online
Les langues disponibles ainsi que leurs codes respectifs sont les suivants :
Les différents fournisseurs d’authentification se configurent simplement. Il suffit de créer une application “Phraseanet” chez le fournisseur en spécifiant l’URL de callback adéquate.
Note
Les URLs de callback fournies sont des exemples présupposant que Phraseanet est installé à l’adresse http://phraseanet.mondomaine.com. Il faut adapter ces URLs en fonction de l’adresse réelle.
Les services de cache cache et opcode-cache peuvent être configurés avec les adapteurs suivants :
Nom | Service | Description | Options |
---|---|---|---|
RedisCache | Cache | Serveur de cache utilisant l’extension PHP redis | host, port |
ArrayCache | cache | opcode-cache | Cache désactivé |
Les sessions sont stockées par défaut sur le disque, dans le système de fichiers.
Il est possible d’utiliser d’autres types de stockage :
Type | Description | Options |
---|---|---|
file | Stockage des sessions sur le disque | |
redis | Stockage des sessions dans un serveur Redis, utilise l’extension PHP redis | host, port |
Avertissement
Le paramétrage de la durée de vie (ttl) de la session ne fonctionne pas avec la gestion par le système de fichiers. Dans ce cas, utiliser le paramétrage gc_maxlifetime de PHP.
Seul le moteur de recherche Elasticsearch est disponible.
Nom | Options |
---|---|
Alchemy\Phrasea\SearchEngine\Elastic\ElasticSearchEngine | host, port, index |
Si Phraseanet est derrière un reverse-proxy, renseigner l’adresse du reverse proxy pour que les adresses IP des utilisateurs soient reconnues.
trusted-proxies:
192.168.27.15
10.0.0.45
La section registration-fields permet de personnaliser les champs disponibles dans le formulaire de la page d’inscription ainsi que leur caractère obligatoire.
registration-fields:
-
name: firstname
required: true
-
name: lastname
required: true
-
name: company
required: false
id | Nom (déprécié) |
login | Identifiant |
gender | Sexe |
firstname | Prénom |
lastname | Nom |
address | Adresse |
zipcode | Code Postal |
geonameid | Ville, Pays |
position | Poste |
company | Société |
job | Activité |
tel | Téléphone |
fax | Fax |
Note
Dans le formulaire d’inscription, il n’est possible de remplir la ville et pays de l’utilisateur que par le Geonameid. Geonameid n’est fonctionnel que si le webservice https://geonames.alchemyasp.com est utilisé.
Dans le cas ou l’instance Phraseanet ne peut pas accéder au serveur Geonames indiquer null comme adresse du serveur Geonames dans la configuration.
Dans ce contexte, ne pas indiquer geonameid dans le formulaire d’inscription.
La configuration xsendfile doit être manipulée à l’aide des outils en ligne de commandes. Les documentations pour Nginx et Apache sont disponibles.
Les plugins se configurent aussi dans ce fichier. Se référer à la documentation des plugins pour cette partie.
Les points de vérification du service de douane sont configurables. Il est aussi possible de créer son propre point de vérification.
Verification | Description | Options |
---|---|---|
CheckerSha256 | Vérifie si le fichier n’est pas un doublon En se basant sur la somme de controle “sha256” | |
CheckerUUID | Vérifie si le fichier n’est pas un doublon En se basant sur l’identifiant unique du fichier | |
CheckerDimension | Vérification sur les dimensions du fichier (* si applicable) | width : largeur mini du fichier height : hauteur mini du fichier |
CheckerExtension | Vérification sur les extensions du fichiers | extensions : les extensions de fichiers autorisées |
CheckerFilename | Vérifie si le fichier n’est pas un doublon En se basant sur son nom | sensitive : active la sensibilité à la casse |
CheckerMediaType | Vérification sur le type du fichier (Audio, Video...) | mediatypes : les types de médias autorisés |
CheckerColorspace | Vérification sur l’espace de couleur du fichier (* si applicable) | colorspaces : les types d’espaces colorimétriques autorisés |
Le service de douane permet également de personnaliser la détection des types mime via le paramètre extension-mapping. Sur certains systèmes, des mauvais types mimes peuvent être détectés. Utiliser ce tableau pour forcer un type mime en fonction d’une extension de fichier.
Il est possible de restreindre la portée d’un point de vérification sur un ensemble de collections en fournissant une liste de base_id correspondant :
#services.yml
Border:
border_manager:
type: Border\BorderManager
options:
enabled: true
checkers:
-
type: Checker\Sha256
enabled: true
collections:
- 4
- 5
La même restriction peut être faite au niveau des databoxes :
#services.yml
Border:
border_manager:
type: Border\BorderManager
options:
enabled: true
checkers:
-
type: Checker\Sha256
enabled: true
databoxes:
- 3
- 7
Note
Il n’est pas possible de restreindre à la fois sur des databoxes et des collections.
Tous les points de vérifications sont déclarés dans le namespace Alchemy\Phrasea\Border\Checker. Il suffit de créer un nouvel objet dans ce namespace. Cet objet doit implémenter l’interface Alchemy\Phrasea\Border\Checker\Checker
Exemple d’un point de vérification qui filtre les documents sur leurs données GPS :
<?php
namespace Alchemy/Phrasea/Border/Checker;
use Alchemy\Phrasea\Border\File;
use Doctrine\ORM\EntityManager;
use MediaVorus\Media\DefaultMedia as Media;
class NorthPole implements Checker
{
private $options;
public function __construct(Array $options)
{
$this->options = $options;
}
//Contrainte de validation, doit retourner un booleen
public function check(EntityManager $em, File $file)
{
$media = $file->getMedia();
if (null !== $latitude = $media->getLatitude() && null !== $ref = $media->getLatitudeRef()) {
if($latitude > 60 && $ref == Media::GPSREF_LATITUDE_NORTH) {
return true;
}
}
return false;
}
}
Déclaration du point de contrôle
border-manager:
enabled: true
checkers:
-
type: Checker\NorthPole
enabled: true
Il est possible de personnaliser les préférences utilisateur par défaut. Les paramètres suivants sont ajustables :
Nom | Description | Valeur par défaut | Valeurs disponibles |
---|---|---|---|
view | Affichage des résultats | thumbs | thumbs (en vignettes) list (en liste) |
images_per_page | Nombre d’image par page de résultat | 20 | |
images_size | Taille des vignettes de résultat | 120 | |
editing_images_size | Taille des vignettes d’édition | 134 | |
editing_top_box | Taille du bloc supérieur d’édition (pourcentage) | 30 | |
editing_right_box | Taille du bloc droit d’édition (pourcentage) | 48 | |
editing_left_box | Taille du bloc gauche d’édition (pourcentage) | 33 | |
basket_sort_field | Index de tri des paniers | name | name (par nom) ou date (par date) |
basket_sort_order | Ordre de tri des paniers | ASC | ASC (ascendant) ou DESC (descendant) |
warning_on_delete_story | Alerter avant la suppression d’un reportage | true | true (oui) ou false (non) |
client_basket_status | Afficher les paniers dans Classic | 1 | 1 (oui) ou 0 (non) |
css | Theme CSS de production | 000000 | 000000 (sombre) ou 959595 (clair) |
advanced_search_reload | Utiliser les dernières options de recherche au chargement | 1 | 1 (oui) ou 0 (non) |
start_page_query | Question par défaut | last | |
start_page | Page de démarrage de production | QUERY | PUBLI (publications) ou QUERY (recherche) ou LAST_QUERY (dernière recherche) |
rollover_thumbnail | Affichage au rollover | caption | caption (notice) ou preview (prévisualisaton) |
technical_display | Afficher les informations techniques | 1 | 1 (oui) ou 0 (non) ou group (groupé avec la notice) |
doctype_display | Afficher une icone correspondante au type de document | 1 | 1 (oui) ou 0 (non) |
basket_caption_display | Afficher la notice des enregistrements dans un panier | 0 | 1 (oui) ou 0 (non) |
basket_status_display | Afficher les status des enregistrements dans un panier | 0 | 1 (oui) ou 0 (non) |
basket_title_display | Afficher le titre des enregistrements dans un panier | 0 | 1 (oui) ou 0 (non) |
Fixe (en secondes) la durée d’inactivité de l’utilisateur avant déconnexion automatique.
Le réglage “idle” est prioritaire sur le réglage “lifetime” et l’option “Se souvenir de moi” n’est alors pas présente sur la page d’accueil.
En cochant “Se souvenir de moi” à l’authentification, durant cette période (en secondes) l’accès à l’application est immédiat sans avoir à se ré-authentifier.
Booléan qui active ou désactive le lazyload des vignettes dans production, cette option est obsolète si l’option “static-file” est activé pour l’affichage des vignettes.
En activant cette option, les vignettes sont servies comme contenu statique. Un lien symbolique est créé pour chaque image.
static-file:
enabled: true
type: nginx
symlink-directory: ''
Phraseanet inclut le lecteur Videojs pour lecture des prévisualisations des documents de type audio et vidéo.
Il peut être personnalisé :
embed_bundle: # (array) Configuration de embed bundle
video:
player: videojs # (array) Active videojs comme lecteur de prévisualisations vidéos - seul choix possible
autoplay: false # (boolean) Active la lecture automatique de la prévisualisation vidéo
video_message_start: StartOfMessage # (string) Le nom du champ documentaire ou est stockée la valeur de début de lecture en seconde
coverSubdef: previewx4 # (string) Définit la sous-définition de type image utilisé pour présenter le lecteur hors lecture
available-speeds: # (array) Vitesses de défilement disponibles dans le lecteur
- 1
- 1.5
- 3
audio:
player: videojs # (array) Active vidéojs comme lecteur de prévisualisations audio
autoplay: false # (boolean) Active la lecture automatique de la prévisualisation audio
Note
La lecture à haute vitesse a des impacts sur la consomation de bande passante.
La visionneuse Pdf.js peut être utilisée pour l’affichage de prévisualisations des documents PDF en remplacement de la visionneuse FlexPaper utilisée par defaut.
Pdfjs permet la lecture de fichiers PDF par le navigateur tandis que FlexPaper nécessite que le plugin Adobe Flash Player soit installé et activé pour le navigateur ainsi qu’autorisé, cas échéant, pour l’instance Phraseanet consultée.
embed_bundle:
document:
player: flexpaper # (string) Pour les documents Office, utiliser flexpaper ou pdfjs
enable-pdfjs: true # (boolean) Utiliser pdfjs comme lecteur de prévisualisation pour les documents PDF
Note
Flexpaper ou Pdfjs peuvent être utilisés pour la lecture des fichiers de prévisualisation de documents Microsoft Office. Paramétrer la sous-définition Preview pour les documents de type Document en fonction du choix de paramétrage du lecteur utilisé.
La section permet le paramétrage d’options dans l’outil d’édition vidéo proposé dans Production.
video-editor:
ChapterVttFieldName: VideoTextTrackChapters # (string) Le nom du champ documentaire stockant les données de chapitrage
seekBackwardStep: 500 # (integer) En millisecondes, la valeur de déplacement de la tête de lecture en arrière
seekForwardStep: 500 # (integer) En millisecondes, la valeur de déplacement de la tête de lecture en avant
playbackRates: # (array) Les vitesses de défilement disponibles dans le lecteur
- 1
- '1.5'
- 3
La section permet le paramétrage des options de la géolocalisation dans Production.
Une clé publique MapBox API est requise pour utiliser l’affichage par géolocalisation. Cette clé peut être obtenue sur le site Mapbox.
Pour utiliser l’aide à la saisie proposée par GeoNames dans le formulaire d’édition de Phraseanet, fournir une adresse geonames-server dans la section Webservice du fichier de configuration.
geocoding-providers: # (array) Configuration de la géolocalisation dans Production
-
map-provider: mapboxWebGL # (string) La bibliothèque utilisée pour l'affichage de cartes
enabled: false # (string) Active ou désactive la fonctionnalité dans Production
public-key: '' # (string) La clé d'API MapBox à utiliser
map-layers: # (array) Tableau regroupant les fonds de cartes proposées
-
name: Streets
value: 'mapbox://styles/mapbox/streets-v9'
-
name: Basic
value: 'mapbox://styles/mapbox/basic-v9'
transition-mapboxgl:
-
animate: true
speed: '2.2'
curve: '1.42'
default-position: # (array) La postion par défaut de la carte
- '48.879162'
- '2.335062'
default-zoom: 5
marker-default-zoom: 9
geonames-field-mapping: true # (boolean) Active, désactive l'assistance à la saisie Geoname dans le formulaire d'édition
cityfields: City, Ville # (array) Mapping des champs Phraseanet pour la propriété Name (la ville)
provincefields: Province # (array) Mapping des champs Phraseanet pour la propriété Region
countryfields: Country, Pays # (array) Mapping des champs Phraseanet pour la propriété Country