I finally nailed the install to Ubuntu 16.04. It's no single line code and was very manual but I wanted to debug where this was failing and finally figured it out. Here is what I had to do (pardon the elementary nature of the process, I'm still a real Linux noob)...
CAUTION:
These instructions only work for Ubuntu 16.04 Xenial because I deleted all code referencing other builds. If your version is different, make sure to retain what is relevant for your build.
AMATEUR HOUR WARNING
As I mentioned before, as I'm still very new to Linux, If someone here can likely figure out a much better way to get this setup, even better. I hadn't been able to find any instructions on the internet that proved useful even though my google-foo is quite strong, and I was determined to get this setup, if for no other reason than this would be a great learning experience.
- Setup a VM in Hyper-V and completed a fresh install of Ubuntu 16.04 server
- During the install I selected to manually install the necessary packages so this was a minimal server install
- Full update
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
- Manually install apache
sudo apt-get install apache2 apache2-utils
- Enable apache to autostart
sudo systemctl enable apache2
- Set ownership of root directory
sudo chown www-data /var/www/html/ -R
- Install MariaDB
sudo apt-get install mariadb-server mariadb-client
- Enable MariaDB to autostart
sudo systemctl enable mysql
- Complete MariaDB setup. When prompted, select pwd, remove anonymous, disallow remote root, remove test db and reload db
sudo mysql_secure_installation
- Install PHP
sudo apt-get install php7.0-fpm php7.0-mysql php7.0-common php7.0-gd php7.0-json php7.0-cli php7.0-curl libapache2-mod-php7.0
- Enable apache PHP module and restart apache
sudo a2enmod php7.0
sudo systemctl restart apache2
That got me to my base LAMP install. I was now ready to download Snipe-IT. From the documentation I selected #3 and ran each command one at a time.
sudo wget https://raw.githubusercontent.com/snipe/snipe-it/master/install.sh
chmod 744 install.sh
Then before running the final command I decided to examine the "install.sh" contents to see what was happening. Turns out it downloads and calls another script so before running that second script, I wanted to have a look at it so I commented out the final command that executes the second script so it would only download the file to my home directory and set permissions. I then ran the script and got the second script so I could look at it.
sudo ./install.sh
Once I looked in the second script (snipeit.sh) I noticed there is a lot of content that is trying to account for various Linux builds so I went through and deleted everything that didn't have anything to do with my version of Linux in order to simplify the debugging process. I also deleted every code reference to >> /var/log/snipeit-install.log 2>&1
since I had noticed on a previous run that this was causing permissions errors. Rather than have to deal with permissions, I didn't care about saving the install log and instead allowed it to display on the terminal session.
The next error I got was related to the composer where the code was trying to install using sudo
(you'll note that this is set at the top of the script). Apparently composer cannot be installed this way. Keep reading for how I addressed that.
I then also removed most references to updates or installing the LAMP stack as I had already done this. Something that kept causing errors in the script even when I chose to run from nothing but a minimal Ubuntu install without apache, mysql or php. I ended-up modifying the script quite a bit, hard-coding some of the variables to make debugging a little easier. This is the final script I had saved as "snipeit.sh"
#!/bin/bash
######################################################
# Snipe-It Install Script #
# Script created by Mike Tucker #
# [email protected] #
# This script is just to help streamline the #
# install process for Debian and CentOS #
# based distributions. I assume you will be #
# installing as a subdomain on a fresh OS install. #
# Right now I'm not going to worry about SMTP setup #
# #
# Feel free to modify, but please give #
# credit where it's due. Thanks! #
######################################################
# ensure running as root
if [ "$(id -u)" != "0" ]; then
exec sudo "$0" "$@"
fi
#First things first, let's set some variables and find our distro.
clear
name="snipeit"
si="Snipe-IT"
hostname="$(hostname)"
fqdn="$(hostname --fqdn)"
ans=default
hosts=/etc/hosts
file=master.zip
tmp=/tmp/$name
fileName=snipe-it-master
rm -rf $tmp/
mkdir $tmp
echo "
_____ _ __________
/ ___/____ (_)___ ___ / _/_ __/
\__ \/ __ \/ / __ \/ _ \______ / / / /
___/ / / / / / /_/ / __/_____// / / /
/____/_/ /_/_/ .___/\___/ /___/ /_/
/_/
"
echo ""
echo ""
echo " Welcome to Snipe-IT Inventory Installer for Centos and Debian!"
echo ""
#Get your FQDN.
echo -n " Q. What is the FQDN of your server? ($fqdn): "
read fqdn
if [ -z "$fqdn" ]; then
fqdn="$(hostname --fqdn)"
fi
echo " Setting to $fqdn"
echo ""
#Do you want to set your own passwords, or have me generate random ones?
until [[ $ans == "yes" ]] || [[ $ans == "no" ]]; do
echo -n " Q. Do you want me to automatically create the snipe database user password? (y/n) "
read setpw
case $setpw in
[yY] | [yY][Ee][Ss] )
mysqluserpw="$(echo `< /dev/urandom tr -dc _A-Za-z-0-9 | head -c16`)"
ans="yes"
;;
[nN] | [n|N][O|o] )
echo -n " Q. What do you want your snipeit user password to be?"
read -s mysqluserpw
echo ""
ans="no"
;;
*) echo " Invalid answer. Please type y or n"
;;
esac
done
#Snipe says we need a new 32bit key, so let's create one randomly and inject it into the file
random32="$(echo `< /dev/urandom tr -dc _A-Za-z-0-9 | head -c32`)"
#db_setup.sql will be injected to the database during install.
#Again, this file should be removed, which will be a prompt at the end of the script.
dbsetup=$tmp/db_setup.sql
echo >> $dbsetup "CREATE DATABASE snipeit;"
echo >> $dbsetup "GRANT ALL PRIVILEGES ON snipeit.* TO snipeit@localhost IDENTIFIED BY '$mysqluserpw';"
#Let us make it so only root can read the file. Again, this isn't best practice, so please remove these after the install.
sudo chown root:root $dbsetup
sudo chmod 700 $dbsetup
## TODO: Progress tracker on each step
##################################### Install for Ubuntu ##############################################
webdir=/var/www
#Update/upgrade Debian/Ubuntu repositories, get the latest version of git.
echo ""
echo "## Updating ubuntu in the background. Please be patient."
echo ""
apachefile=/etc/apache2/sites-available/$name.conf
echo "## Installing packages."
echo "## Setting up LAMP."
sudo apt-get install -y git unzip php php-mcrypt php-curl php-mysql php-gd php-ldap php-zip php-mbstring
#Enable mcrypt and rewrite
echo "## Enabling mcrypt and rewrite"
sudo phpenmod mcrypt
sudo phpenmod mbstring
sudo a2enmod rewrite
# Get files and extract to web dir
echo ""
echo "## Downloading snipeit and extract to web directory."
sudo wget -P $tmp/ https://github.com/snipe/snipe-it/archive/$file
sudo unzip -qo $tmp/$file -d $tmp/
sudo cp -R $tmp/$fileName $webdir/$name
sudo ls -al /etc/apache2/mods-enabled/rewrite.load
#Create a new virtual host for Apache.
echo "## Create Virtual host for apache."
echo >> $apachefile ""
echo >> $apachefile ""
echo >> $apachefile "<VirtualHost *:80>"
echo >> $apachefile "ServerAdmin webmaster@localhost"
echo >> $apachefile " <Directory $webdir/$name/public>"
echo >> $apachefile " Require all granted"
echo >> $apachefile " AllowOverride All"
echo >> $apachefile " </Directory>"
echo >> $apachefile " DocumentRoot $webdir/$name/public"
echo >> $apachefile " ServerName $fqdn"
echo >> $apachefile " ErrorLog /var/log/apache2/snipeIT.error.log"
echo >> $apachefile " CustomLog /var/log/apache2/access.log combined"
echo >> $apachefile "</VirtualHost>"
echo "## Setting up hosts file."
echo >> $hosts "127.0.0.1 $hostname $fqdn"
sudo a2ensite $name.conf
cat > $webdir/$name/.env <<-EOF
#Created By Snipe-it Installer
APP_TIMEZONE=$(cat /etc/timezone)
DB_HOST=localhost
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=$mysqluserpw
APP_URL=http://$fqdn
APP_KEY=$random32
EOF
# Setup Mysql, then run the command.
/usr/bin/mysql_secure_installation
echo "## Creating MySQL Database and user. "
echo "## Please Input your MySQL/MariaDB root password: "
mysql -u root -p < $dbsetup
echo "## Securing Mysql"
# Have user set own root password when securing install
# and just set the snipeit database user at the beginning
echo ""
echo ""
echo "## Cleaning up..."
rm -f snipeit.sh
rm -f install.sh
rm -rf $tmp/
echo "## Done!"
sleep 1
This got me about 90% of the way there. I then had to run the following commands one at a time (note that composer is not run from the elevated command)
cd /var/www/snipeit
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
To finish it off, I set the required permissions.
sudo chmod -R 755 /var/www/snipeit/storage
sudo chmod -R 755 /var/www/snipeit/storage/private_uploads
sudo chmod -R 755 /var/www/snipeit/public/uploads
sudo chown -R www-data:www-data /var/www/snipeit
sudo service apache2 restart
Because I'm using this internally, I edited the sites-available/snipeit.conf file as follows...
<VirtualHost *:80>
ServerAdmin [email protected]
<Directory /var/www/snipeit/public>
Require all granted
AllowOverride All
</Directory>
DocumentRoot /var/www/snipeit/public
ServerName snipeit.domain.com
ServerAlias XXX.XXX.XXX.XXX #This is the server IP address
ServerAlias localhost
ErrorLog ${APACHE_LOG_DIR}/sniptit.error.log
CustomLog ${APACHE_LOG_DIR}/snipeit.access.log combined
</VirtualHost>
The installation will have created a .env file in your root folder however, I figured out that this file was incomplete. So I added the missing values based on documentation for Snipe-IT and this is the resulting /var/www/snipeit/.env file...
#Created By Snipe-it Installer
# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_TIMEZONE=Canada/Eastern
#The above is set during install
APP_ENV=production
APP_DEBUG=false
APP_LOCALE=en
APP_URL=http://snipeit.domain.com
#This has to be exactly the correct FQDN to get to your Snipt-IT install. If you are using local IP address only then this must be in the IP address format like http://XXX.XXX.XXX.XXX
APP_KEY=XXXXXXXXXXXXXXXX
#The above is set during install
# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=snipeit
DB_USERNAME=XXXXXXXXX
#The above is set during install
DB_PASSWORD=XXXXXXXXXXXX
#The above is set during install
DB_PREFIX=null
DB_DUMP_PATH='/usr/local/bin'
# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=outlook.office365.com
#This is correct if you are using Office 365 for your email
MAIL_PORT=587
MAIL_USERNAME=XXXXXXXXXXX
#Mail username, usually same as email address
MAIL_PASSWORD=XXXXXXXXXXX
#Your email password
MAIL_ENCRYPTION=TLS
[email protected]
[email protected]
# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
# This should be gd or imagick
# --------------------------------------------
IMAGE_LIB=gd
# --------------------------------------------
# OPTIONAL: SESSION SETTINGS
# --------------------------------------------
SESSION_LIFETIME=12000
EXPIRE_ON_CLOSE=false
ENCRYPT=false
COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false
Once that was updated, I rebooted the server for good measure and was able to navigate to my server IP address http://XXX.XXX.XXX.XXX and was presented with the Pre-flight & Setup screen.
For reference, this is where to find the .env file config details.
Once you're at the pre-flight page and everything is green, you can navigate your way to setting up the db and user and begin to enter your first assets.
Hope this proves useful.