Project

General

Profile

BrutusSetup » History » Version 13

Anonymous, 11/15/2025 06:19 PM
updating table

1 1
h1. brutus Server Setup
2
3
h2. History
4
5 2
Who needs "the cloud", I've got gigabit fiber running directly to my house! 
6
-- Me
7 1
8 2
I've been running a local file server for 16ish years.
9
10 1
|=. *Date* |=. *Note* |
11 13
|*7/28/2025*|Upgraded to 256GB (+128GB) RAM|
12 2
| *9/11/2024* | Swtiched to "Dynu":https://www.dynu.com/en-US/ for dynamic DNS and used "Let's Encrypt":https://letsencrypt.org/ for a proper SSL/TLS cert.|
13 1
| *9/8/2024* | Retired @phalanx@ and replaced it with @brutus@ (hardware details in the section below).|
14
| *5/27/2022* | Wipe and install Ubuntu 22.04|
15
| *7/8/2019* | Change Dynamic DNS provider to http://freedns.afraid.org. |
16
| *1/9/2019* | Added 10G Ethernet interface. |
17
| *1/4/2019* | Replaced mobo/proc/RAM with parts salvaged from work. Proc i7-4790 (Haswell); RAM 32GB DDR3L.|
18
| *6/2/2018* | Upgraded boot drive to 500 GB SSD. Also installed Ubuntu 18.04 LTS. |
19
| *1/16/2017*| Upgraded server added 2 x 3 TB additional HDDs (via PCIe SATA expansion card), new power supply, and new (slightly used) case.  After adding the new disks to the RAID and growing the file system, total usable storage on the array is now 11.18 TB.|
20
| *11/18/2016* |Updated (wipe and reinstall) to Ubuntu Server 16.04.1 LTS|
21
| *9/2015* | I recently decided to pay for dynamic DNS service from "Dyn":http://dyn.com.  The cost was $30 (after 25% coupon) for a year w/ 30 hostnames. Server is now reachable at https://baranovich.homelinux.org:3268|
22
| *8/2014* | Both of the my original 3TB HDDs started acting funny and died within a week of each other after about 1.8 years of continuous use.  Fortunately I reacted immediately and I was able to back up all of my data onto other disks. Although I regularly back up all of my critical data I decided that I really don't want to have to deal with losing any of my data.  I promptly purchased another HDD and a HW RAID card (an LSI MegaRAID SAS 9240-8i) and set out to build a RAID 5 array.  I quickly ran into problems with the RAID card.  I was only able to get the computer to boot with it installed once.  During that boot I upgraded the card's firmware with the hope that it would fix all my issues, but it did not and I was never able to fully boot with the card installed again.  After a little googling I discovered someone in my same position who claimed to have called LSI tech support and was told that LSI cards are "not compatible with newer motherboards".  The guy didn't elaborate as to what that meant but I assume it means LSI cards don't work in UEFI motherboards. I was disappointed but I started reading about software raid (device mapper raid) and decided that it should work perfectly for my little fileserver.  I also decided that btrfs is not really ready for prime time and I should use some other file system.|
23 2
| *??/2008* | Created first version of @phalanx@ with Dell desktop that was Kab's college computer.|
24 1
25
h2. Hardware Details
26 3
27
* Dell r730xd server 2U 
28 1
** 2x Intel E5-2680v4 CPUs
29 13
** -128- 256 GB DDR4 2400
30 3
** 24x 1 TB mSATA PM-851 
31
** Dell HBA H330
32
** LSI SAS 9300-8E 8-Port 12Gb/s 12Gbps External HBA Controller Bus Card
33
* Netapp DS2246 Storage Expansion Array 24 Bay 2.5" SAS Trays 2x IOM6 Controllers
34
** 24x 1 TB mSATA PM-851
35
36
Total raw storage capacity: 44 TB
37
Total usable storage capacity (RAID-6): 42.84 TB
38
39
h3. Price Breakdown
40
41
Components purchased from e-Bay.
42
43
|=. *Component* |=. *Description* |=. *Price* |
44
|Dell r730xd server|2x Intel E5-2680v4 CPUs; 128 GB DDR4|$413.39|
45
|24x 2.5" 8FKXC/08FKXC| SAS SATA Drive Caddy For Dell PowerEdge|$88.79|
46
|Dell TRJ5G |Optical SATA power cable SFF R730|$13.73|
47
|Dell 0P2R3R|HBA H330 12gbps SAS SATA Mini Mono|$15.90|
48
|LSI SAS 9300-8E|8-Port 12Gb/s 12Gbps External HBA Controller Bus Card|$37.09|
49
|Netapp DS2246|Storage Expansion Array 24 Bay 2.5" SAS Trays 2x IOM6 Controllers|$149.94|
50 1
|2x External SAS Cable|SFF-8436 QSFP to SFF-8644 HD Hybrid SAS Cable 1.64 ft.|$41.54|
51 13
|128 GB DDR4-2400|RAM|$117.78|
52 3
53
Total price: $797.47 (mSATA drives and adapter cards salvaged)
54 4
55
h2. Network Interfaces
56
57
|*Interface*    | *MAC*                | *Reserved IP*  | *Notes*  |
58
|eno1             |c8:1f:66:dd:6a:24|192.168.8.10    |primary gigabit interface|
59
|eno2             |c8:1f:66:dd:6a:25|--                       |secondary gigabit (unused)|
60
|eno3             |c8:1f:66:dd:6a:26|--                       |third gigabit interface (unused)|
61
|eno4             |c8:1f:66:dd:6a:27|--                       |fourth gigabit interface (unused)|
62
|enp132s0     |24:8a:07:e3:14:80|--                      |10G fiber interface (unused)|
63
|enp132s0d1 |24:8a:07:e3:14:81|10.250.1.6       |10G fiber interface|
64
|ipmi               |18:66:da:a2:a0:3b|192.168.208.4|IPMI interface|
65
66
Note: 10G interface provided by Mellanox 10G PCIe card.
67 5
68
h2. Storage Configuration
69
70
The r730xd has 24x 1TB drives and the attached Netapp shelf has an additional 24x 1TB drives connected via the LSI SAS 9300-8E card for a total of 44 TB.  T
71
72
* Script to partition each device (add additional drives to the list to partition more)
73
<pre>
74
for device in sdar; do echo $device; parted --script /dev/$device \
75
    mklabel gpt \
