Collecte - self-hosted open source email collector
Collect emails on your static website into your private git repo. The solution is targeted at people who already have a Linux server and domain, or don’t mind to get one. You have to be familiar with basics of operating a web server. No Python knowledge is required, but service is going to use it.
Prerequisites
- You’ll need to host a Linux server somewhere.
- You’ll need a domain to serve the API requests.
- It can be a tiny virtual machine, like Google’s free tier f1-micro.
- It can be a Heroku node, which will save a few minutes configuring nginx.
- You’ll need to be familiar with shell to install and configure service.
- The page with the email signup form can be hosted anywhere, for example on GitHub pages.
What you get
Python service running on a virtual machine using systemd unit. Nginx serving a single API endpoint. Private git repository, that stores all submitted emails into a plain text file.
How it works
- Service accepts POST requests at
/singup
. - Appends the received email to
emails.txt
. - Commits changes.
- Pushes the commit to the upstream.
- Redirects user to “thanks” page.
How to install
Instruction are written for Ubuntu Linux, but can be applied to any other Linux distribution.
- Create a system user to run the service.
sudo adduser --system collecte --home /var/lib/collecte
- Setup git repo for saving emails.
cd /var/lib/collecte && sudo -u collecte git init .
- Create an SSH key pair to push the repo.
sudo -u collecte ssh-keygen
- Make sure the public key is accepted at the upstream git repo.
- Install collecte inside of a virtualenv.
sudo su collecte python3 -m venv /var/lib/collecte/.venv source /var/lib/collecte/.venv/bin/activate pip install collecte exit
- Create systemd unit.
sudo cat >/etc/systemd/system/collecte.service <<EOF [Unit] Description=collecte HTTP API After=network.target StartLimitIntervalSec=0 Environment="PORT=7777" Environment="REDIRECT_URL=https://your-static-website.com/thanks" [Service] Type=simple User=collecte ExecStart=/var/lib/collecte/.venv/bin/collecte [Install] WantedBy=multi-user.target
- Enable and start the service.
sudo systemctl daemon-reload sudo systemctl enable collecte.service sudo systemctl start collecte.service
- Install nginx.
sudo apt install nginx
- Configure nginx to proxy pass requests to the collecte service.
Edit
/etc/nginx/sites-available/default
to have the following section.location /signup { proxy_pass http://127.0.0.1:7777; }
- Ensure nginx configuration is valid and restart nginx.
sudo nginx -t && sudo systemctl restart nginx.service