Skip to content

Instantly share code, notes, and snippets.

@jacobblock
Last active October 22, 2023 13:01
Show Gist options
  • Save jacobblock/4d9270c25548c65300dd to your computer and use it in GitHub Desktop.
Save jacobblock/4d9270c25548c65300dd to your computer and use it in GitHub Desktop.
Ultimate FreeNAS Setup

FreeNAS

I started using FreeNAS in August 2013. It is fantastic piece of software and I have been really impressed by the upgrades just in the few months I've been using it. It looks like they recently went to a plugin system as of version 9 to make installing software easier for end users. I've ran into several issues related to plugins and user + group permissions so I decided to just use the available FreeBSD port system. After fiddling for a few days (now turned into months) I believe I have created something helpful for the community and anyone interested in picking up the port system. The sandbox nature of FreeNAS's jail system is especially helpful for playing around without having any consequence on your core system.

Here are straight-forward instructions to setting up a bunch of different software on FreeNAS. If you make a terrible error, just throw up another plugin sandbox and repeat.

ToC

Notes

Gist is awesome, and currently this write-up is written in Markdown. Unfortunately that means you'll have to replace a bunch of references to:

  • tetra: My zpool
  • 192.168.1.2: My static FreeNAS ip
  • 192.168.1.3: My static media jail ip
  • 192.168.1.4: My static backup jail ip

Along with that be sure to keep paths consistent between your builds. It is easy to forget if you SSH'd into FreeNAS or into the jail.

Additionally, do not copy/paste entire chunks of commands. I often skip over different yes/no options for brevity in this guide. Read what the prompt says and feel free to drop a comment if answers seem ambiguous.

Setting up the jail

Create a jail using the FreeNAS web UI

Jail name: media_jail
IPv4 address: 192.168.1.3/24
autostart: checked
type: pluginjail
VIMAGE: unchecked
vanilla: checked
sysctls: allow.raw_sockets=true,allow.sysvipc=true

Ports and dependencies

ssh root@192.168.1.2
jls
jexec 17 tcsh
passwd
portsnap fetch extract
portsnap fetch update
sysrc sshd_enable=YES
sysrc ftpd_enable=YES
cd /usr/ports/ports-mgmt/pkg/ && make deinstall
cd /usr/ports/ports-mgmt/pkg/ && make install clean
pkg2ng
cd /usr/ports/ports-mgmt/portmaster && make config-recursive install clean
cd /usr/ports/devel/git && make config-recursive install clean
cd /usr/ports/devel/py-cheetah && make config-recursive install clean

Create a 'media' user and create media directory

mkdir /mnt/media
adduser
Username   : media
Password   : <blank>
Full Name  : Media
Uid        : 1001
Class      : 
Groups     : media 
Home       : /home/media
Home Mode  : 
Shell      : /bin/tcsh
Locked     : no
id media

