Self-Hosted Guide
Everything you need to host Seogard on your own server.
Getting Started
Prerequisites: Docker and Docker Compose installed on your server.
- Clone the repo
git clone https://github.com/seogard-software/seogard.git && cd seogard - Copy and configure the environment file
cp .env.example .envEdit
.env— you must change:Variable Description MONGO_PASSWORDMongoDB password — pick a strong one NUXT_JWT_SECRETJWT signing key — 64+ random characters NUXT_PUBLIC_APP_URLPublic URL of your instance (e.g. https://seo.mysite.com) - Run
docker compose -f docker-compose.self-hosted.yml up -d - Open
http://localhost:3000and create your admin account
The first account created becomes the administrator (owner). Registration then closes automatically — subsequent members are added by invitation.
A single .env file for everything (web + crawler). MongoDB and Redis connections are handled automatically by Docker.
Architecture
port 3000x2The Web serves the dashboard and the API. The Workers crawl pages with Playwright (headless browser). Redis distributes pages to the workers. MongoDB stores the data.
Sizing
Each crawler worker uses ~1 GB of RAM. MongoDB needs a RAM cache to perform well. The rest (~2 GB) is shared between Redis, the web server and the OS.
Formula: MongoDB cache = server RAM - (workers × 1 GB) - 2 GB
| Server RAM | Workers | MongoDB cache | Pages you can monitor |
|---|---|---|---|
| 4 GB | 1 | 1 GB | ~5 000 |
| 8 GB | 3 | 3 GB | ~15 000 |
| 16 GB | 8 | 6 GB | ~50 000 |
| 32 GB | 15 | 15 GB | ~100 000+ |
The MongoDB cache defaults to 2 GB in the docker-compose. Adjust it to your server by editing docker-compose.self-hosted.yml → --wiredTigerCacheSizeGB X.
# Lancer avec 3 workersWORKER_REPLICAS=3 docker compose -f docker-compose.self-hosted.yml up -dAdjusting workers
Change the number of workers to match your server resources:
WORKER_REPLICAS=5 docker compose -f docker-compose.self-hosted.yml up -dOr edit docker-compose.self-hosted.yml directly → replicas: 5
Email notifications
Optional — without email configuration, Seogard still works but sends no alerts and no password resets.
- Create a free account on resend.com (100 emails/day)
- Verify your domain in the Resend dashboard
- Add to your
.env: - Restart:
docker compose -f docker-compose.self-hosted.yml restart web worker
OAuth login
Optional — without OAuth, users log in with email + password.
Add the keys to your .env to enable each provider:
- Create an OAuth Client on Google Cloud Console
- Redirect URI :
https://seogard.io/api/auth/oauth/google/callback GOOGLE_CLIENT_ID=...andGOOGLE_CLIENT_SECRET=...
Microsoft
- Create an app on Azure Portal → App registrations
- Redirect URI :
https://seogard.io/api/auth/oauth/microsoft/callback MICROSOFT_CLIENT_ID=...andMICROSOFT_CLIENT_SECRET=...
GitHub
- Create an OAuth App on GitHub Developer Settings
- Callback URL :
https://seogard.io/api/auth/oauth/github/callback GITHUB_CLIENT_ID=...andGITHUB_CLIENT_SECRET=...
Crawler whitelisting
If your sites are behind a WAF (Cloudflare, Akamai, etc.), you must whitelist your server's IP.
See the whitelisting guideUpdating
cd seogardgit pulldocker compose -f docker-compose.self-hosted.yml up --build -dMongoDB data persists in a Docker volume. No data loss during an update.
License
Seogard is distributed under the Business Source License 1.1 (BSL). You can use it for free for internal use (monitoring your own sites). Using it as a competing commercial service is prohibited.
Each release automatically converts to Apache 2.0 after 3 years.
Read the full licenseBackup
# Sauvegarderdocker exec seogard-mongo-1 mongodump --archive > backup-$(date +%Y%m%d).archive# Restaurerdocker exec -i seogard-mongo-1 mongorestore --archive < backup.archive