{"id":10518,"date":"2020-01-07T23:41:56","date_gmt":"2020-01-07T22:41:56","guid":{"rendered":"https:\/\/www.dreamsworld.it\/emanuele\/?p=10518"},"modified":"2020-01-29T14:27:52","modified_gmt":"2020-01-29T13:27:52","slug":"nextcloud-nginx-php74-e-mysql8","status":"publish","type":"post","link":"https:\/\/www.dreamsworld.it\/emanuele\/2020-01-07\/nextcloud-nginx-php74-e-mysql8\/","title":{"rendered":"Installare Nextcloud con nginx, PHP7.4 e MySQL8."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Amo avere il controllo dei miei strumenti e anche <a href=\"https:\/\/www.dreamsworld.it\/emanuele\/2019-06-08\/il-mio-cloud-a-casa-mia\/\">il mio cloud<\/a> <strong>non fa eccezione<\/strong>. Il plugin fornito da <a rel=\"noreferrer noopener\" aria-label=\"FreeNAS (opens in a new tab)\" href=\"https:\/\/www.freenas.org\/\" target=\"_blank\">FreeNAS<\/a> (<em>provatelo, non tornerete mai pi\u00f9 indietro<\/em>) era perfetto ma limitante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco dunque <strong>come installare manualmente Nextcloud su PHP7.4 e MySQL8.<\/strong><\/p>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">1. Su FreeNAS creiamo una jail con <em>iocage<\/em> e una volta entrati aggiorniamo i suoi repository<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pkg update &amp;&amp; pkg upgrade<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Installiamo i pacchetti necessari al funzionamento di nextcloud<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pkg install php74-mysqli-7.4.0 php74-ctype-7.4.0 php74-curl-7.4.0 php74-dom-7.4.0 php74-gd-7.4.0 php74-iconv-7.4.0 php74-json-7.4.0 php74-iconv-7.4.0 php74-mbstring-7.4.0 php74-openssl-7.4.0 php74-posix-7.4.0 php74-session-7.4.0 php74-simplexml-7.4.0 php74-xmlreader-7.4.0 php74-xmlwriter-7.4.0 php74-zip-7.4.0 php74-zlib-7.4.0 php74-pdo_mysql-7.4.0 php74-fileinfo-7.4.0 php74-bz2-7.4.0 php74-intl-7.4.0 php74-imap-7.4.0 php74-pecl-imagick-im7-3.4.4 php74-xml-7.4.0 php74-filter-7.4.0 php74-readline-7.4.0 php74-pdo-7.4.0 php74-pecl-APCu<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Installiamo MySQL8<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pkg install mysql80-server-8.0.17<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Installiamo il webserver (e qualche utility)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pkg install nginx nano sudo<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mettiamo tutto in auto-start nella jail<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sysrc -f \/etc\/rc.conf nginx_enable=\"YES\"\nsysrc -f \/etc\/rc.conf mysql_enable=\"YES\"\nsysrc -f \/etc\/rc.conf php_fpm_enable=\"YES\"<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">2. Configuriamo i local PATH per PHP modificando il file www.conf<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">nano \/usr\/local\/etc\/php-fpm.d\/www.conf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rimuoviamo il commento a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">env[PATH] = \/usr\/local\/bin:\/usr\/bin:\/bin<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">3. Avviamo il server SQL e avviamo la procedura di messa in sicurezza di base<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">service mysql-server start\nmysql_secure_installation<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Qui verr\u00e0 richiesto il livello di sicurezza e la password per l&#8217;utente root e una serie di domande alle quali potrete rispondere sempre YES \ud83d\ude09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo un utente nel db di nextcloud modificando prima la modalit\u00e0 di autenticazione (<em>MySQL8 introduce una nuova modalit\u00e0 non ancora supportata da nextcloud<\/em>)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">nano \/usr\/local\/etc\/mysql\/my.cnf\ndefault_authentication_plugin=mysql_native_password (da inserire dentro sezione mysqld)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Effettuiamo il login sul server MySQL con l&#8217;utente di root creato al punto 7<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mysql -u root -p\nPassword:\ncreate database nextcloud; \ncreate user 'dbadmin'@'localhost' identified by '&lt;password-per-utente-dbadmin&gt;';\ngrant all privileges on nextcloud.* to 'dbadmin'@'localhost';\nflush privileges;\nquit;<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">4. Richiediamo un nuovo certificato per far girare il web server su HTTPS:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir \/usr\/local\/etc\/ssl\/openssl\ncd \/usr\/local\/etc\/ssl\/openssl\nopenssl req -new &gt; cert.csr<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Completata la procedura effettuiamo qualche rename<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">openssl rsa -in privkey.pem -out key.pem\nopenssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1825\ncat key.pem&gt;&gt;cert.pem\nopenssl dhparam 2048 -out dhparam.pem<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Modifichiamo nginx.conf in modo da utilizzare https<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">touch \/usr\/local\/etc\/nextcloud_ssl.conf\nnano \/usr\/local\/etc\/nginx\/nextcloud_ssl.conf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E inseriamo la configurazione del server in SSL:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server {\n   listen 443 ssl http2;\n   server_name nextcloud.local;\n   ssl_certificate \/usr\/local\/etc\/ssl\/openssl\/cert.pem;\n   ssl_certificate_key \/usr\/local\/etc\/ssl\/openssl\/key.pem;\n   ssl_prefer_server_ciphers on;\n   ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;\n   ssl_dhparam \/usr\/local\/etc\/ssl\/openssl\/dhparam.pem;\n   add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n   #ssl_ciphers         HIGH:!aNULL:!MD5;\n # Path to the root of your installation\n   root \/usr\/local\/www\/nextcloud\/;\n # set max upload size\n   client_max_body_size 10G;\n   fastcgi_buffers 64 4K;\n # Disable gzip to avoid the removal of the ETag header\n   gzip off;\n rewrite ^\/caldav(.<em>)$ \/remote.php\/caldav$1 redirect;   rewrite ^\/carddav(.<\/em>)$ \/remote.php\/carddav$1 redirect;\n   rewrite ^\/webdav(.*)$ \/remote.php\/webdav$1 redirect;\n index index.php;\n   error_page 403 \/core\/templates\/403.php;\n   error_page 404 \/core\/templates\/404.php;\n location = \/robots.txt {\n allow all;\n log_not_found off;\n access_log off;\n }\n location ~ ^\/(?:.htaccess|data|config|db_structure.xml|README){\n deny all;\n }\n location \/ {\n The following 2 rules are only needed with webfinger\n rewrite ^\/.well-known\/host-meta \/public.php?service=host-meta last;\n rewrite ^\/.well-known\/host-meta.json \/public.php?service=host-meta-json last;\n rewrite ^\/.well-known\/carddav \/remote.php\/carddav\/ redirect;\n rewrite ^\/.well-known\/caldav \/remote.php\/caldav\/ redirect;\n rewrite ^(\/core\/doc\/[^\\\/]+\/)$ $1\/index.html;\n try_files $uri $uri\/ =404;\n }\n location ~ .php(?:$|\/) {\n fastcgi_split_path_info ^(.+.php)(\/.+)$;\n include fastcgi_params;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param PATH_INFO $fastcgi_path_info;\n fastcgi_pass unix:\/var\/run\/nextcloud-php-fpm.sock;\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_intercept_errors on;\n }\n Adding the cache control header for js and css files\n Make sure it is BELOW the location ~ .php(?:$|\/) { block\n location ~* .(?:css|js)$ {\n add_header Cache-Control \"public, max-age=7200\";\n Add headers to serve security related headers\n add_header Strict-Transport-Security \"max-age=15768000; includeSubDomains; preload;\";\n add_header X-Content-Type-Options nosniff;\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-XSS-Protection \"1; mode=block\";\n add_header X-Robots-Tag none;\n Optional: Don't log access to assets\n access_log off;\n }\n Optional: Don't log access to other assets\n location ~* .(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {\n access_log off;\n }\n }<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ricordiamoci di fare un include di nextcloud_ssl.conf dentro nginx.conf<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">nano \/usr\/local\/etc\/nginx\/nginx.conf\ninclude \/usr\/local\/etc\/nginx\/nextcloud_ssl.conf; (da scrivere in fondo dentro al file)<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">5. Configuriamo la cache PHP<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cp \/usr\/local\/etc\/php.ini-production \/usr\/local\/etc\/php.ini\n# Modify opcache settings in php.ini according to Nextcloud documentation (remove comment and set recommended value)\n# https:\/\/docs.nextcloud.com\/server\/15\/admin_manual\/configuration_server\/server_tuning.html#enable-php-opcache\nsed -i '' 's\/.<em>opcache.enable_cli=.<\/em>\/opcache.enable_cli=1\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.opcache.file_cache=.<\/em>\/opcache.opcache.file_cache=\\\/tmp\\\/.opcache\\\/\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.interned_strings_buffer=.<\/em>\/opcache.interned_strings_buffer=8\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.max_accelerated_files=.<\/em>\/opcache.max_accelerated_files=10000\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.memory_consumption=.<\/em>\/opcache.memory_consumption=128\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.save_comments=.<\/em>\/opcache.save_comments=1\/' \/usr\/local\/etc\/php.ini\nsed -i '' 's\/.<em>opcache.revalidate_freq=.<\/em>\/opcache.revalidate_freq=1\/' \/usr\/local\/etc\/php.ini\n# recommended value of 512MB for php memory limit (avoid warning when running occ)\nsed -i '' 's\/.<em>memory_limit.<\/em>\/memory_limit=512M\/' \/usr\/local\/etc\/php.ini<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">6. Scarichiamo, estraiamo e modifichiamo i permessi per nextcloud<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cd\nfetch nextcloud-17.0.2.tar.bz2 https:\/\/download.nextcloud.com\/server\/releases\/nextcloud-17.0.1.tar.bz2\ntar -jxf nextcloud-17.0.2.tar.bz2\ncp -rf nextcloud \/usr\/local\/www\/nextcloud\nchown -R www:www \/usr\/local\/www\/nextcloud\/<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">7. Installiamo nextcloud specificando il dataset nel quale registrare i dati del software e la cartella di destinazione dei file degli utenti<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo -u www php \/usr\/local\/www\/nextcloud\/occ  maintenance:install --database \"mysql\" --database-name \"nextcloud\"  --database-user \"dbadmin\" --database-pass \"&lt;passsword-utente-dbadmin&gt;\" --admin-user \"NextCloud_Admin\" --admin-pass \"&lt;password-utente-NextCloud_Admin&gt;\" --data-dir \"\/mnt\/nextcloud\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nel mio caso, il dataset accessibile alla jail da FreeNAS \u00e8 stato montato dentro <em>\/mnt\/nextcloud<\/em>.<\/p>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">8. Modifichiamo il file di configurazione di NextCloud esplicitando l&#8217;indirizzo e l&#8217;eventuale DNS al quale verr\u00e0 contattato<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">nano \/usr\/local\/www\/nextcloud\/config\/config.php\n e modificare l'array in questo modo:\n array (\n   0 =&gt; 'localhost',\n   1 =&gt; '192.168.0.100',\n   2 =&gt; 'nextcloud.local',\n ),<\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">9. Diamo il via ai servizi e, tramite browser, godiamoci <strong>il nostro nuovo cloud<\/strong> pronto ad esser riempito.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">service nginx start\nservice php-fpm start<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s all folks. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Emanuele<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Amo avere il controllo dei miei strumenti e anche il mio cloud non fa eccezione. Il plugin fornito da FreeNAS (provatelo, non tornerete mai pi\u00f9 indietro) era perfetto ma limitante. Ecco dunque come installare manualmente Nextcloud su PHP7.4 e MySQL8. &hellip; <a href=\"https:\/\/www.dreamsworld.it\/emanuele\/2020-01-07\/nextcloud-nginx-php74-e-mysql8\/\">Leggi ancora &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[3],"tags":[2784,2782,2753,653,640,1396,2785,966],"class_list":["post-10518","post","type-post","status-publish","format-standard","hentry","category-computer","tag-cloud","tag-freebsd","tag-freenas","tag-guide","tag-how-to","tag-mysql","tag-nextcloud","tag-server"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/comments?post=10518"}],"version-history":[{"count":0,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10518\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/media?parent=10518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/categories?post=10518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/tags?post=10518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}