PersSRV
VM Config
- 1GB RAM
- 200GB disk
CentOS 7 with encrypted disks
| Disk Name | Size |
|---|---|
| /boot | 1 GB |
| swap | 2 GB |
| / | The rest |
| /opt (optional - encrypted disk) | 100 GB |
For the Encrypted Disk
In grub on boot Ctrl-e - Remove rhgb Remove rhgb from /boot/grub2/grub.cfg
vi /etc/crypttab
restorecon -r /opt/www/html
If cloned VM
hostname PersSrv.ianculovici.com
vi /etc/sysconfig/network
install the vi enhancements
yum install -y vim-enhanced
Setup Firewall Rules and user permissions
groupadd dev
usermod -a -G dev chris
/etc/sudoers
%dev ALL=(ALL) NOPASSWD: ALL
Installing Perl (Needded for VMware Tools) - maybe - tools are now installed directly from CentOS repository
yum install -y perl
yum install -y open-vm-tools # not needed in CentOS 8
Nginx
yum install -y epel-release # not needed in CentOS 8
yum install -y nginx
systemctl start nginx
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --reload
systemctl enable nginx
Install PHP
yum install -y php php-fpm php-opcache php-cli php-zip
yum install -y unzip
yum install -y yum-utils
vi /etc/php.ini
cgi.fix_pathinfo=0
vi /etc/php-fpm.d/www.conf
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
systemctl start php-fpm
systemctl enable php-fpm
Configure PHP with Nginx
vi /etc/nginx/default.d/all.conf
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
index index.php index.html index.htm;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
vi /etc/nginx/nginx.conf
Add
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name PersSrv.ianculovici.com;
root /opt/www/fin/public;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
server {
listen 80;
listen [::]:80;
server_name PersSrv.ianculovici.com;
root /opt/www/fin/public;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
systemctl restart nginx
PostgreSQL
Install
yum install postgresql-contrib postgresql-server
/usr/pgsql-9.6/bin/postgresql96-setup initdb
systemctl start postgresql-9.6
systemctl enable postgresql-9.6
Create fin database
su - postgres
psql -c "create user chris with password 'chris1' CREATEDB CREATEROLE SUPERUSER;"
su - chris
psql template1 -c "create database fin"
yum install -y php-pgsql
firewall-cmd --permanent --zone=public --add-port=5432/tcp
firewall-cmd --reload
su - postgres
vi /var/lib/pgsql/data/pg_hba.conf
pg_ctl reload
Replace "ident" with "trust" as in the following line
host all all 127.0.0.1/32 md5
Note: The following is not needed if default layout/configuration is used:
Edit /etc/systemd/system/multi-user.target.wants/postgresql-9.4.service
Replace
Environment=PGDATA=/var/lib/pgsql/9.4/data/
with
Environment=PGDATA=/opt/pgsql/9.4/data/
Install Laravel
yum install php-json -y
Install Composer
curl -sS https://getcomposer.org/installer | php
chmod +x composer.phar
mv composer.phar /usr/local/bin/composer
composer -V
Install Laravel and Create New App
yum install php-mbstring php-dom -y
su - chris
composer global require "laravel/installer"
cd /opt/www
~/.config/composer/vendor/bin/laravel new fin
Edit .env to setup the database
groupadd www-data
usermod -a -G www-data chris
usermod -a -G www-data nginx
cd fin
chgrp -R www-data storage bootstrap/cache
chmod -R g+w storage bootstrap/cache
Install node-js to compile code
yum install npm -y
CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP without TIME ZONE) RETURNS INTEGER
AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION MONTH(TIMESTAMP WITH TIME ZONE) RETURNS INTEGER
AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL STABLE;
CREATE OR REPLACE FUNCTION MONTH(DATE) RETURNS INTEGER
AS $$
SELECT EXTRACT(MONTH FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION YEAR(TIMESTAMP without TIME ZONE) RETURNS INTEGER
AS $$
SELECT EXTRACT(YEAR FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION YEAR(TIMESTAMP WITH TIME ZONE) RETURNS INTEGER
AS $$
SELECT EXTRACT(YEAR FROM $1)::INTEGER;
$$ LANGUAGE SQL STABLE;
CREATE OR REPLACE FUNCTION YEAR(DATE) RETURNS INTEGER
AS $$
SELECT EXTRACT(YEAR FROM $1)::INTEGER;
$$ LANGUAGE SQL IMMUTABLE;
SELinux Package
sudo yum -y install checkpolicy
sudo setsebool -P httpd_can_network_connect 1
chcon -R -t httpd_sys_rw_content_t storage
DB
sudo setsebool -P httpd_can_network_connect_db on
Backups
mkdir /opt/BACKUP
# mount -t nfs persnas:/nas/Recovery.Backup/ /opt/BACKUP/
mount /opt/BACKUP/
yum install -y rsync
DB Objects
The scripts project should have the most current scripts. Examples are below.
create table stage(label varchar(32),accountid varchar(32), tx_date date, post_date date, description varchar (128), amount decimal(20,2), category varchar(32));
CREATE TABLE transaction_record(
id serial primary key,
label varchar(32),
accountid char(5),
txdate date,
postdate date,
description varchar (128),
amount decimal(20,2),
categoryid char(5)
);
INSERT INTO transaction_record (label,accountid, txdate, postdate, description, amount, categoryid)
SELECT s.label,s.accountid, s.tx_date, s.post_date, s.description, s.amount, s.category from stage s;
CREATE TABLE account(
id char(5),
name varchar(128),
bank_name varchar(128),
account_type varchar(32),
account_num varchar(64),
owner_name varchar(128),
details varchar(256)
);
INSERT INTO account (id, name, bank_name, account_type, account_num, owner_name)
VALUES
('AMEXA', 'AMEX (Anca)' , 'American Express' , '', 'Credit card' , 'Anca'),
('CITIC', 'Citi' , 'Citi Bank' , '', 'Credit card' , 'Chris'),
('BFCU' , 'BFCU' , 'Bethpage FCU' , '', 'Checking' , 'Chris'),
('CAP1C', 'CapitalOne' , 'Capital One' , '', 'Credit card' , 'Chris'),
('CASH' , 'Cash' , ` , `, 'Cash' , 'Chris & Anca'),
('DISCA', 'Discover (Anca)' , 'Discover Card' , '', 'Credit card' , 'Anca'),
('CHACK', 'Chase (Check)' , 'Chase' , '', 'Checking' , 'Chris & Anca'),
('CHACC', 'Chase (CC)' , 'Chase' , '', 'Credit card' , 'Chris')
copy stage from '/opt/stage/w.csv' with csv delimiter ',' escape '"';
CREATE TABLE category(
id CHAR(5) primary key,
name varchar(32),
longname varchar(128),
parent integer not null default 0
);
CREATE TABLE ignore_records(accountid char(5), description varchar(128));
COPY ignore_records FROM '/opt/stage/ignore_records.csv' WITH CSV DELIMITER ',' ESCAPE '"';
ignore_records.csv:
BFCU,DISCOVER DC PYMNTS
BFCU,MACYS WEB PYMT
BFCU,EMIGRANTDIRECT - TRANSFER
BFCU,CITI AUTOPAY - PAYMENT
BFCU,CHASE - AUTOPAY
BFCU,AMEX EPayment
CHACC,AUTOMATIC PAYMENT - THANK
AMEXA,AUTOPAY PAYMENT RECEIVED
DISCA,DIRECTPAY FULL BALANCE
CITIC,AUTOPAY
CREATE TABLE category_match(accountid char(5), categoryid char(5), description varchar(128));
COPY category_match FROM '/opt/stage/category_match.csv' WITH CSV DELIMITER ',' ESCAPE '"';
category_match.csv:
--------------------
BFCU,GAS,CPENERGY
BFCU,CHARO,COUNTRYSIDE MINI
BFCU,CHARO,ROMANIAN MEDIA M
BFCU,MORTG,Bank of America - MORTGAGE
BFCU,INCOM,IRS TREAS
BFCU,INCOM,ACTIAN CORPORATI
BFCU,INCOM,Angela Earhart
CHACC,PEST,ECO SHIELD HOUSTON
CHACC,WATER,PEARLAND UTILITIES WEB
CHACC,ENT,CHR*CHRISTIANBOOK.COM
CHACC,?????,Amazon
CHACC,VACAT,SOUTHWES
CHACC,VACAT,GALVESTON SEAWALL
CHACC,VACAT,FRONTIER
CHACC,GROCE,HEB #
AMEXA,GROCE,HEB #
CHACC,GASOL,HEB GAS
CHACC,PHONH,OOMA
CHACC,ELECT,Reliant
CHACC,CLOTH,ROSS STORES
CHACC,GROCE,WAL-MART
CHACC,HOMEN,HOMEGOODS
CHACC,EZTAG,Harris Co Tollq
AMEXA,CAMNT,AUTO MAX
AMEXA,CAMNT,DISCOUNT TIRE
AMEXA,CLOTH,GYMBOREE
AMEXA,EATOU,FIELDINGS
AMEXA,ENT,BARNES & NOBLE
AMEXA,EATOU,LA MADELEINE
AMEXA,HEALT,CVS/PHARMACY
AMEXA,CLOTH,KOHL'S
AMEXA,EATOU,PIZZA HUT
AMEXA,EATOU,EINSTEIN BROS
AMEXA,HOMEN,HOBBY LOBBY
AMEXA,HOMEN,THE HOME DEPOT
AMEXA,EATOU,CHICK-FIL-A
AMEXA,EATOU,RED ROBIN
AMEXA,EATOU,TWO GUYS PIZZERIA
AMEXA,EATOU,HUNGRYS
AMEXA,EATOU,OLIVE GARDEN
AMEXA,EATOU,PEI WEI
AMEXA,CLOTH,OLD NAVY
AMEXA,EATOU,IN-N-OUT BURGER
DISCA,GASOL,Gasoline
CITIC,INET,COMCAST OF HOU
CHACK,INCOM,ACTIAN CORPORATI
AMEXA,GROCE,WHOLEFDS
AMEXA,HEALT,TGF PRECISION HAIR
------------------------
common.sql
--------------
\set account_type_val '\` :account_type '\`
\set import_file '\` '/opt/stage/' :load_ym '_' :account_type '.csv' '\`
\set load_table :account_type '_csv'
\set label '\` :load_ym '\`
\i common.sql
CREATE TEMP TABLE :load_table (tx_date varchar(15),dummy1 varchar(15),description varchar(128),cardowner varchar(64), card varchar(20),dummy2 varchar(15),dummy3 varchar(15),amount decimal(20,2),dummy4 varchar(15),dummy5 varchar(15),dummy6 varchar(15),dummy7 varchar(15),dummy8 varchar(15),dummy9 varchar(15),dummy10 varchar(15),dummy11 varchar(15));
COPY :load_table FROM :import_file WITH CSV DELIMITER ',' ESCAPE '"';
INSERT INTO stage
SELECT :label AS label, :account_type_val AS type, left(csv.tx_date,10)::date AS tx_date, left(csv.tx_date,10)::date AS post_date,csv.description, -coalesce(csv.amount,0) AS amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.description ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
\i common.sql
CREATE TEMP TABLE :load_table (Date varchar(15),Check_no varchar(10),Type varchar(20),Description varchar(128),Debit decimal(20,2),Credit decimal(20,2),Balance decimal(20,2));
copy bfcu_csv from :import_file with csv delimiter ',' escape '"' header;
INSERT INTO stage
SELECT :label AS label, :account_type_val AS type, csv.date::date as tx_date, csv.date::date as post_date, csv.description, coalesce(csv.credit,0) - coalesce(csv.debit,0) AS amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.description ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
\i common.sql
CREATE TEMP TABLE :load_table (type varchar(20),tx_date varchar(15),post_date varchar(15),description varchar(128),amount decimal(20,2));
COPY :load_table FROM :import_file WITH CSV DELIMITER ',' ESCAPE '"' HEADER;
INSERT INTO stage
SELECT :label AS label, :account_type_val AS accountid, csv.tx_date::date, csv.post_date::date,csv.description, coalesce(csv.amount,0) AS amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.description ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
\i common.sql
CREATE TEMP TABLE :load_table (details varchar(15),tx_date varchar(15),description varchar(128),amount decimal(20,2),type varchar(21),balance decimal(20,2),check_no varchar(8),dummy varchar(1));
COPY :load_table FROM :import_file WITH CSV DELIMITER ',' ESCAPE '"' HEADER;
INSERT INTO stage
SELECT
:label AS label,
:account_type_val AS accountid, csv.tx_date::date AS tx_date, csv.tx_date::date AS post_date, csv.description as description,
csv.amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.description ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
\i common.sql
CREATE TEMP TABLE :load_table (status varchar(15),tx_date varchar(15),description varchar(128),debit varchar(21),credit varchar(21));
COPY :load_table FROM :import_file WITH CSV DELIMITER ',' ESCAPE '"' HEADER;
INSERT INTO stage
SELECT
:label as label, :account_type_val AS type, csv.tx_date::date AS tx_date, csv.tx_date::date AS post_date, left(csv.description,-1) as description,
CASE csv.credit WHEN ` THEN 0 ELSE cast(csv.credit as decimal(20,2)) END - CASE csv.debit WHEN ` THEN 0 ELSE CAST(csv.debit as decimal(20,2)) END AS amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.description ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
\i common.sql
CREATE TEMP TABLE :load_table (tx_date varchar(15),post_date varchar(15),description varchar(128),amount decimal(20,2),category varchar(32));
COPY :load_table FROM :import_file WITH CSV DELIMITER ',' ESCAPE '"' HEADER;
INSERT INTO stage
SELECT :label as label, :account_type_val AS type, right(csv.tx_date,10)::date AS tx_date, csv.post_date::date AS post_date,csv.description, -coalesce(csv.amount,0) AS amount, m.categoryid as category
FROM
:load_table csv
LEFT JOIN category_match m ON csv.category ILIKE m.description || '%'
WHERE
csv.description not in (SELECT description from :load_table WHERE description ilike ANY (select description || '%' from ignore_records))
;
recreate_categ_ignore.sql
----------------------------
DROP TABLE ignore_records;
DROP TABLE category_match;
CREATE TABLE ignore_records(accountid char(5), description varchar(128));
COPY ignore_records FROM '/opt/stage/ignore_records.csv' WITH CSV DELIMITER ',' ESCAPE '"';
CREATE TABLE category_match(accountid char(5), categoryid char(5), description varchar(128));
COPY category_match FROM '/opt/stage/category_match.csv' WITH CSV DELIMITER ',' ESCAPE '"';
alter sequence transaction_record_id_seq restart 1530;
copy transaction_record(id,label,accountid,txdate,postdate,description,amount,categoryid) to '/tmp/test.csv' csv;
copy transaction_record1 from '/tmp/test.csv' csv;
Other Services
yum install -y mailx