FoolFuuka/Install/Ubuntu16

From Bibliotheca Anonoma

This guide was written by ATC of desuarchive, and is designed for Debian/Ubuntu Linux servers. This guide is designed for Ubuntu 16.04 LTS servers (xenial).

Work in progress.


Prepare things

apt-get update
apt-get upgrade

Add the keys for HipHop Virtual Machine

from docs.hhvm.com

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94
sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"

Add repo for Percona Server for MySQL 5.7

from www.percona.com

wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb

Add repo for NGINX Stable

from nginx.org

wget https://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
sudo add-apt-repository "deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx"

Add repo for sphinxsearch

from sphinxsearch.com

sudo add-apt-repository ppa:builds/sphinxsearch-rel22

Install all the needed packages.

Nginx, HHVM, PHP5 Cli, PHP5 Curl, MariaDB, Maven (includes java), Sphinxsearch

sudo apt-get update
sudo apt-get install git nginx hhvm mariadb-server mariadb-client imagemagick maven openjdk-8-jdk-headless redis-server sphinxsearch

Install composer for downloading FoolFuuka dependencies.

from getcomposer.org

curl -sS https://getcomposer.org/installer | php

Move composer to bin

sudo mv composer.phar /usr/local/bin/composer

Edit HHVM config to use a unix socket.

sudo mkdir /var/run/hhvm/
sudo chown www-data:www-data /var/run/hhvm/
sudo nano /etc/hhvm/server.ini

Then remove the line starting with hhvm.server.port, and in its place add the following one:

hhvm.server.file_socket=/var/run/hhvm/hhvm.sock

Add required php.ini vars.

sudo nano /etc/hhvm/php.ini
date.timezone = UTC
upload_max_filesize = 32M
post_max_size = 32M

Enable the hhvm service.

sudo systemctl enable hhvm

Download FoolFuuka and install dependencies.

cd /var/www/
git clone https://github.com/pleebe/FoolFuuka.git foolfuuka
cd foolfuuka
composer dump-autoload --optimize
composer install 

Choose 'Y' to 3rd party assets.

Install Foolfuuka Plugins

You may need to find the repo on their github if their site doesn't work: https://github.com/FoolCode

cd /var/www/foolfuuka/app/foolz/foolframe/plugins
mkdir foolz
cd foolz
git clone https://github.com/pleebe/foolframe-plugin-articles.git
cd /var/www/foolfuuka/app/foolz/foolfuuka/plugins
mkdir foolz
cd foolz
git clone https://github.com/pleebe/foolfuuka-plugin-board-statistics.git
git clone https://github.com/FoolCode/foolfuuka-plugin-dice-roll.git
git clone https://github.com/pleebe/foolfuuka-plugin-intel-share.git
git clone https://github.com/pleebe/foolfuuka-plugin-popup-report.git
git clone https://github.com/FoolCode/foolfuuka-plugin-quests.git
git clone https://github.com/pleebe/foolfuuka-plugin-spam-guard.git
git clone https://github.com/pleebe/foolfuuka-plugin-thread-chunk.git
git clone https://github.com/pleebe/foolfuuka-plugin-adverts.git
git clone https://github.com/pleebe/foolfuuka-plugin-external-links.git
git clone https://github.com/pleebe/foolfuuka-plugin-fortune.git
git clone https://github.com/pleebe/foolfuuka-plugin-cloudflare-cache-purge.git
git clone https://github.com/pleebe/foolfuuka-plugin-table.git

Set Permissions and Group for FoolFuuka Directory

sudo mkdir /var/www/foolfuuka/public/foolfuuka/boards/
sudo chown -Rf www-data:www-data /var/www/foolfuuka
sudo chmod 777 /var/www/foolfuuka/public/foolfuuka/boards/

Install hhvm with nginx

Change the user in /etc/nginx/nginx.conf to www-data

