mirror of
https://github.com/knadh/listmonk.git
synced 2024-11-13 02:55:04 +08:00
Compare commits
4 commits
36258d9c12
...
79065db9a4
Author | SHA1 | Date | |
---|---|---|---|
|
79065db9a4 | ||
|
7fcc6f71e2 | ||
|
24bab75996 | ||
|
c2f92571b3 |
9 changed files with 252 additions and 470 deletions
34
README.md
34
README.md
|
@ -12,38 +12,30 @@ Visit [listmonk.app](https://listmonk.app) for more info. Check out the [**live
|
|||
|
||||
### Docker
|
||||
|
||||
The latest image is available on DockerHub at [`listmonk/listmonk:latest`](https://hub.docker.com/r/listmonk/listmonk/tags?page=1&ordering=last_updated&name=latest). Use the sample [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) to run manually or use the helper script.
|
||||
The latest image is available on DockerHub at [`listmonk/listmonk:latest`](https://hub.docker.com/r/listmonk/listmonk/tags?page=1&ordering=last_updated&name=latest).
|
||||
Download and use the sample [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml).
|
||||
|
||||
#### Demo
|
||||
|
||||
```bash
|
||||
mkdir listmonk-demo && cd listmonk-demo
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)"
|
||||
```shell
|
||||
# Download the compose file to the current directory.
|
||||
curl -O https://github.com/knadh/listmonk/blob/master/docker-compose.yml
|
||||
|
||||
# Run the services in the background.
|
||||
docker compose up -d
|
||||
```
|
||||
Visit `http://localhost:9000`
|
||||
|
||||
DO NOT use this demo setup in production.
|
||||
|
||||
#### Production
|
||||
|
||||
```bash
|
||||
mkdir listmonk && cd listmonk
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-prod.sh)"
|
||||
```
|
||||
Visit `http://localhost:9000`.
|
||||
|
||||
**NOTE**: Always examine the contents of shell scripts before executing them.
|
||||
|
||||
See [installation docs](https://listmonk.app/docs/installation).
|
||||
See [installation docs](https://listmonk.app/docs/installation)
|
||||
|
||||
__________________
|
||||
|
||||
### Binary
|
||||
- Download the [latest release](https://github.com/knadh/listmonk/releases) and extract the listmonk binary.
|
||||
- `./listmonk --new-config` to generate config.toml. Then, edit the file.
|
||||
- `./listmonk --new-config` to generate config.toml. Edit it.
|
||||
- `./listmonk --install` to setup the Postgres DB (or `--upgrade` to upgrade an existing DB. Upgrades are idempotent and running them multiple times have no side effects).
|
||||
- Run `./listmonk` and visit `http://localhost:9000`.
|
||||
- Run `./listmonk` and visit `http://localhost:9000`
|
||||
|
||||
See [installation docs](https://listmonk.app/docs/installation).
|
||||
See [installation docs](https://listmonk.app/docs/installation)
|
||||
__________________
|
||||
|
||||
|
||||
|
|
|
@ -1,64 +1,65 @@
|
|||
# NOTE: This docker-compose.yml is an example setup.
|
||||
# It is not intented to run out of the box
|
||||
# and you must edit the below configurations to suit your needs.
|
||||
# See https://listmonk.app/docs/installation/#manual-docker-install_1
|
||||
|
||||
x-app-defaults: &app-defaults
|
||||
restart: unless-stopped
|
||||
image: listmonk/listmonk:latest
|
||||
ports:
|
||||
- "9000:9000"
|
||||
networks:
|
||||
- listmonk
|
||||
environment:
|
||||
- TZ=Etc/UTC
|
||||
|
||||
x-db-defaults: &db-defaults
|
||||
image: postgres:14-alpine
|
||||
ports:
|
||||
- "9432:5432"
|
||||
networks:
|
||||
- listmonk
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=listmonk
|
||||
- POSTGRES_USER=listmonk
|
||||
- POSTGRES_DB=listmonk
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U listmonk"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 6
|
||||
x-db-credentials: &db-credentials # Use the default POSTGRES_ credentials if they're available or simply default to "listmonk"
|
||||
POSTGRES_USER: &db-user listmonk # for database user, password, and database name
|
||||
POSTGRES_PASSWORD: &db-password listmonk
|
||||
POSTGRES_DB: &db-name listmonk
|
||||
|
||||
services:
|
||||
# listmonk app
|
||||
app:
|
||||
image: listmonk/listmonk:test
|
||||
container_name: listmonk_app
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "9000:9000" # To change the externally exposed port, change to: $custom_port:9000
|
||||
networks:
|
||||
- listmonk
|
||||
hostname: listmonk.example.com # Recommend using FQDN for hostname
|
||||
depends_on:
|
||||
- db
|
||||
command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"]
|
||||
# --config (file) param is set to empty so that listmonk only uses the env vars (below) for config.
|
||||
# --install --idempotent ensures that DB installation happens only once on an empty DB, on the first ever start.
|
||||
# --upgrade automatically runs any DB migrations when a new image is pulled.
|
||||
|
||||
environment: # The same params as in config.toml are passed as env vars here.
|
||||
LISTMONK_app__address: 0.0.0.0:9000
|
||||
LISTMONK_db__user: *db-user
|
||||
LISTMONK_db__password: *db-password
|
||||
LISTMONK_db__database: *db-name
|
||||
LISTMONK_db__host: listmonk_db
|
||||
LISTMONK_db__port: 5432
|
||||
LISTMONK_db__ssl_mode: disable
|
||||
LISTMONK_db__max_open: 25
|
||||
LISTMONK_db__max_idle: 25
|
||||
LISTMONK_db__max_lifetime: 300s
|
||||
TZ: Etc/UTC
|
||||
LISTMONK_ADMIN_USER: ${LISTMONK_ADMIN_USER:-} # If these (optional) are set during the first `docker compose up`, then the Super Admin user is automatically created.
|
||||
LISTMONK_ADMIN_PASSWORD: ${LISTMONK_ADMIN_PASSWORD:-} # Otherwise, the user can be setup on the web app after the first visit to http://localhost:9000
|
||||
volumes:
|
||||
- ./uploads:/listmonk/uploads:rw # Mount an uploads directory on the host to /listmonk/uploads inside the container.
|
||||
# To use this, change directory path in Admin -> Settings -> Media to /listmonk/uploads
|
||||
|
||||
# Postgres database
|
||||
db:
|
||||
<<: *db-defaults
|
||||
image: postgres:17-alpine
|
||||
container_name: listmonk_db
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5432:5432"
|
||||
networks:
|
||||
- listmonk
|
||||
environment:
|
||||
<<: *db-credentials
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U listmonk"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 6
|
||||
volumes:
|
||||
- type: volume
|
||||
source: listmonk-data
|
||||
target: /var/lib/postgresql/data
|
||||
|
||||
app:
|
||||
<<: *app-defaults
|
||||
container_name: listmonk_app
|
||||
hostname: listmonk.example.com # Recommend using FQDN for hostname
|
||||
depends_on:
|
||||
- db
|
||||
volumes:
|
||||
- ./config.toml:/listmonk/config.toml
|
||||
|
||||
demo-db:
|
||||
container_name: listmonk_demo_db
|
||||
<<: *db-defaults
|
||||
|
||||
demo-app:
|
||||
<<: *app-defaults
|
||||
container_name: listmonk_demo_app
|
||||
command: [sh, -c, "yes | ./listmonk --install --config config-demo.toml && ./listmonk --config config-demo.toml"]
|
||||
depends_on:
|
||||
- demo-db
|
||||
|
||||
networks:
|
||||
listmonk:
|
||||
|
||||
|
|
|
@ -1,97 +1,46 @@
|
|||
# Installation
|
||||
|
||||
listmonk requires Postgres ⩾ 12
|
||||
|
||||
!!! Admin
|
||||
listmonk generates and prints admin credentials to the terminal during installation. This can be copied to login to the admin dashboard and later changed. To choose a custom username and password during installation,
|
||||
set the environment variables `LISTMONK_ADMIN_USER` and `LISTMONK_ADMIN_PASSWORD` during installation.
|
||||
listmonk is a simple binary application that requires a Postgres database instance to run. The binary can be downloaded and run manually, or it can be run as a container with Docker compose.
|
||||
|
||||
## Binary
|
||||
1. Download the [latest release](https://github.com/knadh/listmonk/releases) and extract the listmonk binary. `amd64` is the main one. It works for Intel and x86 CPUs.
|
||||
1. `./listmonk --new-config` to generate config.toml. Edit the file.
|
||||
1. `./listmonk --install` to install the tables in the Postgres DB. Copy the admin username and password from the terminal output (these can be changed from the admin UI later). To choose a custom username and password during installation, run: `LISTMONK_ADMIN_USER=myuser LISTMONK_ADMIN_PASSWORD=xxxxx ./listmonk --install`
|
||||
1. Run `./listmonk` and visit `http://localhost:9000`.
|
||||
1. `./listmonk --install` to install the tables in the Postgres DB (⩾ 12).
|
||||
1. Run `./listmonk` and visit `http://localhost:9000` to create the Super Admin user and login.
|
||||
|
||||
!!! Tip
|
||||
To set the Super Admin username and password during installation, set the environment variables:
|
||||
`LISTMONK_ADMIN_USER=myuser LISTMONK_ADMIN_PASSWORD=xxxxx ./listmonk --install`
|
||||
|
||||
|
||||
## Docker
|
||||
|
||||
The latest image is available on DockerHub at `listmonk/listmonk:latest`
|
||||
|
||||
!!! note
|
||||
listmonk's docs and scripts use `docker compose`, which is compatible with the latest version of docker. If you installed docker and docker-compose from your Linux distribution, you probably have an older version and will need to use the `docker-compose` command instead, or you'll need to update docker manually. [More info](https://gist.github.com/MaximilianKohler/e5158fcfe6de80a9069926a67afcae11#docker-update).
|
||||
The recommended method is to download the [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) file, customize it for your environment and then to simply run `docker compose up -d`.
|
||||
|
||||
Use the sample [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) to run listmonk and Postgres DB with `docker compose` as follows:
|
||||
```shell
|
||||
# Download the compose file to the current directory.
|
||||
curl -O https://github.com/knadh/listmonk/blob/master/docker-compose.yml
|
||||
|
||||
### Demo
|
||||
|
||||
#### Easy Docker install
|
||||
|
||||
```bash
|
||||
mkdir listmonk-demo && cd listmonk-demo
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)"
|
||||
# Run the services in the background.
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
#### Manual Docker install
|
||||
Then, visit `http://localhost:9000` to create the Super Admin user and login.
|
||||
|
||||
```bash
|
||||
wget -O docker-compose.yml https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml
|
||||
docker compose up -d demo-db demo-app
|
||||
```
|
||||
!!! Tip
|
||||
To set the Super Admin username and password during setup, set the environment variables (only the first time):
|
||||
`LISTMONK_ADMIN_USER=myuser LISTMONK_ADMIN_PASSWORD=xxxxx docker compose up -d`
|
||||
|
||||
!!! warning
|
||||
The demo does not persist Postgres after the containers are removed. **DO NOT** use this demo setup in production.
|
||||
|
||||
### Production
|
||||
------------
|
||||
|
||||
#### Easy Docker install
|
||||
### Mounting a custom config.toml
|
||||
The docker-compose file includes all necessary listmonk configuration as environment variables, `LISTMONK_*`.
|
||||
If you would like to remove those and mount a config.toml instead:
|
||||
|
||||
This setup is recommended if you want to _quickly_ setup `listmonk` in production.
|
||||
|
||||
```bash
|
||||
mkdir listmonk && cd listmonk
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-prod.sh)"
|
||||
```
|
||||
|
||||
The above shell script performs the following actions:
|
||||
|
||||
- Downloads `docker-compose.yml` and generates a `config.toml`.
|
||||
- Runs a Postgres container and installs the database schema.
|
||||
- Runs the `listmonk` container.
|
||||
|
||||
!!! note
|
||||
It's recommended to examine the contents of the shell script, before running in your environment.
|
||||
|
||||
#### Manual Docker install
|
||||
|
||||
The following workflow is recommended to setup `listmonk` manually using `docker compose`. You are encouraged to customise the contents of [`docker-compose.yml`](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) to your needs. The overall setup looks like:
|
||||
|
||||
- `docker compose up db` to run the Postgres DB.
|
||||
- `docker compose run --rm app ./listmonk --install` to setup the DB (or `--upgrade` to upgrade an existing DB).
|
||||
- Copy `config.toml.sample` to your directory and make the following changes:
|
||||
- `app.address` => `0.0.0.0:9000` (Port forwarding on Docker will work only if the app is advertising on all interfaces.)
|
||||
- `db.host` => `listmonk_db` (Container Name of the DB container)
|
||||
- Run `docker compose up app` and visit `http://localhost:9000`.
|
||||
|
||||
##### Mounting a custom config.toml
|
||||
|
||||
To mount a local `config.toml` file, add the following section to `docker-compose.yml`:
|
||||
|
||||
```yml
|
||||
app:
|
||||
<<: *app-defaults
|
||||
depends_on:
|
||||
- db
|
||||
volumes:
|
||||
- ./path/on/your/host/config.toml:/listmonk/config.toml
|
||||
```
|
||||
|
||||
!!! note
|
||||
Some common changes done inside `config.toml` for Docker based setups:
|
||||
|
||||
- Change `app.address` to `0.0.0.0:9000`.
|
||||
- Change `db.host` to `listmonk_db`.
|
||||
|
||||
Here's a sample `config.toml` you can use:
|
||||
#### 1. Save the config.toml file on the host
|
||||
|
||||
```toml
|
||||
[app]
|
||||
|
@ -99,7 +48,7 @@ address = "0.0.0.0:9000"
|
|||
|
||||
# Database.
|
||||
[db]
|
||||
host = "listmonk_db"
|
||||
host = "listmonk_db" # Postgres container name in the compose file.
|
||||
port = 5432
|
||||
user = "listmonk"
|
||||
password = "listmonk"
|
||||
|
@ -110,25 +59,20 @@ max_idle = 25
|
|||
max_lifetime = "300s"
|
||||
```
|
||||
|
||||
Mount the local `config.toml` inside the container at `listmonk/config.toml`.
|
||||
#### 2. Mount the config file in docker-compose.yml
|
||||
|
||||
!!! tip
|
||||
- See [configuring with environment variables](configuration.md) for variables like `app.admin_password` and `db.password`
|
||||
- Ensure that both `app` and `db` containers are in running. If the containers are not running, restart them `docker compose restart app db`.
|
||||
- Refer to [this tutorial](https://yasoob.me/posts/setting-up-listmonk-opensource-newsletter-mailing/) for setting up a production instance with Docker + Nginx + LetsEncrypt SSL.
|
||||
```yaml
|
||||
app:
|
||||
...
|
||||
volumes:
|
||||
- /path/on/your/host/config.toml:/listmonk/config.toml
|
||||
```
|
||||
|
||||
!!! info
|
||||
The example `docker-compose.yml` file works with Docker Engine 24.0.5+ and Docker Compose version v2.20.2+.
|
||||
|
||||
##### Changing the port
|
||||
|
||||
To change the port for listmonk:
|
||||
|
||||
- Ensure no other container of listmonk app is running. You can check with `docker ps | grep listmonk`.
|
||||
- Change [L11](https://github.com/knadh/listmonk/blob/master/docker-compose.yml#L11) to `custom-port:9000` Eg: `3876:9000`. This will expose the port 3876 on your local network to the container's network interface on port 9000.
|
||||
- For NGINX setup, if you're running NGINX on your local machine, you can proxy_pass to the `<MACHINE_IP>:3876`. You can also run NGINX as a docker container within the listmonk's container (for that you need to add a service `nginx` in the docker-compose.yml). If you do that, then proxy_pass will be set to `http://app:9000`. Docker's network will resolve the DNS for `app` and directly speak to port 9000 (which the app is exposing within its own network).
|
||||
|
||||
#### 3. Change the `--config ''` flags in the `command:` section to point to the path
|
||||
|
||||
```yaml
|
||||
command: [sh, -c, "./listmonk --install --idempotent --yes --config /listmonk/config.toml && ./listmonk --upgrade --yes --config /listmonk/config.toml && ./listmonk --config /listmonk/config.toml"]
|
||||
```
|
||||
|
||||
|
||||
## Compiling from source
|
||||
|
@ -137,13 +81,13 @@ To compile the latest unreleased version (`master` branch):
|
|||
|
||||
1. Make sure `go`, `nodejs`, and `yarn` are installed on your system.
|
||||
2. `git clone git@github.com:knadh/listmonk.git`
|
||||
3. `cd listmonk && make dist`. This will generate the `listmonk binary`.
|
||||
3. `cd listmonk && make dist`. This will generate the `listmonk` binary.
|
||||
|
||||
## Release candidate (RC)
|
||||
|
||||
The `master` branch with bleeding edge changes is periodically built and published as `listmonk/listmonk:rc` on DockerHub. To run the latest pre-release version, replace all instances of `listmonk/listmonk:latest` with `listmonk/listmonk:rc` in the docker-compose.yml file and follow the Docker installation steps above. While it is generally safe to run release candidate versions, they may have issues that only get resolved in a general release.
|
||||
|
||||
## Helm chart for kubernetes
|
||||
## Helm chart for Kubernetes
|
||||
|
||||
![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 3.0.0](https://img.shields.io/badge/AppVersion-3.0.0-informational?style=flat-square)
|
||||
|
||||
|
|
|
@ -1,21 +1,24 @@
|
|||
# Upgrade
|
||||
|
||||
Some versions may require changes to the database. These changes or database "migrations" are applied automatically and safely, but, it is recommended to take a backup of the Postgres database before running the `--upgrade` option, especially if you have made customizations to the database tables.
|
||||
!!! Warning
|
||||
Always take a backup of the Postgres database before upgrading listmonk
|
||||
|
||||
## Binary
|
||||
- Download the [latest release](https://github.com/knadh/listmonk/releases) and extract the listmonk binary.
|
||||
- `./listmonk --upgrade` to upgrade an existing DB. Upgrades are idempotent and running them multiple times have no side effects.
|
||||
- Run `./listmonk` and visit `http://localhost:9000`.
|
||||
- Stop the running instance of listmonk.
|
||||
- Download the [latest release](https://github.com/knadh/listmonk/releases) and extract the listmonk binary and overwrite the previous version.
|
||||
- `./listmonk --upgrade` to upgrade an existing database schema. Upgrades are idempotent and running them multiple times have no side effects.
|
||||
- Run `./listmonk` again.
|
||||
|
||||
If you installed listmonk as a service, you will need to stop it before overwriting the binary. Something like `sudo systemctl stop listmonk` or `sudo service listmonk stop` should work. Then overwrite the binary with the new version, then run `./listmonk --upgrade, and `start` it back with the same commands.
|
||||
|
||||
If it's not running as a service, `pkill -9 listmonk` will stop the listmonk process.
|
||||
|
||||
## Docker
|
||||
> Instructions for versions above v4.x.x using the latest [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) file.
|
||||
|
||||
- `docker compose down app` and stop the app container.
|
||||
- `docker compose pull` to pull the latest version from DockerHub.
|
||||
- `docker compose run --rm app ./listmonk --upgrade` to upgrade an existing DB.
|
||||
- Run `docker compose up app db` and visit `http://localhost:9000`.
|
||||
- `docker compose up app -d` to automatically run the upgrade and start listmonk.
|
||||
|
||||
## Railway
|
||||
- Head to your dashboard, and select your Listmonk project.
|
||||
|
|
|
@ -41,22 +41,23 @@
|
|||
{{ end }}
|
||||
</li>
|
||||
<li>
|
||||
<code>./listmonk --new-config</code> to generate config.toml. Edit the file.
|
||||
<code>./listmonk --new-config</code> to generate config.toml. Edit it.
|
||||
</li>
|
||||
<li><code>./listmonk --install</code> to setup the Postgres DB (⩾ v9.4) or <code>--upgrade</code> to upgrade an existing DB.</li>
|
||||
<li><code>./listmonk --install</code> to setup the Postgres DB or <code>--upgrade</code> to upgrade an existing DB.</li>
|
||||
<li>Run <code>./listmonk</code> and visit <code>http://localhost:9000</code></li>
|
||||
</ul>
|
||||
<p><a href="/docs/installation">Installation docs →</a></p>
|
||||
|
||||
<br />
|
||||
<h3>Hosting providers</h3>
|
||||
<a href="https://railway.app/new/template/listmonk"><img src="https://camo.githubusercontent.com/d07713342bc583232f8752c33a6a24e5f367d73725183a63f2f5fdd7c00606a3/68747470733a2f2f7261696c7761792e6170702f627574746f6e2e737667" alt="One-click deploy on Railway" style="max-height: 32px;" /></a>
|
||||
<a href="https://railway.app/new/template/listmonk"><img src="https://railway.app/button.svg" alt="One-click deploy on Railway" style="max-height: 32px;" /></a>
|
||||
<br />
|
||||
<a href="https://www.pikapods.com/pods?run=listmonk"><img src="https://www.pikapods.com/static/run-button.svg" alt="Deploy on PikaPod" /></a>
|
||||
<br />
|
||||
<a href="https://dash.elest.io/deploy?soft=Listmonk&id=237"><img height="33" src="https://github.com/elestio-examples/wordpress/raw/main/deploy-on-elestio.png" alt="Deploy on Elestio" /></a>
|
||||
<br />
|
||||
<a href="https://zeabur.com/templates/5EDMN6"><img width="148" src="https://zeabur.com/button.svg" alt="Deploy on Zeabur"/></a>
|
||||
<p><small>*listmonk has no affiliation with any of these providers.</small></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
|
@ -64,24 +65,19 @@
|
|||
<h3>Docker</h3>
|
||||
<p><a href="https://hub.docker.com/r/listmonk/listmonk/tags?page=1&ordering=last_updated&name=latest"><code>listmonk/listmonk:latest</code></a></p>
|
||||
<p>
|
||||
Use the sample <a href="https://github.com/knadh/listmonk/blob/master/docker-compose.yml">docker-compose.yml</a>
|
||||
to run manually or use the helper script.
|
||||
</p>
|
||||
<h4>Demo</h4>
|
||||
<pre>mkdir listmonk-demo && cd listmonk-demo
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)"</pre>
|
||||
<p>
|
||||
(DO NOT use this demo setup in production)
|
||||
Download and use the sample <a href="https://github.com/knadh/listmonk/blob/master/docker-compose.yml">docker-compose.yml</a>
|
||||
</p>
|
||||
|
||||
<h4>Production</h4>
|
||||
<pre>mkdir listmonk && cd listmonk
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-prod.sh)"</pre>
|
||||
<pre>
|
||||
# Download the compose file to the current directory.
|
||||
curl -O https://github.com/knadh/listmonk/blob/master/docker-compose.yml
|
||||
|
||||
# Run the services in the background.
|
||||
docker compose up -d
|
||||
</pre>
|
||||
<p>Visit <code>http://localhost:9000</code></p>
|
||||
|
||||
<p><a href="/docs/installation">Installation docs →</a></p>
|
||||
|
||||
<p class="small">NOTE: Always examine the contents of shell scripts before executing them.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
184
i18n/hu.json
184
i18n/hu.json
|
@ -1,18 +1,18 @@
|
|||
{
|
||||
"_.code": "hu",
|
||||
"_.name": "Magyar (hu)",
|
||||
"_.name": "magyar (hu)",
|
||||
"admin.errorMarshallingConfig": "Hiba a konfiguráció exportálásakor: {error}",
|
||||
"analytics.count": "Darab",
|
||||
"analytics.fromDate": "Ettől",
|
||||
"analytics.invalidDates": "Érvénytelen kezdő vagy végdátum.",
|
||||
"analytics.isUnique": "Darabszámok tagok szerint.",
|
||||
"analytics.links": "Linkek",
|
||||
"analytics.links": "Hivatkozások",
|
||||
"analytics.nonUnique": "Darabszámok összesítve. A megtekintések és kattintások tagokhoz kötése ki van kapcsolva.",
|
||||
"analytics.title": "Kimutatás",
|
||||
"analytics.toDate": "Eddig",
|
||||
"bounces.complaint": "Panasz",
|
||||
"bounces.hard": "Kemény",
|
||||
"bounces.soft": "Lágy",
|
||||
"bounces.soft": "Puha",
|
||||
"bounces.source": "Forrás",
|
||||
"bounces.unknownService": "Ismeretlen szolgáltatás.",
|
||||
"bounces.view": "Visszapattanások megtekintése",
|
||||
|
@ -24,7 +24,7 @@
|
|||
"campaigns.archiveMeta": "Kapány metaadat",
|
||||
"campaigns.archiveMetaHelp": "A nyilvánosan közzétett kampányüzenetbe helyettesítendő adatok (pl. név, e-mail cím, és amiket a sablon használ).",
|
||||
"campaigns.archiveSlug": "URL Slug",
|
||||
"campaigns.archiveSlugHelp": "Egy rövid név a nyilvános URL-ben való használathoz. Pl: my-newsletter-edition-2",
|
||||
"campaigns.archiveSlugHelp": "Egy rövid név a nyilvános URL-címben való használathoz. Például: én-hírlevél-kiadás-2",
|
||||
"campaigns.attachments": "Mellékletek",
|
||||
"campaigns.cantUpdate": "Nem lehet frissíteni futó vagy befejezett kampányt.",
|
||||
"campaigns.clicks": "Kattintások",
|
||||
|
@ -48,10 +48,10 @@
|
|||
"campaigns.fieldInvalidSubject": "A tárgy túl hosszú.",
|
||||
"campaigns.formatHTML": "HTML formátum",
|
||||
"campaigns.fromAddress": "Feladó",
|
||||
"campaigns.fromAddressPlaceholder": "Feladó <noreply@teszt.hu>",
|
||||
"campaigns.fromAddressPlaceholder": "Feladó <nincsválasz@teszt.hu>",
|
||||
"campaigns.invalid": "Érvénytelen kampány",
|
||||
"campaigns.invalidCustomHeaders": "Érvénytelen fejlécek: {error}",
|
||||
"campaigns.markdown": "Markdown",
|
||||
"campaigns.markdown": "Markdown-nyelv",
|
||||
"campaigns.needsSendAt": "A kampányhoz ütemezéséhez dátumot kell beállítani.",
|
||||
"campaigns.newCampaign": "Új kampány",
|
||||
"campaigns.noKnownSubsToTest": "Nincsenek tagok a teszteléshez.",
|
||||
|
@ -82,7 +82,7 @@
|
|||
"campaigns.sendToLists": "Cél listák",
|
||||
"campaigns.sent": "Elküldve",
|
||||
"campaigns.start": "Indítás",
|
||||
"campaigns.started": "\"{name}\" elindult",
|
||||
"campaigns.started": "„{name}” elindult",
|
||||
"campaigns.startedAt": "Kezdete",
|
||||
"campaigns.stats": "Statisztika",
|
||||
"campaigns.status.cancelled": "Megszakítva",
|
||||
|
@ -91,13 +91,13 @@
|
|||
"campaigns.status.paused": "Szünetel",
|
||||
"campaigns.status.running": "Aktív",
|
||||
"campaigns.status.scheduled": "Ütemezett",
|
||||
"campaigns.statusChanged": "\"{name}\" {status}",
|
||||
"campaigns.statusChanged": "„{name}” {status}",
|
||||
"campaigns.subject": "Tárgy",
|
||||
"campaigns.templatingRef": "Sablon referenciák",
|
||||
"campaigns.templatingRef": "Sablonhivatkozások",
|
||||
"campaigns.testEmails": "Címek",
|
||||
"campaigns.testSent": "Tesztüzenet elküldve",
|
||||
"campaigns.timestamps": "Időbélyegek",
|
||||
"campaigns.trackLink": "Nyomkövető link",
|
||||
"campaigns.trackLink": "Nyomkövetőhivatkozás",
|
||||
"campaigns.views": "Megtekintések",
|
||||
"dashboard.campaignViews": "Megtekintések",
|
||||
"dashboard.linkClicks": "Kattintások",
|
||||
|
@ -124,7 +124,7 @@
|
|||
"forms.formHTML": "HTML űrlap",
|
||||
"forms.formHTMLHelp": "Az alábbi HTML kód beágyazásával megjelenítheti az feliratkozási űrlapot egy külső weboldalon. Az űrlapnak tartalmaznia kell az e-mail mezőt és egy vagy több `name=\"l\"` (lista UUID) mezőt. A név mező nem kötelező.",
|
||||
"forms.noPublicLists": "Nincsenek nyilvános listák az űrlapok létrehozásához.",
|
||||
"forms.publicLists": "Publikus listák",
|
||||
"forms.publicLists": "Nyilvános listák",
|
||||
"forms.publicSubPage": "Nyilvános feliratkozási oldal",
|
||||
"forms.selectHelp": "Válassza ki az űrlapon megjelenő listákat.",
|
||||
"forms.title": "Űrlapok",
|
||||
|
@ -141,8 +141,8 @@
|
|||
"globals.buttons.delete": "Törlés",
|
||||
"globals.buttons.deleteAll": "Összes törlése",
|
||||
"globals.buttons.edit": "Szerkesztés",
|
||||
"globals.buttons.enabled": "Be",
|
||||
"globals.buttons.insert": "Beillesztés",
|
||||
"globals.buttons.enabled": "Engedélyezve",
|
||||
"globals.buttons.insert": "Beszúrás",
|
||||
"globals.buttons.learnMore": "Tudj meg többet",
|
||||
"globals.buttons.manage": "Manage",
|
||||
"globals.buttons.more": "Tovább",
|
||||
|
@ -172,8 +172,8 @@
|
|||
"globals.messages.confirm": "Biztos?",
|
||||
"globals.messages.confirmDiscard": "Módosítások elvetése?",
|
||||
"globals.messages.copied": "Másolva",
|
||||
"globals.messages.created": "\"{name}\" létrehozva",
|
||||
"globals.messages.deleted": "\"{name}\" törölve",
|
||||
"globals.messages.created": "„{name}” létrehozva",
|
||||
"globals.messages.deleted": "„{name}” törölve",
|
||||
"globals.messages.deletedCount": "{name} ({num}) törölve",
|
||||
"globals.messages.done": "Kész",
|
||||
"globals.messages.emptyState": "Üres",
|
||||
|
@ -194,21 +194,21 @@
|
|||
"globals.messages.passwordChangeFull": "Tisztítsa meg és írja be újra a teljes jelszót a(z) '{name}'-ben.",
|
||||
"globals.messages.permissionDenied": "Permission denied: {name}",
|
||||
"globals.messages.slowQueriesCached": "A lassú lekérdezések gyorsítótárazva vannak. Ennek az oldalnak néhány száma nem lesz naprakész.",
|
||||
"globals.messages.updated": "\"{name}\" frissítve",
|
||||
"globals.months.1": "Jan",
|
||||
"globals.months.10": "Okt",
|
||||
"globals.months.11": "Nov",
|
||||
"globals.months.12": "Dec",
|
||||
"globals.months.2": "Feb",
|
||||
"globals.months.3": "Már",
|
||||
"globals.months.4": "Ápr",
|
||||
"globals.months.5": "Máj",
|
||||
"globals.months.6": "Jún",
|
||||
"globals.months.7": "Júl",
|
||||
"globals.months.8": "Aug",
|
||||
"globals.months.9": "Szep",
|
||||
"globals.messages.updated": "„{name}” frissítve",
|
||||
"globals.months.1": "január",
|
||||
"globals.months.10": "október",
|
||||
"globals.months.11": "november",
|
||||
"globals.months.12": "december",
|
||||
"globals.months.2": "február",
|
||||
"globals.months.3": "március",
|
||||
"globals.months.4": "április",
|
||||
"globals.months.5": "május",
|
||||
"globals.months.6": "június",
|
||||
"globals.months.7": "július",
|
||||
"globals.months.8": "augusztus",
|
||||
"globals.months.9": "szeptember",
|
||||
"globals.states.off": "Ki",
|
||||
"globals.terms.all": "Mindegyik",
|
||||
"globals.terms.all": "Összes",
|
||||
"globals.terms.analytics": "Kimutatás",
|
||||
"globals.terms.bounce": "Visszapattanó",
|
||||
"globals.terms.bounces": "Visszapattanók",
|
||||
|
@ -235,12 +235,12 @@
|
|||
"globals.terms.template": "Sablon",
|
||||
"globals.terms.templates": "Sablonok",
|
||||
"globals.terms.tx": "Ügymenet",
|
||||
"globals.terms.user": "User | Users",
|
||||
"globals.terms.users": "Users",
|
||||
"globals.terms.user": "Felhasználó | Felhasználók",
|
||||
"globals.terms.users": "Felhasználók",
|
||||
"globals.terms.year": "Év",
|
||||
"import.alreadyRunning": "Az importálás elkezdődött. Várja meg, amíg befejeződik, vagy állítsa le, mielőtt újra próbálkozna.",
|
||||
"import.blocklist": "Tiltás",
|
||||
"import.csvDelim": "CSV határoló",
|
||||
"import.csvDelim": "CSV elválasztó",
|
||||
"import.csvDelimHelp": "Az alapértelmezett határoló a vessző.",
|
||||
"import.csvExample": "CSV fájl példa",
|
||||
"import.csvFile": "CSV vagy ZIP fájl",
|
||||
|
@ -382,8 +382,8 @@
|
|||
"settings.bounces.enableWebhooks": "Visszapattanó webhook",
|
||||
"settings.bounces.enabled": "Engedélyezve",
|
||||
"settings.bounces.folder": "Mappa",
|
||||
"settings.bounces.folderHelp": "A vizsgálandó IMAP mappa neve. Például: 'Inbox'",
|
||||
"settings.bounces.hard": "Hard",
|
||||
"settings.bounces.folderHelp": "A vizsgálandó IMAP mappa neve. Például: Beérkezett üzenetek",
|
||||
"settings.bounces.hard": "Kemény",
|
||||
"settings.bounces.invalidScanInterval": "Az ellenőrzés gyakorisága 1 percnél nagyobb kell legyen.",
|
||||
"settings.bounces.name": "Visszapattanók",
|
||||
"settings.bounces.none": "Nincs",
|
||||
|
@ -393,7 +393,7 @@
|
|||
"settings.bounces.scanInterval": "Ellenőrzés gyakorisága",
|
||||
"settings.bounces.scanIntervalHelp": "A visszapattanó e-mailek ellenőrzésének gyakorisága. (s: másodperc, m: perc)",
|
||||
"settings.bounces.sendgridKey": "Kulcs",
|
||||
"settings.bounces.soft": "Soft",
|
||||
"settings.bounces.soft": "Puha",
|
||||
"settings.bounces.type": "Típus",
|
||||
"settings.bounces.username": "Név",
|
||||
"settings.confirmRestart": "Újraindítás előtt győződjön meg róla, hogy a futó kampányok szünetelnek!",
|
||||
|
@ -411,12 +411,12 @@
|
|||
"settings.general.enablePublicSubPage": "Nyilvános feliratkozás",
|
||||
"settings.general.enablePublicSubPageHelp": "Nyilvános feliratkozási felület engedélyezése, amelyen az összes nyilvános listára fel lehet iratkozni.",
|
||||
"settings.general.faviconURL": "Favicon URL",
|
||||
"settings.general.faviconURLHelp": "(Opcionális) a böngészőben megjelenő favicon URL-je",
|
||||
"settings.general.faviconURLHelp": "(Nem kötelező) a böngészőben megjelenő favicon URL-je",
|
||||
"settings.general.fromEmail": "Alapértelmezett `Feladó`",
|
||||
"settings.general.fromEmailHelp": "Új kampányok alapértelmezett `Feladó` e-mail címe, mely kapmányonként módosítható.",
|
||||
"settings.general.language": "Nyelv",
|
||||
"settings.general.logoURL": "Logó URL",
|
||||
"settings.general.logoURLHelp": "(Optional) az oldalakon megjelenő logó URL-je",
|
||||
"settings.general.logoURLHelp": "(Nem kötelező) az oldalakon megjelenő logó URL-je",
|
||||
"settings.general.name": "Általános",
|
||||
"settings.general.rootURL": "URL",
|
||||
"settings.general.rootURLHelp": "A rendszer nyilvános URL-je, záró `/` nélkül.",
|
||||
|
@ -451,13 +451,13 @@
|
|||
"settings.media.s3.bucketTypePrivate": "Privát",
|
||||
"settings.media.s3.bucketTypePublic": "Nyilvános",
|
||||
"settings.media.s3.key": "AWS hozzáférési kulcs",
|
||||
"settings.media.s3.publicURL": "Nyilvános URL (opcionális)",
|
||||
"settings.media.s3.publicURL": "Nyilvános URL (nem kötelező)",
|
||||
"settings.media.s3.publicURLHelp": "Egyéni S3 domain használata a képhivatkozásokhoz az alapértelmezett S3 backend URL helyett.",
|
||||
"settings.media.s3.region": "Régió",
|
||||
"settings.media.s3.secret": "AWS hozzáférési titok",
|
||||
"settings.media.s3.uploadExpiry": "Elévülés (TTL)",
|
||||
"settings.media.s3.uploadExpiryHelp": "(Opcionális) Elévülési idő a generált URL-hez. Csak a Privát típusra vonatkozik. (s: másodperc, m: perc, h: óra, d: nap).",
|
||||
"settings.media.s3.url": "S3 háttér URL-je",
|
||||
"settings.media.s3.uploadExpiryHelp": "(Nem kötelező) Lejárati megadása a generált előre aláírt URL-címhez. Csak a Privát típusra vonatkozik. (s: másodperc, m: perc, h: óra, d: nap).",
|
||||
"settings.media.s3.url": "S3 háttér URL-címe",
|
||||
"settings.media.s3.urlHelp": "Csak akkor módosítsa, ha egyéni S3-kompatibilis hátteret használ, mint például a Minio.",
|
||||
"settings.media.title": "Média",
|
||||
"settings.media.upload.extensions": "Engedélyezett fájlkiterjesztések",
|
||||
|
@ -468,7 +468,7 @@
|
|||
"settings.media.upload.uriHelp": "Nyilvános URI mely alatt a feltöltött fájlok elérhetőek. Például: /media",
|
||||
"settings.messengers.maxConns": "Kapcsolatok száma",
|
||||
"settings.messengers.maxConnsHelp": "Egyidejű kapcsolatok maximális száma.",
|
||||
"settings.messengers.messageSaved": "Sikeres mentés. Újratöltés...",
|
||||
"settings.messengers.messageSaved": "Sikeres mentés. Újratöltés…",
|
||||
"settings.messengers.name": "Kézbesítők",
|
||||
"settings.messengers.nameHelp": "Például: sms (betűk, számok, `-`)",
|
||||
"settings.messengers.password": "Jelszó",
|
||||
|
@ -478,7 +478,7 @@
|
|||
"settings.messengers.timeout": "Időkorlát",
|
||||
"settings.messengers.timeoutHelp": "Kapcsolat életben tartása a megadott ideig. (s: másodperc, m: perc)",
|
||||
"settings.messengers.url": "URL-cím",
|
||||
"settings.messengers.urlHelp": "A Postback szerver URL-je.",
|
||||
"settings.messengers.urlHelp": "Postback-kiszolgáló gyökérének URL-címe.",
|
||||
"settings.messengers.username": "Név",
|
||||
"settings.needsRestart": "A beállítások megváltoztak. Szüneteltesse az összes kampányt, és indítsa újra az alkalmazást.",
|
||||
"settings.performance.batchSize": "Kötegméret",
|
||||
|
@ -513,16 +513,16 @@
|
|||
"settings.privacy.listUnsubHeader": "`List-Unsubscribe` fejléc",
|
||||
"settings.privacy.listUnsubHeaderHelp": "Ha be van kapcsolva, egyes e-mail kliensek lehetővé teszik az egykattintásos leiratkozást.",
|
||||
"settings.privacy.name": "Adatvédelem",
|
||||
"settings.privacy.recordOptinIP": "Opt-in IP cím rögzítése",
|
||||
"settings.privacy.recordOptinIP": "IP-cím rögzítésére feliratkozás",
|
||||
"settings.privacy.recordOptinIPHelp": "Az előfizető attribútumainak feljegyzésekor rögzítse a dupla opt-in IP címét.",
|
||||
"settings.restart": "Újraindítás",
|
||||
"settings.security.OIDCClientID": "Client ID",
|
||||
"settings.security.OIDCClientSecret": "Client secret",
|
||||
"settings.security.OIDCHelp": "Enable OpenID Connect OAuth2 login via an OAuth provider.",
|
||||
"settings.security.OIDCRedirectURL": "Redirect URL for oAuth provider",
|
||||
"settings.security.OIDCRedirectWarning": "This does not seem to be a production URL. Change the Root URL in 'General' settings.",
|
||||
"settings.security.OIDCURL": "Provider URL",
|
||||
"settings.security.OIDCWarning": "When OIDC is enabled, default password login is disabled. Invalid config can lock you out.",
|
||||
"settings.security.OIDCClientID": "Ügyfél-azonosító",
|
||||
"settings.security.OIDCClientSecret": "Ügyfél titka",
|
||||
"settings.security.OIDCHelp": "Engedélyezze az OpenID Connect OAuth2 bejelentkezést egy OAuth-szolgáltatón keresztül.",
|
||||
"settings.security.OIDCRedirectURL": "URL-cím átirányítása az oAuth-szolgáltatóhoz",
|
||||
"settings.security.OIDCRedirectWarning": "Úgy tűnik, ez nem egy éles URL-cím. Módosítsa a gyökér URL-címet az „Általános” beállításokban.",
|
||||
"settings.security.OIDCURL": "Szolgáltató URL-címe",
|
||||
"settings.security.OIDCWarning": "Ha az OIDC engedélyezve van, az alapértelmezett jelszó bejelentkezés le van tiltva. Az érvénytelen beállítás kizárhatja Önt.",
|
||||
"settings.security.captchaKey": "hCaptcha.com kulcs",
|
||||
"settings.security.captchaKeyHelp": "Kulcs és jelszó igénylése a hcaptcha.com oldalon.",
|
||||
"settings.security.captchaSecret": "hCaptcha.com jelszó",
|
||||
|
@ -533,8 +533,8 @@
|
|||
"settings.smtp.customHeaders": "Egyéni fejlécek",
|
||||
"settings.smtp.customHeadersHelp": "Kimenő üzenetek extra fejlécei. Például: [{\"X-K1\": \"V1\"}, {\"X-K2\": \"V2\"}]",
|
||||
"settings.smtp.enabled": "Be",
|
||||
"settings.smtp.heloHost": "HELO host",
|
||||
"settings.smtp.heloHostHelp": "(Nem kötelező) Általában `localhost`, de néhány SMTP szerver teljes domain nevet vár (FQDN)",
|
||||
"settings.smtp.heloHost": "HELO házigazda",
|
||||
"settings.smtp.heloHostHelp": "(Nem kötelező) Általában `localhost`, de néhány SMTP-kiszolgáló teljes domain nevet vár (FQDN)",
|
||||
"settings.smtp.name": "SMTP",
|
||||
"settings.smtp.retries": "Újrapróbálkozások",
|
||||
"settings.smtp.retriesHelp": "Az újrapróbálkozások száma, ha az üzenet sikertelen.",
|
||||
|
@ -542,7 +542,7 @@
|
|||
"settings.smtp.setCustomHeaders": "Egyéni fejlécek beállítása",
|
||||
"settings.smtp.testConnection": "Próbaüzenet",
|
||||
"settings.smtp.testEnterEmail": "Próba jelszó",
|
||||
"settings.smtp.toEmail": "Címzett (To:)",
|
||||
"settings.smtp.toEmail": "Címzett",
|
||||
"settings.title": "Beállítások",
|
||||
"settings.updateAvailable": "Új verzió érhető el! ({version})",
|
||||
"subscribers.advancedQuery": "Adatbázis lekérdezés",
|
||||
|
@ -553,10 +553,10 @@
|
|||
"subscribers.confirmBlocklist": "{num} tag tiltása?",
|
||||
"subscribers.confirmDelete": "{num} tag törlése?",
|
||||
"subscribers.confirmExport": "{num} tag exportálása?",
|
||||
"subscribers.domainBlocklisted": "Az e-mail domainje szerepel a tiltólistán.",
|
||||
"subscribers.domainBlocklisted": "Az e-mail-tartomány szerepel a tiltólistán.",
|
||||
"subscribers.downloadData": "Adatok letöltése",
|
||||
"subscribers.email": "Email",
|
||||
"subscribers.emailExists": "Az e-mail cím már szerepel a nyilvántartásban.",
|
||||
"subscribers.email": "E-mail",
|
||||
"subscribers.emailExists": "Az e-mail-cím már szerepel a nyilvántartásban.",
|
||||
"subscribers.errorBlocklisting": "Hiba a tagok letiltása során: {error}",
|
||||
"subscribers.errorNoIDs": "Nincsenek megadva az azonosítók.",
|
||||
"subscribers.errorNoListsGiven": "Nincsenek megadva a listák.",
|
||||
|
@ -564,7 +564,7 @@
|
|||
"subscribers.errorSendingOptin": "Hiba a megerősítő e-mail küldésekor.",
|
||||
"subscribers.export": "Exportálás",
|
||||
"subscribers.invalidAction": "Érvénytelen művelet.",
|
||||
"subscribers.invalidEmail": "Érvénytelen e-mail.",
|
||||
"subscribers.invalidEmail": "Érvénytelen e-mail-cím.",
|
||||
"subscribers.invalidJSON": "Érvénytelen JSON adat.",
|
||||
"subscribers.invalidName": "Érvénytelen név.",
|
||||
"subscribers.listChangeApplied": "Lista módosítva.",
|
||||
|
@ -579,14 +579,14 @@
|
|||
"subscribers.preconfirm": "Feliratkozások megerősítése",
|
||||
"subscribers.preconfirmHelp": "Ne küldjön megerősítő e-maileket, és jelölje meg az összes tagot 'feliratkozottként'.",
|
||||
"subscribers.query": "Lekérdezés",
|
||||
"subscribers.queryPlaceholder": "E-mail vagy név",
|
||||
"subscribers.queryPlaceholder": "E-mail-cím vagy név",
|
||||
"subscribers.reset": "Visszaállítás",
|
||||
"subscribers.selectAll": "Összes kijelölése ({num})",
|
||||
"subscribers.sendOptinConfirm": "Megerősítő e-mail küldése",
|
||||
"subscribers.sentOptinConfirm": "Megerősítő e-mail elküldve",
|
||||
"subscribers.status.blocklisted": "Tiltólistán",
|
||||
"subscribers.status.confirmed": "Megerősített",
|
||||
"subscribers.status.enabled": "Aktív",
|
||||
"subscribers.status.enabled": "Engedélyezve",
|
||||
"subscribers.status.subscribed": "Feliratkozva",
|
||||
"subscribers.status.unconfirmed": "Nem megerősített",
|
||||
"subscribers.status.unsubscribed": "Leiratkozott",
|
||||
|
@ -602,41 +602,41 @@
|
|||
"templates.newTemplate": "Új sablon",
|
||||
"templates.placeholderHelp": "A(z) {placeholder} pontosan egyszer helyettesíthető be.",
|
||||
"templates.preview": "Előnézet",
|
||||
"templates.rawHTML": "HTML Forrás",
|
||||
"templates.rawHTML": "HTML-forrás",
|
||||
"templates.subject": "Tárgy",
|
||||
"users.apiOneTimeToken": "Copy the API access token now. It will not be shown again.",
|
||||
"users.cantDeleteRole": "Cannot delete role that is in use.",
|
||||
"users.invalidLogin": "Invalid login or password",
|
||||
"users.invalidRequest": "Invalid auth request",
|
||||
"users.lastLogin": "Last login",
|
||||
"users.listPerms": "List permissions",
|
||||
"users.listPermsWarning": "lists:get_all or lists:manage_all are enabled which overrides per-list permissions",
|
||||
"users.listRole": "List roles | List role",
|
||||
"users.listRoles": "List roles",
|
||||
"users.apiOneTimeToken": "Másolja ki most az API hozzáférési tokent. Nem jelenik meg újra.",
|
||||
"users.cantDeleteRole": "A használatban lévő szerepkör nem törölhető.",
|
||||
"users.invalidLogin": "Érvénytelen bejelentkezési név vagy jelszó",
|
||||
"users.invalidRequest": "Érvénytelen hitelesítési kérelem",
|
||||
"users.lastLogin": "Utolsó bejelentkezés",
|
||||
"users.listPerms": "Engedélyek listázása",
|
||||
"users.listPermsWarning": "A lists:get_all vagy a lists:manage_all engedélyezve van, amely felülbírálja a listánkénti engedélyeket",
|
||||
"users.listRole": "Szereplőlista",
|
||||
"users.listRoles": "Szereplőlista",
|
||||
"users.login": "Belépés",
|
||||
"users.loginOIDC": "Login with {name}",
|
||||
"users.loginOIDC": "Bejelentkezés a következővel: {name}",
|
||||
"users.logout": "Kijelentkezés",
|
||||
"users.needSuper": "User(s) couldn't updated. There has to be at least one active Super Admin user.",
|
||||
"users.newListRole": "New list role",
|
||||
"users.newUser": "New user",
|
||||
"users.newUserRole": "New user role",
|
||||
"users.password": "Password",
|
||||
"users.passwordEnable": "Enable password login",
|
||||
"users.passwordMismatch": "Passwords don't match",
|
||||
"users.passwordRepeat": "Repeat password",
|
||||
"users.perms": "Permissions",
|
||||
"users.profile": "Profile",
|
||||
"users.role": "Role | Roles",
|
||||
"users.roleGroup": "Group",
|
||||
"users.roles": "Roles",
|
||||
"users.status.disabled": "Disabled",
|
||||
"users.status.enabled": "Enabled",
|
||||
"users.type": "Type",
|
||||
"users.needSuper": "A felhasználó(k) nem tudták frissíteni. Legalább egy aktív Super Admin felhasználónak kell lennie.",
|
||||
"users.newListRole": "Új szereplőlista",
|
||||
"users.newUser": "Új felhasználó",
|
||||
"users.newUserRole": "Új felhasználói szereplő",
|
||||
"users.password": "Jelszó",
|
||||
"users.passwordEnable": "Jelszavas bejelentkezés engedélyezése",
|
||||
"users.passwordMismatch": "A jelszavak nem egyeznek",
|
||||
"users.passwordRepeat": "Jelszó ismétlése",
|
||||
"users.perms": "Engedélyek",
|
||||
"users.profile": "Profil",
|
||||
"users.role": "Szereplő | Szereplők",
|
||||
"users.roleGroup": "Csoport",
|
||||
"users.roles": "Szereplők",
|
||||
"users.status.disabled": "Letiltva",
|
||||
"users.status.enabled": "Engedélyezve",
|
||||
"users.type": "Típus",
|
||||
"users.type.api": "API",
|
||||
"users.type.super": "Super Admin",
|
||||
"users.type.user": "User",
|
||||
"users.userRole": "User role | User roles",
|
||||
"users.userRoles": "User roles",
|
||||
"users.username": "Username",
|
||||
"users.usernameHelp": "Used with password login"
|
||||
"users.type.super": "Szuper rendszergazda",
|
||||
"users.type.user": "Felhasználó",
|
||||
"users.userRole": "Felhasználói szereplő | Kelhasználói szereplők",
|
||||
"users.userRoles": "Felhasználói szereplők",
|
||||
"users.username": "Felhasználónév",
|
||||
"users.usernameHelp": "Jelszavas bejelentkezéssel használható"
|
||||
}
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
|
||||
# Listmonk demo setup using `docker compose`.
|
||||
# See https://listmonk.app/docs/installation/ for detailed installation steps.
|
||||
|
||||
check_dependencies() {
|
||||
if ! command -v curl > /dev/null; then
|
||||
echo "curl is not installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker > /dev/null; then
|
||||
echo "docker is not installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for "docker compose" functionality.
|
||||
if ! docker compose version > /dev/null 2>&1; then
|
||||
echo "'docker compose' functionality is not available. Please update to a newer version of Docker. See https://docs.docker.com/engine/install/ for more details."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
setup_containers() {
|
||||
curl -o docker-compose.yml https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml
|
||||
# Use "docker compose" instead of "docker-compose"
|
||||
docker compose up -d demo-db demo-app
|
||||
}
|
||||
|
||||
show_output(){
|
||||
echo -e "\nListmonk is now up and running. Visit http://localhost:9000 in your browser.\n"
|
||||
}
|
||||
|
||||
|
||||
check_dependencies
|
||||
setup_containers
|
||||
show_output
|
153
install-prod.sh
153
install-prod.sh
|
@ -1,153 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
|
||||
# Listmonk production setup using `docker compose`.
|
||||
# See https://listmonk.app/docs/installation/ for detailed installation steps.
|
||||
|
||||
printf '\n'
|
||||
|
||||
RED="$(tput setaf 1 2>/dev/null || printf '')"
|
||||
BLUE="$(tput setaf 4 2>/dev/null || printf '')"
|
||||
GREEN="$(tput setaf 2 2>/dev/null || printf '')"
|
||||
NO_COLOR="$(tput sgr0 2>/dev/null || printf '')"
|
||||
|
||||
info() {
|
||||
printf '%s\n' "${BLUE}> ${NO_COLOR} $*"
|
||||
}
|
||||
|
||||
error() {
|
||||
printf '%s\n' "${RED}x $*${NO_COLOR}" >&2
|
||||
}
|
||||
|
||||
completed() {
|
||||
printf '%s\n' "${GREEN}✓ ${NO_COLOR} $*"
|
||||
}
|
||||
|
||||
exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
sed_inplace() {
|
||||
local search_pattern="$1"
|
||||
local replacement="$2"
|
||||
local file="$3"
|
||||
if [[ "$(uname)" == "Darwin" ]]; then
|
||||
sed -i '' "s/${search_pattern}/${replacement}/g" "$file"
|
||||
else
|
||||
sed -i "s/${search_pattern}/${replacement}/g" "$file"
|
||||
fi
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
if ! exists curl; then
|
||||
error "curl is not installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! exists docker; then
|
||||
error "docker is not installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for "docker compose" functionality.
|
||||
if ! docker compose version >/dev/null 2>&1; then
|
||||
echo "'docker compose' functionality is not available. Please update to a newer version of Docker. See https://docs.docker.com/engine/install/ for more details."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker compose ls >/dev/null; then
|
||||
echo "no docker access - you might need to run this script with sudo or see https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_existing_db_volume() {
|
||||
info "checking for an existing docker db volume"
|
||||
if docker volume inspect listmonk_listmonk-data >/dev/null 2>&1; then
|
||||
error "listmonk-data volume already exists. Please use docker compose down -v to remove old volumes for a fresh setup of PostgreSQL."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
download() {
|
||||
curl --fail --silent --location --output "$2" "$1"
|
||||
}
|
||||
|
||||
is_healthy() {
|
||||
info "waiting for db container to be up. retrying in 3s"
|
||||
health_status="$(docker inspect -f "{{.State.Health.Status}}" "$1")"
|
||||
if [ "$health_status" = "healthy" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
is_running() {
|
||||
info "checking if $1 is running"
|
||||
status="$(docker inspect -f "{{.State.Status}}" "$1")"
|
||||
if [ "$status" = "running" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
generate_password(){
|
||||
echo "$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 13 ; echo '')"
|
||||
}
|
||||
|
||||
get_config() {
|
||||
info "fetching config.toml from listmonk repo"
|
||||
download https://raw.githubusercontent.com/knadh/listmonk/master/config.toml.sample config.toml
|
||||
}
|
||||
|
||||
get_containers() {
|
||||
info "fetching docker-compose.yml from listmonk repo"
|
||||
download https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml docker-compose.yml
|
||||
}
|
||||
|
||||
modify_config(){
|
||||
info "generating a random password"
|
||||
db_password=$(generate_password)
|
||||
|
||||
info "modifying config.toml"
|
||||
sed_inplace 'host = "localhost"' 'host = "listmonk_db"' config.toml
|
||||
sed_inplace 'password = "listmonk"' "password = \"${db_password}\"" config.toml
|
||||
sed_inplace 'address = "localhost:9000"' 'address = "0.0.0.0:9000"' config.toml
|
||||
|
||||
info "modifying docker-compose.yml"
|
||||
sed_inplace 'POSTGRES_PASSWORD=listmonk' "POSTGRES_PASSWORD=$db_password" docker-compose.yml
|
||||
}
|
||||
|
||||
run_migrations(){
|
||||
info "running migrations"
|
||||
docker compose up -d db
|
||||
while ! is_healthy listmonk_db; do sleep 3; done
|
||||
docker compose run --rm app ./listmonk --install
|
||||
}
|
||||
|
||||
start_services(){
|
||||
info "starting app"
|
||||
docker compose up -d app db
|
||||
}
|
||||
|
||||
show_output(){
|
||||
info "finishing setup"
|
||||
sleep 3
|
||||
|
||||
if is_running listmonk_db && is_running listmonk_app
|
||||
then completed "Listmonk is now up and running. Visit http://localhost:9000 in your browser."
|
||||
else
|
||||
error "error running containers. something went wrong."
|
||||
fi
|
||||
}
|
||||
|
||||
check_dependencies
|
||||
check_existing_db_volume
|
||||
get_config
|
||||
get_containers
|
||||
modify_config
|
||||
run_migrations
|
||||
start_services
|
||||
show_output
|
37
static/public/templates/login-setup.html
Normal file
37
static/public/templates/login-setup.html
Normal file
|
@ -0,0 +1,37 @@
|
|||
{{ define "admin-login-setup" }}
|
||||
{{ template "header" .}}
|
||||
|
||||
<section class="login">
|
||||
<h2>{{ .L.T "users.newUser"}}</h2>
|
||||
<p> {{ .L.T "users.firstTime" }}</p>
|
||||
|
||||
<form method="post" action="{{ .RootURL }}/admin/login" class="form">
|
||||
<div>
|
||||
<input type="hidden" name="nonce" value="{{ .Data.Nonce }}" />
|
||||
<input type="hidden" name="next" value="{{ .Data.NextURI }}" />
|
||||
<p>
|
||||
<label for="email">{{ .L.T "subscribers.email" }}</label>
|
||||
<input id="email" type="email" name="email" autofocus required minlength="3" />
|
||||
</p>
|
||||
<p>
|
||||
<label for="username">{{ .L.T "users.username" }}</label>
|
||||
<input id="username" type="text" name="username" required minlength="3" />
|
||||
</p>
|
||||
<p>
|
||||
<label for="password">{{ .L.T "users.password" }}</label>
|
||||
<input id="password" type="password" name="password" required minlength="8" />
|
||||
</p>
|
||||
<p>
|
||||
<label for="password2">{{ .L.T "users.passwordRepeat" }}</label>
|
||||
<input id="password2" type="password" name="password2" required minlength="8" />
|
||||
</p>
|
||||
|
||||
{{ if .Data.Error }}<p><span class="error">{{ .Data.Error }}</span></p>{{ end }}
|
||||
|
||||
<p class="submit"><button class="button" type="submit">{{ .L.T "globals.buttons.continue" }}</button></p>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
{{ template "footer" .}}
|
||||
{{ end }}
|
Loading…
Reference in a new issue