Código fuente wiki de Instalacion (docker)

Versión 18.1 por dFa el 2025/02/22 10:39

Ocultar los últimos autores
dFa 1.1 1 (% class="jumbotron" %)
2 (((
3 (% class="container" %)
4 (((
5 = NEXTCLOUD =
6
7 Instalación de nextcloud mediante docker
8 )))
9 )))
10
dFa 4.1 11 ----
12
13
dFa 1.1 14 {{toc/}}
15
16 (% class="row" %)
17 (((
18 (% class="col-xs-12 col-sm-8" %)
19 (((
dFa 4.1 20 ----
21
dFa 1.1 22 = INICIO =
23
dFa 3.1 24 == Instalación ==
dFa 1.1 25
dFa 2.3 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
dFa 2.2 33 El primer paso es generar nuestro docker-compose:
dFa 1.1 34
dFa 2.2 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
dFa 1.1 49
dFa 2.2 50 redis:
51 image: redis:alpine
52 container_name: nextcloud-redis
53 restart: unless-stopped
54 volumes:
55 - redis:/data
dFa 1.1 56
dFa 2.2 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
dFa 17.1 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
dFa 2.2 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
dFa 2.3 106 Los volúmenes se han configurado por las siguientes razones:
dFa 2.2 107
dFa 2.3 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
dFa 2.2 113
dFa 2.3 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.
dFa 2.2 115
dFa 4.2 116 Desplegamos los contenedores:
dFa 2.3 117
dFa 6.1 118 [[image:1740216653242-590.png]]
dFa 2.3 119
dFa 6.1 120 Y vemos que se han creado los volumenes correctamente:
dFa 4.2 121
dFa 6.1 122 [[image:1740216641833-376.png]]
dFa 4.2 123
dFa 6.1 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
dFa 7.2 128 === nginx.conf ===
129
dFa 6.1 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
dFa 7.2 265 === config.php ===
266
dFa 6.1 267 Hacemos lo mismo con el fichero config.php que se encuentra en el volumen app dentro del directorio config:
268
269 {{code language="php"}}
270 <?php
271 $CONFIG = array (
272 'memcache.local' => '\\OC\\Memcache\\APCu',
273 'apps_paths' =>
274 array (
275 0 =>
276 array (
277 'path' => '/var/www/html/apps',
278 'url' => '/apps',
279 'writable' => true,
280 ),
281 1 =>
282 array (
283 'path' => '/var/www/html/custom_apps',
284 'url' => '/custom_apps',
285 'writable' => true,
286 ),
287 ),
288 'memcache.distributed' => '\\OC\\Memcache\\Redis',
289 'memcache.locking' => '\\OC\\Memcache\\Redis',
290 'redis' =>
291 array (
292 'host' => 'redis',
293 'password' => '',
294 'port' => 6379,
295 ),
296 'upgrade.disable-web' => true,
297 'instanceid' => 'ocxuwrcpcats',
298 'passwordsalt' => 'bFuPjx3NMpliQCtY729Uob2SRp19xe',
299 'secret' => 'eFMG77LAdbjw6oPSJM7hL/IDPBnP3qDxE7xlX6/uPMOvQ/kG',
300 'trusted_domains' =>
301 array (
302 0 => '10.100.200.35:8080',
303 1 => 'dfacloud.ddns.net',
304
305 ),
306 'datadirectory' => '/var/nextcloud/data',
307 'dbtype' => 'mysql',
308 'version' => '30.0.6.2',
309 'overwrite.cli.url' => 'https://dfacloud.ddns.net',
310 'dbname' => 'nextcloud',
311 'dbhost' => 'db',
312 'dbport' => '',
313 'dbtableprefix' => 'oc_',
314 'mysql.utf8mb4' => true,
315 'dbuser' => 'nextcloud',
316 'dbpassword' => 'Ko5b0sq977j1saaCQ3SD55',
317 'installed' => true,
318 );
319 {{/code}}
320
321 En este fichero php tendremos que tener en cuenta modificar los valores nuestra dirección ip:puerto y nuestra dns en consecuencia.
322
dFa 8.2 323 === Permisos ===
dFa 7.1 324
dFa 8.2 325 Es importante tener en cuenta los permisos de los directorios, sobre todo los directorios de datos y perfiles de usuarios.
326
327 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.
328
329 El usuario y grupo desde el host anfitrión en nuestro caso son:
330
331 * user: 33 (www-data)
332 * group: tape (www-data)
333
dFa 16.1 334 Y deben contener permisos 770
335
dFa 8.2 336 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.
dFa 8.3 337
dFa 9.2 338 == Acceso ==
339
340 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:
341
342 * [[http:~~/~~/ipservidor:8080>>http://ipservidor:8080]]
343
dFa 18.1 344 [[image:1740220925385-402.png]]
345
346 Indicamos un usuario y contraseña y comenzará la instalación.
347
dFa 12.1 348 = EXTRA =
349
dFa 14.2 350 == Compartir recurso que se usa en docker por smb ==
dFa 1.1 351
dFa 14.2 352 Si vamos a compartir un directorio de datos usado por docker tambien a través de smb, es importante tener en cuenta los permisos.
dFa 1.1 353
dFa 14.2 354 Para ello añadiremos nuestro usuario de smb al grupo tape e indicaremos en el recurso smb como usuario valido dicho grupo.
dFa 2.3 355
dFa 14.2 356 Para añadir el usuario al grupo tape:
dFa 4.2 357
dFa 14.2 358 {{code language="bash"}}
359 usermod -a -G tape usuario
360 {{/code}}
361
dFa 14.3 362 Para configurar el grupo en smb:
dFa 14.2 363
dFa 14.3 364 {{code language="bash"}}
365 [datos]
366 path = /datos/dFa
367 browsable = yes
368 writable = yes
369 valid users = @tape
370 #valid users = dFa
371 read only = no
372 force create mode = 0777
373 force directory mode = 0777
374 guest ok = no
375 {{/code}}
dFa 14.2 376
dFa 14.4 377 De esta manera tanto docker como el usuario de smb que hemos añadido al grupo tape tendrá permisos sobre el recurso.
dFa 14.3 378
dFa 14.4 379 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:
380
381 {{code language="bash"}}
382 setfacl -R -m g:tape:rwx /datos/
383 setfacl -R -d -m g:tape:rwx /datos/
384 {{/code}}
385
386
387
dFa 14.2 388
389 )))
390 )))