summaryrefslogtreecommitdiff
path: root/src/blog/temp/pastebin_alt_with_privatebin.md
blob: 491847e0b4af9134d438fca6755763c6d43d5931 (plain)
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
title: Set up a pastebin alternative with PrivateBin and YOURLS
author: David Luévano
lang: en
summary: How to set up a pastebin alternative with PrivateBin and YOURLS, on Arch.
tags: server
    tools
    code
    tutorial
    english

https://wiki.archlinux.org/title/Arch_package_guidelines
https://wiki.archlinux.org/title/Nginx#PHP_implementation

mariadb (for mysql) is assumed

# MariaDB

[MariaDB](https://wiki.archlinux.org/title/MariaDB) is a drop-in replacement of [MySQL](https://wiki.archlinux.org/title/MySQL).

Install the `mariadb` package:

```sh
pacman -S mariadb
```

Before starting/enabling the systemd service run:

```sh
mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
```

`start`/`enable` the `mariadb.service`:

```sh
systemctl start mariadb.service
systemctl enable mariadb.service
```

Run and follow the secure installation script before proceding any further:

```sh
mariadb-secure-installation
```

Change the binding address so the service listens on `localhost` by modifying `/etc/my.cnf.d/server.cnf`:

```ini
[mariadb]
bind-address = localhost
```

## Create users/databases

Using `mariadb` as root, create users with their respective database (for our use-case) with the following queries:

```sql
MariaDB> CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
MariaDB> CREATE DATABASE <database_name>;
MariaDB> GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'localhost';
MariaDB> quit
```

The `database_name` will depend on how YOURLS and PrivateBin are configured.

# PHP

[PHP](https://wiki.archlinux.org/title/PHP) is a general-purpose scripting language that is usually used for web development, which was supposed to be ass for a long time but it seems to be a misconseption from the *old times*.

Install the `php`, `php-fpm`, `php-gd` packages:

```sh
pacman -S php php-fpm php-gd
```

`start`/`enable` the `php-fpm.service`:

```sh
systemctl start php-fpm.service
systemctl enable php-fpm.service
```

## Configuration

Only showing configurations needed, main config file is located at `/etc/php/php.ini`, but drop-in files can be placed at `/etc/php/conf.d/` instead.

Set timezone ([list of timezones](https://www.php.net/manual/en/timezones.php)):

```ini
date.timezone = Europe/Berlin
```

Enable the `gd` and `mysql` extensions:

```ini
extension=gd
extension=pdo_mysql
extension=mysqli
```

## Nginx

Create a PHP specific config that can be reusable at `/etc/nginx/php_fastcgi.conf`:

```nginx
location ~ \.php$ {
    # 404
    try_files $fastcgi_script_name =404;

    # default fastcgi_params
    include fastcgi_params;

    # fastcgi settings
    fastcgi_pass                        unix:/run/php-fpm/php-fpm.sock;
    fastcgi_index                       index.php;
    fastcgi_buffers                     8 16k;
    fastcgi_buffer_size         32k;

    # fastcgi params
    fastcgi_param DOCUMENT_ROOT $realpath_root;
    fastcgi_param SCRIPT_FILENAME       $realpath_root$fastcgi_script_name;
    #fastcgi_param PHP_ADMIN_VALUE      "open_basedir=$base/:/usr/lib/php/:/tmp/";
}
```

This then can be imported by any `server` directive that needs it.

# YOURLS

[YOURLS](https://yourls.org/) is a self-hosted URL shortener that is supported by PrivateBin.

Install from the AUR with `yay`:

```sh
yay -S yourls
```

Create a new user and database as described in [Create users](#Create users).

## Configuration

The default configuration file is self explanatory, it is located at `/etc/webapps/yourls/config.php`.

Set the newly created user/database information and get one cookie string from the [URL provided](http://yourls.org/cookie) (or create your own). Then it is important to change/set the `$yours_user_passwords` variable. I also changed the "shortening method" to `62`:

```php
define( 'YOURLS_URL_CONVERT', 62 );
```

Lastly, the `$yourls_reserved_URL` variable will need more blacklisted words depending on the use-case.

I had issues with the password hashing, which I disabled by adding the following config:

```php
define( 'YOURLS_NO_HASH_PASSWORD', true );
```

## Nginx

Create a `yourls.conf` at the usual `sites-<available/enabled>` path for `nginx`:

### TO-DO ACTUALLY WRITE FOR YOURLS

```nginx
server {
    listen 80;
    root //usr/share/webapps/privatebin/;
    server_name bin.yourdomain.com;

    if ($pastebin_badagent) {
       return 403;
    }

    location / {
        index index.html index.htm index.php;
    }

    include /etc/nginx/php_fastcgi.conf;
}
```

# PrivateBin

https://privatebin.info/
https://github.com/PrivateBin/PrivateBin/blob/master/doc/Installation.md#installation
--- https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation
https://github.com/PrivateBin/PrivateBin/wiki/Configuration
https://aur.archlinux.org/packages/privatebin

Install from the AUR with `yay`:

```sh
yay -S privatebin
```

## Configuration

This heavily depends on personal preference. Make a copy of the config template:

```sh
cp /etc/webapps/privatebin/conf.sample.php /etc/webapps/privatebin/conf.php
```

# TO-DO

NEED TO SPECIFY THE DATA PATH CHAGE FROM 'DATA' TO 'VAR/LIB/PRIVATEBIN/

At least configure the `[model]` and `[model_options]` to use SQLite instead of plain filesystem files. 

```sh
[model]
; example of DB configuration for SQLite
class = Database
[model_options]
;dsn = "sqlite:" PATH "data/db.sq3"
dsn = "sqlite:" PATH "/var/lib/privatebin/db.sq3"
usr = null
pwd = null
opt[12] = true  ; PDO::ATTR_PERSISTENT
```


## Nginx

To deny access to some bots/crawlers, PrivateBin provides a sample `.htaccess`, which is used in Apache. We need an Nginx version, which I found [here](https://gist.github.com/benediktg/948a70136e2104c8601da7d355061323).

Add the following at the beginning of the `http` block of the `/etc/nginx/nginx.conf` file:

```nginx
http {
    map $http_user_agent $pastebin_badagent {
        ~*bot 1;
        ~*spider 1;
        ~*crawl 1;
        ~https?:// 1;
        WhatsApp 1;
        SkypeUriPreview 1;
        facebookexternalhit 1;
	}

    #...
}
```

Create a `privatebin.conf` at the usual `sites-<available/enabled>` path for `nginx`:

```nginx
server {
    listen 80;
    root //usr/share/webapps/privatebin/;
    server_name bin.yourdomain.com;

    if ($pastebin_badagent) {
       return 403;
    }

    location / {
        index index.html index.htm index.php;
    }

    include /etc/nginx/php_fastcgi.conf;
}
```