Código fuente wiki de Instalacion (docker)

Versión 19.2 por dFa el 2025/02/22 15:19

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