Código fuente wiki de Instalacion (docker)

Versión 20.5 por dFa el 2025/02/22 15:36

Mostrar los últimos autores
1 (% class="jumbotron" %)
2 (((
3 (% class="container" %)
4 (((
5 = NEXTCLOUD =
6
7 Instalación de nextcloud mediante docker
8 )))
9 )))
10
11 ----
12
13
14 {{toc/}}
15
16 (% class="row" %)
17 (((
18 (% class="col-xs-12 col-sm-8" %)
19 (((
20 ----
21
22 = INICIO =
23
24 == Instalación ==
25
26 La instalación consta de 4 servicios:
27
28 * db: Base de datos mariadb
29 * redis: Base de datos de memoria caché redis
30 * app: Aplicativo nextcloud
31 * web: Servidor web nginx, se encarga de redireccionar las peticiones hacia el aplicativo (app)
32
33 El primer paso es generar nuestro docker-compose:
34
35 {{code language="yaml"}}
36 services:
37 db:
38 image: mariadb:10.11
39 container_name: nextcloud-db
40 restart: unless-stopped
41 command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
42 volumes:
43 - database:/var/lib/mysql
44 environment:
45 MYSQL_ROOT_PASSWORD: Ko5b0sq977j1saaCQ3SD55
46 MYSQL_DATABASE: nextcloud
47 MYSQL_USER: nextcloud
48 MYSQL_PASSWORD: Ko5b0sq977j1saaCQ3SD55
49
50 redis:
51 image: redis:alpine
52 container_name: nextcloud-redis
53 restart: unless-stopped
54 volumes:
55 - redis:/data
56
57 app:
58 image: nextcloud:fpm
59 container_name: nextcloud-app
60 restart: unless-stopped
61 ports:
62 - 9000:9000
63 depends_on:
64 - db
65 - redis
66 volumes:
67 - data:/var/www/html
68 - user:/var/nextcloud/data
69 - /datos/dFa:/mnt
70 environment:
71 MYSQL_HOST: db
72 MYSQL_DATABASE: nextcloud
73 MYSQL_USER: nextcloud
74 MYSQL_PASSWORD: Ko5b0sq977j1saaCQ3SD55
75 REDIS_HOST: redis
76 PHP_UPLOAD_LIMIT: 0
77 command: >
78 sh -c "chown -R www-data:www-data /var/nextcloud &&
79 chmod -R 770 /var/nextcloud &&
80 exec /entrypoint.sh php-fpm"
81
82 web:
83 image: nginx
84 container_name: nextcloud-web
85 restart: always
86 ports:
87 - 8080:80
88 depends_on:
89 - app
90 volumes:
91 - nginx_conf:/etc/nginx
92 - data:/var/www/html
93 volumes_from:
94 - app
95
96 volumes:
97 data:
98 driver: local
99 database:
100 driver: local
101 redis:
102 driver: local
103 nginx_conf:
104 driver: local
105 user:
106 driver: local
107 {{/code}}
108
109 Los volúmenes se han configurado por las siguientes razones:
110
111 * database: Ficheros de la base de datos mysql
112 * redis: Ficheros de la base de datos de memoria caché
113 * data: Ficheros del aplicativo nextcloud (es necesario que lo usen tanto el contenedor app como el contenedor web)
114 * user: Ficheros de los perfiles de usuarios creados para nextcloud
115 * nginx_conf: Fichero nginx.conf
116
117 Además, en este caso, se ha realizado un bind de nuestro disco /datos para que sea utilizado como punto de montaje en nextcloud. Dado que es un contenedor, es necesario mapearlo para que la interfaz web tenga acceso al recurso de alguna manera.
118
119 Desplegamos los contenedores:
120
121 [[image:1740216653242-590.png]]
122
123 Y vemos que se han creado los volumenes correctamente:
124
125 [[image:1740216641833-376.png]]
126
127 == Configuración ==
128
129 Con los volumenes creados, todavía nextcloud no es accesible, dado que debemos configurar tanto el config.php como como el nginx.conf.
130
131 === nginx.conf ===
132
133 El fichero nginx.conf se encuentra en el volumen nextcloud_nginx_conf. Realizamos previamente un backup y reemplazamos por el siguiente:
134
135 {{code language="yaml"}}
136 worker_processes auto;
137
138 error_log /var/log/nginx/error.log warn;
139 pid /var/run/nginx.pid;
140
141 events {
142 worker_connections 1024;
143 }
144
145 http {
146 include mime.types;
147 default_type application/octet-stream;
148 types {
149 text/javascript mjs;
150 application/wasm wasm;
151 }
152
153 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
154 '$status $body_bytes_sent "$http_referer" '
155 '"$http_user_agent" "$http_x_forwarded_for"';
156
157 access_log /var/log/nginx/access.log main;
158
159 sendfile on;
160 keepalive_timeout 65;
161
162 # Define asset_immutable variable properly
163 map $arg_v $asset_immutable {
164 default "";
165 "" ", immutable";
166 }
167
168 upstream php-handler {
169 server app:9000;
170 }
171
172 server {
173 listen 80;
174
175 client_max_body_size 512M;
176 client_body_timeout 300s;
177 fastcgi_buffers 64 4K;
178
179 client_body_buffer_size 512k;
180
181 gzip on;
182 gzip_vary on;
183 gzip_comp_level 4;
184 gzip_min_length 256;
185 gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
186 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;
187
188 add_header Referrer-Policy "no-referrer" always;
189 add_header X-Content-Type-Options "nosniff" always;
190 add_header X-Frame-Options "SAMEORIGIN" always;
191 add_header X-Permitted-Cross-Domain-Policies "none" always;
192 add_header X-Robots-Tag "noindex, nofollow" always;
193 add_header X-XSS-Protection "1; mode=block" always;
194
195 fastcgi_hide_header X-Powered-By;
196
197 root /var/www/html;
198
199 index index.php index.html /index.php$request_uri;
200
201 location = / {
202 if ( $http_user_agent ~ ^DavClnt ) {
203 return 302 /remote.php/webdav/$is_args$args;
204 }
205 }
206
207 location = /robots.txt {
208 allow all;
209 log_not_found off;
210 access_log off;
211 }
212
213 location ^~ /.well-known {
214 location = /.well-known/carddav { return 301 /remote.php/dav/; }
215 location = /.well-known/caldav { return 301 /remote.php/dav/; }
216 location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
217 location /.well-known/pki-validation { try_files $uri $uri/ =404; }
218 return 301 /index.php$request_uri;
219 }
220
221 location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
222 location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
223
224 location ~ \.php(?:$|/) {
225 rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;
226
227 fastcgi_split_path_info ^(.+?\.php)(/.*)$;
228 set $path_info $fastcgi_path_info;
229
230 try_files $fastcgi_script_name =404;
231
232 include fastcgi_params;
233 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
234 fastcgi_param PATH_INFO $path_info;
235 fastcgi_param HTTPS on;
236
237 fastcgi_param modHeadersAvailable true;
238 fastcgi_param front_controller_active true;
239 fastcgi_pass php-handler;
240
241 fastcgi_intercept_errors on;
242 fastcgi_request_buffering off;
243
244 fastcgi_max_temp_file_size 0;
245 }
246
247 location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
248 try_files $uri /index.php$request_uri;
249 add_header Cache-Control "public, max-age=15778463$asset_immutable";
250 access_log off;
251 }
252
253 location ~ \.wasm$ {
254 default_type application/wasm;
255 }
256
257 location /remote {
258 return 301 /remote.php$request_uri;
259 }
260
261 location / {
262 try_files $uri $uri/ /index.php$request_uri;
263 }
264 }
265 }
266 {{/code}}
267
268 Reiniciamos los contenedores para que apliquen todos los cambios y comprobamos si funciona correctamente accediendo a través del puerto expuesto, en este caso el 8080:
269
270 * [[http:~~/~~/ipservidor:8080>>http://ipservidor:8080]]
271
272 [[image:1740220925385-402.png]]
273
274 Indicamos un usuario y contraseña y comenzará la instalación.
275
276 === config.php ===
277
278 Una vez realziada la instralación, hacemos lo mismo con el fichero config.php que se encuentra en el volumen app dentro del directorio config:
279
280 {{code language="php"}}
281 <?php
282 $CONFIG = array (
283 'memcache.local' => '\\OC\\Memcache\\APCu',
284 'apps_paths' =>
285 array (
286 0 =>
287 array (
288 'path' => '/var/www/html/apps',
289 'url' => '/apps',
290 'writable' => true,
291 ),
292 1 =>
293 array (
294 'path' => '/var/www/html/custom_apps',
295 'url' => '/custom_apps',
296 'writable' => true,
297 ),
298 ),
299 'memcache.distributed' => '\\OC\\Memcache\\Redis',
300 'memcache.locking' => '\\OC\\Memcache\\Redis',
301 'redis' =>
302 array (
303 'host' => 'redis',
304 'password' => '',
305 'port' => 6379,
306 ),
307 'upgrade.disable-web' => true,
308 'instanceid' => 'ocxuwrcpcats',
309 'passwordsalt' => 'bFuPjx3NMpliQCtY729Uob2SRp19xe',
310 'secret' => 'eFMG77LAdbjw6oPSJM7hL/IDPBnP3qDxE7xlX6/uPMOvQ/kG',
311 'trusted_domains' =>
312 array (
313 0 => '10.100.200.35:8080',
314 1 => 'dfacloud.ddns.net',
315
316 ),
317 'datadirectory' => '/var/nextcloud/data',
318 'dbtype' => 'mysql',
319 'version' => '30.0.6.2',
320 'overwrite.cli.url' => 'https://dfacloud.ddns.net',
321 'dbname' => 'nextcloud',
322 'dbhost' => 'db',
323 'dbport' => '',
324 'dbtableprefix' => 'oc_',
325 'mysql.utf8mb4' => true,
326 'dbuser' => 'nextcloud',
327 'dbpassword' => 'Ko5b0sq977j1saaCQ3SD55',
328 'installed' => true,
329 );
330 {{/code}}
331
332 En este fichero php tendremos que tener en cuenta modificar los valores nuestra dirección ip:puerto y nuestra dns en consecuencia.
333
334 Tambien debemos tener en cuenta la directiva:
335
336 * 'datadirectory' => '/var/nextcloud/data',
337
338 Dado que indica el directorio de datos dentro del contenedor.
339
340 === Permisos ===
341
342 Es importante tener en cuenta los permisos de los directorios, sobre todo los directorios de datos y perfiles de usuarios.
343
344 En nuestro caso hemos montado el perfil de usuario en un directorio distinto dado que es una recomendación de seguridad de nextcloud, y además hemos expuesto nuestro disco /datos montando en el host anfitrión al contenedor, por lo que es posible que tengamos que revisar los permisos.
345
346 El usuario y grupo desde el host anfitrión en nuestro caso son:
347
348 * user: 33 (www-data)
349 * group: tape (www-data)
350
351 Y deben contener permisos 770
352
353 Hemos ajustado el compose para que se adapten estos permisos de forma automática, no obstante es importante revisarles si nextcloud indica algún problema de permisos.
354
355 == Acceso ==
356
357
358 = EXTRA =
359
360 == Compartir recurso que se usa en docker por smb ==
361
362 Si vamos a compartir un directorio de datos usado por docker tambien a través de smb, es importante tener en cuenta los permisos.
363
364 Para ello añadiremos nuestro usuario de smb al grupo tape e indicaremos en el recurso smb como usuario valido dicho grupo.
365
366 Para añadir el usuario al grupo tape:
367
368 {{code language="bash"}}
369 usermod -a -G tape usuario
370 {{/code}}
371
372 Para configurar el grupo en smb:
373
374 {{code language="bash"}}
375 [datos]
376 path = /datos/dFa
377 browsable = yes
378 writable = yes
379 valid users = @tape
380 #valid users = dFa
381 read only = no
382 force create mode = 0777
383 force directory mode = 0777
384 guest ok = no
385 {{/code}}
386
387 De esta manera tanto docker como el usuario de smb que hemos añadido al grupo tape tendrá permisos sobre el recurso.
388
389 También para evitar problemas, es importante asignar ACL's para que el recurso siempre tenga los mismos permisos cuando se añade un nuevo fichero y además aseguramos que el contenido ya existente se encuentra en un estado correcto en cuanto a los mismos:
390
391 {{code language="bash"}}
392 setfacl -R -m g:tape:rwx /datos/
393 setfacl -R -d -m g:tape:rwx /datos/
394 {{/code}}
395
396
397
398
399 )))
400 )))