# Server Software

Server software configuration and installation procedures such as Apache, and Postfix

# Apache Option FollowSymLinks not allowed here Error

Apache htaccess `Option FollowSymLinks not allowed here` error:  
```
find /home -name ".htaccess" -type f -exec sed -i '/FollowSymLinks/SymLinksIfOwnerMatch/g' {} ";"
```

# Migrating Self-Signed SSL Certificate to LetsEncrypt Certificate

### Download Let's Encrypt Client

1. `<span class="pln">sudo </span><span class="pun">-</span><span class="pln">s</span>`
2. `<span class="pln">git clone https</span><span class="pun">:</span><span class="com">//github.com/letsencrypt/letsencrypt /opt/letsencrypt</span>`

### Update Apache Configuration

Let's Encrypt does not detect multiple virtual host in a single file, so if you have multiple virtual hosts in a single file, you need to separate it and update the configuration for SSL only. Then redirect all plain-text traffic to SSL using a single virtual host.

Create a new virtual host in `/etc/httpd/conf.d/redirect_ssl.conf` to redirect plain-text traffic to SSL, replace all `<domain>`to your TLD, such as `example.com`:

1. `<span class="tag"><VirtualHost</span><span class="pln"> *:80</span><span class="tag">></span>`
2. `<span class="pln"> ServerName </span><span class="tag"><domain></span>`
3. `<span class="pln"> ServerAlias *.</span><span class="tag"><domain></span>`
4. `<span class="pln"> RewriteEngine on</span>`
5. `<span class="pln"> RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]</span>`
6. `<span class="tag"></VirtualHost></span>`

### Setup SSL Certificates

1. `<span class="pln">cd </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">letsencrypt</span>`
2. `<span class="pun">./</span><span class="pln">letsencrypt</span><span class="pun">-</span><span class="kwd">auto</span> <span class="pun">--</span><span class="pln">apache </span><span class="pun">-</span><span class="pln">d </span><span class="str"><domain></span> <span class="pun">-</span><span class="pln">d www</span><span class="pun">.<</span><span class="pln">domain</span><span class="pun">></span> <span class="pun">-</span><span class="pln">d </span><span class="str"><subdomain></span><span class="pun">.<</span><span class="pln">domain</span><span class="pun">></span>`

Replacing `<domain>` with your domain, subsequent subdomains can be specified with `-d` option.

### Restart Apache and Test

1. `<span class="pln">systemctl restart httpd</span>`

### (Optional) Renewing SSL Certificates

Let's Encrypt issue **90 days** validity certificates, but you can however, renew it earlier in case errors occurred.

To renew the certificates, simply use the following command:

1. `<span class="str">/opt/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">letsencrypt</span><span class="pun">-</span><span class="kwd">auto</span><span class="pln"> renew</span>`

If you have just created a new certificate, Let's Encrypt will never issue you a new one, it will only issue a new certificate for your domains if the validity period is **less than 30 days**, so, you can create a cronjob to try and renew the certificate every day, week or month, in case anything goes wrong with your certificate.

To setup cronjob to automatically renew certificate, enter command `crontab -e` to create a new cronjob and add the following line:

1. `<span class="lit">0</span> <span class="lit">3</span> <span class="pun">*</span> <span class="pun">*</span> <span class="lit">1</span> <span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">letsencrypt</span><span class="pun">-</span><span class="kwd">auto</span><span class="pln"> renew </span><span class="pun">>></span> <span class="str">/var/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">le</span><span class="pun">-</span><span class="pln">renew</span><span class="pun">.</span><span class="pln">log</span>`

The cronjob above will run on **every monday** at **3 A.M.**, it will append any output from `/opt/letsencrypt/letsencrypt-auto`to `/var/log/le-renew.log`. Please refer to the reference for more info on Linux cronjobs.

### References

