aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 95b0bfa282465fd267d988b0cb9aa6affdb25a43 (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
Ansible Playbooks for Personal DragonFly BSD Server
===================================================

**Aaron LI**

Created: 2018-02-14

Introduction
------------
An Ansible playbook to manage a small (even 512 MB RAM) personal VPS to
self-host various services including:
* _DNS_ (NSD for authoritative DNS service)
* _Email_ (Postfix, Dovecot)
* _Web_ (Nginx, acme-client for Let's Encrypt certificates)
* _CalDAV/CardDAV_ (Radicale with uWSGI)
* _Git_ (Web interface via cgit with uWSGI)
* _IRC Bouncer_ (ZNC)

Playbooks
---------
* `bootstrap.yml`:
  Bootstrap the remote host (e.g., a VPS) after installing DragonFly BSD.

  **NOTE**:
  - Use the `bootstrap.sh` script instead.
  - The new host should be configured that allow `root` ssh into it using
    a password. (This will be *disabled* during the bootstrap.)

* `deploy.yml`:
  The main playbook that deploys services on the target host.

Configurations
--------------
* `ansible.cfg`
  Ansible configuration file

* `inventory.yml`
  Remote host specifications

* `group_vars/all/vars.yml`
  Variables for hosts in the `all` group, i.e., all hosts

* `group_vars/all/vault.yml`
  Encrypted variables that will merged into the above `vars.yml` upon
  Ansible playing the playbook.

* `host_vars/vultr`
  Variables specific to this host.

Roles
-----
* `bootstrap`
  Only used in the `bootstrap.yml` playbook to bootstrap a newly installed
  DragonFly BSD host.

* `basic`
  Basic settings, includes:
  - Tune basic services in `/etc/rc.conf`
  - Set some system tunables in `/boot/loader.conf`
  - Enable `/var/log/console.log` in syslog
  - Tune csh/tcsh
  - Tweak pkg and install basic packages

* `security`
  - Setup PF firewall
  - Enable `sshlockout`

* `dns`
  - Setup local DNS cache with [Unbound](https://www.nlnetlabs.nl/projects/unbound/about/)
  - Configure [NSD](https://www.nlnetlabs.nl/projects/nsd/about/) as
    the authoritative name server in *hidden master* mode for several
    personal domains

* `web`
  - Obtain SSL/TLS certificates from *Let's Encrypt*, as well as for other
    services (SMTP, IMAP, CalDAV/CardDAV, ZNC).
  - Serve personal website
  - Serve CalDAV/CardDAV via [Radicale](http://radicale.org/)
  - Serve git repositories via [cgit](https://git.zx2c4.com/cgit/)
  - Useful reverse proxies to popular websites

* `mail`
  - SMTP client & server by [Postfix](http://www.postfix.org/)
  - IMAP server by [Dovecot](https://dovecot.org/)
  - DKIM signing via [OpenDKIM](http://opendkim.org/)
  - SPF, DKIM, DMARC records managed through NSD above
  - Do *not* use database
  - No web interface

* `git`
  - Self-host Git repositories
  - Web interface via [cgit](https://git.zx2c4.com/cgit/)
  - Also manage and deploy the static resources of cgit via a Git repo

* `shadowsocks`
  Setup ShadowSocks-libev for a useful proxy.

* `znc`
  Setup [ZNC](https://wiki.znc.in/ZNC) IRC bouncer connecting to channel
  `#dragonflybsd` on [EFNet](http://www.efnet.org/).

* `radicale`
  Setup [Radicale](http://radicale.org/) as a lightweight CalDAV/CardDAV
  server for personal calendars and contacts.
  Served via Nginx and [uWSGI](http://projects.unbit.it/uwsgi).

Extensions
----------
* `filter_plugins/`
  Custom template filters

References
----------
* Securing a Server with Ansible
  https://ryaneschinger.com/blog/securing-a-server-with-ansible/

License
-------
[The MIT License](https://opensource.org/licenses/MIT)