# Environment Variables
URL: https://usememos.com/docs/configuration/environment-variables

Memos maps runtime flags to environment variables with the `MEMOS_` prefix. In production, environment variables are usually the cleanest way to keep deployment config explicit and repeatable.

## Reference [#reference]

All flags and their corresponding environment variables:

| Flag                       | Environment variable           | Default  | Purpose                                                          |
| -------------------------- | ------------------------------ | -------- | ---------------------------------------------------------------- |
| `--port`                   | `MEMOS_PORT`                   | `8081`   | HTTP listen port                                                 |
| `--addr`                   | `MEMOS_ADDR`                   | \`\`     | Bind address (empty = all interfaces)                            |
| `--unix-sock`              | `MEMOS_UNIX_SOCK`              | \`\`     | Unix socket path                                                 |
| `--data`                   | `MEMOS_DATA`                   | auto     | Data directory                                                   |
| `--driver`                 | `MEMOS_DRIVER`                 | `sqlite` | Database backend (`sqlite`, `mysql`, `postgres`)                 |
| `--dsn`                    | `MEMOS_DSN`                    | auto     | Database connection string                                       |
| `--instance-url`           | `MEMOS_INSTANCE_URL`           | \`\`     | Public instance URL                                              |
| `--demo`                   | `MEMOS_DEMO`                   | `false`  | Demo mode                                                        |
| `--allow-private-webhooks` | `MEMOS_ALLOW_PRIVATE_WEBHOOKS` | `false`  | Allow webhook URLs that resolve to private or reserved IP ranges |
| `--log-level`              | `MEMOS_LOG_LEVEL`              | `info`   | Log verbosity (`debug`, `info`, `warn`, `error`)                 |

### Data directory defaults [#data-directory-defaults]

`MEMOS_DATA` resolves automatically when not set:

* **Windows**: `%ProgramData%\memos`
* **Docker**: `/var/opt/memos` (when writable)
* **Linux / macOS**: current directory (`.`)

### DSN defaults [#dsn-defaults]

When `MEMOS_DRIVER=sqlite` and `MEMOS_DSN` is empty, the database file defaults to `{MEMOS_DATA}/memos_prod.db`. For MySQL and PostgreSQL, `MEMOS_DSN` is required.

## Priority order [#priority-order]

1. Command-line flags (highest)
2. Environment variables
3. Default values (lowest)

An explicit flag always wins over the environment variable for the same setting.

## Practical guidance [#practical-guidance]

* set `MEMOS_INSTANCE_URL` whenever the app sits behind a proxy
* prefer explicit `MEMOS_DRIVER` and `MEMOS_DSN` when you are not using SQLite defaults
* leave `MEMOS_ALLOW_PRIVATE_WEBHOOKS` disabled unless your webhook targets intentionally live on a trusted private network
* keep secrets such as database credentials outside committed compose files
* treat these values as part of deployment config and back them up accordingly

## Common patterns [#common-patterns]

SQLite with explicit data directory:

```bash
export MEMOS_DRIVER=sqlite
export MEMOS_DATA=/var/opt/memos
./memos
```

External PostgreSQL:

```bash
export MEMOS_DRIVER=postgres
export MEMOS_DSN="postgres://user:password@db:5432/memos?sslmode=disable"
export MEMOS_INSTANCE_URL=https://memos.example.com
./memos
```

Unix socket with Nginx (useful for local reverse proxy):

```bash
export MEMOS_UNIX_SOCK=/var/run/memos.sock
export MEMOS_DATA=/var/lib/memos
export MEMOS_INSTANCE_URL=https://memos.example.com
./memos
```

Nginx upstream for the socket:

```nginx
upstream memos {
    server unix:/var/run/memos.sock;
}
```
