Código fuente wiki de Instalacion (docker)

Versión 25.2 por dFa el 2025/02/22 16:12

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