# Mail-Archiver
###### guide-by-example
# Purpose & Overview
IMAP email archiving system with web gui managment.
* [Github](https://github.com/s1t5/mail-archiver)
Written in C# for backend and postgres for database.
A very new project but looks super promising.
# Files and directory structure
```
/home/
└── ~/
└── docker/
└── mail-archiver/
├── 🗁 mailarchiver_database/
├── 🗋 .env
└── 🗋 compose.yml
```
* `mailarchiver_database` - contains the database data, including all emails and attachments
* `.env` - the file containing environment variables for docker compose
* `compose.yml` - the compose file that defines how to run the containers
Only the two files are required.
The directories are created on the first run.
# Compose
Some changes from [the official](https://github.com/s1t5/mail-archiver?tab=readme-ov-file#%EF%B8%8F-installation)
compose.
* env variables are moved to the `.env` file
* reverse proxy is expected so the ports are only exposed(documented),
not mapped to the host
* hostname and container name are added
* renamed services to have more clear name
which required to also change the connection string variable,
replacing host `postgres` with `mailarchiver-db`
* changed bind mount folder name
* network is set
`compose.yml`
```yml
services:
mailarchiver-app:
image: s1t5/mailarchiver:latest
container_name: mailarchiver-app
hostname: mailarchiver-app
restart: unless-stopped
env_file: .env
expose:
- "5000"
depends_on:
mailarchiver-db:
condition: service_healthy
mailarchiver-db:
image: postgres:17-alpine
container_name: mailarchiver-db
hostname: mailarchiver-db
restart: unless-stopped
env_file: .env
expose:
- "5432"
volumes:
- ./mailarchiver_database:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mailuser -d MailArchiver"]
interval: 300s
timeout: 10s
retries: 3
start_period: 30s
networks:
default:
name: $DOCKER_MY_NETWORK
external: true
```
`.env`
```bash
# GENERAL
DOCKER_MY_NETWORK=caddy_net
TZ=Europe/Bratislava
# Database Connection
ConnectionStrings__DefaultConnection=Host=mailarchiver-db;Database=MailArchiver;Username=mailuser;Password=masterkey;
# Authentication Settings
Authentication__Enabled=true
Authentication__Username=admin
Authentication__Password=secure123!
Authentication__SessionTimeoutMinutes=60
Authentication__CookieName=MailArchiverAuth
# MailSync Settings
MailSync__IntervalMinutes=15
MailSync__TimeoutMinutes=60
MailSync__ConnectionTimeoutSeconds=180
MailSync__CommandTimeoutSeconds=300
# BatchRestore Settings
BatchRestore__AsyncThreshold=50
BatchRestore__MaxSyncEmails=150
BatchRestore__MaxAsyncEmails=50000
BatchRestore__SessionTimeoutMinutes=30
BatchRestore__DefaultBatchSize=50
# Npgsql Settings
Npgsql__CommandTimeout=600
# POSTGRES
POSTGRES_DB=MailArchiver
POSTGRES_USER=mailuser
POSTGRES_PASSWORD=masterkey
```
**All containers must be on the same network**.
Which is named in the `.env` file.
If one does not exist yet: `docker network create caddy_net`
# Reverse proxy
Caddy v2 is used, details
[here](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/caddy_v2).
`Caddyfile`
```php
mailarchiver.{$MY_DOMAIN} {
reverse_proxy mailarchiver-app:5000
}
```
# First run
Login with the credentials set in the `.env` file
# gmail
* 2factorAuth needs to be fulyl enabled and set
* [https://myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords)
create app password
# Trouble shooting
# Update
Manual image update:
- `docker-compose pull`
- `docker-compose up -d`
- `docker image prune`
It is **strongly recommended** to now add current **tags** to the images in the compose.
Tags will allow you to easily return to a working state if an update goes wrong.
# Backup and restore
#### Backup
#### Restore
# Backup of just user data
#### Backup script
#### Cronjob - scheduled backup
# Restore the user data