NextCloud est une plateforme de stockage et partage de données .
Préparez une jail, nommée next
.
C'est une application php, suivez la documentation à ce sujet.
Elle repose sur une base de données mysql/mariadb.
Installez votre environnement php:
# pkg -j nextcloud install www/nextcloud databases/pecl-memcache
vous pouvez aussi ajouter graphics/pecl-imagick
pour éviter un avertissement sur la génération du favicon, mais il embarque beaucoup de dépendances.
Construisez avec vos poudrieres la version nox11
:
DEFAULT_VERSIONS+= imagemagick=6-nox11
Créer un utilisateur dédié à nextcloud, dédié à la base que l'on va créer:
CREATE USER 'nextcloud'@'192.168.0.x' IDENTIFIED BY 'motdepasse'; GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'192.168.0.x'; FLUSH PRIVILEGES; exit;
Autoriser l'utilisateur www à configurer le programme:
chown www /usr/local/www/nextcloud/config chown www /usr/local/www/nextcloud/config/config.php
Après avoir configuré votre nom de domaine et installé des clefs https, configurez le serveur web comme suit:
upstream php-handler { server unix:/jails/next/var/run/php-fpm.sock; } # Set the `immutable` cache control options only for assets with a cache busting `v` argument map $arg_v $asset_immutable { "" ""; default "immutable"; } server { listen 80; listen [::]:80; server_name cloud.chezmoi.eu; # Prevent nginx HTTP Server Detection server_tokens off; # Enforce HTTPS return 301 https://$server_name$request_uri; } server { http2 on; listen 443 ssl; listen [::]:443 ssl; server_name cloud.chezmoi.eu; # Path to the root of your installation set $jail_path "/jails/next"; set $www_next "/usr/local/www/nextcloud"; root $jail_path$www_next; # Use Mozilla's guidelines for SSL/TLS settings # https://mozilla.github.io/server-side-tls/ssl-config-generator/ ssl_certificate /etc/ssl/nginx/cloud.example.com.crt; ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key; # Prevent nginx HTTP Server Detection server_tokens off; # HSTS settings # WARNING: Only add the preload option once you read about # the consequences in https://hstspreload.org/. This option # will add the domain to a hardcoded list that is shipped # in all major browsers and getting removed from this list # could take several months. #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; # set max upload size and increase upload timeout: client_max_body_size 512M; client_body_timeout 300s; fastcgi_buffers 64 4K; # Enable gzip but do not remove ETag headers gzip on; gzip_vary on; gzip_comp_level 4; gzip_min_length 256; gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; # Pagespeed is not supported by Nextcloud, so if your server is built # with the `ngx_pagespeed` module, uncomment this line to disable it. #pagespeed off; # The settings allows you to optimize the HTTP2 bandwitdth. # See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/ # for tunning hints client_body_buffer_size 512k; # HTTP response headers borrowed from Nextcloud `.htaccess` add_header Referrer-Policy "no-referrer" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Download-Options "noopen" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Robots-Tag "noindex, nofollow" always; add_header X-XSS-Protection "1; mode=block" always; add_header Strict-Transport-Security "max-age=31536000"; # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; # Add .mjs as a file extension for javascript # Either include it in the default mime.types list # or include you can include that list explicitly and add the file extension # only for Nextcloud like below: # include mime.types; types { text/javascript js mjs; } # Specify how to handle directories -- specifying `/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists # on the server. In particular, if that directory contains an index.php file, # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus # `try_files $uri $uri/ /index.php$request_uri` # always provides the desired behaviour. index index.php index.html /index.php$request_uri; # Rule borrowed from `.htaccess` to handle Microsoft DAV clients location = / { if ( $http_user_agent ~ ^DavClnt ) { return 302 /remote.php/webdav/$is_args$args; } } location = /robots.txt { deny all; log_not_found off; access_log off; } # Make a regex exception for `/.well-known` so that clients can still # access it despite the existence of the regex rule # `location ~ /(\.|autotest|...)` which would otherwise handle requests # for `/.well-known`. location ^~ /.well-known { # The rules in this block are an adaptation of the rules # in `.htaccess` that concern `/.well-known`. location = /.well-known/carddav { return 301 /remote.php/dav/; } location = /.well-known/caldav { return 301 /remote.php/dav/; } location /.well-known/acme-challenge { try_files $uri $uri/ =404; } location /.well-known/pki-validation { try_files $uri $uri/ =404; } # Let Nextcloud's API for `/.well-known` URIs handle all other # requests by passing them to the front-end controller. return 301 /index.php$request_uri; } # Rules borrowed from `.htaccess` to hide certain paths from clients location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; } # Ensure this block, which passes PHP files to the PHP process, is above the blocks # which handle static assets (as seen below). If this block is not declared first, # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php` # to the URI, resulting in a HTTP 500 error response. location ~ \.php(?:$|/) { # Required for legacy support rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri; fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; try_files $fastcgi_script_name =404; include fastcgi_params; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $www_next/$fastcgi_script_name; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; fastcgi_max_temp_file_size 0; } # Serve static files location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463, $asset_immutable"; access_log off; # Optional: Don't log access to assets location ~ \.wasm$ { default_type application/wasm; } } location ~ \.woff2?$ { try_files $uri /index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } # Rule borrowed from `.htaccess` location /remote { return 301 /remote.php$request_uri; } location / { try_files $uri $uri/ /index.php$request_uri; } }
Réglez l'adresse du serveur cloud.chezmoi.eu
ainsi que l'adresse de la socket php dans la jail.
Configurez php-fpm comme suit:
--- php-fpm.d/www.conf.default 2023-05-14 02:00:42.000000000 +0000 +++ php-fpm.d/www.conf 2023-05-19 21:16:00.661837000 +0000 @@ -42,7 +42,8 @@ ; FreeBSD for security reasons; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = 127.0.0.1:9000 +;listen = 127.0.0.1:9000 +listen = /var/run/php-fpm.sock ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) @@ -54,9 +55,9 @@ ; and group can be specified either by name or by their numeric IDs. ; Default Values: Owner is set to the master process running user. If the group ; is not set, the owner's group is used. Mode is set to 0660. -;listen.owner = www -;listen.group = www -;listen.mode = 0660 +listen.owner = www +listen.group = www +listen.mode = 0660 ; When POSIX Access Control Lists are supported you can set them using ; these options, value is a comma separated list of user/group names. @@ -441,11 +442,11 @@ ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. ; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp +env[HOSTNAME] = $HOSTNAME +env[PATH] = /usr/local/bin:/usr/bin:/bin +env[TMP] = /tmp +env[TMPDIR] = /tmp +env[TEMP] = /tmp ; Additional php.ini defines, specific to this pool of workers. These settings ; overwrite the values previously defined in the php.ini. The directives are the write the values previously defined in the php.ini. The directives are the
Pour php:
--- php.ini 2023-05-19 22:23:25.697031000 +0000 +++ php.ini-production 2023-05-19 21:21:42.199584000 +0000 @@ -430,7 +432,7 @@ ; Maximum amount of memory a script may consume ; https://php.net/memory-limit -memory_limit = 128M +memory_limit = 1G ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Error handling and logging ; @@ -950,6 +950,7 @@ ;extension=pdo_sqlite ;extension=pgsql ;extension=shmop + ; The MIBS data available in the PHP distribution must be installed. ; See https://www.php.net/manual/en/snmp.installation.php ;extension=snmp @@ -1774,16 +1773,16 @@ [opcache] ; Determines if Zend OPCache is enabled -;opcache.enable=1 +opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version of PHP ;opcache.enable_cli=0 ; The OPcache shared memory storage size. -;opcache.memory_consumption=128 +opcache.memory_consumption=256 ; The amount of memory for interned strings in Mbytes. -;opcache.interned_strings_buffer=8 +opcache.interned_strings_buffer=8 ; The maximum number of keys (scripts) in the OPcache hash table. ; Only numbers between 200 and 1000000 are allowed.
Créez une entrée pour cron(8):
crontab -u www -e crontab -u www -l SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin MAILTO=patron@cloud.lapinbilly.eu */5 * * * * /usr/local/bin/php --define apc.enable_cli=1 -f /usr/local/www/nextcloud/cron.php
La variable MAILTO
va vous permettre de recevoir des messages en cas de problème. Par contre, dans ce cas, vous allez recevoir toutes les cinq minutes.
Si vous voulez éviter ça, choisissez MAILTO=“”
.
C'est la dernière étape, il suffit de se connecter à l'adresse réglée sur nginx et de configurer la base de donnée en suivant le guide. Ajoutez dans la configuration
'default_phone_region' => 'FR',
Préparez newsyslog pour qu'il gère les fichiers journaux:
/var/log/nextcloud/nextcloud.log www:www 640 7 * @T00 JC /usr/local/www/nextcloud/data/nextcloud.log www:www 640 7 * @T00 JC
Suivez la documentation sur le sujet.