Código fuente wiki de Instalacion (docker)

Versión 21.1 por dFa el 2025/02/22 15:38

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