76
    mkpart primary 0% 100%; done
77
</pre>
78
* Command to create the RAID-6 array (Note: do not copy verbatim as the device names may change):
79
<pre>
80
$ sudo mdadm --create --verbose /dev/md0 --level=6 --raid-devices=48 /dev/sda1 /dev/sdaa1 /dev/sdab1 /dev/sdad1 /dev/sdae1 /dev/sdaf1 /dev/sdag1 /dev/sdah1 /dev/sdai1 /dev/sdaj1 /dev/sdak1 /dev/sdal1 /dev/sdam1 /dev/sdan1 /dev/sdao1 /dev/sdap1 /dev/sdaq1 /dev/sdar1 /dev/sdas1 /dev/sdat1 /dev/sdau1 /dev/sdav1 /dev/sdaw1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1 /dev/sdm1 /dev/sdn1 /dev/sdo1 /dev/sdp1 /dev/sdq1 /dev/sdr1 /dev/sds1 /dev/sdt1 /dev/sdu1 /dev/sdv1 /dev/sdw1 /dev/sdx1 /dev/sdy1 /dev/sdz1
81
</pre>
82
* The create command above takes a significant amount of time to create a new array (20+ hrs).  Use this command to monitory status:
83
<pre>
84
$ watch cat /proc/mdstat
85
</pre>
86
* The following are miscellaneous mdadm commands for reference:
87
<pre>
88
$ sudo mdadm --stop /dev/md0
89
$ sudo mdadm --assemble --scan
90
$ sudo mdadm --manage /dev/md0 --add /dev/sdas1
91
</pre>
92
* Use this command to store the array information to the mdadm configuration file:
93
<pre>
94
$ sudo su
95
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
96
# update-initramfs -u
97
</pre>
98 6
99
h2. NFS setup:
100
101
* Install NFS (note be sure to configure the firewall first):
102
<pre>
103
$ sudo apt install nfs-kernel-server
104
</pre>
105
* Edit @/etc/exports@:
106
<pre>
107
/storage    192.168.8.0/24(rw,nohide,insecure,no_subtree_check,async)
108
/storage    192.168.4.0/24(rw,nohide,insecure,no_subtree_check,async)
109
110
/storage    10.250.1.0/24(rw,nohide,insecure,no_subtree_check,async)
111
</pre>
112
* Restart NFS:
113
<pre>
114
$ sudo systemctl restart nfs-kernel-server
115
</pre>
116
* Export filesystems:
117
<pre>
118
$ sudo exportfs
119
</pre>
120
121
h2. Firewall Configuration
122
123
|*Port*|*Description*|
124
|22|ssh|
125
|80|http|
126
|111|SUN rpc|
127
|443|https|
128
|2049|NFS|
129
|3142|apt-cacher-ng|
130
|4045|lockd|
131
|17641|NFS connect|
132
|61993|bt|
133
134
It was a bit annoying to get NFS working when the firewall was enabled but I found some good instructions and got them to work.  The issue was that some of the important rpc/NFS daemons use random ports when they boot up.
135
136
* Edit @/etc/default/nfs-kernel-server@ comment out this line:
137
<pre>
138
RPCMOUNTDOPTS=--manage-gids
139
</pre>
140
 add this line