sudo nano /etc/nginx/hhvm.conf
location ~ \.(hh|php)$ {
    fastcgi_keep_conn on;
    fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Configure Nginx to host foolfuuka

Create this file

sudo nano /etc/nginx/sites-enabled/archive.conf
server {
	listen 80;
	listen [::]:80;
	#listen 443 ssl;
	#listen [::]:443 ssl;

	#ssl_certificate /etc/nginx/ssl/myarchive.local.crt;
	#ssl_certificate_key /etc/nginx/ssl/myarchive.local.key;

	root /var/www/foolfuuka/public;
	index index.php;

	server_name myarchive.local;
	include hhvm.conf;

	client_max_body_size 2M;

	location / {
		try_files $uri $uri/ /index.php$is_args$args;
	}
}

Disable transparent_hugepage

su -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo nano /etc/default/grub

append transparent_hugepage=never to GRUB_CMDLINE_LINUX_DEFAULT, then save the file

sudo update-grub

Raise file limit

sudo nano /etc/security/limits.conf
* soft nofile 63545
* hard nofile 63545
* soft nproc 63545
* hard nproc 63545

edit MariaDB to use utf8mb4 for correct unicode processing

sudo nano /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
open-files-limit=40000

skip-log-bin
## Comment these to disable binary log
#log_bin			= /var/log/mysql/mariadb-bin
#log_bin_index		= /var/log/mysql/mariadb-bin.index
#expire_logs_days	= 10
#max_binlog_size         = 100M

[mysql]
default-character-set = utf8mb4

Enable toku (Find and Uncomment the load module)

sudo nano /etc/mysql/conf.d/tokudb.cnf 
sudo systemctl stop mysql
sudo reboot

Create the database and install Foolfuuka user accounts.

sudo mysql_secure_installation
mysql -u root -p
  SET GLOBAL default_storage_engine=TokuDB;
  SET GLOBAL log_bin_trust_function_creators = 1;
  CREATE USER 'asagi'@'localhost' IDENTIFIED BY 'pass';  
  CREATE USER 'foolfuuka'@'localhost' IDENTIFIED BY 'pass';
  CREATE USER 'sphinx'@'localhost' IDENTIFIED BY 'w3e2yzjQSG5WGDwM';
  CREATE DATABASE asagi DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
  CREATE DATABASE foolfuuka DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
  GRANT ALL PRIVILEGES ON `asagi`. * TO 'asagi'@'localhost';
  GRANT ALL PRIVILEGES ON `asagi`. * TO 'foolfuuka'@'localhost';
  GRANT ALL PRIVILEGES ON `foolfuuka`. * TO 'foolfuuka'@'localhost';
  GRANT SELECT ON `asagi`.* TO 'sphinx'@'localhost';
  GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE VIEW, TRIGGER, SHOW VIEW ON `asagi`.`index_counters` TO 'sphinx'@'localhost' WITH GRANT OPTION;
  FLUSH PRIVILEGES;
  exit

Install and compile Asagi from source.

sudo adduser asagi
sudo su asagi
cd ~
git clone https://github.com/oohnoitz/asagi.git optimizations
cd asagi
mvn package assembly:single
mv target/asagi-0.4.0-SNAPSHOT-full.jar ./asagi.jar

Configure Asagi

nano asagi.json

Insert the following JSON into that file:

{"settings": {
  "dumperEngine": "DumperJSON",
  "sourceEngine": "YotsubaJSON",

  "boardSettings": {
    "default": {
      "engine": "Mysql",
      "database": "asagi",
      "host": "localhost",
      "username": "asagi",
      "password": "pass",
      "charset": "utf8mb4",
      "path": "/var/www/foolfuuka/public/foolfuuka/boards/",
      "useOldDirectoryStructure": false,
      "webserverGroup": "www-data",
      "thumbThreads": 3,
      "mediaThreads": 0,
      "newThreadsThreads": 3,
      "deletedThreadsThresholdPage": 8,
      "refreshDelay": 30,
      "throttleAPI": false,
      "throttleURL": "a.4cdn.org",
      "throttleMillisec": 11100,

      "threadRefreshRate": 10,
      "pageSettings": [
        {"delay": 30, "pages": [0, 1]},
        {"delay": 500, "pages": [2, 3, 4, 5, 6, 7, 8]},
        {"delay": 30, "pages": [9, 10]}
      ]
    },

    "3": {},
    "a": {},
    "aco": {},
    "adv": {},
    "an": {},
    "asp": {},
    "b": {},
    "biz": {},
    "c": {},
    "cgl": {},
    "ck": {},
    "cm": {},
    "co": {},
    "d": {},
    "diy": {},
    "e": {},
    "f": {},
    "fa": {},
    "fit": {},
    "g": {},
    "gd": {},
    "gif": {},
    "h": {},
    "hc": {},
    "hm": {},
    "his": {},
    "hr": {},
    "i": {},
    "ic": {},
    "int": {},
    "jp": {},
    "k": {},
    "lgbt": {},
    "lit": {},
    "m": {},
    "mlp": {},
    "mu": {},
    "n": {},
    "news": {},
    "o": {},
    "out": {},
    "p": {},
    "po": {},
    "pol": {},
    "qa": {},
    "qst": {},
    "r": {},
    "r9k": {},
    "s": {},
    "s4s": {},
    "sci": {},
    "soc": {},
    "sp": {},
    "t": {},
    "tg": {},
    "toy": {},
    "trash": {},
    "trv": {},
    "tv": {},
    "u": {},
    "v": {},
    "vg": {},
    "vp": {},
    "vr": {},
    "w": {},
    "wg": {},
    "wsg": {},
    "wsr": {},
    "x": {},
    "y": {}
  }
}}

Start asagi (There is a better way to do this).

Maybe we should use systemd for it...

UseParallelGC adds Parallelization to the garbage collector, which really helps for Java.

screen java -XX:+UseParallelGC -XX:+UseParallelOldGC -verbose:gc -jar asagi.jar

ATC of Desuarchive prefers these parameters, which have two customizations.

  1. For the first parameter, Java by default will use 1/4th your system memory, so you can set your own hard memory roof to reduce usage or increase it. He used 6144m.
    • If you aren't archiving more than 8 boards, this probably won't be an issue that you need to deal with.
  2. The permsize is about the permanent generation objects: depends on your heap size.
    • This setting is probably related to how many boards are on Desuarchive, but Sunako doesn't had that sort of issue.
screen java -Xmx6144m -XX:+UseParallelGC -XX:+UseParallelOldGC -verbose:gc -XX:MaxPermSize=512m -jar asagi.jar

Install FoolFuuka

Now, Install FoolFuuka at the website using foolfuuka credentials Then, Configure asagi as the database and remove the table prefix from FoolFuuka.

The installer is quite self explanatory, just make sure to remove the Boards prefix.

Also make sure to install imagemagick and set the path in the config to it.

Note: In the installer one should have FoolFuuka table prefix set (default is fine ff_). But after installing one needs to set BOARD PREFIX to blank since asagi doesn't have any. FoolFuuka table prefix != board table prefix. Here's a code change that does it.

Add boards, Configure Sphinx

To configure Sphinx Search, take the following links:

http://IP/admin -> Search -> Generate Config. http://IP/admin -> Boards -> Edit -> Check Use SphinxSearch as search engine. On the Search panel, change the working directory (on Ubuntu) to the following:

/var/lib/sphinxsearch

Start Sphinxsearch

sudo nano /etc/default/sphinxsearch

Change the following line from

START=no

to

START=yes

Save and run the following command

sudo /etc/init.d/sphinxsearch start


Right-click and copy this config out of Foolfuuka and add your MySQL database information for asagi. Change the following line from

pid_file = /var/lib/sphinxsearch/searchd.pid

to

pid_file = /var/run/sphinxsearch/searchd.pid 

Then, paste this to /etc/sphinxsearch/sphinx.conf

If anything errors, kill any running instance of asagi and restart it

Build the indexes

sudo indexer *_ancient --rotate
sudo indexer *_main --rotate
sudo indexer *_delta --rotate

Configure Crontab

sudo crontab -e
@hourly sudo -u sphinxsearch /usr/bin/indexer --rotate *_delta > /dev/null
@daily sudo -u sphinxsearch /usr/bin/indexer --rotate *_main > /dev/null
@monthly sudo -u sphinxsearch /usr/bin/indexer --rotate *_ancient > /dev/null

Adding Archives

Inject your sql file into the asagi database (assuming that your sql file is called "dump.sql"):

mysql -u root -p asagi < dump.sql

Then, in the admin panel, simply add the board that corresponds to the board you injected.

Note: This only applies if you are importing a new board. For importing a dump to an existing board table, you will need to use the fuuka-to-asagi tool found in the asagi-toolkit

Extra configuration

Depending on which distro you use, some configs might need to be changed.

Fixing thumbnail creation

Foolfuuka might not be able to generate thumbnails for images to be posted. If so, check:

$ whereis convert
convert: /usr/bin/convert /usr/share/man/man1/convert.1.gz

and make sure it is the same value in Admin panel -> general -> Imagemagick Convert


Enable Redis Cache

nano /var/www/foolfuuka/app/foolz/foolframe/config/cache.php
<?php 
return array (
  'type' => 'redis',
  'format' => 'smart_json',
  'prefix' => 'foolframe_TUi_',
  'servers' => 
  array (
  ),
);