aboutsummaryrefslogtreecommitdiffstats
path: root/multimedia/zoneminder/files/README.FreeBSD
blob: ff112cc402bed318e026cde04084d309cb7f25fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169

ZoneMinder is a free, open source Closed-circuit television software 
application developed for Unix-like operating systems which supports 
IP, USB and Analog cameras. 

New installs
============

ZoneMinder requires a MySQL (or MySQL forks) database backend and 
a http server, capable to execute PHP and CGI scripts.

To simplify things, we assume, that you use MySQL and NGINX on 
the same server.

1. Preliminary steps

1.1 Install databases/mysql56-server
    You may choose your favourite method - ports or packages here. 
    FreeBSD default setting use STRICT_TRANS_TABLES sql_mode. It's mandatory to disable it. Edit your my.cnf or create new in /var/db/mysql
    
    The following example works with ZoneMinder quite well

    [server]
        skip-networking
        skip-name-resolve
        innodb_flush_method = O_DIRECT
        skip-innodb_doublewrite
        innodb_file_per_table

    ZoneMinder use very simple queries, however it tends to write to 
    the database quite a lot depending on your capture mode and number 
    of cameras. So tweak your MySQL instance accordantly

    Now, enable and start MySQL
        sysrc mysql_server_enable="YES"
        service mysql-server start

1.2 Install www/nginx 
    We provide an example for an HTTP install, however, you should use 
    HTTPS if you plan to expose your installation to the public. There 
    are plenty guides how to do it and security/letsencrypt.sh is a 
    good way to get a valid SSL certificate.

    Your server block should include the following:

        server {
                root /usr/local/www/zoneminder;
                try_files $uri $uri/ /index.php$is_args$args;
                index index.php;

                location = /cgi-bin/nph-zms {
                        include fastcgi_params;
                        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_pass    unix:/var/run/fcgiwrap/fcgiwrap.sock;
                }

                location ~ \.php$ { 
                        include fastcgi_params;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    unix:/var/run/php-fpm.sock;
                }

                location /api {
                        rewrite ^/api/(.+)$ /api/index.php?p=$1 last;
                }
        }

1.2.1 ZoneMinder has it's own authentication system, however it's recommend to use NGINX basic 
    auth over HTTPS if you don't need fine grain control to ZoneMinder components.

1.2.2 If you choose ZoneMinder authentication, it's recommended to prohibit access to 
    image and events folder as it's possible to guess file names inside it.

        location ~ ^/(?:images|events)/ {
                deny all;
        }
        
    Enable and start NGINX
        sysrc nginx_enable="YES"
        service nginx start

1.3 Install www/fcgiwrap 
    As NGINX lacks it's own CGI wrapper, we need external one. Please 
    note that ZoneMinder's montage page use simultaneous access to all 
    cameras, so you need to use at least as many fcgiwrap workers as 
    your number of cameras. The following example assumes you have 4.

    Enable and start FcgiWrap
        sysrc fcgiwrap_enable="YES"
        sysrc fcgiwrap_user="www"
        sysrc fcgiwrap_flags="-c 4"

1.4 PHP is installed as a dependency to ZoneMinder. However, you should 
    tweak some of it's settings.
    Edit /usr/local/etc/php-fpm.conf and set

        listen = /var/run/php-fpm.sock
        listen.owner = www
        listen.group = www
        env[PATH] = /usr/local/bin:/usr/bin:/bin

    If you want to set another path for the socket file, make sure you 
    change it in your NGINX config well. The env[PATH] needs to be set 
    to locate the zip utility as ZoneMinder's export functions rely on 
    exec(). Sorry, chroot folks. 

    PHP throws warning if date.timezone option is not set. The best place 
    to do it is an ini file in /usr/local/etc/php 

        date.timezone = "UTC"

    Enable and start php-fpm
        sysrc php_fpm_enable="YES"
        service php-fpm start

1.5 ZoneMinder constantly keeps the last N frames from its cameras to 
    preserve them when alarm occurs. This can be a performance hog if 
    placed on spindle drive. The best practice is put it on tmpfs.
    See https://www.freebsd.org/cgi/man.cgi?query=tmpfs for more 
    information.

    ZoneMinder will use /tmp for default. If you plan to change it, see 
    ZM_PATH_MAP setting.

    Mapping /tmp to tmpfs is actually a recommended step under FreeBSD.
    Edit /etc/fstab and add the following:

        tmpfs           /tmp        tmpfs   rw,nosuid,mode=01777    0   0

    The size of temporary files depends on your number of cameras 
    number and frames you plan to keep. My 12 3Mbit cameras with 25 
    last frames consumes 6 GB.

2. ZoneMinder installation

    Connect to MySQL under root and create zm user and populate database.

    mysql -u root -p
    
        CREATE DATABASE zm;
        GRANT ALL PRIVILEGES ON zm.* TO 'zmuser'@'localhost' IDENTIFIED BY 'zmpass';
        FLUSH PRIVILEGES;
        quit;
    
    mysql -u root -p zm < /usr/local/share/zoneminder/db/zm_create.sql
    
2.1 If you have chosen to change the ZoneMinder MySQL credentials to something
    other than zmuser/zmpass then you must now edit /usr/local/etc/zm.conf. Change
    ZM_DB_USER and ZM_DB_PASS to the values you created in the previous step.

    Additionally, you must also edit 
    /usr/local/www/zoneminder/api/app/Config/database.php in a similar 
    manner. Scroll down and change login and password to the values you created in the previous step.

    Enable and start ZoneMinder
        sysrc zoneminder_enable="YES"
        service zoneminder start

Upgrades
========

1. Stop ZoneMinder
    service zoneminder stop

2. Upgrade database
    sudo -u www zmupdate.pl
    
3. Start ZoneMinder
    service zoneminder start