Código fuente wiki de Instalacion (docker)

Versión 25.3 por dFa el 2025/02/22 16:13

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 {{code}}
120 - /datos/dFa:/mnt
121 {{/code}}
122
123 También se añade la adición de permisos al directorio /var/nextcloud durante la generación del contenedor, dado que el directorio se crea durante la creación del volumen "user".
124
125 {{code}}
126 command: >
127 sh -c "chown -R www-data:www-data /var/nextcloud &&
128 chmod -R 770 /var/nextcloud &&
129 exec /entrypoint.sh php-fpm"
130 {{/code}}
131
132 Desplegamos los contenedores:
133
134 [[image:1740216653242-590.png]]
135
136 Y vemos que se han creado los volumenes correctamente:
137
138 [[image:1740216641833-376.png]]
139
140 == Configuración ==
141
142 Con los volumenes creados, todavía nextcloud no es accesible, dado que debemos configurar tanto el config.php como como el nginx.conf.
143
144 === nginx.conf ===
145
146 El fichero nginx.conf se encuentra en el volumen nextcloud_nginx_conf. Realizamos previamente un backup y reemplazamos por el siguiente:
147
148 {{code language="yaml"}}
149 worker_processes auto;
150
151 error_log /var/log/nginx/error.log warn;
152 pid /var/run/nginx.pid;
153
154 events {
155 worker_connections 1024;
156 }
157
158 http {
159 include mime.types;
160 default_type application/octet-stream;
161 types {
162 text/javascript mjs;
163 application/wasm wasm;
164 }
165
166 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
167 '$status $body_bytes_sent "$http_referer" '
168 '"$http_user_agent" "$http_x_forwarded_for"';
169
170 access_log /var/log/nginx/access.log main;
171
172 sendfile on;
173 keepalive_timeout 65;
174
175 # Define asset_immutable variable properly
176 map $arg_v $asset_immutable {
177 default "";
178 "" ", immutable";
179 }
180
181 upstream php-handler {
182 server app:9000;
183 }
184
185 server {
186 listen 80;
187
188 client_max_body_size 512M;
189 client_body_timeout 300s;
190 fastcgi_buffers 64 4K;
191
192 client_body_buffer_size 512k;
193
194 gzip on;
195 gzip_vary on;
196 gzip_comp_level 4;
197 gzip_min_length 256;
198 gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
199 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;
200
201 add_header Referrer-Policy "no-referrer" always;
202 add_header X-Content-Type-Options "nosniff" always;
203 add_header X-Frame-Options "SAMEORIGIN" always;
204 add_header X-Permitted-Cross-Domain-Policies "none" always;
205 add_header X-Robots-Tag "noindex, nofollow" always;
206 add_header X-XSS-Protection "1; mode=block" always;
207
208 fastcgi_hide_header X-Powered-By;
209
210 root /var/www/html;
211
212 index index.php index.html /index.php$request_uri;
213
214 location = / {
215 if ( $http_user_agent ~ ^DavClnt ) {
216 return 302 /remote.php/webdav/$is_args$args;
217 }
218 }
219
220 location = /robots.txt {
221 allow all;
222 log_not_found off;
223 access_log off;
224 }
225
226 location ^~ /.well-known {
227 location = /.well-known/carddav { return 301 /remote.php/dav/; }
228 location = /.well-known/caldav { return 301 /remote.php/dav/; }
229 location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
230 location /.well-known/pki-validation { try_files $uri $uri/ =404; }
231 return 301 /index.php$request_uri;
232 }
233
234 location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
235 location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
236
237 location ~ \.php(?:$|/) {
238 rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;
239
240 fastcgi_split_path_info ^(.+?\.php)(/.*)$;
241 set $path_info $fastcgi_path_info;
242
243 try_files $fastcgi_script_name =404;
244
245 include fastcgi_params;
246 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
247 fastcgi_param PATH_INFO $path_info;
248 fastcgi_param HTTPS on;
249
250 fastcgi_param modHeadersAvailable true;
251 fastcgi_param front_controller_active true;
252 fastcgi_pass php-handler;
253
254 fastcgi_intercept_errors on;
255 fastcgi_request_buffering off;
256
257 fastcgi_max_temp_file_size 0;
258 }
259
260 location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
261 try_files $uri /index.php$request_uri;
262 add_header Cache-Control "public, max-age=15778463$asset_immutable";
263 access_log off;
264 }
265
266 location ~ \.wasm$ {
267 default_type application/wasm;
268 }
269
270 location /remote {
271 return 301 /remote.php$request_uri;
272 }
273
274 location / {
275 try_files $uri $uri/ /index.php$request_uri;
276 }
277 }
278 }
279 {{/code}}
280
281 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:
282
283 * [[http:~~/~~/ipservidor:8080>>http://ipservidor:8080]]
284
285 [[image:1740220925385-402.png]]
286
287 Indicamos un usuario y contraseña y comenzará la instalación.
288
289 === config.php ===
290
291 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:
292
293 {{code language="php"}}
294 <?php
295 $CONFIG = array (
296 'memcache.local' => '\\OC\\Memcache\\APCu',
297 'apps_paths' =>
298 array (
299 0 =>
300 array (
301 'path' => '/var/www/html/apps',
302 'url' => '/apps',
303 'writable' => true,
304 ),
305 1 =>
306 array (
307 'path' => '/var/www/html/custom_apps',
308 'url' => '/custom_apps',
309 'writable' => true,
310 ),
311 ),
312 'memcache.distributed' => '\\OC\\Memcache\\Redis',
313 'memcache.locking' => '\\OC\\Memcache\\Redis',
314 'redis' =>
315 array (
316 'host' => 'redis',
317 'password' => '',
318 'port' => 6379,
319 ),
320 'upgrade.disable-web' => true,
321 'instanceid' => 'ocxuwrcpcats',
322 'passwordsalt' => 'bFuPjx3NMpliQCtY729Uob2SRp19xe',
323 'secret' => 'eFMG77LAdbjw6oPSJM7hL/IDPBnP3qDxE7xlX6/uPMOvQ/kG',
324 'trusted_domains' =>
325 array (
326 0 => '10.100.200.35:8080',
327 1 => 'dfacloud.ddns.net',
328
329 ),
330 'datadirectory' => '/var/nextcloud/data',
331 'dbtype' => 'mysql',
332 'version' => '30.0.6.2',
333 'overwrite.cli.url' => 'https://dfacloud.ddns.net',
334 'dbname' => 'nextcloud',
335 'dbhost' => 'db',
336 'dbport' => '',
337 'dbtableprefix' => 'oc_',
338 'mysql.utf8mb4' => true,
339 'dbuser' => 'nextcloud',
340 'dbpassword' => 'Ko5b0sq977j1saaCQ3SD55',
341 'installed' => true,
342 );
343 {{/code}}
344
345 En este fichero php tendremos que tener en cuenta modificar los valores nuestra dirección ip:puerto y nuestra dns en consecuencia.
346
347 Tambien debemos tener en cuenta la directiva:
348
349 * 'datadirectory' => '/var/nextcloud/data',
350
351 Dado que indica el directorio de datos dentro del contenedor.
352
353 === Permisos ===
354
355 Es importante tener en cuenta los permisos de los directorios, sobre todo los directorios de datos y perfiles de usuarios.
356
357 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.
358
359 El usuario y grupo desde el host anfitrión en nuestro caso son:
360
361 * user: 33 (www-data)
362 * group: tape (www-data)
363
364 Y deben contener permisos 770
365
366 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.
367
368 = OTROS =
369
370 == Compartir recurso que se usa en docker por smb ==
371
372 Si vamos a compartir un directorio de datos usado por docker tambien a través de smb, es importante tener en cuenta los permisos.
373
374 Para ello añadiremos nuestro usuario de smb al grupo tape e indicaremos en el recurso smb como usuario valido dicho grupo.
375
376 Para añadir el usuario al grupo tape:
377
378 {{code language="bash"}}
379 usermod -a -G tape usuario
380 {{/code}}
381
382 Para configurar el grupo en smb:
383
384 {{code language="bash"}}
385 [datos]
386 path = /datos/dFa
387 browsable = yes
388 writable = yes
389 valid users = @tape
390 #valid users = dFa
391 read only = no
392 force create mode = 0777
393 force directory mode = 0777
394 guest ok = no
395 {{/code}}
396
397 De esta manera tanto docker como el usuario de smb que hemos añadido al grupo tape tendrá permisos sobre el recurso.
398
399 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:
400
401 {{code language="bash"}}
402 setfacl -R -m g:tape:rwx /datos/
403 setfacl -R -d -m g:tape:rwx /datos/
404 {{/code}}
405
406
407
408
409 )))
410 )))