HL8 Homelab Server User Manual
HL8 Homelab Server User Manual
USER MANUAL
REVISION DETAILS
Version Description
Contents
2
Version -1.1
REVISION DETAILS........................................................................................................................................2
GETTING STARTED.......................................................................................................................................8
ABOUT US................................................................................................................................................8
WHY 45HOMELAB HL8.............................................................................................................................8
HARDWARE..................................................................................................................................................9
COMPONENTS AND SPECIFICATIONS.......................................................................................................9
INITIAL SETUP............................................................................................................................................11
INSERTING THE STORAGE DRIVES..........................................................................................................11
CABLE SETUP..........................................................................................................................................12
Power requirements..........................................................................................................................13
45HOMELAB HL 8 INITIAL CABLING SETUP DIAGRAM...........................................................................14
INITIAL CONFIGURATION /SETUP...............................................................................................................15
NETWORK SETUP...................................................................................................................................15
USING THE DESKTOP UI.....................................................................................................................15
SETTING THE NETWORKING USING NMTUI...........................................................................................19
Setting Static IP..................................................................................................................................20
Setting a Bond....................................................................................................................................23
HOUSTON LOGIN AND CONFIG..................................................................................................................28
CREATING ZPOOL...................................................................................................................................29
CREATING ZFS FILESYSTEM/DATASET.....................................................................................................30
CREATING YOUR SHARES........................................................................................................................32
Samba/SMB shares............................................................................................................................32
Setting up Local User Access SMB Shares..............................................................................................36
Set SMB permissions using local users and group..............................................................................40
Connecting to SMB Share on Windows and MacOS..............................................................................42
Connecting to SMB Share on Windows..............................................................................................42
Connecting to SMB Share on MacOS.................................................................................................44
Managing NFS in Houston UI.................................................................................................................46
Mounting NFS Share to Linux Client.......................................................................................................49
Add Mount on Reboot.......................................................................................................................49
Verify Share Mounted........................................................................................................................50
Verify Mount on Reboot....................................................................................................................50
SETUP ISCSI STORAGE............................................................................................................................52
3
Version -1.1
Configuring iSCSI Target.....................................................................................................................52
Create an iSCSI Target........................................................................................................................53
Create iSCSI LUNs...............................................................................................................................54
Configure ACL (Initiator IQN).............................................................................................................54
Configure Authentication...................................................................................................................54
Exit and Save the Configuration.........................................................................................................55
Open Firewall for iSCSI and enable the iSCSI service.........................................................................55
Verification /Connecting to the LUN......................................................................................................56
AUTOMATED ZFS REPLICATION/SNAPSHOTS IN HOUSTON UI...............................................................59
SOFTWARE.................................................................................................................................................62
PORTAINER.............................................................................................................................................62
NEXTCLOUD AND NPM ON PORTAINER.................................................................................................65
INSTALLING NGINX PROXY MANAGER(NPM) ON PORTAINER................................................................68
CONFIGURING PLEX PORTAINER............................................................................................................72
IMMICH - self-hosted backup solution for photos and videos...............................................................82
Uploading Pictures.............................................................................................................................87
Explore Tab........................................................................................................................................87
Map Tab.................................................................................................................................................87
Sharing Tab........................................................................................................................................87
Library................................................................................................................................................88
Mobile App........................................................................................................................................88
Administration...................................................................................................................................88
Server Status......................................................................................................................................90
CLI Commands...................................................................................................................................90
HOME ASSISTANT...................................................................................................................................91
Method 1 - Portainer deployment.....................................................................................................91
Method 2 - Deploying in Rocky Terminal...........................................................................................92
WIREGUARD - fast, modern, and secure VPN tunnel.............................................................................93
FRIGATE - open-source NVR built around real-time AI...........................................................................95
Explanation of [Link]..................................................................................................96
[Link]..........................................................................................................................................97
Why is this file needed?.....................................................................................................................99
TROUBLESHOOTING...................................................................................................................................99
4
Version -1.1
HL8 WONT POWER ON..........................................................................................................................99
HOUSTON UI IS NOT ACCESSIBLE...........................................................................................................99
DRIVES ARE MISSING IN MY ZPOOL.....................................................................................................100
ZPOOL IS IN A DEGRADED STATE..........................................................................................................100
SAMBA SHARES ARE NOT ACCESSIBLE TO MOUNT..............................................................................101
GETTING ACCESS DENIED WHEN ACCESSING THE FILES IN THE SHARE...............................................101
HOW DO I UPDATE MY HL8..................................................................................................................101
45DRIVES DISK MODULE IS NOT WORKING.........................................................................................102
SYSTEM WOULD NOT BOOT INTO THE OS...........................................................................................102
REVISION DETAILS
GETTING STARTED
ABOUT US
WHY 45HOMELAB HL8
HARDWARE
COMPONENTS AND SPECIFICATIONS
INITIAL SETUP
UNBOXING THE HL8
INSERTING THE STORAGE DRIVES
CABLE SETUP
Power requirements
45HOMELAB HL 8 INITIAL CABLING SETUP DIAGRAM
INITIAL CONFIGURATION /SETUP
NETWORK SETUP
USING THE DESKTOP UI
SETTING UP IPMI
SETTING THE NETWORKING USING NMTUI
Setting Static IP
Setting a Bond
HOUSTON LOGIN AND CONFIG
CREATING ZPOOL
CREATING ZFS FILESYSTEM/DATASET
CREATING YOUR SHARES
Samba/SMB shares
5
Version -1.1
Setting up Local User Access SMB Shares
Set SMB permissions using local users and group
Connecting to SMB Share on Windows and MacOS
Connecting to SMB Share on Windows
Connecting to SMB Share on MacOS
Managing NFS in Houston UI
Mounting NFS Share to Linux Client
Add Mount on Reboot
Verify Share Mounted
Verify Mount on Reboot
SETUP ISCSI STORAGE
Configuring iSCSI Target
Create an iSCSI Target
Create iSCSI LUNs
Configure ACL (Initiator IQN)
Configure Authentication
Exit and Save the Configuration
Open Firewall for iSCSI and enable the iSCSI service
Verification /Connecting to the LUN
AUTOMATED ZFS REPLICATION/SNAPSHOTS IN HOUSTON UI
SOFTWARE
PORTAINER
NEXTCLOUD AND NPM ON PORTAINER
INSTALLING NGINX PROXY MANAGER(NPM) ON PORTAINER
CONFIGURING PLEX PORTAINER
IMMICH - self-hosted backup solution for photos and videos
Uploading Pictures
Explore Tab
Map Tab
Sharing Tab
Library
Mobile App
Administration
6
Version -1.1
HL8 Status
CLI Commands
HOME ASSISTANT
Method 1 - Portainer deployment
Method 2 - Deploying in Rocky Terminal
WIREGUARD - fast, modern, and secure VPN tunnel
FRIGATE - open-source NVR built around real-time AI
docker-compose
Explanation of [Link]
[Link]
Why is this file needed?
TROUBLESHOOTING
HL8 WONT POWER ON
HOUSTON UI IS NOT ACCESSIBLE
DRIVES ARE MISSING IN MY ZPOOL
ZPOOL IS IN A DEGRADED STATE
SAMBA SHARES ARE NOT ACCESSIBLE TO MOUNT
GETTING ACCESS DENIED WHEN ACCESSING THE FILES IN THE SHARE
HOW DO I UPDATE MY HL8
45DRIVES DISK MODULE IS NOT WORKING s
SYSTEM WOULD NOT BOOT INTO THE OS
7
Version -1.1
GETTING STARTED
ABOUT US
Serving our customers well is at the core of everything we do at 45HomeLab. In an industry where
technical support is strictly timed, automated and impersonal we are real people solving real storage
problems. Our storage solutions are non-proprietary, giving you the freedom to run any software you
choose.
OUR GOAL
Provide you with the best storage solution for your data needs - not the most expensive one. Today we
provide the most affordable storage solutions in the industry.
OUR MISSION
To provide affordable open-source storage solutions while staying true to our community roots by giving
back to the open-source community that we rely on.
OPEN DESIGN
Unlike mainstream data storage providers 45HomeLab maintains an open design and ongoing
relationships with the open-source community.
At 45HomeLab we know home labbers have a strong vision of the infrastructure they want, and how to
build and configure it. A key pillar of a great home lab, is a sufficient storage that is customized and
configured how you need it.
The problem is home storage offerings today are under powered and have locked down software, while
enterprise solutions are just too big and expensive. We understand how frustrating this is, which is why
8
Version -1.1
we’ve created the 45HomeLab product line. It is big, strong, fast, while also being open and flexible so
you can easily modify, upgrade, and repair it, all at a price that makes sense for a power home lab user.
Our new HL8 is an 8-bay server that was designed to provide the power and storage needed for a great
home lab.
HARDWARE
Below are the components that will be in your HL8 if you have not requested for any modification in the
order the below components will be present by default. Your CPU, motherboard, RAM, Boot drives etc.
could change based on your customization.
9
Version -1.1
ID Component Model - specs
1 Backplane HL – 4 Drive PCB Backplane x2
Optional: 1TB/500GB/250GB - Gen 4x4 NVMe
2 Boot Storage M.2
3 Cables miniSAS HD 0.6m
4 Cables MiniSAS SFF-8087 to miniSAS HD SFF-8643 50cm
5 Chassis HL8 Chassis
6 CPU Optional: Ryzen 5 5500GT or Ryzen 7 5700G
NF-A12x15 PWM 120mmx15mm Noctua x2
NF-A4x10 FLX 40mmx10 Noctua x1
7 Fans NH-L9a-AM4 Noctua CPU Cooler
8 Heatsink B8 2U Passive Cooler
9 Motherboard GIGABYTE B550I AORUS PRO AX 1.0
Copper transceiver (Optional with SFP+
11 Networking Motherboard)
12 Networking 2.5 GbE LAN
NVME Riser AOC-SLG3-2M2 – 2 Position M.2 NVMe Add on
13 Card Card (Optional)
FLEX GURU 500W 80 Plus Gold Certified
15 Power Supply Efficiency ≥90%
16 RAM 16GB DDR4 UDIMM
17 RAM 32GB DDR4 UDIMM
18 RAM 64GB DDR4 UDIMM
10
Version -1.1
INITIAL SETUP
Once your unit is unboxed or in its final destination you can now start installing the storage
drives.
It is best practice to install the drives from starting from index 1-1 and sequentially incrementing
in order.
11
Version -1.1
TThe drive should fit snugly into a slot. Make sure the back of the drive is facing the right when
placing in the slot
After all the drives are inserted into the slots, you can close up the unit and move on to hooking
up the needed cables to your unit.
CABLE SETUP
At this point, you should have the unit unboxed and storage drives installed. The next step is to connect
the cables needed to connect and configure the unit.
No Component
1 2.5G port
2 BIOS USB 3.2 slot
3 BIOS Q-Flash Plus button
4 USB slot
5 USB slot
6 USB slot
7 USB slot
8 Type C slot
9 HDMI port
10 HDMI port
11 Display (DP) port
12 WIFI ports
13 MIC audio port
Table: Back panel slot details 14 LINE OUT audio port
15 LINE IN audio port
16 Power cable slot
You can connect a 1GB LAN cable from your router or
switch as per your 17 Power switch network setup. For the initial
connection to your unit, you can plug in the other end of the Ethernet/ LAN cable to provide
internet to the HL8 and where we will be accessing the data from the slot labeled 1 in the back
on the unit.
A HMDI or Display Port monitor will also be connected initially so you can see the see the
desktop/Graphical User Interface screen when the unit first turns on. You can connect the
monitor to the HMDI port (9)/(10) or Display Port (11).
If you want to configure the unit locally, a USB keyboard will also be beneficial. You can use any
of the USB slots labelled from 4 to 7 in fig above.
The last step would be to plug in the power cable. Slot labelled 16.
12
Version -1.1
After that you can turn on the power switch and the press the round blue power button to turn
on.
Power requirements
The PSU we provide with the appropriate options is a FLEX GURU 500W 80 Plus Gold Certified
Efficiency ≥90%
If you are sourcing your own power supply, you can use this as a minimum guideline. It is
especially important to ensure you have at least 20A of 5v power.
In addition, if you plan on using a graphics card, or anything that will increase power draw, you
may require a more powerful supply.
13
Version -1.1
45HOMELAB HL 8 INITIAL CABLING SETUP DIAGRAM
14
Version -1.1
INITIAL CONFIGURATION /SETUP
Now you have your HL8 all powered up and ready to be configured. Before we proceed you need to
have the below steps completed.
NETWORK SETUP
Login to the desktop UI using the 45drives user and 45Dr!ves as the password.
15
Version -1.1
Go to the applications in the top left corner. Go to settings -> Advanced network Configurations
16
Version -1.1
Edit the interface and go to the IPV4 settings section to set the IP. Change the method to manual
for setting the static IP and click on add to enter the IP details.
17
Version -1.1
Once the details have been entered click save
18
Version -1.1
After this you can start setting password for your root user using below command in the terminal and set
the password.
This is just an addition option to set up network other than using the UI. You can ignore this if you have
already set the IP using the UI and move to the Houston login and config section.
You can run “ip -c a” to show your interfaces with colored IP addresses. This helps to distinguish
what you’re looking at.
So, you can see in the above diagram that the interface eno1 has carrier detected which means
there is a LAN cable connected to NIC slot.
Similarly, eno2 has no carrier which means its not connected. If it is connected and still not
detected it will need further troubleshooting.
Once you have your interface connected with the carrier detected next step is to set a static ip for
your HL8.
19
Version -1.1
We will be using this IP going forward to access the HL8.
Setting Static IP
Fig: NMTUI
20
Version -1.1
In case the interface names show up as wired connection 1,2 etc you can select that and confirm
what the actual interface name is by checking device name like below screenshot.
Navigate to IPv4 configuration and change automatic to manual and then click show.
21
Version -1.1
Here we can enter our static IP information. Be sure to remember to add your subnet after your
IP address. (Most common would be /24, which correlates to a subnet mask of [Link]) If
you will be joining a domain, you can set your HL8’s DNS. Click OK. (Even if you aren’t joining a
domain, if you want to be able to resolve internet addresses via names you will need to give a
DNS whether its a public one or an internal one. Because were setting a static IP, if you don’t
include a DNS at all you won’t be able to download packages or anything because it needs DNS.)
22
Version -1.1
You will need to activate that interface .
Deactivate and reactivate the interface. This resets the connection and ensures proper
communication. (If you as SSH’d over the interface that you are working on, deactivating will kick
you out of your SSH session, so you will need to do this when you are physically at the HL8.
Setting a Bond
23
Version -1.1
Enter your Profile name and Device name. For this example, we have used Bond1. Under Slaves,
click Add and select Ethernet.
For this example, we will be using the NIC ports. Enter your interface name under Profile name
and Device, and click OK.
Do the same for ens7f1. Your Slaves table should look like this.
24
Version -1.1
Add your IP address info for your bond, and click OK.
25
Version -1.1
Here we can see our bond has been created.
26
Version -1.1
Click Back, and go to Activate a connection. Highlight Bond1 and Deactivate it.
Now activate it. Make sure the two slave ports are deactivated.
27
Version -1.1
HOUSTON LOGIN AND CONFIG
You should already have the Houston modules installed in your HL8. You can access Houston UI at
[Link] .
If the Houston UI is not loading do check if the cockpit service is running and enable it using below
command
You can check using systemctl status cockpit and if its not active enable it using below commnd
You can use the root account you created and the password or the 45drives user as well to login. Root
account would have the elevated privileges.
28
Version -1.1
CREATING ZPOOL
Once we’re logged into Houston, you should see a list of modules. You will see the ZFS tab. Click
on this to continue.
On the top right of the ZFS page you will notice Storage Pools. Click on this to begin creating your
first storage pool. When we create a pool with ZFS, we select the drives we want to be part of
the pool. In our case all 15 drives
Provide a name for your new storage pool, in this test environment we have named the pool
tank in this example.
Select which raid you would like to use under “Virtual Device “. We usually recommend RAIDZ2
which is equivalent to RAID 6 and has two drive redundancy. You may use RAIDZ1 for 1 drive
redundancy but will not have as much available data to utilize as the system can only hold 8
drives. If this is critical data, we certainly would recommend you going with RAID2.
Then select your hard drives and click on “Create” to finish. Ensure you uncheck Disks WWN, and
then select “Device Alias” so the pool is created with the Disk Aliasing to easily identify drives (i.e
1-1, 1-2, etc.)
We do not recommend setting “refreservation” below 10%. With this disabled we can write to the
29 point the pool may be unusable and data could be lost.
ZFS Pool/Dataset and fill it entirely, at which
Version -1.1
s
With your new storage pool created, we can now create some datasets to share out. You will see
Create Filesystem. Click on this to continue.
30
Version -1.1
In the new window that appears, give your new filesystem a name. We can leave all of the
options at the default settings. In this example, we have used nfs.
If you wish you can change those other parameters as per your preference and even set quota as
well.
Once you click on create you will have your dataset created.
Now you will be able to see your ZFS pool, datasets, and drives within the File Systems Tab, and
Status Tab within the ZFS module.
If you are to run zpool status command within the Terminal you should see the output of the ZFS
Pool, it’s VDEVs, and Disks.
31
Version -1.1
You can create as many datasets you want based on how many shares you are planning to
create.
If you are unable to create the pool, ensure the drives you are using are free of any
partitions.
Ensure the disks you are using to create the pool are of the same size
Once you have your pool and dataset created next step is to create network shares. You can either create
SAMBA/NFS shares.
Samba/SMB shares
In Houston UI, navigate to the File Sharing tab. And click on the Samba tab, if not selected.
32
Version -1.1
First, we can add any options to the Global SMB configuration.
Here we can change the Server Description, the Workgroup, Log Level, and add any additional
parameters to the SMB configuration in the Advanced Settings box by clicking the down arrow.
For example, here we’ve added a few parameters to help with MacOS performance on an SMB
share.
Next, we can create an SMB share, we can scroll down to Shares and select the Plus button to
begin.
Here we can set the SMB Share Name, a Description, the Path to be shared out. It will be
usually /pool_name/dataset_name (you can now create the path here instead of ZFS)
33
Version -1.1
if we are domain joined, we can select to use Windows ACLs.
We can specify any Valid Users and Valid Groups, allow Guest Access, make the SMB share Read
Only, make it Browsable, and enable Windows ACLs, as well as some other options.
We can also add any additional options in the Advanced Settings box via the drop-down arrow.
In the Advanced Settings box, we entered “inherit permissions = yes” ourselves. This is to make
sure that the permissions are inherited from the parent folder.
There are a few preselected options we can enter into the Advanced Settings box by selecting
one of the buttons below: Shadow Copy, MacOS Share, Audit Logs.
Here we can see we’ve created a share called “samba” with a description of “smb-share“. It is
pathed to our ZFS dataset at “/tank/samba“. We have added the “administrator” to Valid Groups,
and left the share Browsable.
34
Version -1.1
If you were to run “testparm -s” on the command line you will see your samba
share has been added and configured properly in its own section.
Verification
35
Version -1.1
Setting up Local User Access SMB Shares
This is to create local users and groups and add them to provide access to your samba share.
Click the ‘Users’ section, this will open a page with a list of users. Select “New User”.
Fill in the Username, Full Name/Description. Then click “Apply”. It is also possible to assign this
new user to a group at the bottom of the prompt. If applicable it can be done here, or a user can
be assigned at a later time.
36
Version -1.1
A prompt will come up to set the users password. This is a local Linux password, it can be used to
SSH into the machine, or to authenticate to Houston.
The user generation will complete successfully. The user should now be able to authenticate to
Houston or SSH with that password.
37
Version -1.1
The below sections will detail assigning a user to a specific group, and setting an SMB password
if applicable.
In the “Users” section the new user should be seen. Click on the user to assign a group.
A dropdown will pop up and you can now select a group to assign to the user.
The newly added group should be displayed under the Groups section. Click “Apply” to save
changes.
38
Version -1.1
Configuring a Samba Password for a User
Select the user you wish to assign a Samba password. The Samba password will need to be set to
allow users to authenticate to Samba shares. It can be the same as the Linux password, but does
not have to be. Click on “Set Samba Password”. Enter a password and click “Apply”.
39
Version -1.1
Set SMB permissions using local users and group
Click on the edit button of the share you want to add the user to grant the permissions.
40
Version -1.1
Select the owner and the group for the share and set the permissions as well as per your
preference.
41
Version -1.1
You can also select valid users and groups if you want to provide access to multiple of them.
In this menu, enter the server IP address in the following format \\SERVER-IP\SHARE-NAME and
select Connect using different credentials.
42
Version -1.1
Enter the login to connect to the SMB share.
43
Version -1.1
Here we can see our SMB share is connected, and we can create a folder.
At the toolbar on the top of the screen, press Go and then “Connect to Server…“.
44
Version -1.1
In the address bar, enter smb://SERVER-IP/SHARE and click Connect. We can also select the plus
at the bottom to save this information if we need to reconnect.
45
Version -1.1
Here we can see our SMB share is connected, and we can create a folder.
46
Version -1.1
We first begin to create our NFS export by selecting the Plus Icon on the right.
We can define the path to be shared out. It would be usually /pool_name/dataset_name
select the range of IPs for client access, and add any additional NFS options to our share.
If we leave Client IP empty, it will default to everyone, and if we leave Options empty, it will
default to ‘rw,sync,no_subtree_check’
Here we create an NFS share, with a path to our NFS dataset at /tank/nfsfs. We have set the
Client IP to be available to 192.168.*.*. For settings you can give
“rw,sync,no_subtree_check,no_root_squash“
47
Version -1.1
If you haven’t opened the firewall ports then follow the below steps
48
Version -1.1
Mounting NFS Share to Linux Client
Here we will discuss on the process of mounting an NFS share to a Linux client and to mount on reboot.
Go the terminal and run the command below to install the nfs package
install nfs-utils
mkdir /mnt/(mount_point)
eg :
Now use this command to mount it to the share. Edit the fields for your specific case, i.e. Server
IP, Pool Name, and Share Name. See example below.
49
Version -1.1
To allow the share to mount on reboot, you will need to edit the fstab. You can use your
preferred text editor, here we have used vim.
vim /etc/fstab
To ensure the share has mounted, you can run the command df.
To ensure the share will mount on reboot after editing the /etc/fstab, unmount the share.
50
Version -1.1
umount /mnt/nfs_share
Remount the share using the following command, this command will mount all shares in the
/etc/fstab file.
mount -a
51
Version -1.1
SETUP ISCSI STORAGE
Install necessary packages for iSCSI
Create a ZFS dataset with your naming scheme of choice, in this case we’ll use “images”.
Multiple iSCSI LUNs can be stored in this singular dataset or new datasets can be created for
each iSCSI LUN.
Before using targetcli, we’ll need to create a sparse image file. Creating large files in targetcli
can be a very time-consuming process.
cd /tank/images
52
Version -1.1
dd if=/dev/zero of=lun0 bs=1 count=0 seek=1T
53
Version -1.1
cd /iscsi
create [Link]:[Link]
cd [Link]:[Link]/tpg1/luns
create /backstores/fileio/lun0
When creating the ACL, it needs to be the name of the initiator IQN name of the client that
will be connecting to the LUN.
In this example, the IQN name of the client will be “[Link]:client”
Configure Authentication
We’ll need to configure the userid and password when connecting to the LUN from the client.
This step is optional.
Choose any name and password for userid and password
54
Version -1.1
Exit and Save the Configuration
In the Houston UI, navigate to Networking > Firewall > Edit Zones and Rules
Add “iscsi-target” to the services
In the Houston service tab, search for “target” and enable the Targetcli daemon
55
Version -1.1
Verification /Connecting to the LUN
56
Version -1.1
Click ‘quick connect’
57
Version -1.1
In Disk Management, there should now be a new disk that is unallocated and ready for
formatting.
58
Version -1.1
AUTOMATED ZFS REPLICATION/SNAPSHOTS IN HOUSTON UI
Make sure to install mbuffer and remove the old auto snapshot service on all Storinators you
wish to use snapshots to use with znapzend.
59
Version -1.1
Select the Dataset you wish to backup. Click the drop down on the left and select “Configure
Replication Task
The screenshot below details a task that takes a snapshot once daily, and retains the snapshots
for 1 month. This can be customized to your use case.
Also, you can add multiple rules by clicking the +, for example setup below is for every hour for 7
days, every 4 hours for 30 days, and every 90 days for a year.
60
Version -1.1
Make sure to restart the ‘znapzend’ service after any change has been
made to snapshot tasks
To ensure the snapshots are being created you can go to the Snapshots section of the ZFS to see
all snapshots that were created.
61
Version -1.1
SOFTWARE
45HomeLab comes with Rocky as the default OS and Houston UI for the server management. Apart from
that you can install other software stacks as well as per your preference. We have included some of them
for your reference.
PORTAINER
With the help of Portainer, you can easily interact with containerized programs, monitor your Docker
installation, and set up new stacks. To centralize your container administration around a single
application, a single Portainer instance may link to numerous Docker hosts.
Make sure docker is installed before you proceed. If not installed you can refer
[Link]
Now you have your portainer ready to deploy other software stacks.
64
Version -1.1
NEXTCLOUD AND NPM ON PORTAINER
You will need portainer to be installed and configured first before installing NextCloud.
In portainer navigate to "Images" and select Build a New Image:
65
Version -1.1
Then click "Build the image", this will start the build process, wait until this completes.
Then navigate to the "Stacks" tab, and click "Add Stack"
Name the stack nextcloud-nginx and paste the following into the text box:
If you already have Nginx Proxy Manager installed remove those NPM sections from the text
below when pasting into the web editor.
66
Version -1.1
Paste the below contents on the web editor. You can copy it from the link below so that .yml file
formatting is not lost [Link]
[Link]
67
Version -1.1
version: "3"
volumes:
nextcloud-data:
nextcloud-db:
npm-data:
npm-ssl:
npm-db:
networks:
frontend:
backend:
services:
nextcloud-app:
image: 45cloud:latest
restart: always
volumes:
- nextcloud-data:/var/www/html
environment:
- MYSQL_PASSWORD=thisisjustatest
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=nextcloud-db
- PHP_UPLOAD_LIMIT=200G
networks:
- frontend
- backend
nextcloud-db:
image: mariadb:10.5
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- nextcloud-db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=thisisjustatest
- MYSQL_PASSWORD=thisisjustatest
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- OVERWRITEPROTOCOL=https
networks:
- backend
npm-app:
image: jc21/nginx-proxy-manager:2.9.19
restart: always
ports:
- "80:80"
- "81:81"
- "443:443"
- "8900:8900"
- "32400:32400"
- "2283:2283"
environment:
- DB_MYSQL_HOST=npm-db
- DB_MYSQL_PORT=3306
- DB_MYSQL_USER=npm
- DB_MYSQL_PASSWORD=thisisjustatest
- DB_MYSQL_NAME=npm
volumes:
- npm-data:/data
- npm-ssl:/etc/letsencrypt 68
networks: Version -1.1
- frontend
- backend
npm-db:
image: jc21/mariadb-aria:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=thisisjustatest
- MYSQL_DATABASE=npm
- MYSQL_USER=npm
- MYSQL_PASSWORD=thisisjustatest
volumes:
- npm-db:/var/lib/mysql
networks:
- backend
69
Version -1.1
INSTALLING NGINX PROXY MANAGER(NPM) ON PORTAINER
If you need NextCloud to be installed as well, please follow the steps on the NextCloud Section that will
handle the deployment of both NextCloud and Nginx proxy manager.
If you have already installed NextCloud using the steps above. You can ignore this separate installation as
Nginx is already installed with NextCloud install above.
If not, below would be the steps to install NPM to set up proxy for custom ports for various applications.
Give a name for your stack. For example, we can give npm.
Paste the below contents on the web editor. You can copy it from the link below so that .yml file
formatting is not lost.
[Link]
70
Version -1.1
version: '3'
volumes:
npm-data:
npm-ssl:
npm-db:
networks:
frontend:
backend:
services:
npm-app:
image: jc21/nginx-proxy-manager:2.9.19
restart: always
ports:
- "80:80"
- "81:81"
- "443:443"
environment:
- DB_MYSQL_HOST=npm-db
- DB_MYSQL_PORT=3306
- DB_MYSQL_USER=npm
- DB_MYSQL_PASSWORD=thisisjustatest
- DB_MYSQL_NAME=npm
volumes:
- npm-data:/data
- npm-ssl:/etc/letsencrypt
networks:
- frontend
- backend
npm-db:
image: jc21/mariadb-aria:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=thisisjustatest
- MYSQL_DATABASE=npm
- MYSQL_USER=npm
- MYSQL_PASSWORD=thisisjustatest
volumes:
- npm-db:/var/lib/mysql
networks:
- backend
After that click on deploy stack and wait for the deployment to be completed.
71
Version -1.1
Nginx Proxy Managers webUI will be available at port :81 [Link] with
admin@[Link] and changeme credentials.
72
Version -1.1
CONFIGURING PLEX PORTAINER
73
Version -1.1
Under volumes click on map additional volume and create a volume with container path of
/config to the volume you created in step 1
Click on map additional volume and create a second bind volume with container path to /media.
This name can change to whatever and bind it to the host path that they want to store media
such as a zpool, etc. (here we can used our path in the zpool where our storage is).
74
Version -1.1
Under ENV click on add environment variable and throw in PGID 1000 and PUID 1000. Here 1000
is the ID of the user that we are given ownership of the content, so add the ID accordingly.
You should be able to see that the container is deployed and running.
75
Version -1.1
Nginx Proxy Managers web UI will be available at port :81 with admin@[Link] and
‘change me’ credentials.
When creating your proxy host use the name of the container found in the containers tab of
portainer.
Create a proxy host with domain name IP:PORT or DNS name if they are port forwarding or have
a hostname select scheme (http/https), forward hostname is the name of the container and
forward port by default would be 32400. Then under advanced custom nginx config put in "listen
32400;"
Click on proxy hosts
76
Version -1.1
In the advanced give the below and save
77
Version -1.1
78
Version -1.1
After that you can set up the library as per your wish
79
Version -1.1
Click on add libraries
You can select the library type and then select the media folder that we had linked to our storage
in HL8
80
Version -1.1
After that select the folder, we are selecting media as we had given that during our container
creation.
81
Version -1.1
Then you can scan the library for the existing files
You will be able to see the videos that are there in your server in the dataset or path you had
given.
82
Version -1.1
IMMICH - self-hosted backup solution for photos and videos
version: "3.8"
services:
immich-server:
container_name: immich_server
image: [Link]/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
env_file:
83
Version -1.1
- [Link]
depends_on:
- redis
- database
- typesense
restart: always
immich-microservices:
container_name: immich_microservices
image: [Link]/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: [Link]
# service: hwaccel
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
env_file:
- [Link]
depends_on:
- redis
- database
- typesense
restart: always
immich-machine-learning:
container_name: immich_machine_learning
image: [Link]/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- model-cache:/cache
env_file:
- [Link]
84
Version -1.1
restart: always
immich-web:
container_name: immich_web
image: [Link]/immich-app/immich-web:${IMMICH_VERSION:-release}
env_file:
- [Link]
restart: always
typesense:
container_name: immich_typesense
image:
typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259
d4dd
environment:
- TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
- TYPESENSE_DATA_DIR=/data
- GLOG_minloglevel=1
volumes:
- tsdata:/data
restart: always
redis:
container_name: immich_redis
image: redis:6.2-
alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
restart: always
database:
container_name: immich_postgres
image: postgres:14-
alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441
env_file:
- [Link]
85
Version -1.1
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
immich-proxy:
container_name: immich_proxy
image: [Link]/immich-app/immich-proxy:${IMMICH_VERSION:-release}
environment:
# Make sure these values get passed through from the env file
- IMMICH_SERVER_URL
- IMMICH_WEB_URL
ports:
- 2283:8080
depends_on:
- immich-server
- immich-web
restart: always
volumes:
pgdata:
model-cache:
tsdata:
86
Version -1.1
Copy the content of the [Link] from below and paste into the editor. (github repo -
[Link] )
# You can find documentation for all the supported env variables at
[Link]
UPLOAD_LOCATION=./library
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secrets for postgres and typesense. You should change these to random passwords
TYPESENSE_API_KEY=some-random-text
DB_PASSWORD=postgres
###################################################################################
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich_redis
Post installation you can you can use the guide below to set up
[Link]
87
Version -1.1
Immich user guide
Uploading Pictures
On the main home page, you'll see a noticeable box labeled "CLICK TO UPLOAD YOUR FIRST
PHOTO." Click on it to begin the upload process.
If you already have pictures uploaded, simply click the "Upload" option located in the top-right
corner of the screen. This will allow you to select images, videos, or other media from your local
computer. **YOU MUST BE IN THE PHOTOS TAB FOR THE UPLOAD BUTTON TO APPEAR**
Explore Tab
Within the Explore tab, you have access to a range of tools that make searching and viewing your
photos a breeze. Leveraging the capabilities of ChatGPT, facial recognition, and geolocation
technology, finding your pictures has never been more convenient.
You can also narrow down your search by categories such as Favorites, Recently Added, Videos,
Motion Pictures, and Panorama Photos, making it
Map Tab
In the Map tab, you can harness the geolocation data of your photos to visualize them on a
world map. This feature allows you to see exactly where each of your photos was taken,
providing a unique and interactive way to explore your memories.
Inside Map Settings, you have the capability to adjust the map's visual mode (dark or light),
decide whether to display only your favorite photos on the map, and specify a date range for the
displayed photos. These options enable you to tailor your map experience to your preferences.
Sharing Tab
Within the Sharing tab, you have the capability to create shared albums with other IMMICH
members or share album links with individuals who don't have IMMICH accounts. This feature
simplifies the process of sharing your albums with others, regardless if they use IMMICH or not.
88
Version -1.1
Library
Favorites Tab
In the Favorites tab, you can conveniently locate all the photos you've marked as your favorites.
This tab serves as a dedicated space where your cherished photos are readily accessible.
Albums Tab
In the Albums tab, you can seamlessly create and organize photos into distinct albums. This
feature allows you to categorize your photos and easily access them based on the specific
albums they belong to.
Archive Tab
In the Albums tab serves as a storage space for your photos, keeping them separate from the
main photo view. This feature is useful for safely tucking away photos that you may not want
readily accessible or visible in the main photos tab or to other users.
Mobile App
Settings
In the Albums tab serves as a storage space for your photos, keeping them separate from the main photo
view. This feature is useful for safely tucking away photos that you may not want readily accessible or
visible in the main photos tab
Administration
When logged into IMMICH as an administrative account in the WebUI, you will notice an
"Administration" button located in the top-left corner. Clicking this button will navigate you to the
administration window, where you can access and configure all the administrative settings for IMMICH.
Users
Within the "User" tab, you have the ability to both view existing users and manage them by adding or
removing users as needed. To make changes to a user's settings, simply locate the user and click on the
blue pencil icon situated to the right of their entry. This enables you to edit various aspects of their
profile, such as their email address, name, storage label, external path, and even reset their password.
Furthermore, each user account has its dedicated personal settings accessible by clicking on your name
or icon located in the top right corner. Within this section, you can perform various actions, including
89
Version -1.1
managing your account details, handling API keys, authorizing devices, managing memories, overseeing
password settings for your account, and configuring sharing preferences.
Jobs
When in the 'Jobs' tab, you can conveniently monitor all currently active tasks, such as generating
thumbnails, extracting metadata, sidecar metadata, tagging objects, encoding clips, recognizing faces,
transcoding videos, and handling storage template migration jobs, which can be initiated from the
bottom of the page. Furthermore, you have the option to control the concurrency settings by navigating
to the top right corner of the page, where you will find a blue box labeled 'Manage Concurrency”.
Settings
Inside the settings tab, we have a number of options to choose from. Starting with Job Settings - These
settings are the same settings that are found in the jobs tab in the “manage concurrency” button.
Machine Learning – In this section, you can configure Machine Learning settings, including the
option to enable or disable features such as Image Tagging, Smart Search, and Facial
Recognition.
Map Settings – n this section, you have the flexibility to enable or disable the map features, and
you can also modify the tile URL if needed.
OAuth Authentication – In this section, you have the ability to control the login settings using
OAuth. You can manage various parameters such as the Issuer URL, Client ID, Client Secret,
Scope, Storage Label Claim, Button Text, as well as options like Auto Register, Auto Launch, and
Mobile Redirect URL override
Password Authentication – In this section, you can toggle the option to log in using a username
and password, allowing you to either enable or disable this feature.
Storage Template – In this section, you can customize how your images and videos are saved, as
well as configure the desired file structure.
Thumbnail Settings – Here, you have the option to modify the resolution of both small and large
thumbnails, as well as fine-tune the quality percentage. Additionally, there's a setting available
for those who prefer the Wide Gamut display.
Video Transcoding Settings – This tab is for the bit more advanced users. Here we manage the
resolutions and encoding information of the video files. We can find things such as:
Constant Rate Factor (-crf)
Present (-present)
Audio Codec
Video Codec
Target Resolution
Max Bitrate
Threads
Transcode Policy
Tone-Mapping
90
Version -1.1
Two-Pass Encoding
This is also two subdirectories inside the Video Transcoding settings being
Server Status
In the Server Status tab, you can access information like the total number of photos and videos stored,
as well as the amount of storage used. Additionally, you can view detailed user usage data, which
provides insights into the number of photo and video uploads for each individual user.
You can also check the server status, version, and storage usage from any page or tab by looking in the
bottom left corner of the WebUI interface.
CLI Commands
You can find the CLI and bulk upload commands / guides here
[Link]
91
Version -1.1
HOME ASSISTANT
An Open-source home automation that puts local control and privacy first. Powered by a worldwide
community of tinkerers and DIY enthusiasts.
This is the bare minimum to get the container up and running, to access the
1. Go to your portainer UI —> stacks —> “Add Stack” —> Web editor —> Paste your docker-
[Link]
version: "3.9"
services:
homeassistant:
image: homeassistant/home-assistant:stable
container_name: homeassistant
network_mode: host
environment:
- TZ=America/Halifax
volumes:
- /opt/docker/stack/home_assistant/config:/config
restart: unless-stopped
The only things that need to change in this file are the time zone (TZ) and the volume path.
92
Version -1.1
2. Click “Deploy the stack”.
3. Navigate to [Link]
4. Make sure the port is open in firewall.
5. Follow guided Home Assistant Web UI setup.
Create a directory for your Home Assistant configuration, and inside this directory, create a
[Link] file
mkdir -p /opt/docker/stack/home_assistant
cd /opt/docker/stack/home_assistant
vim [Link]
version: "3.9"
services:
homeassistant:
image: homeassistant/home-assistant:stable
container_name: homeassistant
network_mode: host
environment:
- TZ=America/Halifax #Replace with your timezone
volumes:
- /opt/docker/stack/home_assistant/config:/config
restart: unless-stopped
Run Docker Compose from the same directory as your [Link] file:
docker-compose up -d
93
Version -1.1
This command will pull the necessary image and start the container in the background.
Since you're using network_mode: host , you can access the Home Assistant UI by navigating to
[Link] or [Link] if you're on the host machine, replacing <host-ip> with
the actual IP address of your host.
Additional Notes:
Ensure that no other services are using port 8123 on your host.
If you face any issues accessing Home Assistant, consider checking firewall rules or network
policies that might be blocking the port.
version: "3"
services:
wireguard:
image: linuxserver/wireguard:latest
container_name: wireguard
cap_add:
94
Version -1.1
- NET_ADMIN
volumes:
- ./config:/config
ports:
- "5000:5000"
- "51820:51820/udp"
wireguard-ui:
image: ngoduykhanh/wireguard-ui:latest
container_name: wireguard-ui
depends_on:
- wireguard
cap_add:
- NET_ADMIN
network_mode: service:wireguard
environment:
- SENDGRID_API_KEY
- EMAIL_FROM_ADDRESS
- EMAIL_FROM_NAME
- SESSION_SECRET
- WGUI_USERNAME=admin
- WGUI_PASSWORD=kGMrU6S7(+`Ah93ENLK><8
- WG_CONF_TEMPLATE
- WGUI_MANAGE_START=true
- WGUI_MANAGE_RESTART=true
logging:
driver: json-file
options:
max-size: 50m
volumes:
- ./db:/app/db
- ./config:/etc/wireguard
95
Version -1.1
FRIGATE - open-source NVR built around real-time AI
This is the bare minimum to get the container up and running and will need
needs,storage etc.
Environment:
rocky 8
docker files in default location /var/lib/docker
Example containers location & structure
[Link]
version: "3.9"
services:
frigate:
container_name: frigate
image: [Link]/blakeblackshear/frigate:stable
privileged: true # This may not be necessary for all setups
restart: unless-stopped
shm_size: "64mb" # Update for your cameras based on calculation above
ports:
- "5000:5000" # WebUI
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over TCP
- "8555:8555/udp" # WebRTC over UDP
environment:
FRIGATE_RTSP_PASSWORD: "password"
volumes:
- /etc/localtime:/etc/localtime:ro
96
Version -1.1
Explanation of [Link]
1. version: "3.9"
Defines the version of Docker Compose file syntax. 3.9 is a specific version of the
2. services:
2.1 frigate:
Specifies the Docker image to be used for this service, pointing to Frigate’s stable release.
Allows the service to access the host's devices and possibly other privileged
functionalities.
Ensures the container will restart automatically unless explicitly stopped by the user.
Allocates shared memory for the container, useful when your application has specific
memory requirements.
2.7 ports:
2.8 environment:
2.9 volumes:
97
Version -1.1
Mounts host paths or named volumes to paths inside the container.
3. volumes:
3.1 frigate_media:
Additional Notes:
[Link]
The [Link] file is used to specify configuration settings for Frigate. Frigate needs this file to know how
to connect to your cameras, how to process the video streams, how to interact with other services, and
many other settings.
Ensure you have this file created & populated with the correct path in your [Link] before
running the container.
cameras:
front_door: # This is just an example name for your camera
ffmpeg:
inputs:
- path: rtsp://your_camera_ip:554/your_stream_path
roles:
- detect 98
# Other camera settings go here Version -1.1
1. mqtt:
This denotes the configuration section related to MQTT, a lightweight messaging protocol typically used
in IoT setups.
2. enabled: False
This line is configuring whether or not to enable MQTT. Here, it is set to False , meaning MQTT is
disabled.
3. cameras:
This is the start of the section where you define the configurations for each of your cameras.
4. name_of_your_camera:
This is where you name your camera; it is just a placeholder, so you should replace it with a name that
makes sense for your setup (e.g., front_door ).
These lines are defining how Frigate should use FFmpeg to interact with the camera. FFmpeg is a
multimedia framework used to handle video, audio, and other multimedia files and streams. Here, it is
specified to use the camera for detection purposes.
8. inputs:
This denotes the start of a list of input streams from the camera that Frigate should use.
9. path: rtsp://IP_OF_CAMERA:554/rtsp
This line is specifying the RTSP (Real-Time Streaming Protocol) path to your camera stream. You should
replace IP_OF_CAMERA with the actual IP of your camera, and the rest of the path may vary based on
the camera model and manufacturer.
10. roles:
This specifies the roles that this input stream will be used for.
11. detect
This specifies that the input stream should be used for detection purposes.
12. detect:
This is the start of the section where you define the detection settings for this camera.
99
Version -1.1
Why is this file needed?
This file is crucial because it allows you to tailor Frigate to your specific needs and hardware. By
providing this file, you are informing Frigate about your camera(s), their properties, locations, and how
you want Frigate to process their streams, enabling Frigate to function correctly according to your use
case. Without this configuration file, Frigate would not know how to interact with your camera(s) or how
to process their streams.
TROUBLESHOOTING
If the status is inactive then restart the service using systemctl restart cockpit
Your Houston interface should load fine after that.
If the you were not getting ping response during our troubleshooting steps, then you need to
check your networking
You can use the NMTUI interface and check the interface that has the IP set and check if it
up and active.
If all good check if your device is in the correct network.
Try checking which are the drives in your pool that are missing
You can either use the zpool status or check in the UI using ZFS tab
Check the server logs using dmesg -T to see if it has any drives drop warning.
Try re-seating the drive and see if it is getting picked up.
If the drive is still not detected try swapping it with a drive in another slot and see if it is getting
detected.
If the drives is still not detected it is most likely a failed drive.
But if the drive gets detected on a different slot. It could be a bad slot.
Try checking which are the drives in your pool that are missing
You can either use the zpool status or check in the UI using ZFS tab
Check the server logs using dmesg -T to see if it has any drives drop warning.
101
Version -1.1
Check if it is an actual failed drive by running SMART diagnostics on the drive
Check if you are noticing any uncorrectable or offline sectors if yes then it is most likely a failed
drive and needs replacement.
If the drive is good you would need to troubleshoot if it is the underlying hardware such as
backplane/cables etc.
Make sure you are having the appropriate permission to access the files.
Check the permission granted and see if the user getting access denied has access.
It is most likely that he is not having access or is having access to just the top-level folder and not
the child folders and files.
Modify the permission as per your preference and you should be able to access the files.
You can update the HL8 by using the software updates tab in the Houston UI
102
Version -1.1
45DRIVES DISK MODULE IS NOT WORKING
If the 45drives disks module does not show up and does not detect the drives you can perform
device mapping manually using sudo dalias -t HL8
Once the command finishes, reload the 45drives disks module and it should show the drives.
103
Version -1.1