Create this user in your FreeNAS with the same uid and gid (typically 1001 if you haven't made a custom account yet).

Add mounts for media + crashplan backups inside the jail (/mnt//media to /mnt/media).

Software

Sabnzbd

cd /usr/ports/news/sabnzbdplus && make config-recursive install clean
chown -R media:media sabnzbd
sysrc sabnzbd_enable=YES
sysrc sabnzbd_user=media
sysrc sabnzbd_group=media

SickRage

cb /usr/local && git clone git://github.com/SickRage/SickRage.git sickrage
chown -R media:media sickrage
cp /usr/local/sickrage/runscripts/init.freebsd /usr/local/etc/rc.d/sickrage
sysrc sickrage_enable=YES
sysrc sickrage_user=media
sysrc sickrage_group=media

Couch Potato

cd /usr/local && git clone git://github.com/RuudBurger/CouchPotatoServer.git couchpotato
chown -R media:media couchpotato
cp /usr/local/couchpotato/init/freebsd /usr/local/etc/rc.d/couchpotato
chmod +x /usr/local/etc/rc.d/couchpotato
sysrc couchpotato_enable=YES
sysrc couchpotato_user=media
sysrc couchpotato_group=media
sysrc couchpotat_dir=/usr/local/couchpotato

Headphones

cd /usr/local && git clone git://github.com/rembo10/headphones.git
chown -R media:media headphones
cp /usr/local/headphones/init-scripts/init.freebsd /usr/local/etc/rc.d/headphones
chmod +x /usr/local/etc/rc.d/headphones
sysrc headphones_enable=YES
sysrc headphones_user=media
sysrc headphones_group=media

Plex

cd /usr/ports/multimedia/plexmediaserver && make config-recursive install clean
cd /usr/local && mkdir plexdata
chown -R media:media plexdata
sysrc plexmediaserver_enable=YES
sysrc plexmediaserver_user=media
sysrc plexmediaserver_group=media

There has been new security settings added and there was a problem with the plex scanner making a request to a local agent. To fix it you should add 192.168.1.0/24 to Settings -> Server -> Network -> Enabled Advanced -> "List of IP Address and networks that are allowed without auth" add 192.168.1.0/24. After that, click refresh all and the scanner should be able to connect to the local agent.

PlexPy

cd /usr/local && git clone https://github.com/JonnyWong16/plexpy.git
chown -R media:media plexpy
cp /usr/local/plexpy/init-scripts/init.freebsd /usr/local/etc/rc.d/plexpy
chmod +x /usr/local/etc/rc.d/plexpy
sysrc plexpy_enable=YES
sysrc plexpy_user=media
sysrc plexpy_dir=/usr/local/plexpy
sysrc plexpy_port=8083

Madsonic

Discovered madsonic only recently (quite a surprise!). Looks like a great fork of subsonic that includes a number of features for free compared to subsonic. The port depends on jetty server and other stuff. I prefer to use openjdk and a standalone install as done below. Use the madsonic start script also attached to the gist.

cd /usr/ports/java/openjdk8-jre && make config-recursive install clean
mkdir -p /usr/local/madsonic && cd /usr/local/madsonic
wget -Omadsonic.tar.gz http://madsonic.org/download/6.0/20160122_madsonic-6.0.7960-standalone.zip
tar -zxvf madsonic.tar.gz
rm madsonic.tar.gz
chown -R media:media /usr/local/madsonic

vi /usr/local/etc/rc.d/madsonic
# Use the file "madsonic" attached below
chmod a+x /usr/local/etc/rc.d/madsonic

sysrc madsonic_enable=YES
sysrc madsonic_user=media
sysrc madsonic_group=media
sysrc madsonic_bin=/usr/local/madsonic/madsonic.sh
sysrc madsonic_podcast_folder=/mnt/media/music/podcasts
sysrc madsonic_playlist_folder=/mnt/media/music/playlists

Here is the madsonic launch script to use.

Deluge

Uncheck option for GTK during configuration.

cd /usr/ports/net-p2p/deluge-cli && make WITHOUT_X11=yes config-recursive install clean
mkdir -p /usr/local/deluge
chown -R media:media /usr/local/deluge
sysrc deluged_enable=YES
sysrc deluged_user=media
sysrc deluged_group=media
sysrc deluged_confdir=/usr/local/deluge
sysrc deluge_web_enable=YES
sysrc deluge_web_user=media
sysrc deluge_web_group=media
sysrc deluge_web_confdir=/usr/local/deluge

Calibre

cd /usr/ports/deskutils/calibre && make config-recursive && make install clean
sysrc calibre_enable=YES
sysrc calibre_port=8082
sysrc calibre_user=media
sysrc calibre_group=media
sysrc calibre_library=/mnt/media/books

Nginx webserver + PHP + MYSQL

For PHP5-extensions, include: bz2 ctype curl ftp dom exif fileinfo gd gmp iconv json ldap mbstring mcrypt mysql mysqli openssl pdo_mysql pdo_pgsql pdo_sqlite pgsql xsl zip zlib

For PHP5, include: FPM

cd /usr/ports/www/nginx && make config-recursive install clean
cd /usr/ports/databases/mysql56-server && make config-recursive install clean
cd /usr/ports/databases/postgresql94-server && make config-recursive install clean
cd /usr/ports/lang/php56-extensions && make config-recursive install clean
cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
cd /usr/local/etc/nginx && cp nginx.conf-dist nginx.conf && cp mime.types-dist mime.types
sysrc nginx_enable=YES
sysrc php_fpm_enable=YES
sysrc mysql_enable=YES
sysrc postgresql_enable=YES
service postgresql initdb
service postgresql start
service mysql-server start
mysql_secure_installation
su pgsql
passwd

Modify nginx.conf similar to the attached nginx.conf file. Make sure to pay close attention to where "root" is and "location ~ .php$". You can overwrite the file with ":wq!"

Create a similar index.html as below in folder /usr/local/www.

NextCloud

cd /usr/ports/www/nextcloud && make config-recursive install clean
su pgsql
createdb ocdb
psql -s ocdb
create user <user> password <password>
GRAND ALL PRIVELEGES ON DATABASE ocdb TO <user>

Tiny Tiny RSS

Helpful link: http://tt-rss.org/forum/viewtopic.php?f=16&t=911

cd /usr/ports/www/tt-rss && make config-recursive && make install clean
sysrc ttrssd_enable=YES
mysql -u root -p
CREATE DATABASE ttrssdb;
GRANT ALL ON ttrssdb.* TO ttrssuser IDENTIFIED BY "pick some random long password with lots of words BLAMMY";
quit;
chown -R www:www /usr/local/www/tt-rss
rm /usr/local/www/tt-rss/config.php

Testing

service sshd start
service couchpotato start
service sickrage start
service headphones start
service sabnzbd start
service plexmediaserver start
service deluge start
service nginx start
service php-fpm start
service postgres start
service calibre start
service madsonic start
service plexpy start

Now check to make sure everything is running fine (192.168.1.3). Then shut down the plugin server and start it up again. Everything should still be working fine.

Backups

Important files Sickbeard replacement: sickbeard.db and config.ini Sabnzbd replacement: sabnzbd.ini Couch potato replacement: Plex: not worth it

Moving over databases and config files from plugins Log into FreeNAS

cp /mnt/tetra/plugins_1/usr/pbi/sickbeard-amd64/data/config.ini /mnt/tetra/media_jail/usr/local/sickbeard
cp /mnt/tetra/plugins_1/usr/pbi/sickbeard-amd64/data/sickbeard.db /mnt/tetra/media_jail/usr/local/sickbeard
cp /mnt/tetra/plugins_1/usr/pbi/sabnzbdplus-amd64/sabnzbd/sabnzbd.ini /mnt/tetra/media_jail/usr/local/sabnzbd
cp /mnt/tetra/plugins_1/usr/pbi/headphones-amd64/data/config.ini /mnt/tetra/media_jail/usr/local/headphones/
cp /mnt/tetra/plugins_1/usr/pbi/headphones-amd64/data/headphones.db /mnt/tetra/media_jail/usr/local/headphones/
cp /mnt/tetra/plugins_1/usr/local/CouchPotatoServer/data/settings.conf /mnt/tetra/media_jail/usr/local/CouchPotatoServer/data
cp /mnt/tetra/plugins_1/usr/local/CouchPotatoServer/data/couchpotato.db /mnt/tetra/media_jail/usr/local/CouchPotatoServer/data

Make sure your settings move across the boundary. Daemons might not start up if ip's, filepaths, etc. are different.

Crashplan

Create a jail using the FreeNAS web UI

Jail name: backup_jail
IPv4 address: 192.168.1./24
autostart: checked
type: portjail
VIMAGE: unchecked
vanilla: checked

Now add the directories you want to backup and where the backups should go.

Ports and dependencies

ssh root@192.168.1.2
jls
jexec 5 tcsh
passwd
portsnap fetch && portsnap extract && portsnap update
sysrc sshd_enable=YES
vi /etc/ssh/sshd_config
# add the following to the end of the file
Match User backup
    AllowTcpForwarding yes

adduser # backup with Uid 1002

Download the java runtime in order to please the CrashPlan overlords (or alternatively, modify the crashplan port scripts): http://www.oracle.com/technetwork/java/javase/downloads/index.html Scroll down to Java SE 8u111/112 and click JRE Download (third button). Accept the license and download jdk-8u112-linux-i586.tar.gz. Then scp or ftp it over:

scp ~/Downloads/jdk-8u112-linux-i586.tar.gz root@192.168.1.2:/mnt/tetra/backup_jail/usr/ports/distfiles/

This is just to appease the makefile, and instead we will use OpenJDK's JRE anyways. The following takes quite a while to install.

Install java and crashplan

cd /usr/ports/java/openjdk8-jre/ && make config-recursive && make install clean
cd /usr/ports/sysutils/linux-crashplan/ && make config-recursive && make install clean
sysrc crashplan_enable=YES

Now change the default Java binary path:

vi /usr/local/share/crashplan/install.vars
  JAVACOMMON=/usr/local/bin/java

Restart the jail. Now follow this guide to modify your current crashplan install to work on the remote machine. You will need to create a port bridge over ssh, which you can do with the following command (before starting up crashplan locally):

ssh -L 4200:localhost:4243 backup@192.168.1.4

And grab the file /var/lib/crashplan/.ui_info from the server and bring it to your local host where you will run the crashplan desktop client.

Helpful codes

Mounting USB drive:

kldload fuse
mkdir /mnt/usb
ntfs-3g /dev/da1s1 /mnt/usb
ntfs-3g -o permissions /dev/da1s1 /mnt/usb

Upgrading

Upgrading can be a royal pain... but fear not. Typically you can just run a portmaster -ad, and if it says "conflict... blah blah" just run "pkg delete -f " then re-run the portmaster command. Eventually everything should be updated! Many times the update process comes to a grinding halt because of dependency issues. You can kick off a single app to be updated similar below. You will also want to review /usr/ports/UPDATING if you run into trouble to see if a port has changed. There is usually a command to migrate a package such as a portmaster -o oldpackage newpackage.

less /usr/ports/UPDATING
portsnap fetch update
cd /usrports/ports-mgmt/pkg && make install clean
cd /usr/ports/ports-mgmt/portmaster && make install clean
pkg version -l '<'
portmaster -Rafd
portmaster -fd news/sabnzbdplus

Rsync files

&rsync --progress --stats --recursive --times --perms --links --dry-run /mnt/tetra /mnt/usb/tetra
nohup foo &

rsync -az -H --delete --numeric-ids --stats --progress -e ssh root@192.168.1.2:/mnt/tetra/family /media/jacob/usb/tetra
rsync -az -H --delete --numeric-ids --stats --progress -e ssh root@192.168.1.2:/mnt/tetra/media_jail/usr/local/sickbeard/data/config.ini /media/jacob/usb/tetra/backup

cp 

Copy server and daemon config files and databases

mkdir /mnt/tetra/backup/server_configs
cd /mnt/tetra/backup/server_configs
rsync -aqz /mnt/tetra/media_jail/usr/local/sickbeard/config.ini /mnt/tetra/media_jail/usr/local/sickbeard/sickbeard.db sickbeard/
rsync -aqz /mnt/tetra/media_jail/usr/local/sabnzbd/sabnzbd.ini sabnzbd/
rsync -aqz /mnt/tetra/media_jail/usr/local/headphones/config.ini /mnt/tetra/media_jail/usr/local/headphones/headphones.db headphones/
rsync -aqz /mnt/tetra/media_jail/usr/local/CouchPotatoServer/data/settings.conf /mnt/tetra/media_jail/usr/local/CouchPotatoServer/data/couchpotato.db couchpotato/
rsync -aqz /mnt/tetra/media_jail/usr/local/etc/nginx/nginx.conf /mnt/tetra/media_jail/usr/local/www/home/index.html nginx/
cd /mnt/tetra/backup/server_configs
rsync -aqz sabnzbd/sabnzbd.ini /mnt/tetra/media_jail/usr/local/sabnzbd/
rsync -aqz sickbeard/config.ini sickbeard/sickbeard.db /mnt/tetra/media_jail/usr/local/sickbeard/
rsync -aqz headphones/config.ini headphones/headphones.db /mnt/tetra/media_jail/usr/local/headphones/
rsync -aqz couchpotato/settings.conf couchpotato/couchpotato.db /mnt/tetra/media_jail/usr/local/CouchPotatoServer/data/

cd /usr/local && chmod -R media:media sabnzbd sickbeard headphones CouchPotatoServer

Appendix

2016-10-04: SickRageTV was forked to SickRage. Please read about migration here.

<html>
<head>
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<style>
.fluid-container {
padding-left: 15px;
padding-right: 15px;
margin-left: auto;
margin-right: auto;
}
iframe {
width: 100%;
height: 100%;
}
.nav-tabs>li>a.sabnzbd_logo {
background: url("http://192.168.1.3:8080/static/images/logo.png") no-repeat top right;
background-position: 0 0px;
float: left;
height: 40px;
padding-left: 50px;
padding-right: 50px;
}
.nav-tabs>li>a.headphones_logo {
background: url("http://192.168.1.3:8181/images/headphoneslogo.png") no-repeat top right;
background-size: contain;
float: left;
width: 40px;
height: 40px;
}
.nav-tabs>li>a.plex_logo {
background: url("http://192.168.1.3:32400/web/img/base/plex-logo.96faf245690b14fdd33eccd3294ac57f.svg") no-repeat top right;
background-color: #1f1f1f;
background-size: contain;
float: left;
width: 80px;
height: 40px;
}
.nav-tabs>li>a.plexpy_logo {
background: url("http://192.168.1.3:32400/web/img/base/plex-logo.96faf245690b14fdd33eccd3294ac57f.svg") no-repeat top right;
background-color: #1f1f1f;
background-size: contain;
float: left;
width: 80px;
height: 40px;
}
.nav-tabs>li>a.calibre_logo {
background: url("http://192.168.1.3:8082/static/calibre_banner.png") no-repeat top right;
background-size: contain;
height: 40px;
width: 150px;
}
.nav-tabs>li>a.madsonic_logo {
background: url("http://192.168.1.3:4040/icons/madsonic_sunny/logo.png") no-repeat top right;
background-size: contain;
height: 40px;
width: 160px;
}
.nav-tabs>li>a.freenas_logo {
background: url("http://192.168.1.2/static/images/ui/freenas-logo.png") no-repeat top right;
background-size: cover;
height: 40px;
width: 150px;
}
</style>
<title>Home Media</title>
</head>
<body>
<div>
<ul class="nav nav-tabs" id="myTabs">
<li class="active"><a href="#home" data-toggle="tab">Home</a></li>
<li><a href="#freenas" data-toggle="tab" class="freenas_logo"></a></li>
<li><a href="#freenasftp" data-toggle="tab">NAS FTP</a></li>
<li><a href="#plex" data-toggle="tab" class="plex_logo" alt="Plex">Plex</a></li>
<li><a href="#plexpy" data-toggle="tab" class="plexpy_logo" alt="PlexPy">PlexPy</a></li>
<li><a href="#sabnzbd" data-toggle="tab" class="sabnzbd_logo" alt="Sabnzbd"></a></li>
<li><a href="#sickrage" data-toggle="tab">Sickrage</a></li>
<li><a href="#sonarr" data-toggle="tab">Sonarr</a></li>
<li><a href="#couchpotato" data-toggle="tab">Couch Potato</a></li>
<li><a href="#headphones" data-toggle="tab" class="headphones_logo" alt="Headphones"></a></li>
<li><a href="#deluge" data-toggle="tab">Deluge</a></li>
<li><a href="#calibre" data-toggle="tab" class="calibre_logo"></a></li>
<li><a href="#ttrss" data-toggle="tab">TT-RSS</a></li>
<li><a href="#madsonic" data-toggle="tab" class="madsonic_logo"></a></li>
</ul>
</div>
<div>
<div class="tab-content">
<div class="tab-pane active" id="home">
<p>Home!</p>
</div>
<div class="tab-pane" id="freenas" data-src="http://192.168.1.2"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="freenasftp" data-src="ftp://192.168.1.3"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="sabnzbd" data-src="http://192.168.1.3:8080"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="sickrage" data-src="http://192.168.1.3:8081"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="sonarr" data-src="http://192.168.1.3:8989"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="couchpotato" data-src="http://192.168.1.3:5050"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="headphones" data-src="http://192.168.1.3:8181"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="plex" data-src="http://192.168.1.3:32400/web/"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="plexpy" data-src="http://192.168.1.3:8083"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="deluge" data-src="http://192.168.1.3:8112"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="calibre" data-src="http://192.168.1.3:8082"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="ttrss" data-src="http://192.168.1.3/tt-rss/"><iframe src="" allowfullscreen></iframe></div>
<div class="tab-pane" id="madsonic" data-src="http://192.168.1.3:4040"><iframe src="" allowfullscreen></iframe></div>
</div>
</div>
<script>
$(document).ready(function() {
$('#myTabs').on('show.bs.tab', function(e) {
var paneId = $(e.target).attr('href');
var src = $(paneId).attr('data-src');
if ($(paneId+" iframe").attr("src")=="") {
$(paneId+" iframe").attr("src", src);
}
});
});
</script>
</body>
</html>
#!/bin/sh
#
# PROVIDE: madsonic
# REQUIRE: LOGIN DAEMON NETWORKING
# KEYWORD: shutdown
#
# To enable madsonic, add this line to your /etc/rc.conf:
#
# madsonic_enable="YES"
#
# And optionally these line:
#
# madsonic_user="username" # Default is "root"
# madsonic_bin="/path/to/madsonic.sh" # Default is "/usr/local/sbin/madsonic.sh"
. /etc/rc.subr
name="madsonic"
rcvar="${name}_enable"
load_rc_config $name
required_files=$madsonic_bin
: ${madsonic_enable="NO"}
: ${madsonic_user="root"}
: ${madsonic_port="4040"}
: ${madsonic_home="/usr/local/madsonic"}
: ${madsonic_bin="${madsonic_home}/madsonic.sh"}
: ${madsonic_music_folder="/mnt/media/music"}
: ${madsonic_podcast_folder="${madsonic_music_folder}/podcasts"}
: ${madsonic_playlist_folder="${madsonic_music_folder}/playlists"}
: ${madsonic_playlist_import_folder="${madsonic_playlist_folder}/import"}
: ${madsonic_playlist_export_folder="${madsonic_playlist_folder}/export"}
: ${madsonic_playlist_backup_folder="${madsonic_playlist_folder}/backup"}
: ${madsonic_pidfile="${madsonic_home}/madsonic.pid"}
status_cmd="${name}_status"
stop_cmd="${name}_stop"
command=$madsonic_bin
command_args="--pidfile=${madsonic_pidfile} --home=${madsonic_home} --port=${madsonic_port} --default-music-folder=${madsonic_music_folder} --default-podcast-folder=${madsonic_podcast_folder} --default-playlist-import-folder=${madsonic_playlist_import_folder} --default-playlist-export-folder=${madsonic_playlist_export_folder} --default-playlist-backup-folder=${madsonic_playlist_backup_folder}"
verify_pid() {
pid=`cat ${madsonic_pidfile} 2>/dev/null`
ps -p ${pid} | grep -q "madsonic"
return $?
}
madsonic_stop() {
echo "Stopping ${name}"
verify_pid
if [ -n "${pid}" ]; then
kill ${sig_stop} ${pid}
wait_for_pids ${pid}
echo "Stopped"
fi
rm -f ${madsonic_pidfile}
}
madsonic_status() {
verify_pid && echo "${name} is running as ${pid}" || echo "${name} is not running"
}
run_rc_command "$1"
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
index index.php index.htm index.html;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
root /usr/local/www;
listen 80;
server_name localhost;
location / {
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
# rewrite ^/.well-known/host-meta /nextcloud/public.php?service=host-meta
# last;
#rewrite ^/.well-known/host-meta.json
# /nextcloud/public.php?service=host-meta-json last;
location = /.well-known/carddav {
return 301 $scheme://$host/nextcloud/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/nextcloud/remote.php/dav;
}
location /.well-known/acme-challenge { }
location ^~ /nextcloud {
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Disable gzip to avoid the removal of the ETag header
gzip off;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
error_page 403 /nextcloud/core/templates/403.php;
error_page 404 /nextcloud/core/templates/404.php;
location /nextcloud {
rewrite ^ /nextcloud/index.php$uri;
}
location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS off;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^/nextcloud/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~* \.(?:css|js)$ {
try_files $uri /nextcloud/index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers (It is intended
# to have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read
# into this topic first.
# add_header Strict-Transport-Security "max-age=15768000;
# includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
try_files $uri /nextcloud/index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}
}
}
@Surgingchaos
Copy link

I'd like to thank you for this really informative guide, however I can't autostart couchpotato (it works when I start it manually). I get the following error after using /usr/local/etc/rc.d/couchpotato start

'/usr/local/etc/rc.d/couchpotato: WARNING: $command_interpreter /usr/local/bin/python != python'

@csjjpm
Copy link

csjjpm commented Mar 7, 2015

Hi,
I get an error "cp: /usr/local/headphones/init-alt.freebsd: No such file or directory" when performing this copy:
cp /usr/local/headphones/init-alt.freebsd /usr/local/etc/rc.d/headphones

I've looked in the headphones directory and can't see what to copy instead. Can you help?
thanks
Paul

@csjjpm
Copy link

csjjpm commented Mar 7, 2015

Surgingchaos -
I fixed that by doing:
pkg install python

@tmcarr
Copy link

tmcarr commented Jun 12, 2015

I made a few fixes to this in https://gist.github.com/tmcarr/1f9f0ede533d282fbc7f

Feel free to merge my changes.

@FrAllard
Copy link

FrAllard commented Sep 9, 2015

I had problem when compiling Deluge. There is a compiling problem in libtorrent-rasterbar and here is the solution.

Execute those commands (the subfolder "libtorrent-rasterbar-1.0.6" might change in the future)

cd /usr/ports/net-p2p/libtorrent-rasterbar/work/libtorrent-rasterbar-1.0.6/include/libtorrent
cp config.hpp config.hpp.original
nano -wc config.hpp

Replace the line:

define TORRENT_ICONV_ARG (char**)

With this line

define TORRENT_ICONV_ARG (const char**)

@FrAllard
Copy link

FrAllard commented Sep 9, 2015

The command to copy init script of Headphone is
cp /usr/local/headphones/init-scripts/init.freebsd /usr/local/etc/rc.d/headphones

@TonyBostonTB
Copy link

Hi and thanks for this. After all I can not install Deluge because I'm getting mentioned rasterbar errors.
The Line #define TORRENT_ICONV_ARG (const char**) is already set. But no luck with compiling.

1 error generated.
  CXXLD    libtorrent-rasterbar.la
libtool:   error: 'escape_string.lo' is not a valid libtool object
*** [libtorrent-rasterbar.la] Error code 1
1 error
*** [all-recursive] Error code 1
1 error
===> Compilation failed unexpectedly.
Try to set MAKE_JOBS_UNSAFE=yes and rebuild before reporting the failure to
the maintainer.
*** [do-build] Error code 1

Stop in /usr/ports/net-p2p/libtorrent-rasterbar.
*** [install] Error code 1

Stop in /usr/ports/net-p2p/libtorrent-rasterbar.
*** [lib-depends] Error code 1

Stop in /usr/ports/net-p2p/libtorrent-rasterbar-python.
*** [install] Error code 1

Stop in /usr/ports/net-p2p/libtorrent-rasterbar-python.
*** [run-depends] Error code 1

Stop in /usr/ports/net-p2p/deluge.
*** [install] Error code 1

Stop in /usr/ports/net-p2p/deluge.
root@deluge:/usr/ports/net-p2p/deluge #```

@MatKlucznyk
Copy link

I was having the same issue with the libtorrent compile. I noticed that there were two lines in the config.hpp file with #define TORRENT_ICONV_ARG, the first correct with (const char**) the second incorrect with (char**) changed the second and it was able to compile.

@Maglin
Copy link

Maglin commented Mar 27, 2016

SICKRAGETV is broken. Please update the git command to:
cd /usr/local && git clone git://github.com/SiCKRAGE/SickRage.git sickrage
which is the current working fork. Only took me 3 hours of searching to find it.

Also might be a good idea to help NOOB's like myself with a small paragraph explaining not to have ANY spaces in directory and file names. I had 8TB of data with lots of spaces that I pulled off my old windows system. Luckily I was able to get Detox from freshports and fixed my entire library in less than 5 minutes.

@axemann
Copy link

axemann commented Sep 13, 2016

Turns out there is an error in the Madsonic startup script above. Line 42 should have the '--port=' argument set to '${madsonic_port}', which gives:

command_args="--pidfile=${madsonic_pidfile} --home=${madsonic_home} --port=${madsonic_port} --default-music-folder=${madsonic_music_folder} --default-podcast-folder=${madsonic_podcast_folder} --default-playlist-import-folder=${madsonic_playlist_import_folder} --default-playlist-export-folder=${madsonic_playlist_export_folder} --default-playlist-backup-folder=${madsonic_playlist_backup_folder}"

Once that is corrected, Madsonic will start up on port 4040 (or whatever port you specify in the variable).

@jacobblock
Copy link
Author

jacobblock commented Oct 4, 2016

Thanks @Maglin and @axemann, moved to sickrage fork and fixed madsonic line. I have been using sickgear for some time and strongly recommend it. I will most likely move the guide over to that by the end of the year.

@Maglin spaces are fine on linux, but you will need to either escape the space with a backslash or encase the path in quotes. The majority of my files have spaces in them with no issues. (e.g. "My File.txt" or My\ File.txt will both auto complete fine with most shells).

@gaikokujinch
Copy link

I get stuck with Crashplan. Though I have the Oracle Java file in the distfiles folder, Crashplan still complains:

===> linux-crashplan-4.7.0_1 depends on file: /usr/local/linux-oracle-jdk1.8.0/bin/java - not found
===> Found saved configuration for linux-oracle-jdk18-8.112
===> linux-oracle-jdk18-8.112 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by linux-oracle-jdk18-8.112 for building
===> Extracting for linux-oracle-jdk18-8.112
=> SHA256 Checksum mismatch for jdk-8u112-linux-i586.tar.gz.
===> Refetch for 1 more times files: jdk-8u112-linux-i586.tar.gz
===> linux-oracle-jdk18-8.112 You must manually fetch the J2SE SDK download for the Linux platform (jdk-8u112-linux-i586.tar.gz) from http://www.oracle.com/technetwork/java/javase/downloads/index.html, place it in /usr/ports/distfiles and then run make again.

My distfiles folder shows

root@crashplan03:/usr/ports/distfiles # ls
CrashPlan_4.7.0_Linux.tgz
bash
bison-3.0.4.tar.xz
dialog4ports-0.1.6.tar.gz
gettext-0.19.8.1.tar.xz
jdk-8u112-linux-i586-demos.tar.gz
jre-8u112-linux-i586.tar.gz
m4-1.4.18.tar.xz

@unclenospam
Copy link

unclenospam commented Feb 10, 2017

How to add nzbhydra service:

cd /usr/local && git clone https://github.com/theotherp/nzbhydra.git nzbhydra
chown -R media:media nzbhydra
sysrc nzbhydra_enable=YES
sysrc nzbhydra_user=media
sysrc nzbhydra_group=media
sysrc nzbhydra_dir=/usr/local/nzbhydra

create a new rc.d script for nzbhydra.
nano /usr/local/etc/rc.d/nzbhydra

#!/bin/sh

# PROVIDE: nzbhydra
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="nzbhydra"
rcvar="${name}_enable"
load_rc_config ${name}

: ${nzbhydra_enable:="NO"}
: ${nzbhydra_user:="media"}
: ${nzbhydra_group:="media"}
: ${nzbhydra_dir:="/usr/local/nzbhydra"}

pidfile="/var/run/nzbhydra/nzbhydra.pid"
command="/usr/local/bin/python2.7"
command_args="/usr/local/nzbhydra/nzbhydra.py --pidfile ${pidfile} --nobrowser --daemon"

start_precmd="nzbhydra_prestart"
nzbhydra_prestart() {
        if [ -f ${pidfile} ]; then
                rm -f ${pidfile}
                echo "Removing stale pidfile."
        elif [ ! -d ${pidfile%/*} ]; then
                install -d -o ${nzbhydra_user} -g ${nzbhydra_group} ${pidfile%/*}
        fi

        if [ ! -d ${nzbhydra_datadir} ]; then
                install -d -o ${nzbhydra_user} -g ${nzbhydra_group} ${nzbhydra_datadir}
        fi
}

run_rc_command "$1"

save nano and exit
chmod +x /usr/local/etc/rc.d/nzbhydra

Restart your jail and access nzbhydra at http://jailip:5075/

@SavageCore
Copy link

SavageCore commented Jun 15, 2017

Is it just me or does madsonic require ffmpeg installation? I know all the docs say ffmpeg is bundled but it did not appear to be for me. I would get no transcoder found errors in the web ui.

I had to do the following:

cd /usr/ports/multimedia/ffmpeg
make config (enable LAME)
make install clean
mkdir /usr/local/madsonic/transcode
ln -s /usr/local/bin/ffmpeg /usr/local/madsonic/transcode/ffmpeg

Just to note I used madsonic-6.2.9040-standalone.tar.gz

HTTPS

Instructions for HTTPS Madsonic: https://gist.github.com/SavageCore/70edef4caf9c453374571fa4ad4f30f3

@onsosb
Copy link

onsosb commented Jan 28, 2018

Thanks so much for this write up, it cleared many questions for a beginner like me. I am wandering if you could please elaborate or add the process of how to add nextcloud to run from a jail in your setup above.
Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment