A modern, single-binary web panel and REST API for Postfix + Dovecot mail servers.
Domains, mailboxes, aliases, admins, RBAC and a self-service user portal — no PHP, no web server, no extra runtime.
Quick Start · Screenshots · Features · Full feature list · Setup guide
- One file to deploy — the Vue 3 UI, Swagger docs and translations are embedded in a single static Go binary. Copy it, point it at your database, run it. Also shipped as Docker image,
.deband.rpm. - Fast and lightweight — no PHP-FPM, Apache/Nginx or Node runtime in production — just one Go process.
- API-first — every action in the UI is available through a documented REST API (
/api/v1) with JWT and long-lived API keys, ready for automation and provisioning scripts. - Built for teams — superadmins, domain admins and fine-grained RBAC roles decide who can see and change what.
- Users help themselves — a separate portal lets mailbox owners change their password, set forwarding and configure vacation auto-replies.
- Familiar data model — PostfixAdmin-style tables (
domain,mailbox,alias, …) and$2y$bcrypt hashes, on MariaDB/MySQL or PostgreSQL. - Scriptable CLI — bulk CSV import/export, domain/mailbox/transport management, MySQL backups, quota reports and a Postfix
transport_mapsTCP server.
git clone https://github.com/jniltinho/go-postfixadmin.git
cd go-postfixadmin
docker compose up -dOpen http://localhost:8080 — the stack includes MariaDB and creates the first admin automatically (admin@example.com / adminpassword — change it in docker-compose.yml).
docker run -p 8080:8080 \
-e DB_URL="postfix:pass@tcp(your-db:3306)/postfix?charset=utf8mb4&parseTime=True" \
jniltinho/go-postfixadmin:latestDownload from GitHub Releases, then:
./postfixadmin --generate-config # writes config.toml — set your database
./postfixadmin migrate # create / update the schema
./postfixadmin migrate rbac # optional: RBAC roles and permissions
./postfixadmin admin --add-superadmin admin@example.com:'S3cure!Pass'
./postfixadmin server # http://localhost:8080Swagger UI is available at /swagger/ when server.swagger_enable = true.
make build # builds the Vue 3 frontend and embeds it into bin/postfixadmin
make runSee DEVELOPMENT.md for the full developer workflow.
| Domains | Email accounts |
|---|---|
![]() |
![]() |
| Add email account | Add domain |
|---|---|
![]() |
![]() |
| Aliases | Domain aliases |
|---|---|
![]() |
![]() |
| Administrators | RBAC roles |
|---|---|
![]() |
![]() |
| Mail delivery log | Audit log |
|---|---|
![]() |
![]() |
| Forwarding & password | Vacation auto-reply |
|---|---|
![]() |
![]() |
More screenshots (login pages, transports, API keys, create admin/alias…) in DOCUMENTS/screenshots.
- Mail management — domains (limits, quotas, backup MX), mailboxes with quota, aliases with multiple recipients, alias domains, per-domain Postfix transports
- User portal — password change, forwarding, vacation auto-reply via Dovecot Sieve
- Security — JWT (short-lived access token + httpOnly refresh cookie), CSRF origin check, login rate limiting, strong password policy with built-in generator, persistent API keys with expiry
- Access control — superadmin / domain-admin separation plus optional fine-grained RBAC roles
- Operations — admin audit log, mail delivery log ingestion (
readlog), quota reports, MySQL/MariaDB backups, optional OpenTelemetry export to OpenObserve - i18n — English, Português (pt_BR) and Español
- Databases — MariaDB/MySQL and PostgreSQL
Complete capability list: FEATURES.md
- Features
- Development Guide
- Quick Setup – MariaDB
- Quick Setup – PostgreSQL
- Complete Setup Guide
- Transport TCP Server
- Contributing
Backend: Go 1.26, Echo v5, GORM, Cobra, Viper, log/slog, Swaggo (OpenAPI)
Frontend (embedded): Vue 3 + TS + Vite, Pinia, Vue Router, Tailwind CSS v4, Lucide icons
Packaging: Multi-stage Docker, UPX-compressed binary, native .deb/.rpm via Makefile + GitHub Actions
If Go-PostfixAdmin is useful to you, please ⭐ the repository — it helps other admins find it.
Contributions are welcome. Please read CONTRIBUTING.md first.
Go-PostfixAdmin is an independent project, inspired by and not affiliated with PostfixAdmin.
This project is licensed under the MIT License — see the LICENSE file for details.
Optional application log, HTTP/database trace and metric export to OpenObserve is available. All export and database tracing switches default to disabled. See configuration and deployment and isolated Docker validation.
Set the OpenObserve authorization header using your ingestion email/password (the credentials below are fictional):
# Fictional credentials: replace with your OpenObserve ingestion credentials.
export OBSERVABILITY_AUTHORIZATION="Basic $(printf '%s' 'telemetry@example.com:example-password' | base64 | tr -d '\r\n')"Then enable the desired signals and set their endpoints as described in the configuration guide. For Docker, pass this variable into the app service and recreate the container.