1. [Digital Ocean Article](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-centos-7)
2. [Let's Encrypt Article](https://letsencrypt.org/getting-started/)
3. [Cronjob Format](http://www.nncron.ru/help/EN/working/cron-format.htm)

# LAMP Stack Upgrade Issues

### "Table Doesn't Exists" After MySQL/MariaDB Upgrade

Paste MySQL data directory to upgraded data directory, containing `ibdata1`, `ib_logfile0` and `ib_logfile1`, in `lampp`, it's `/opt/lampp/var/mysql`:

1. `<span class="pln">sudo cp </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">lampp_backup</span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">mysql </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">lampp</span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">mysql</span>`
2. `<span class="pln">sudo chown </span><span class="pun">-</span><span class="pln">R mysql</span><span class="pun">:</span><span class="pln">mysql </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">lampp</span><span class="pun">/</span><span class="pln">mysql</span>`

# Standard Installation Procedures for LAMP Stack on CentOS 7

### 1. System Upgrade

1. `<span class="pln">yum </span><span class="pun">-</span><span class="pln">y update</span>`

### 2. Install Required Software

1. `<span class="pln">yum </span><span class="pun">-</span><span class="pln">y install git policycoreutils</span><span class="pun">-</span><span class="pln">python httpd mariadb mariadb</span><span class="pun">-</span><span class="pln">server php</span><span class="pun">-</span><span class="pln">mysql php</span><span class="pun">-</span><span class="pln">gd php</span><span class="pun">-</span><span class="pln">ldap php</span><span class="pun">-</span><span class="pln">odbc php</span><span class="pun">-</span><span class="pln">pear php</span><span class="pun">-</span><span class="pln">xml php</span><span class="pun">-</span><span class="pln">xmlrpc php</span><span class="pun">-</span><span class="pln">mbstring php</span><span class="pun">-</span><span class="pln">snmp php</span><span class="pun">-</span><span class="pln">soap curl curl</span><span class="pun">-</span><span class="pln">devel</span>`

### 3. Setup MySQL Server

1. `<span class="pln">mysql_secure_installation</span>`

4\. Start and Enable All Services

1. `<span class="pln">systemctl enable httpd</span>`
2. `<span class="pln">systemctl enable mariadb</span>`
3. `<span class="pln">systemctl start httpd</span>`
4. `<span class="pln">systemctl start mariadb</span>`

### 5. Open Firewall Ports

1. `<span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">zone</span><span class="pun">=</span><span class="kwd">public</span> <span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">service</span><span class="pun">=</span><span class="pln">http</span>`
2. `<span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">zone</span><span class="pun">=</span><span class="kwd">public</span> <span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">service</span><span class="pun">=</span><span class="pln">https</span>`
3. `<span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">zone</span><span class="pun">=</span><span class="kwd">public</span> <span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=<</span><span class="pln">ssh_port</span><span class="pun">>/</span><span class="pln">tcp</span>`
4. `<span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">reload</span>`

### 6. Change SSH Port

1. `<span class="pln">vim </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">ssh</span><span class="pun">/</span><span class="pln">sshd_config </span><span class="com">#and append 'Port <ssh_port>'</span>`
2. `<span class="pln">semanage port </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">t </span><span class="typ">ssh_port_t</span> <span class="pun">-</span><span class="pln">p tcp </span><span class="str"><ssh_port></span>`
3. `<span class="pln">systemctl restart sshd</span>`

### 7. Enable Shutdown Button

Edit `/etc/systemd/logind.conf` and uncomment the following 2 lines:

1. `<span class="typ">PowerKeyIgnoreInhibited</span><span class="pun">=</span><span class="kwd">no</span>`
2. `<span class="typ">HandlePowerKey</span><span class="pun">=</span><span class="pln">poweroff</span>`

### 8. Reboot System

1. `<span class="pln">reboot</span>`

## (HP MicroServer Only)

Edit `/etc/default/grub` and append `clocksource=hpet nolapic` to the end of `GRUB_CMDLINE_LINUX` variable.

# Slow Loading on Ownloud 8

Change `/var/www/html/owncloud/config/config.php` database host to `127.0.0.1` instead of `localhost`

# Postfix and Dovecot Configuration

<h3 id="bkmrk-installation">Installation</h3>
<ol class="linenums" id="bkmrk-hostnamectl-set-host">
<li class="L0"><code><span class="pln">hostnamectl </span><span class="kwd">set</span><span class="pun">-</span><span class="pln">hostname mail</span><span class="pun">.&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L1"><code><span class="pln">yum </span><span class="pun">-</span><span class="pln">y install postfix dovecot</span></code></li>
</ol>
<h3 id="bkmrk-postfix-configuratio">Postfix Configuration</h3>
<ol id="bkmrk-append-the-following">
<li>
<p>Append the following to <code>/etc/postfix/main.cf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">myhostname </span><span class="pun">=</span><span class="pln"> mail</span><span class="pun">.&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L1"><code><span class="pln">mydomain </span><span class="pun">=</span> <span class="str">&lt;domain&gt;</span><span class="pun">.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L2"><code><span class="pln">myorigin </span><span class="pun">=</span><span class="pln"> $mydomain</span></code></li>
<li class="L3"><code><span class="pln">home_mailbox </span><span class="pun">=</span><span class="pln"> mail</span><span class="pun">/</span></code></li>
<li class="L4"><code><span class="pln">mynetworks </span><span class="pun">=</span> <span class="lit">127.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">8</span> <span class="pun">&lt;</span><span class="pln">domain IP</span><span class="pun">&gt;</span></code></li>
<li class="L5"><code><span class="pln">inet_interfaces </span><span class="pun">=</span><span class="pln"> all</span></code></li>
<li class="L6"><code><span class="pln">mydestination </span><span class="pun">=</span><span class="pln"> $myhostname</span><span class="pun">,</span><span class="pln"> localhost</span><span class="pun">.</span><span class="pln">$mydomain</span><span class="pun">,</span><span class="pln"> localhost</span><span class="pun">,</span><span class="pln"> $mydomain</span></code></li>
<li class="L7"><code><span class="pln">smtpd_sasl_type </span><span class="pun">=</span><span class="pln"> dovecot</span></code></li>
<li class="L8"><code><span class="pln">smtpd_sasl_path </span><span class="pun">=</span> <span class="kwd">private</span><span class="pun">/</span><span class="pln">auth</span></code></li>
<li class="L9"><code><span class="pln">smtpd_sasl_local_domain </span><span class="pun">=</span></code></li>
<li class="L0"><code><span class="pln">smtpd_sasl_security_options </span><span class="pun">=</span><span class="pln"> noanonymous</span></code></li>
<li class="L1"><code><span class="pln">broken_sasl_auth_clients </span><span class="pun">=</span><span class="pln"> yes</span></code></li>
<li class="L2"><code><span class="pln">smtpd_sasl_auth_enable </span><span class="pun">=</span><span class="pln"> yes</span></code></li>
<li class="L3"><code><span class="pln">smtpd_recipient_restrictions </span><span class="pun">=</span><span class="pln"> permit_sasl_authenticated</span><span class="pun">,</span><span class="pln">permit_mynetworks</span><span class="pun">,</span><span class="pln">reject_unauth_destination</span></code></li>
<li class="L4"><code><span class="pln">smtp_tls_security_level </span><span class="pun">=</span><span class="pln"> may</span></code></li>
<li class="L5"><code><span class="pln">smtpd_tls_security_level </span><span class="pun">=</span><span class="pln"> may</span></code></li>
<li class="L6"><code><span class="pln">smtp_tls_note_starttls_offer </span><span class="pun">=</span><span class="pln"> yes</span></code></li>
<li class="L7"><code><span class="pln">smtpd_tls_loglevel </span><span class="pun">=</span> <span class="lit">1</span></code></li>
<li class="L8"><code><span class="pln">smtpd_tls_key_file </span><span class="pun">=</span> <span class="str">/etc/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">live</span><span class="pun">/&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;/</span><span class="pln">privkey</span><span class="pun">.</span><span class="pln">pem</span></code></li>
<li class="L9"><code><span class="pln">smtpd_tls_cert_file </span><span class="pun">=</span> <span class="str">/etc/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">live</span><span class="pun">/&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;/</span><span class="pln">fullchain</span><span class="pun">.</span><span class="pln">pem</span></code></li>
<li class="L0"><code><span class="pln">smtpd_tls_received_header </span><span class="pun">=</span><span class="pln"> yes</span></code></li>
<li class="L1"><code><span class="pln">smtpd_tls_session_cache_timeout </span><span class="pun">=</span> <span class="lit">3600s</span></code></li>
<li class="L2"><code><span class="pln">smtpd_use_tls</span><span class="pun">=</span><span class="pln">yes</span></code></li>
<li class="L3"><code><span class="pln">tls_random_source </span><span class="pun">=</span><span class="pln"> dev</span><span class="pun">:</span><span class="str">/dev/</span><span class="pln">urandom</span></code></li>
<li class="L4"><code><span class="pln">virtual_alias_domains </span><span class="pun">=</span> <span class="str">&lt;domain&gt;</span><span class="pun">.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L5"><code><span class="pln">virtual_alias_maps </span><span class="pun">=</span><span class="pln"> hash</span><span class="pun">:</span><span class="str">/etc/</span><span class="pln">postfix</span><span class="pun">/</span><span class="kwd">virtual</span></code></li>
</ol>
</li>
<li>
<p>Find and uncomment the following lines in <code>/etc/postfix/main.cf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="com">#inet_interfaces = localhost</span></code></li>
<li class="L1"><code><span class="com">#mydestination = $myhostname, localhost.$mydomain, localhost</span></code></li>
</ol>
</li>
<li>
<p>Append the following lines to <code>/etc/postfix/master.cf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">submission inet n </span><span class="pun">-</span><span class="pln"> n </span><span class="pun">-</span> <span class="pun">-</span><span class="pln"> smtpd</span></code></li>
<li class="L1"><code> <span class="pun">-</span><span class="pln">o syslog_name</span><span class="pun">=</span><span class="pln">postfix</span><span class="pun">/</span><span class="pln">submission</span></code></li>
<li class="L2"><code> <span class="pun">-</span><span class="pln">o smtpd_sasl_auth_enable</span><span class="pun">=</span><span class="pln">yes</span></code></li>
<li class="L3"><code> <span class="pun">-</span><span class="pln">o smtpd_recipient_restrictions</span><span class="pun">=</span><span class="pln">permit_sasl_authenticated</span><span class="pun">,</span><span class="pln">reject_unauth_destination</span></code></li>
<li class="L4"><code> <span class="pun">-</span><span class="pln">o milter_macro_daemon_name</span><span class="pun">=</span><span class="pln">ORIGINATING</span></code></li>
<li class="L5"><code><span class="pln">smtps inet n </span><span class="pun">-</span><span class="pln"> n </span><span class="pun">-</span> <span class="pun">-</span><span class="pln"> smtpd</span></code></li>
<li class="L6"><code> <span class="pun">-</span><span class="pln">o syslog_name</span><span class="pun">=</span><span class="pln">postfix</span><span class="pun">/</span><span class="pln">smtps</span></code></li>
<li class="L7"><code> <span class="pun">-</span><span class="pln">o smtpd_sasl_auth_enable</span><span class="pun">=</span><span class="pln">yes</span></code></li>
<li class="L8"><code> <span class="pun">-</span><span class="pln">o smtpd_recipient_restrictions</span><span class="pun">=</span><span class="pln">permit_sasl_authenticated</span><span class="pun">,</span><span class="pln">reject_unauth_destination</span></code></li>
<li class="L9"><code> <span class="pun">-</span><span class="pln">o milter_macro_daemon_name</span><span class="pun">=</span><span class="pln">ORIGINATING</span></code></li>
</ol>
</li>
<li>
<p>Make sure that the following is present in <code>/etc/postfix/main.cf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">alias_maps </span><span class="pun">=</span><span class="pln"> hash</span><span class="pun">:</span><span class="str">/etc/</span><span class="pln">aliases</span></code></li>
</ol>
</li>
<li>
<p>Edit and add the desired email address to <code>/etc/postfix/virtual</code> such as the following:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">info@</span><span class="str">&lt;domain&gt;</span><span class="pun">.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span><span class="pln"> admin</span></code></li>
<li class="L1"><code><span class="pln">webmaster@</span><span class="str">&lt;domain&gt;</span><span class="pun">.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span><span class="pln"> admin</span></code></li>
</ol>
</li>
<li>
<p>Create a map database: <code>postmap /etc/postfix/virtual</code></p>
</li>
</ol>
<h3 id="bkmrk-dovecot-configuratio">Dovecot Configuration</h3>
<ol id="bkmrk-find-and-modify-the-">
<li>
<p>Find and modify the following lines in <code>/etc/dovecot/conf.d/10-master.conf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="com"># Postfix smtp-auth</span></code></li>
<li class="L1"><code><span class="pln">unix_listener </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">spool</span><span class="pun">/</span><span class="pln">postfix</span><span class="pun">/</span><span class="kwd">private</span><span class="pun">/</span><span class="pln">auth </span><span class="pun">{</span></code></li>
<li class="L2"><code><span class="pln"> mode </span><span class="pun">=</span> <span class="lit">0660</span></code></li>
<li class="L3"><code><span class="pln"> user </span><span class="pun">=</span><span class="pln"> postfix</span></code></li>
<li class="L4"><code> <span class="kwd">group</span> <span class="pun">=</span><span class="pln"> postfix</span></code></li>
<li class="L5"><code><span class="pun">}</span></code></li>
</ol>
</li>
<li>
<p>Find and modify the following lines in <code>/etc/dovecot/conf.d/10-auth.conf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">auth_mechanisms </span><span class="pun">=</span><span class="pln"> plain login</span></code></li>
</ol>
</li>
<li>
<p>Find and modify the following lines in <code>/etc/dovecot/conf.d/10-mail.conf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">mail_location </span><span class="pun">=</span><span class="pln"> maildir</span><span class="pun">:~/</span><span class="pln">mail</span></code></li>
</ol>
</li>
<li>
<p>Find and modify the following lines in <code>/etc/dovecot/conf.d/20-pop3.conf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">pop3_uidl_format </span><span class="pun">=</span> <span class="pun">%</span><span class="lit">08Xu</span><span class="pun">%</span><span class="lit">08Xv</span></code></li>
</ol>
</li>
<li>
<p>Find and modify the following lines in <code>/etc/dovecot/conf.d/10-ssl.conf</code>:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">ssl_cert </span><span class="pun">=</span> <span class="pun">&lt;</span><span class="str">/etc/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">live</span><span class="pun">/&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;/</span><span class="pln">fullchain</span><span class="pun">.</span><span class="pln">pem</span></code></li>
<li class="L1"><code><span class="pln">ssl_key </span><span class="pun">=</span> <span class="pun">&lt;</span><span class="str">/etc/</span><span class="pln">letsencrypt</span><span class="pun">/</span><span class="pln">live</span><span class="pun">/&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;/</span><span class="pln">privkey</span><span class="pun">.</span><span class="pln">pem</span></code></li>
</ol>
</li>
</ol>
<h3 id="bkmrk-restart-and-enable-s">Restart and Enable Services</h3>
<ol class="linenums" id="bkmrk-systemctl-restart-po">
<li class="L0"><code><span class="pln">systemctl restart postfix</span></code></li>
<li class="L1"><code><span class="pln">systemctl enable postfix</span></code></li>
<li class="L2"><code><span class="pln">systemctl restart dovecot</span></code></li>
<li class="L3"><code><span class="pln">systemctl enable dovecot</span></code></li>
</ol>
<h3 id="bkmrk-open-firewall-ports">Open Firewall Ports</h3>
<ol class="linenums" id="bkmrk-firewall-cmd---perma">
<li class="L0"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">service</span><span class="pun">=</span><span class="pln">smtp</span></code></li>
<li class="L1"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=</span><span class="lit">587</span><span class="pun">/</span><span class="pln">tcp</span></code></li>
<li class="L2"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=</span><span class="lit">465</span><span class="pun">/</span><span class="pln">tcp</span></code></li>
<li class="L3"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=</span><span class="lit">110</span><span class="pun">/</span><span class="pln">tcp</span></code></li>
<li class="L4"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">service</span><span class="pun">=</span><span class="pln">pop3s</span></code></li>
<li class="L5"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=</span><span class="lit">143</span><span class="pun">/</span><span class="pln">tcp</span></code></li>
<li class="L6"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">service</span><span class="pun">=</span><span class="pln">imaps</span></code></li>
<li class="L7"><code><span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">reload</span></code></li>
</ol>
<h3 id="bkmrk-configure-dns">Configure DNS</h3>
<ol id="bkmrk-add-an-a-record-for-">
<li>
<p>Add an <code>A</code> record for the mail server:</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">name </span><span class="pun">=</span><span class="pln"> mail</span><span class="pun">.&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span><span class="str">`</span></code></li>
<li class="L1"><code><span class="str">IP = &lt;mail server IP&gt;</span></code></li>
</ol>
</li>
<li>
<p>Add an <code>MX</code> record:</p>
<ol class="linenums">
<li class="L0"><code><span class="typ">Hostname</span> <span class="pun">=</span><span class="pln"> mail</span><span class="pun">.&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L1"><code><span class="typ">Priority</span> <span class="pun">=</span> <span class="lit">5</span></code></li>
</ol>
</li>
<li>
<p>Add the following <code>TXT</code> records:</p>
<ol class="linenums">
<li class="L0"><code><span class="typ">Name</span> <span class="pun">=</span> <span class="pun">@</span></code></li>
<li class="L1"><code><span class="typ">Text</span> <span class="pun">=</span> <span class="str">"v=spf1 ip4:&lt;domain IP&gt; ~all"</span></code></li>
<li class="L2"><code></code></li>
<li class="L3"><code><span class="typ">Name</span> <span class="pun">=</span><span class="pln"> _dmarc</span><span class="pun">.&lt;</span><span class="pln">domain</span><span class="pun">&gt;.&lt;</span><span class="pln">tld</span><span class="pun">&gt;</span></code></li>
<li class="L4"><code><span class="typ">Text</span> <span class="pun">=</span><span class="pln"> v</span><span class="pun">=</span><span class="pln">DMARC1</span><span class="pun">;</span><span class="pln"> p</span><span class="pun">=</span><span class="pln">none</span></code></li>
</ol>
</li>
<li>
<p>Add <code>PTR</code> record for <code>&lt;domain&gt;.&lt;tld&gt;</code></p>
</li>
<li>
<p>Finally, test your email at <code>https://www.mail-tester.com/</code></p>
</li>
</ol>
<h3 id="bkmrk-notes-on-using-let%27s">Notes on Using Let's Encrypt for SSL</h3>
<p id="bkmrk-make-sure-that-encry"><em>Make sure that <code>Encryption</code> is set to <code>STARTTLS</code> when configuring mail clients</em></p>
<h3 id="bkmrk-references">References</h3>
<ol id="bkmrk-krizna-article-ubunt">
<li><a href="http://www.krizna.com/centos/setup-mail-server-centos-7/">Krizna Article</a></li>
<li><a href="https://help.ubuntu.com/community/PostfixBasicSetupHowto#Local_Alias_database">Ubuntu Postfix Alias Configuration</a></li>
</ol>

# Install RethinkDB on CentOS 7

## Installing RethinkDB

```
sudo wget http://download.rethinkdb.com/centos/7/`uname -m`/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
sudo yum install rethinkdb
```

## Create Service File
Create the service file, `/usr/lib/systemd/system/rethinkdb@.service` with the following content:
```
[Unit]
Description=RethinkDB database server for instance '%i'

[Service]
User=rethinkdb
Group=rethinkdb
ExecStart=/usr/bin/rethinkdb serve --config-file /etc/rethinkdb/instances.d/%i.conf
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```
Make sure that it has a permission of `644`: `chmod 644 /usr/lib/systemd/system/rethinkdb@.service`

## Creating a Rethink DB Instance
1. Create the RethinkDB data directory: `rethinkdb create -d /path/to/your/rethinkdb/directory`
2. Set the ownership to RethinkDB user: `sudo chown -R rethinkdb.rethinkdb /path/to/your/rethinkdb/directory`
3. Copy RethinkDB sample config file: `sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf`
4. Edit `/etc/rethinkdb/instances.d/instance1.conf`, the line with `directory=` must be changed to point to your Rethink DB data directory.

## Start RethinkDB Instance
<name_instance> in this case would be `instance1`:
```
sudo systemctl enable rethinkdb@<name_instance>
sudo systemctl start rethinkdb@<name_instance>
```

## References
[RethinkDB Startup Doc](https://rethinkdb.com/docs/start-on-startup/)

# Turtl API Server and Client Installation CentOS 7

## Turtl API
### Clone and Configure Turtl API
1. Create a user for turtl API: `sudo useradd turtl`
2. Switch user to `turtl`: `sudo su turtl`
3. Change directory to `turtl`'s home: `cd ~`
1. Install [Clozure CL](https://wiki.twcloud.tech/books/linux/page/installing-clozure-cl-and-quicklisp-on-centos-7)
2. Install [RethinkDB](https://wiki.twcloud.tech/books/linux/page/install-rethinkdb-on-centos-7) and create an instance for Turtl API
3. Install `libuv`: `sudo yum install libuv`
4. Clone Turtl repo: `git clone https://github.com/turtl/api.git`
5. Copy Turtl API config: `cp config/config.default.lisp config/lisp`
6. Edit and configure `config/config.lisp`, make sure to update the following parameters:
  ```
(defvar *local-upload* "<local upload directory>"
(defvar *local-upload-url* "<upload url>"
  ```

### Setup Up Service
Create a service file at `/usr/lib/systemd/system/turtl.service` with the following entry:

```
[Unit]
Description=Turtl API Server

[Service]
User=turtl
Group=turtl
ExecStart=/usr/local/bin/ccl64 --load /home/turtl/api/start.lisp
KillMode=process

[Install]
WantedBy=multi-user.target
```

Start and enable the service:

```
sudo systemctl start turtl
sudo systemctl enable turtl
```

### (OPTIONAL) Configure Reverse Proxy in Apache
Create `httpd` virtual host configuration `/etc/httpd/conf.d/turtl.conf` with the following content, make sure to change `<turtl domain>` to your own domain name:

```
<VirtualHost *:80>
    #Server name configuration
    ServerName <turtl domain>
    ServerAdmin webmaster@<turtl domain>

    #Proxy configuration
    ProxyPreserveHost on
    ProxyRequests off
    ProxyPass / https://wiki.twcloud.tech:8181/
    ProxyPassReverse / https://wiki.twcloud.tech:8181/

    #Logging configuration
    ErrorLog /var/log/httpd/turtl.err
    LogLevel warn
</VirtualHost>
```

### (OPTIONAL) Restrict User Registration
Add the following lines in your Turtl API Virtual Hosts configuration:

```
    #Restrict Registration
    <LocationMatch  "^/users[/]?$">
        AuthType Basic
        AuthName "Restricted"
        AuthUserFile /home/turtl/.htpasswd
        Require valid-user 
    </LocationMatch>
```

Then generate a `.htpasswd` password file in `/home/turtl`: `sudo htpasswd -c /etc/apache2/.htpasswd <whatever username>`. Make sure that it's in the right permission and owner: `chmod 640 /home/turtl/.htpasswd && chown turtl:apache /home/turtl/.htpasswd`

## Installing JS Client
1. Clone `turtl/js` repo to webserver webroot: `sudo mkdir /var/www/turtl && cd /var/www/turtl && sudo git clone https://github.com/turtl/js.git .`
2. Install NodeJS dependencies: `npm install`
3. Copy default config: `cp config/config.js.default config.js`
4. Edit `config/config.js`
5. Update owner and group: `chown -R apache:apache .`
6. Generate assets: `make`