141
<pre>
142
RPCMOUNTDOPTS="--port 17641"
143
</pre>
144
* Edit/create @/etc/modprobe.d/options.conf@:
145
<pre>
146
options lockd nlm_udpport=4045 nlm_tcpport=4045
147
</pre>
148
* Edit @/etc/modules@ and add @lockd@ on its own line:
149
<pre>
150
...
151
lockd
152
</pre>
153
* Now create the firewall rules (only allow incoming access for the local network), for each port in the table above:
154
<pre>
155
$ sudo ufw allow from 192.168.8.0/24 to any port <PORT>
156
</pre>
157
* Add external allow rules (i.e. up these ports to the outside world) for ssh, https, and bt :
158
<pre>
159
$ sudo ufw allow <PORT>
160
</pre>
161
* Start ufw:
162
<pre>
163
$ sudo ufw enable
164
</pre>
165
Overview of added rules:
166
<pre>
167
sudo ufw allow proto tcp to 0.0.0.0/0 port 22
168
sudo ufw allow proto tcp to 0.0.0.0/0 port 443
169
sudo ufw allow proto tcp to 0.0.0.0/0 port 61993
170
171
sudo ufw allow from 192.168.4.0/24 to any port 111
172
sudo ufw allow from 192.168.4.0/24 to any port 2049
173
sudo ufw allow from 192.168.4.0/24 to any port 4045
174
sudo ufw allow from 192.168.4.0/24 to any port 17641
175
176
sudo ufw allow from 192.168.8.0/24 to any port 111
177
sudo ufw allow from 192.168.8.0/24 to any port 2049
178
sudo ufw allow from 192.168.8.0/24 to any port 4045
179
sudo ufw allow from 192.168.8.0/24 to any port 17641
180
181
sudo ufw allow from 10.250.1.0/24 to any port 111
182
sudo ufw allow from 10.250.1.0/24 to any port 2049
183
sudo ufw allow from 10.250.1.0/24 to any port 4045
184
sudo ufw allow from 10.250.1.0/24 to any port 17641
185
</pre>
186 7
187
h2. Apache
188
189 8
The Apache config (see repo) is the really important part here. Below is a section on each application that's running on/from Apache.  I am using https with a permanent redirect from port 80 along with a Let's Encrypt provided SSL/TLS certificate.  Most of the sections below are password protected using mod_auth_digest.  The appropriate digest file is created and managed with the "htdigest":http://httpd.apache.org/docs/2.2/programs/htdigest.html tool. *NOTE:* make sure the password digest file (e.g. @/home/dsorber/web_users@) is owned by @www-data:www-data@ and permissions are set to @600@.
190 7
191
* Install apache2 itself:
192
<pre>
193
$ sudo apt install apache2
194
</pre>
195
* Enable apache modules:
196
<pre>
197
$ sudo a2enmod ssl proxy proxy_http auth_digest
198
</pre>
199
* Copy backed up apache configs to their location:
200
<pre>
201
$ sudo cp apache_configs/* /etc/apache2/sites-available/
202
</pre>
203 1
* Turn on main site (also disable default apache2 site):
204
<pre>
205
$ sudo a2ensite main
206
</pre>
207
208 11
h3. Dynamic DNS
209
210 12
Free Dynamic DNS is provided by "Dynu":https://www.dynu.com/en-US/
211 11
212
* Install @ddclient@
213
<pre>
214
$ sudo apt install ddclient
215
</pre>
216
* Edit @/etc/ddclient@:
217
<pre>
218
daemon=60                                                    # Check every 60 seconds.
219
syslog=yes                                                   # Log update msgs to syslog.
220
mail=root                                                    # Mail all msgs to root.
221
mail-failure=root                                            # Mail failed update msgs to root.
222
pid=/var/run/ddclient.pid                                    # Record PID in file.
223
use=web, web=checkip.dynu.com/, web-skip='IP Address'        # Get ip from server.
224
server=api.dynu.com                                          # IP update server.
225
protocol=dyndns2
226
login=baranovich                                             # Your username
227
password=PASSWORD_GOES_HERE                                  # Your password or MD5/SHA256 hash of password
228
brutus.gleeze.com                                            # Update IP address for alias of your domain name       
229
</pre>
230
* Restart @ddclient@:
231
<pre>
232
$ sudo systemctl restart ddclient
233
</pre>
234
235 8
h3. Let's Encrypt Setup
236 1
237 8
* Install @cerbot@ in a VirtualEnv and create a link
238
<pre>
239
$ sudo apt install python3.12-venv
240
$ sudo python3 -m venv /opt/certbot
241
$ sudo /opt/certbot/bin/pip install --upgrade pip
242
$ sudo /opt/certbot/bin/pip install certbot
243
$ sudo /opt/certbot/bin/pip install certbot-dns-dynu
244
$ sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
245
</pre>
246
* Create @dynu-credentials.ini@ see below for instructions for getting token
247
<pre>
248
dns_dynu_auth_token = [REDACTED]
249
</pre>
250
* Run @certbot@
251
<pre>
252
$ sudo certbot --authenticator dns-dynu --dns-dynu-credentials ./dynu-credentials.ini certonly
253
</pre>
254
* Update Apache configuration @main.conf@
255
* Add cronjob for automated renewal:
256
<pre>
257
$ echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
258
</pre>
259 7
260 9
*Resources*
261
* https://www.dynu.com/Resources/Tutorials/DynamicDNS/Advancedfeatures/Lets-Encrypt
262
* https://certbot.eff.org/instructions?ws=other&os=pip
263
* https://community.letsencrypt.org/t/apache-configuration-example/2338
264
265 8
h3. Transmission
266 7
267 8
I use "Transmission":http://www.transmissionbt.com/ to download Linux .isos ( _wink_ ) and give back to the community by sharing them using my own bandwidth. Transmission with its webui runs as a separate daemon so apache is configured to act as reverse proxy.
268
269 7
* Install transmission daemon:
270
<pre>
271
$ sudo apt install transmission-daemon
272
</pre>
273
* Copy over configuration:
274
<pre>
275
$ sudo systemctl stop transmission-daemon.service
276
$ sudo cp settings.json /etc/transmission-daemon
277
$ sudo systemctl start transmission-daemon.service
278
</pre>
279
* Make sure the user digest file is in place (NOTE: be sure to change use directory permissions to 755 or Apache will not be able to read the web_users file):
280
<pre>
281
$ cd /home/dsorber
282
$ cp web_users .
283
$ cd /home
284
$ sudo chmod 755 dsorber
285
</pre>
286
* Enable site:
287
<pre>
288
$ sudo a2ensite transmission
289 1
</pre>
290
291
h3. Redmine + Git
292 7
293
Unfortunately Trac completely stagnated and never completed moving to Python 3. Therefore I switched to Redmine + Git which (at least as of now) is still maintained.  Note the following uses PostgresQL for the backend database (which is also used for nextcloud).
294
295
# Install prereqs:
296
<pre>
297
 $ sudo apt install apache2 pbzip2 zip unzip postgresql libpq-dev build-essential ruby ruby-dev
298
</pre>
299
# Download Redmine:
300
<pre>
301
$ cd /srv/
302 8
$ sudo wget https://www.redmine.org/releases/redmine-5.1.4.tar.gz
303
$ sudo tar xf redmine-5.1.4.tar.gz
304
$ sudo mv redmine-5.1.4 redmine
305 7
$ sudo chown -R root:root redmine
306
</pre>
307
# Setup postgres database for Redmine:
308
<pre>
309
$ sudo -u postgres psql postgres
310
> CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'password_goes_here' NOINHERIT VALID UNTIL 'infinity';
311
> CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
312
Ctrl+D
313
</pre>
314
# Create database config
315
<pre>
316
$ cd /srv/redmine/config
317
$ sudo cp database.yml.example database.yml
318
</pre>
319
** Edit @database.yml@:
320
<pre>
321
production:
322
  adapter: postgresql
323
  database: redmine
324
  host: localhost
325
  username: redmine
326
  password: "PASSWORD_GOES_HERE"
327
328
# PostgreSQL configuration example
329
#production:
330
#  adapter: postgresql
331
#  database: redmine
332
#  host: localhost
333
#  username: postgres
334
#  password: "postgres"
335
336
# SQLite3 configuration example
337
#production:
338
#  adapter: sqlite3
339
#  database: db/redmine.sqlite3
340
341
# SQL Server configuration example
342
#production:
343
#  adapter: sqlserver
344
#  database: redmine
345
#  host: localhost
346
#  username: jenkins
347
#  password: jenkins
348
</pre>
349
# Install bundle and dependencies:
350
<pre>
351
$ sudo gem install bundler
352
$ cd /srv/redmine
353
$ sudo bundle config set --local without 'development test'
354
$ sudo bundle install 
355
</pre>
356
# Configure Redmine database:
357
<pre>
358
$ sudo rake generate_secret_token
359
$ sudo RAILS_ENV=production rake db:migrate
360
$ sudo RAILS_ENV=production rake redmine:load_default_data
361
</pre>
362
# Configure permissions:
363
<pre>
364
$ sudo chown -R www-data:www-data files log tmp public/plugin_assets
365
$ sudo chmod -R 755 files log tmp public/plugin_assets
366
</pre>
367
# Setup webserver:
368
<pre>
369
$ sudo chown www-data:www-data /srv/redmine/config/environment.rb
370
$ sudo ln -s /srv/redmine/public /var/www/redmine
371
</pre>
372
# Install Passenger:
373
<pre>
374
$ sudo apt install libcurl4-openssl-dev libssl-dev apache2-dev libapr1-dev libaprutil1-dev zlib1g-dev
375
</pre>
376
** Create file @Gemfile.local@:
377
<pre>
378
gem 'passenger'
379
</pre>
380
** Continue with install:
381
<pre>
382
$ sudo bundle install
383
$ sudo passenger-install-apache2-module (follow instructions)
384
$ sudo vim /etc/apache2/mods-available/passenger.load
385
-------------------------------------------------------------------------------
386
LoadModule passenger_module /var/lib/gems/3.0.0/gems/passenger-6.0.14/buildout/apache2/mod_passenger.so
387
-------------------------------------------------------------------------------
388
389
$ sudo vim /etc/apache2/mods-available/passenger.conf
390
-------------------------------------------------------------------------------
391
  <IfModule mod_passenger.c>
392
     PassengerRoot /var/lib/gems/3.0.0/gems/passenger-6.0.14
393
     PassengerDefaultRuby /usr/bin/ruby3.0
394
   </IfModule>
395
-------------------------------------------------------------------------------
396
397
$ sudo a2enmod passenger
398
$ sudo systemctl restart apache2
399
</pre>
400
# Setup Apache config. Note the Redmine section is now included in @main.conf@ and should be commented out until this step is reached.
401
# Install theme(s):
402
<pre>
403
$ cd /srv/redmine/public/themes
404
$ git clone https://github.com/koppen/redmine-pepper-theme.git
405
$ git clone https://github.com/makotokw/redmine-theme-gitmike
406
</pre>
407
408
h3. Redmine Backup
409
410
There are two items that need to be backed up, the database and any attached files:
411
412
* Backup:
413
<pre>
414
$ /usr/bin/pg_dump -U redmine -h localhost -Fc --file=redmine.sqlc redmine
415
416
$ cd /srv/redmine/
417
$ tar cjf redmine_files.tar.bz2 files
418
</pre>
419
420
* Restore:
421
<pre>
422
$ pg_restore -U redmine -h localhost -d redmine redmine.sqlc
423
424
$ tar xf redmine_files.tar.bz2
425
$ sudo cp -r files/ /srv/redmine/files
426
</pre>
427
428
h3. Git Integration
429
430
# Install prereqs:
431
<pre>
432
$ sudo apt install libapache2-mod-perl2 libdbi-perl libdbd-pg-perl
433
</pre>
434
# Configure:
435
<pre>
436
$ sudo ln -s /srv/redmine/extra/svn/Redmine.pm /usr/lib/x86_64-linux-gnu/perl5/5.34/Apache2/Redmine.pm
437
$ sudo a2enmod perl dav dav_fs
438
</pre>
439
# Setup git repo. Note if using an existing repo then just copy it into path: @/srv/git@
440
<pre>
441
$ sudo mkdir -p /srv/git
442
$ cd /srv
443
$ sudo chown -R dsorber:dsorber git
444
(optional used to test below)
445
$ cd git 
446
$ mkdir test; cd test
447
 $ git init --bare
448
</pre>
449
# Setup grack:
450
<pre>
451
$ cd /var/www
452
$ sudo git clone https://github.com/grackorg/grack.git
453
$ sudo vim grack/config.ru
454
-------------------------------------------------------------------------------
455
require 'grack/app'
456
require 'grack/git_adapter'
457
458
config = {
459
  :root => '/srv/git',
460
  :allow_push => true,
461
  :allow_pull => true,
462 1
  :git_adapter_factory => ->{ Grack::GitAdapter.new }
463 7
}
464
465
run Grack::App.new(config)
466
467
-------------------------------------------------------------------------------
468
469
$ sudo chown -R www-data:www-data grack
470
$ cd /var/www/grack
471
$ sudo mkdir public
472
$ sudo mkdir tmp
473
$ sudo chown -R www-data:www-data .
474
$ sudo bundle install
475
</pre>
476 8
# Configure apache. Note the git section is now included in @main.conf@ and should be commented out until this step is reached.
477 7
<pre>
478
$ sudo a2ensite git 
479
$ sudo systemctl restart apache2
480
</pre>
481
482
h3. Nextcloud
483
484
"Nextcloud":https://nextcloud.com/|Nextcloud is a self-hosted "cloud". It allows easy file viewing and sharing as well as CardDav and CalDav servers:
485
486
# Install prereqs:
487
<pre>
488
$ sudo apt install apache2 libapache2-mod-php php-gd php-pgsql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip
489
</pre>
490 1
# Download and move into place:
491 7
<pre>
492
$ wget https://download.nextcloud.com/server/releases/latest.tar.bz2
493
$ tar xf latest.tar.bz2
494
$ sudo mv nextcloud /var/www/nextcloud
495
$ cd /var/www
496
$ sudo chown -R www-data:www-data nextcloud
497
</pre>
498
# Config database (use postgresql; same as redmine):
499
<pre>
500
$ sudo -u postgres psql postgres
501 1
> CREATE ROLE nextcloud LOGIN ENCRYPTED PASSWORD 'password_goes_here' NOINHERIT VALID UNTIL 'infinity';
502 7
> CREATE DATABASE nextcloud WITH ENCODING='UTF8' OWNER=nextcloud;
503
Ctrl+D
504
</pre>
505 8
# Setup Apache config. Note the Nextcloud section is now included in @main.conf@ and should be commented out until this step is reached.
506 7
<pre>
507
$ sudo a2enmod rewrite headers env dir mime
508
$ sudo vim /etc/apache2/envvars
509
-------------------------------------------------------------------------------
510
## Uncomment the following line to use the system default locale instead:
511
512
. /etc/default/local here
513
-------------------------------------------------------------------------------
514
515
$ sudo systemctl restart apache2
516
</pre>
517 8
# Complete configuration by navigating to https://brutus.gleeze.com/nextcloud in a web browser and following the instructions.
518 7
519
h4. Other configuration
520
521
* To setup local storage: go to Apps > Disabled Apps > External Storage (click Enable)
522
* To setup pretty URLS:
523
 * https://docs.nextcloud.com/server/13/admin_manual/installation/source_installation.html#pretty-urls
524
** Edit @/var/www/nextcloud/config/config.php@:
525
<pre>
526
  'htaccess.RewriteBase' => '/nextcloud',
527
  'default_phone_region' => 'US',
528
  'maintenance_window_start' => 1,
529
</pre>
530
**  Edit @/etc/php/8.3/apache2/php.ini@ change line to:
531
<pre>
532
memory_limit = 1024M
533
opcache.interned_strings_buffer=64
534
opcache.revalidate_freq=60
535
</pre>
536
** Add missing indices:
537
<pre>
538
$ cd /var/www/nextcloud
539
$ sudo -u www-data php occ db:add-missing-indice
540
</pre>
541
** Restart apache:
542
<pre>
543
$ sudo systemctl restart apache2 
544
</pre>
545 10
546
h2. Misc
547
548
* Setup the display script:
549
 * Edit @~/.profile@ and add @./repo/software/misc/display.py@
550
* Setup checker script:
551
 * 
552
<pre>
553
$ sudo su
554
# crontab -e
555
</pre>
556
 add this line:
557
<pre>
558
0 * * * *       /home/dsorber/repo/software/misc/checker.py
559
</pre>