Skip to content

Instantly share code, notes, and snippets.

@pathsny
Forked from zenxedo/TrueNAS Setup.md
Last active October 3, 2021 17:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pathsny/448da3d23acb18e113cd0f5784357cae to your computer and use it in GitHub Desktop.
Save pathsny/448da3d23acb18e113cd0f5784357cae to your computer and use it in GitHub Desktop.
Ultimate FreeNAS 11.2 iocage Setup

FreeNAS 11.2

WARNING READ THIS: This page contains incomplete and possibly incorrect info. The page is constantly being edited and worked on. Many of these should work but some may be broken. Read the code carefully to understand what you are doing, stuff may be nedd to be changed for your own use. These include but are not limited too JAIL AND ROUTER IPs, YOUR FREENAS MAIN VOLUME,THE MOST RECENT RELEASE OF DOWNLOADED FILES Use at your own risk.

**Find me in the FreeNAS forums

Thanks to the creator of this guide https://forums.freenas.org/index.php?resources/fn11-1-iocage-jails-plex-tautulli-sonarr-radarr-lidarr-jackett-ombi-transmission-organizr.58/

Setup Structure

myVol > media >  -series
                 -movies
                 -downloads > -radarr
                              -sonarr
                              -complete
                              -incomplete
                              -recycle bin   
                            ```

I have pool named myVol. I created a dataset named "media" owned by the default freenas user media:media. The dataset contains the folders series,movies,downloads. Radarr, Sonarr, Transmission will need to run as the user media:media to have access to them, this is very important and should not be overlooked. I also have a dataset named "apps" to hold the config data.

Permissions

For Sonarr, Radarr, Transmission you will have to change the default user to media:media so the jails can work together properly.

Use the name of your plugin instead of PLUGIN

service PLUGIN onestop
chown -R media:media /usr/local/PLUGIN (this location might be different for some of the apps)
sysrc 'PLUGIN_user=media'
sysrc 'PLUGIN_group=media'
service PLUGIN start

My current setup (dates show the last successful test):

Ombi and Unifi have been moved to docker containers in Rancher. See my other guide.

Configuration:

Plex

# Create the jail
iocage create -n "plex" -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.55/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on" 

# Update to the latest repo
iocage exec plex "mkdir -p /usr/local/etc/pkg/repos"
iocage exec plex "echo -e 'FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/latest\" }' > /usr/local/etc/pkg/repos/FreeBSD.conf"

# Install Plex and dependencies
iocage exec plex pkg install -y plexmediaserver

# Mount storage
iocage exec plex "mkdir -p /config"
mkdir -p /mnt/pool1/apps/plex
iocage fstab -a plex /mnt/pool1/apps/plex /config nullfs rw 0 0
iocage fstab -a plex /mnt/pool1/media /media nullfs ro 0 0

# Set permissions
iocage exec plex chown -R plex:plex /config

# Enable service
iocage exec plex sysrc "plexmediaserver_enable=YES"
iocage exec plex sysrc plexmediaserver_support_path="/config"
iocage exec plex service plexmediaserver start

Transmission

echo '{"pkgs":["bash","unzip","unrar","transmission","openvpn","ca_root_nss"]}' > /tmp/pkg.json
iocage create -n "transmission"  -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.35/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on" allow_tun="1"
rm /tmp/pkg.json

iocage exec transmission mkdir -p /config/transmission-home
iocage exec transmission mkdir -p  /media
iocage fstab -a transmission /mnt/pool1/apps/transmission /config nullfs rw 0 0
iocage fstab -a transmission /mnt/pool1/media/ /media nullfs rw 0 0

iocage exec transmission sysrc "transmission_enable=YES"
iocage exec transmission sysrc "transmission_conf_dir=/config/transmission-home"
iocage exec transmission sysrc "transmission_download_dir=/media/Incoming/complete"

iocage exec transmission "pw groupadd -n media -g 1000"
iocage exec transmission "pw user add media -c media -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec transmission "pw groupmod media -m transmission"
iocage exec transmission  chown -R media:media /config/transmission-home
iocage exec transmission  chown -R media:media /media/Incoming
iocage exec transmission  sysrc 'transmission_user=media'

iocage exec transmission "chown 0:0 /config/ipfw_rules"
iocage exec transmission "chmod 600 /config/ipfw_rules"
iocage exec transmission sysrc "firewall_enable=YES"
iocage exec transmission sysrc "firewall_script=/config/ipfw_rules"
iocage exec transmission sysrc "firewall_type=open"
iocage exec transmission sysrc "openvpn_enable=YES"
iocage exec transmission sysrc "openvpn_dir=/config"
iocage exec transmission sysrc "openvpn_configfile=/config/openvpn.conf"
iocage exec transmission service ipfw start
iocage exec transmission service openvpn start
iocage exec transmission service transmission start
 
# you may need to change the white list in settings.json to 0.0.0.0 or set to your preferred settings

Sonarr V3

echo '{"pkgs":["mono","mediainfo","sqlite3","ca_root_nss","curl"]}' > /tmp/pkg.json
iocage create -n "sonarr" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.137/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on" 
rm /tmp/pkg.json

# mount storage
iocage exec sonarr mkdir -p /config
iocage exec sonarr mkdir -p  /media
mkdir -p /mnt/pool1/apps/sonarr
iocage fstab -a sonarr /mnt/pool1/apps/sonarr /config nullfs rw 0 0
iocage fstab -a sonarr /mnt/pool1/media /media nullfs rw 0 0

# download sonarr
iocage exec sonarr ln -s /usr/local/bin/mono /usr/bin/mono
iocage exec sonarr "fetch 'http://services.sonarr.tv/v1/download/phantom/latest?version=3&os=linux' -o /usr/local/share"
iocage exec sonarr "tar -xzvf /usr/local/share/Sonarr.phantom.3.0.0.334.linux.tar.gz -C /usr/local/share"
iocage exec sonarr rm /usr/local/share/Sonarr.phantom.3.0.0.334.linux.tar.gz

# Media Permissions
iocage exec sonarr "pw groupadd -n media -g 1000"
iocage exec sonarr "pw user add media -c media -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec sonarr "pw groupmod media -m sonarr"
iocage exec sonarr chown -R media:media /usr/local/share/Sonarr /config
iocage exec sonarr  sysrc 'sonarr_user=media'

# create rc.d
iocage exec sonarr mkdir /usr/local/etc/rc.d
iocage exec sonarr "ee /mnt/iocage/jails/sonarr/root/usr/local/etc/rc.d/sonarr"
# use rc.d below
CLICK TO SHOW SONARR rc.d

#!/bin/sh

# $FreeBSD$
#
# PROVIDE: sonarr
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# sonarr_enable: Set to YES to enable sonarr
# Default: NO
# sonarr_user: The user account used to run the sonarr daemon.
# This is optional, however do not specifically set this to an
# empty string as this will cause the daemon to run as root.
# Default: media
# sonarr_group: The group account used to run the sonarr daemon.
# This is optional, however do not specifically set this to an
# empty string as this will cause the daemon to run with group wheel.
# Default: media
# sonarr_data_dir: Directory where sonarr configuration
# data is stored.
# Default: /var/db/sonarr

. /etc/rc.subr
name=sonarr
rcvar=${name}_enable
load_rc_config $name

: ${sonarr_enable:="NO"}
: ${sonarr_user:="media"}
: ${sonarr_group:="media"}
: ${sonarr_data_dir:="/config"}

pidfile="${sonarr_data_dir}/nzbdrone.pid"
command="/usr/sbin/daemon"
procname="/usr/local/bin/mono"
command_args="-f ${procname} /usr/local/share/Sonarr/Sonarr.exe --data=${sonarr_data_dir} --nobrowser"

start_precmd=sonarr_precmd
sonarr_precmd() {
if [ ! -d ${sonarr_data_dir} ]; then
install -d -o ${sonarr_user} -g ${sonarr_group} ${sonarr_data_dir}
fi

export XDG_CONFIG_HOME=${sonarr_data_dir}
}

run_rc_command "$1"

iocage exec sonarr chmod u+x /usr/local/etc/rc.d/sonarr
iocage exec sonarr sysrc "sonarr_enable=YES"
iocage exec sonarr service sonarr start

Sonarr Anime V3

echo '{"pkgs":["mono","mediainfo","sqlite3","ca_root_nss","curl", "git", "rbenv", "bash"]}' > /tmp/pkg.json
iocage create -n "sonarr_anime" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.139/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on" 
rm /tmp/pkg.json

# mount storage
iocage exec sonarr_anime mkdir -p /config
iocage exec sonarr_anime mkdir -p  /media
mkdir -p /mnt/pool1/apps/sonarr_anime
iocage fstab -a sonarr_anime /mnt/pool1/apps/sonarr_anime /config nullfs rw 0 0
iocage fstab -a sonarr_anime /mnt/pool1/media /media nullfs rw 0 0

# download sonarr
iocage exec sonarr_anime ln -s /usr/local/bin/mono /usr/bin/mono
iocage exec sonarr_anime "fetch 'http://services.sonarr.tv/v1/download/phantom/latest?version=3&os=linux' -o /usr/local/share"
iocage exec sonarr_anime "tar -xzvf /usr/local/share/Sonarr.phantom.3.0.0.334.linux.tar.gz -C /usr/local/share"
iocage exec sonarr_anime rm /usr/local/share/Sonarr.phantom.3.0.0.334.linux.tar.gz

# Media Permissions
iocage exec sonarr_anime "pw groupadd -n media -g 1000"
iocage exec sonarr_anime "pw user add media -c media -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec sonarr_anime "pw groupmod media -m sonarr"
iocage exec sonarr_anime chown -R media:media /usr/local/share/Sonarr /config
iocage exec sonarr_anime  sysrc 'sonarr_user=media'

iocage exec sonarr_anime "pkg install rbenv"
iocage exec sonarr_anime "curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-installer | bash"
iocage exec sonarr_anime "mkdir -p /usr/local/share/anidb_ruby"
iocage exec sonarr_anime chown -R media:media /usr/local/share/anidb_ruby
iocage exec sonarr_anime "pkg install rsync"


# From host, first deploy
cd ~/Projects/anidb-ruby/ && bundle exec cap production deploy




# create rc.d
iocage exec sonarr_anime mkdir /usr/local/etc/rc.d
iocage exec sonarr_anime "ee /mnt/iocage/jails/sonarr/root/usr/local/etc/rc.d/sonarr"
# use rc.d below
CLICK TO SHOW SONARR rc.d

#!/bin/sh

# $FreeBSD$
#
# PROVIDE: sonarr
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# sonarr_enable: Set to YES to enable sonarr
# Default: NO
# sonarr_user: The user account used to run the sonarr daemon.
# This is optional, however do not specifically set this to an
# empty string as this will cause the daemon to run as root.
# Default: media
# sonarr_group: The group account used to run the sonarr daemon.
# This is optional, however do not specifically set this to an
# empty string as this will cause the daemon to run with group wheel.
# Default: media
# sonarr_data_dir: Directory where sonarr configuration
# data is stored.
# Default: /var/db/sonarr

. /etc/rc.subr
name=sonarr
rcvar=${name}_enable
load_rc_config $name

: ${sonarr_enable:="NO"}
: ${sonarr_user:="media"}
: ${sonarr_group:="media"}
: ${sonarr_data_dir:="/config"}

pidfile="${sonarr_data_dir}/nzbdrone.pid"
command="/usr/sbin/daemon"
procname="/usr/local/bin/mono"
command_args="-f ${procname} /usr/local/share/Sonarr/Sonarr.exe --data=${sonarr_data_dir} --nobrowser"

start_precmd=sonarr_precmd
sonarr_precmd() {
if [ ! -d ${sonarr_data_dir} ]; then
install -d -o ${sonarr_user} -g ${sonarr_group} ${sonarr_data_dir}
fi

export XDG_CONFIG_HOME=${sonarr_data_dir}
}

run_rc_command "$1"

iocage exec sonarr_anime chmod u+x /usr/local/etc/rc.d/sonarr
iocage exec sonarr_anime sysrc "sonarr_enable=YES"
iocage exec sonarr_anime service sonarr start

Radarr

echo '{"pkgs":["mono","mediainfo","sqlite3","ca_root_nss","curl"]}' > /tmp/pkg.json
iocage create -n "radarr" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.136/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json

iocage exec radarr mkdir -p /config
iocage exec radarr mkdir -p  /media
mkdir -p /mnt/pool1/apps/radarr

iocage fstab -a radarr /mnt/pool1/apps/radarr /config nullfs rw 0 0
iocage fstab -a radarr /mnt/pool1/media/ /media nullfs rw 0 0

iocage exec radarr ln -s /usr/local/bin/mono /usr/bin/mono
iocage exec radarr "fetch https://github.com/Radarr/Radarr/releases/download/v0.2.0.1217/Radarr.v0.2.0.1217.linux.tar.gz -o /usr/local/share"
iocage exec radarr "tar -xzvf /usr/local/share/Radarr.v0.2.0.1217.linux.tar.gz -C /usr/local/share"
iocage exec radarr rm /usr/local/share/Radarr.v0.2.0.1217.linux.tar.gz

## Media Permissions
iocage exec radarr "pw user add radarr -c radarr -u 352 -d /nonexistent -s /usr/bin/nologin"
iocage exec radarr "pw groupadd -n media -g 1000"
iocage exec radarr "pw user add media -c media -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec radarr "pw groupmod media -m radarr"
iocage exec radarr chown -R media:media /usr/local/share/Radarr /config
iocage exec radarr sysrc 'radarr_user=media'
iocage exec radarr service radarr start
On Windows, you need to change the End of Line (EOL) format in Notepad++ to UNIX:

use ee editor or it won't work at least for me!
Create an rc file for radarr using your favorite editor at /mnt/iocage/jails/radarr/root/usr/local/etc/rc.d/radarr

iocage exec radarr mkdir /usr/local/etc/rc.d
iocage exec radarr "ee /mnt/iocage/jails/radarr/root/usr/local/etc/rc.d/radarr"

#!/bin/sh

# $FreeBSD$
#
# PROVIDE: radarr
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# radarr_enable:    Set to YES to enable radarr
#            Default: NO
# radarr_user:    The user account used to run the radarr daemon.
#            This is optional, however do not specifically set this to an
#            empty string as this will cause the daemon to run as root.
#            Default: media
# radarr_group:    The group account used to run the radarr daemon.
#            This is optional, however do not specifically set this to an
#            empty string as this will cause the daemon to run with group wheel.
#            Default: media
# radarr_data_dir:    Directory where radarr configuration
#            data is stored.
#            Default: /var/db/radarr

. /etc/rc.subr
name=radarr
rcvar=${name}_enable
load_rc_config $name

: ${radarr_enable:="NO"}
: ${radarr_user:="media"}
: ${radarr_group:="media"}
: ${radarr_data_dir:="/config"}

pidfile="${radarr_data_dir}/nzbdrone.pid"
command="/usr/sbin/daemon"
procname="/usr/local/bin/mono"
command_args="-f ${procname} /usr/local/share/Radarr/Radarr.exe --data=${radarr_data_dir} --nobrowser"

start_precmd=radarr_precmd
radarr_precmd() {
    if [ ! -d ${radarr_data_dir} ]; then
    install -d -o ${radarr_user} -g ${radarr_group} ${radarr_data_dir}
    fi

    export XDG_CONFIG_HOME=${radarr_data_dir}
}

run_rc_command "$1"
iocage exec radarr chmod u+x /usr/local/etc/rc.d/radarr
iocage exec radarr sysrc "radarr_enable=YES"
iocage exec radarr service radarr start

Bazarr

echo '{"pkgs":["git", "wget", "python27", "py27-pip", "py27-libxml2", "py27-libxslt", "py27-sqlite3", "ffmpeg"]}'  > /tmp/pkg.json
iocage create -n "bazarr" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.77/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json

# mount storage
iocage exec bazarr mkdir -p /data
iocage exec bazarr mkdir -p  /media
mkdir -p /mnt/pool1/apps/bazarr
iocage fstab -a bazarr /mnt/pool1/apps/bazarr /data nullfs rw 0 0
iocage fstab -a bazarr /mnt/pool1/media /media nullfs rw 0 0

# download bazarr
iocage exec bazarr git clone https://github.com/morpheus65535/bazarr.git /usr/local/bazarr
iocage exec bazarr "cd /usr/local/bazarr && pip install --upgrade pip"
iocage exec bazarr "cd /usr/local/bazarr && pip install -r requirements.txt"
iocage exec bazarr "pw groupadd -n media -g 1000"
iocage exec bazarr "pw user add media -c media -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec bazarr chown -R media:media /usr/local/bazarr /data


# if first time
iocage exec bazarr "cp -r /usr/local/bazarr/data/* /data
iocage exec bazarr "rm -rf /usr/local/bazarr/data"
iocage exec bazarr "ln -s /data /usr/local/bazarr/data"


iocage exec bazarr mkdir /usr/local/etc/rc.d
ee /mnt/iocage/jails/bazarr/root/usr/local/etc/rc.d/bazarr


#!/bin/sh

#
# PROVIDE: bazarr
# REQUIRE: networking
# KEYWORD:

. /etc/rc.subr

name="bazarr"
rcvar="bazarr_enable"
command="/usr/local/bin/python2.7 /usr/local/bazarr/bazarr.py"
bazarr_user=media

start_cmd="bazarr_start"

bazarr_start(){
        /usr/sbin/daemon -r -f -u $bazarr_user $command
}

load_rc_config $name
: ${bazarr_enable:=no}

run_rc_command "$1"

iocage exec bazarr chmod +x /usr/local/etc/rc.d/bazarr
iocage exec bazarr sysrc 'bazarr_enable=YES'
iocage exec bazarr service bazarr start

Logarr

echo '{"pkgs":["nginx", "git", "wget", "php72", "php72-zip"]}'  > /tmp/pkg.json
iocage create -n "logarr" -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.88/24"  -p /tmp/pkg.json defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json


iocage exec logarr mkdir -p /apps
iocage fstab -a logarr /mnt/pool1/apps /app nullfs rw 0 0
iocage exec logarr mkdir -p /apps/config # cannot mount a nested dataset.

php_fpm_contents=$(cat <<'END_HEREDOC'
listen = /var/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
END_HEREDOC
)

# does not work
sudo sh -c 'echo "$php_fpm_contents" >> /mnt/pool1/iocage/jails/logarr/root/usr/local/etc/php-fpm.conf'

iocage exec logarr cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
iocage exec logarr sed -i '' -e 's?;date.timezone =?date.timezone = "Universal"?g' /usr/local/etc/php.ini
iocage exec logarr sed -i '' -e 's?;cgi.fix_pathinfo=1?cgi.fix_pathinfo=0?g' /usr/local/etc/php.ini

iocage exec logarr git clone https://github.com/causefx/logarr /usr/local/www/logarr

## IF already copied config
iocage exec logarr cp /usr/local/www/logarr/assets/config /apps/logarr
iocage exec logarr rm -rf /usr/local/www/logarr/assets/config
iocage exec logarr ln -s /apps/logarr/config /usr/local/www/logarr/assets/config



iocage exec logarr chown -R www:www /usr/local/www /apps/logarr 


nginx_conf_contents=$(cat <<'END_HEREDOC'
user www;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /usr/local/www/logarr;
location / {
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
}
END_HEREDOC
)

# does not work
sudo sh -c 'echo "$nginx_conf_contents" >> /mnt/pool1/iocage/jails/logarr/root/usr/local/etc/nginx/nginx.conf '


iocage exec logarr sysrc nginx_enable=YES
iocage exec logarr sysrc php_fpm_enable=YES
iocage exec logarr service nginx start
iocage exec logarr service php-fpm start

iocage exec logarr service nginx stop
iocage exec logarr rm /usr/local/etc/nginx/nginx.conf
iocage exec logarr ln -s /apps/logarr/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf
iocage exec logarr service nginx start


Organizr V2

#Note to self: Make sure port forwarding is disabled before removing or rebuilding this jail

echo '{"pkgs":["nginx", "git", "wget", "php74", "php74-curl", "php74-pdo", "php74-sqlite3", "php74-simplexml", "php74-zip", "php74-openssl", "php74-filter", "php74-json", "php74-session", "php74-pdo_sqlite"]}'  > /tmp/pkg.json
iocage create -n "organizr" -r 12.2-RELEASE ip4_addr="vnet0|192.168.1.99/24"  -p /tmp/pkg.json defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json

iocage exec organizr mkdir -p /config
iocage fstab -a organizr /mnt/pool1/apps/organizr /config nullfs rw 0 0

php_fpm_contents=$(cat <<'END_HEREDOC'
listen = /var/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
END_HEREDOC
)

# does not work
sudo sh -c 'echo "$php_fpm_contents" >> /mnt/pool1/iocage/jails/organizr/root/usr/local/etc/php-fpm.conf'

iocage exec organizr cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
iocage exec organizr sed -i '' -e 's?;date.timezone =?date.timezone = "Universal"?g' /usr/local/etc/php.ini
iocage exec organizr sed -i '' -e 's?;cgi.fix_pathinfo=1?cgi.fix_pathinfo=0?g' /usr/local/etc/php.ini

iocage exec organizr git clone -b v2-develop https://github.com/causefx/Organizr /usr/local/www/Organizr
iocage exec organizr chown -R www:www /usr/local/www /config

nginx_conf_contents=$(cat <<'END_HEREDOC'
user www;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /usr/local/www/Organizr;
location / {
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
}
END_HEREDOC
)

# does not work
sudo sh -c 'echo "$nginx_conf_contents" >> /mnt/pool1/iocage/jails/organizr/root/usr/local/etc/nginx/nginx.conf '


iocage exec organizr sysrc nginx_enable=YES
iocage exec organizr sysrc php_fpm_enable=YES
iocage exec organizr service nginx start
iocage exec organizr service php-fpm start

#important step Navigate to http://JailIP and set the follow the setup database location to "/config/Organizr" and Organizr for the database name. If you have an exsisting config file in the database location once you complete the setup restart the jail and login with you exsisting credentials.

# link my exsisting nginx config, you need to upload your own or edit the exsisting
iocage exec organizr service nginx stop
iocage exec organizr rm /usr/local/etc/nginx/nginx.conf
iocage exec organizr ln -s /config/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf
iocage exec organizr service nginx start

#note to self renable port forwarding

I keep folders in /config for nginx,log,letsencrypt,Backups

Jackett

echo '{"pkgs":["mono","curl","ca_root_nss"]}' > /tmp/pkg.json
iocage create -n "jackett"  -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.40/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json

mkdir -p /mnt/pool1/apps/jackett
iocage exec jackett mkdir -p /config
iocage exec transmission mkdir -p  /media
iocage fstab -a jackett /mnt/pool1/apps/jackett /config nullfs rw 0 0
iocage fstab -a transmission /mnt/pool1/media/ /media nullfs rw 0 0

iocage exec jackett ln -s /usr/local/bin/mono /usr/bin/mono
iocage exec jackett "fetch https://github.com/Jackett/Jackett/releases/download/v0.10.531/Jackett.Binaries.Mono.tar.gz -o /usr/local/share"
iocage exec jackett "tar -xzvf /usr/local/share/Jackett.Binaries.Mono.tar.gz -C /usr/local/share"
iocage exec jackett rm /usr/local/share/Jackett.Binaries.Mono.tar.gz

iocage exec jackett "pw groupadd -n jackett -g 1000"
iocage exec jackett "pw user add jackett -c jackett -u 1005 -d /nonexistent -s /usr/bin/nologin"
iocage exec jackett chown -R jackett:jackett /usr/local/share/Jackett /config
iocage exec jackett mkdir /usr/local/etc/rc.d

jackett_rc_contents=$(cat <<'END_HEREDOC'
#!/bin/sh

# $FreeBSD$
#
# PROVIDE: jackett
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# jackett_enable:    Set to YES to enable jackett
#            Default: NO
# jackett_user:    The user account used to run the jackett daemon.
#            This is optional, however do not specifically set this to an
#            empty string as this will cause the daemon to run as root.
#            Default: media
# jackett_group:    The group account used to run the jackett daemon.
#            This is optional, however do not specifically set this to an
#            empty string as this will cause the daemon to run with group wheel.
#            Default: media
# jackett_data_dir:    Directory where jackett configuration
#            data is stored.
#            Default: /var/db/jackett

. /etc/rc.subr
name=jackett
rcvar=${name}_enable
load_rc_config $name

: ${jackett_enable:="NO"}
: ${jackett_user:="jackett"}
: ${jackett_group:="jackett"}
: ${jackett_data_dir:="/config"}

command="/usr/sbin/daemon"
procname="/usr/local/bin/mono"
command_args="-p ${jackett_data_dir}/jackett.pid -f ${procname} /usr/local/share/Jackett/JackettConsole.exe -d ${jackett_data_dir}"

start_precmd=jackett_precmd
jackett_precmd() {
    export USER=${jackett_user}
    if [ ! -d ${jackett_data_dir} ]; then
    install -d -o ${jackett_user} -g ${jackett_group} ${jackett_data_dir}
    fi

    export XDG_CONFIG_HOME=${jackett_data_dir}
}

run_rc_command "$1"
END_HEREDOC
)

# does not work
sudo sh -c 'echo "$jackett_rc_contents" > /mnt/pool1/iocage/jails/jackett/root/usr/local/etc/rc.d/jackett'

iocage exec jackett chmod u+x /usr/local/etc/rc.d/jackett
iocage exec jackett sysrc "jackett_enable=YES"
iocage exec jackett service jackett start

Tautulli

echo '{"pkgs":["python","py37-setuptools", "py37-sqlite3","py37-openssl","git" ," py37-pycryptodomex" , "security/ca_root_nss", "git-lite"]}' > /tmp/pkg.json
iocage create -n "tautulli" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.56/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json
iocage exec tautulli mkdir -p /config
iocage fstab -a tautulli /mnt/myVol/apps/tautulli /config nullfs rw 0 0
iocage exec tautulli git clone https://github.com/Tautulli/Tautulli.git /usr/local/share/Tautulli
iocage exec tautulli "pw user add tautulli -c tautulli -u 109 -d /nonexistent -s /usr/bin/nologin"
iocage exec tautulli chown -R tautulli:tautulli /usr/local/share/Tautulli /config
iocage exec tautulli cp /usr/local/share/Tautulli/init-scripts/init.freenas /usr/local/etc/rc.d/tautulli
iocage exec tautulli chmod u+x /usr/local/etc/rc.d/tautulli
iocage exec tautulli sysrc "tautulli_enable=YES"
iocage exec tautulli sysrc "tautulli_flags=--datadir /config"
iocage exec tautulli service tautulli start

Kitana

echo '{"pkgs":["python", "security/ca_root_nss", "git-lite"]}' > /tmp/pkg.json
iocage create -n "kitana" -p /tmp/pkg.json -r 11.2-RELEASE ip4_addr="vnet0|192.168.1.57/24" defaultrouter="192.168.1.1" vnet="on" allow_raw_sockets="1" boot="on"
rm /tmp/pkg.json
iocage exec kitana python3.7 -m ensurepip
iocage exec kitana pip3.7 install --upgrade pip
iocage exec kitana mkdir -p /config
mkdir /mnt/pool1/apps/kitana
iocage fstab -a kitana /mnt/pool1/apps/kitana /config nullfs rw 0 0
iocage exec kitana git clone https://github.com/pannal/Kitana.git /usr/local/share/Kitana
iocage exec kitana "cd /usr/local/share/Kitana && pip install -r /usr/local/share/requirements.txt"
iocage exec kitana "pw user add kitana -c kitana -u 110 -d /nonexistent -s /usr/bin/nologin"
cp /usr/local/share/Tautulli/init-scripts/init.freenas /usr/local/etc/rc.d/tautulli
iocage exec kitana chown -R kitana:kitana /usr/local/share/Kitana /config /usr/local/etc/rc.d/kitana
# edit it
iocage exec kitana sysrc "kitana_enable=YES"
iocage exec kitana sysrc "kitana_flags=--datadir /config"
iocage exec kitana service kitana start

Backups

Important files

Backup your entire apps folder

Common Commands

https://www-uxsup.csx.cam.ac.uk/pub/doc/suse/suse9.0/userguide-9.0/ch24s04.html

cd /directorypath	: Change to directory.
chmod [options] mode filename	: Change a file’s permissions.
chown [options] filename :	Change who owns a file.
cp [options] :source destination	: Copy files and directories.
ln -s test symlink	: Creates a symbolic link named symlink that points to the file test
mkdir [options] directory	: Create a new directory.
mv -i myfile yourfile : Move the file from "myfile" to "yourfile". This effectively changes the name of "myfile" to "yourfile".
mv -i /data/myfile :	Move the file from "myfile" from the directory "/data" to the current working directory.
rm [options] directory	: Remove (delete) file(s) and/or directories.
tar [options] filename :	Store and extract files from a tarfile (.tar) or tarball (.tar.gz or .tgz).
touch filename :	Create an empty file with the specified name.

Testing/Updates

iocage exec <jail> pkg upgrade <name of service>
iocage exec <jail> pkg upgrade && pkg update

iocage exec <jail> service <name of service> start
iocage exec <jail> service <name of service> restart
iocage exec <jail> service <name of service> stop

Default User Ports/UID/Location

PORT - SERVICE - USER (UID)
radarr- 7878 - radarr (352) 
sonarr- 8989 - 
jackett - 9117 - jackett (818)
0rganizr - 80 - organizr (www)
plexmediaserver 32400 - plex (972)
transmission - 9091 -transmission (921) 
tautulli - 8181 - tautlli (109)
kitana - 31337 - kitana (110)
ombi - 3579 - ombi (819)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment