Compare commits

...

27 Commits

Author SHA1 Message Date
e32be4cef1 Use .env so we don't conflict with upstream and overwrite 2023-09-25 16:27:49 -05:00
f9902dbce7 Customize docker compose config 2023-09-25 16:24:50 -05:00
746c7d0e90 Hide plausible-conf.env 2023-09-25 16:21:40 -05:00
ruslandoga
ba84dc28d2
remove geoip volume
as suggested in https://github.com/plausible/analytics/discussions/3252
2023-08-10 16:11:36 +07:00
ruslandoga
44925a9937 remove geoip 2023-07-17 20:44:06 +07:00
ruslandoga
2e72a378b1 upgrade clickhouse 2023-07-17 20:42:03 +07:00
ruslandoga
171d8070d8 use plausible v2 2023-07-17 20:41:32 +07:00
ruslandoga
dd0e109a57 use newer clickhouse version 2023-06-14 13:50:13 +08:00
ruslandoga
36d45da228 remove k8s 2023-05-29 20:05:48 +08:00
ruslandoga
3e1462eabd
use v1.5 in docker-compose.yml 2023-04-11 15:56:39 +07:00
ruslandoga
36ada560cb
Merge pull request #65 from joshavant/clickhouse-config-updates
Update Clickhouse logging suppression XML
2023-01-19 14:07:13 +07:00
joshavant
fac1deb8f2 Update Clickhouse logging suppression XML 2023-01-15 23:09:25 -06:00
ruslandoga
524cc15440
Merge pull request #64 from plausible/remove-stale-info
remove more stale info
2023-01-15 21:35:09 +07:00
ruslandoga
2dc9b61b02 remove more stale info 2023-01-15 21:34:29 +07:00
ruslandoga
0366e4c510
Merge pull request #61 from plausible/remove-stale-info
remove references to admin env vars
2023-01-15 20:43:44 +07:00
ruslandoga
a54938ed01 remove references to admin env vars 2023-01-15 20:43:23 +07:00
ruslandoga
5097a507fc
Merge pull request #60 from ketan-vijayvargiya/master
Remove admin creation
2023-01-07 15:41:57 +07:00
ketan-vijayvargiya
7a3a3d2dd9 Remove admin creation 2022-12-16 04:19:20 +00:00
Marko Saric
a6fe8d13df
Merge pull request #56 from robertmarsal/patch-1
fix: remove typo from the config
2022-10-12 14:13:59 +02:00
Robert Marsal
00a07f352d
Remove typo from the config 2022-10-12 12:39:14 +01:00
ruslandoga
c091fb7119
Merge pull request #52 from ruslandoga/upgrade-postgres
upgrade postgres
2022-10-12 17:48:02 +07:00
ruslandoga
a220fd2d08 add postgres upgrade guide 2022-10-12 09:32:32 +07:00
Marko Saric
eb10707338
Merge pull request #55 from Jeroenvb3/master
Fixed link to self hosting docs in readme.
2022-10-07 15:19:43 +02:00
Jeroen van Bennekum
812d6bb5e9
Fixed link to self hosting docs in readme. 2022-10-07 15:12:36 +02:00
ruslandoga
cbc35f7e5c upgrade postgres 2022-09-24 12:18:54 +04:00
ruslandoga
3177d22992
Merge pull request #45 from paskal/paskal/newer_clickhouse
Update clickhouse to 22.6
2022-09-13 11:19:57 +04:00
Dmitry Verkhoturov
662452a19b update clickhouse version to one working under arm
Also, previously we used Ubuntu base image.
Now, we're switching to Alpine.
2022-09-12 19:32:43 +02:00
14 changed files with 211 additions and 580 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
plausible-conf.env
.env
data/

View File

@ -1,12 +1,16 @@
# Plausible Analytics setup examples
This repository acts as a a template to get up and running with [Plausible Analytics](https://github.com/plausible/analytics).
This repository acts as a template to get up and running with [Plausible Analytics](https://github.com/plausible/analytics).
### How to use
Find instructions on how to run Plausible Analytics Self Hosted [in our docs](https://docs.plausible.io/self-hosting).
Find instructions on how to run Plausible Analytics Self Hosted [in our docs](https://plausible.io/docs/self-hosting).
### Contributing
We are always looking to expand on the options and setups provided here. Feel free to open an issue or PR if you feel
something could be improved.
### Upgrade guides
- [Upgrading `plausible_db` (PostgreSQL)](upgrade/postgres.md)

View File

@ -1,4 +1,4 @@
<yandex>
<clickhouse>
<logger>
<level>warning</level>
<console>true</console>
@ -11,4 +11,6 @@
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
</yandex>
<session_log remove="remove"/>
<part_log remove="remove"/>
</clickhouse>

View File

@ -1,8 +1,8 @@
<yandex>
<clickhouse>
<profiles>
<default>
<log_queries>0</log_queries>
<log_query_threads>0</log_query_threads>
</default>
</profiles>
</yandex>
</clickhouse>

View File

@ -1,22 +1,19 @@
version: "3.3"
services:
mail:
image: bytemark/smtp
restart: always
plausible_db:
image: postgres:12
# supported versions are 12, 13, and 14
image: postgres:14-alpine
restart: always
volumes:
- db-data:/var/lib/postgresql/data
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
plausible_events_db:
image: yandex/clickhouse-server:21.3.2.5
image: clickhouse/clickhouse-server:23.3.7.5-alpine
restart: always
volumes:
- event-data:/var/lib/clickhouse
- ./data/clickhouse:/var/lib/clickhouse
- ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
- ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
ulimits:
@ -25,22 +22,13 @@ services:
hard: 262144
plausible:
image: plausible/analytics:latest
image: plausible/analytics:v2.0
restart: always
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
- plausible_db
- plausible_events_db
- mail
ports:
- 8000:8000
- 127.0.0.1:84:8000
env_file:
- plausible-conf.env
volumes:
db-data:
driver: local
event-data:
driver: local
geoip:
driver: local
- .env

View File

@ -1,24 +0,0 @@
version: "3.3"
services:
plausible:
depends_on:
- geoip
environment:
- GEOLITE2_COUNTRY_DB=/geoip/GeoLite2-Country.mmdb
volumes:
- geoip:/geoip:ro
geoip:
image: maxmindinc/geoipupdate
restart: always
environment:
- GEOIPUPDATE_EDITION_IDS=GeoLite2-Country
- GEOIPUPDATE_FREQUENCY=168 # update every 7 days
env_file:
geoip/geoip.conf
volumes:
- geoip:/usr/share/GeoIP
volumes:
geoip:
driver: local

View File

@ -1,2 +0,0 @@
GEOIPUPDATE_ACCOUNT_ID=<your-account-id>
GEOIPUPDATE_LICENSE_KEY=<your-license-key>

View File

@ -1,38 +0,0 @@
# Plausible Analytics in Kubernetes
This guide is designed to extend the [normal self-hosting guide](https://plausible.io/docs/self-hosting), please refer to it before following this guide.
## 1. Clone the hosting repo
To deploy Plausible Analytics into Kubernetes first download the [plausible/hosting](https://github.com/plausible/hosting) repo.
```bash
git clone https://github.com/plausible/hosting
cd hosting
```
## 2. Add required configuration
Like the original self hosting guide configure your server in the `plausible-conf.env` file.
## 3. Deploy the server
Once you've entered your secret key base, base url and admin credentials, you're ready to deploy the server:
```bash
kubectl create namespace plausible # Create a new namespace for all resources
kubectl -n plausible create secret generic plausible-config --from-env-file=plausible-conf.env # Create a configmap from the plausible-conf.env file
# Please change the Postgres and Clickhouse passwords to something more secure here!
kubectl -n plausible create secret generic plausible-db-user --from-literal='username=postgres' --from-literal='password=postgres' # Create the Postgres user
kubectl -n plausible create secret generic plausible-events-db-user --from-literal='username=clickhouse' --from-literal='password=clickhouse' # Create the Clickhouse user
kubectl -n plausible apply -f ./kubernetes
```
You can now navigate to http://{hostname}:8000 and see the login screen.
When you first log in with your admin credentials, you will be prompted to enter a verification code which has been sent to your email. Please configure your server for SMTP to receive this email. [Here are Plausible's SMTP configuration options](https://plausible.io/docs/self-hosting-configuration#mailersmtp-setup).
Otherwise, run this command to verify all users in the database:
```bash
kubectl -n plausible exec statefulset/plausible-db -- /bin/bash -c 'psql -U $POSTGRES_USER -d $POSTGRES_DB -c "UPDATE users SET email_verified = true;"'
```

View File

@ -1,114 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: plausible-db
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
type: ClusterIP
ports:
- name: db
port: 5432
targetPort: 5432
protocol: TCP
selector:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: plausible-db
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
replicas: 1
serviceName: plausible-db
selector:
matchLabels:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
template:
metadata:
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
restartPolicy: Always
# see https://github.com/docker-library/postgres/blob/6bbf1c7b308d1c4288251d73c37f6caf75f8a3d4/14/buster/Dockerfile
securityContext:
runAsUser: 999
runAsGroup: 999
fsGroup: 999
containers:
- name: plausible-db
image: postgres:latest
imagePullPolicy: Always
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
env:
- name: POSTGRES_DB
value: plausible
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: plausible-db-user
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-db-user
key: password
securityContext:
allowPrivilegeEscalation: false
resources:
limits:
memory: 2Gi
cpu: 1500m
requests:
memory: 65Mi
cpu: 15m
readinessProbe:
exec:
command:
- /bin/sh
- -c
- pg_isready -U postgres
initialDelaySeconds: 20
failureThreshold: 6
periodSeconds: 10
livenessProbe:
exec:
command:
- /bin/sh
- -c
- pg_isready -U postgres
initialDelaySeconds: 30
failureThreshold: 3
periodSeconds: 10
volumeClaimTemplates:
- metadata:
name: data
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 128Mi
limits:
storage: 15Gi

View File

@ -1,150 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: plausible-events-db
labels:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
type: ClusterIP
ports:
- name: db
port: 8123
targetPort: 8123
protocol: TCP
selector:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
---
apiVersion: v1
kind: ConfigMap
metadata:
name: plausible-events-db-config
data:
clickhouse-config.xml: |
<yandex>
<logger>
<level>warning</level>
<console>true</console>
</logger>
<!-- Stop all the unnecessary logging -->
<query_thread_log remove="remove"/>
<query_log remove="remove"/>
<text_log remove="remove"/>
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
</yandex>
clickhouse-user-config.xml: |
<yandex>
<profiles>
<default>
<log_queries>0</log_queries>
<log_query_threads>0</log_query_threads>
</default>
</profiles>
</yandex>
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: plausible-events-db
labels:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
replicas: 1
serviceName: plausible-events-db
selector:
matchLabels:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
template:
metadata:
labels:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
restartPolicy: Always
# see https://github.com/ClickHouse/ClickHouse/blob/master/docker/server/Dockerfile
securityContext:
runAsUser: 101
runAsGroup: 101
fsGroup: 101
containers:
- name: plausible-events-db
image: yandex/clickhouse-server:latest
imagePullPolicy: Always
ports:
- containerPort: 8123
volumeMounts:
- name: data
mountPath: /var/lib/clickhouse
- name: config
mountPath: /etc/clickhouse-server/config.d/logging.xml
subPath: clickhouse-config.xml
readOnly: true
- name: config
mountPath: /etc/clickhouse-server/users.d/logging.xml"
subPath: clickhouse-user-config.xml
readOnly: true
env:
- name: CLICKHOUSE_DB
value: plausible
- name: CLICKHOUSE_USER
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: username
- name: CLICKHOUSE_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: password
securityContext:
allowPrivilegeEscalation: false
resources:
limits:
memory: 2Gi
cpu: 1500m
requests:
memory: 80Mi
cpu: 10m
readinessProbe:
httpGet:
path: /ping
port: 8123
initialDelaySeconds: 20
failureThreshold: 6
periodSeconds: 10
livenessProbe:
httpGet:
path: /ping
port: 8123
initialDelaySeconds: 30
failureThreshold: 3
periodSeconds: 10
volumes:
- name: config
configMap:
name: plausible-events-db-config
volumeClaimTemplates:
- metadata:
name: data
labels:
app.kubernetes.io/name: clickhouse
app.kubernetes.io/component: database
app.kubernetes.io/part-of: plausible
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 128Mi
limits:
storage: 20Gi

View File

@ -1,70 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: plausible-smtp
labels:
app.kubernetes.io/name: smtp
app.kubernetes.io/component: email
app.kubernetes.io/part-of: plausible
spec:
type: ClusterIP
ports:
- name: smtp
port: 25
targetPort: 25
protocol: TCP
selector:
app.kubernetes.io/name: smtp
app.kubernetes.io/component: email
app.kubernetes.io/part-of: plausible
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: plausible-smtp
labels:
app.kubernetes.io/name: smtp
app.kubernetes.io/component: email
app.kubernetes.io/part-of: plausible
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: smtp
app.kubernetes.io/component: email
app.kubernetes.io/part-of: plausible
template:
metadata:
labels:
app.kubernetes.io/name: smtp
app.kubernetes.io/component: email
app.kubernetes.io/part-of: plausible
spec:
restartPolicy: Always
containers:
- name: plausible-smtp
image: bytemark/smtp:latest
imagePullPolicy: Always
ports:
- containerPort: 25
securityContext:
allowPrivilegeEscalation: false
resources:
limits:
memory: 512Mi
cpu: 500m
requests:
memory: 5Mi
cpu: 1m
readinessProbe:
tcpSocket:
port: 25
initialDelaySeconds: 20
failureThreshold: 6
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 25
initialDelaySeconds: 30
failureThreshold: 3
periodSeconds: 10

View File

@ -1,150 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: plausible
labels:
app.kubernetes.io/name: plausible
app.kubernetes.io/component: server
spec:
type: LoadBalancer
ports:
- name: http
port: 8000
targetPort: 8000
protocol: TCP
selector:
app.kubernetes.io/name: plausible
app.kubernetes.io/component: server
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: plausible
labels:
app.kubernetes.io/name: plausible
app.kubernetes.io/component: server
spec:
# Plausible is not currently designed to run in a clustered scenario. Increasing the replicas of this deployment is highly NOT recommended!
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: plausible
app.kubernetes.io/component: server
template:
metadata:
labels:
app.kubernetes.io/name: plausible
app.kubernetes.io/component: server
spec:
restartPolicy: Always
# see https://github.com/plausible/analytics/blob/master/Dockerfile
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
initContainers:
- name: plausible-init
image: plausible/analytics:latest
command:
- "/bin/sh"
- "-c"
args:
- sleep 30 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin
envFrom:
- secretRef:
name: plausible-config
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: plausible-db-user
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-db-user
key: password
- name: CLICKHOUSE_USER
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: username
- name: CLICKHOUSE_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: password
- name: DATABASE_URL
value: postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(PLAUSIBLE_DB_SERVICE_HOST):$(PLAUSIBLE_DB_SERVICE_PORT)/plausible
- name: CLICKHOUSE_DATABASE_URL
value: http://$(CLICKHOUSE_USER):$(CLICKHOUSE_PASSWORD)@$(PLAUSIBLE_EVENTS_DB_SERVICE_HOST):$(PLAUSIBLE_EVENTS_DB_SERVICE_PORT)/plausible
- name: SMTP_HOST_ADDR
value: $(PLAUSIBLE_SMTP_SERVICE_HOST)
securityContext:
allowPrivilegeEscalation: false
resources:
limits:
memory: 2Gi
cpu: 1500m
requests:
memory: 50Mi
cpu: 10m
containers:
- name: plausible
image: plausible/analytics:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
envFrom:
- secretRef:
name: plausible-config
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: plausible-db-user
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-db-user
key: password
- name: CLICKHOUSE_USER
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: username
- name: CLICKHOUSE_PASSWORD
valueFrom:
secretKeyRef:
name: plausible-events-db-user
key: password
- name: DATABASE_URL
value: postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(PLAUSIBLE_DB_SERVICE_HOST):$(PLAUSIBLE_DB_SERVICE_PORT)/plausible
- name: CLICKHOUSE_DATABASE_URL
value: http://$(CLICKHOUSE_USER):$(CLICKHOUSE_PASSWORD)@$(PLAUSIBLE_EVENTS_DB_SERVICE_HOST):$(PLAUSIBLE_EVENTS_DB_SERVICE_PORT)/plausible
- name: SMTP_HOST_ADDR
value: $(PLAUSIBLE_SMTP_SERVICE_HOST)
securityContext:
allowPrivilegeEscalation: false
resources:
limits:
memory: 2Gi
cpu: 1500m
requests:
memory: 140Mi
cpu: 10m
readinessProbe:
httpGet:
path: /api/health
port: 8000
initialDelaySeconds: 35
failureThreshold: 6
periodSeconds: 10
livenessProbe:
httpGet:
path: /api/health
port: 8000
initialDelaySeconds: 45
failureThreshold: 3
periodSeconds: 10

View File

@ -1,5 +0,0 @@
ADMIN_USER_EMAIL=replace-me
ADMIN_USER_NAME=replace-me
ADMIN_USER_PWD=replace-me
BASE_URL=replace-me
SECRET_KEY_BASE=replace-me

187
upgrade/postgres.md Normal file
View File

@ -0,0 +1,187 @@
Guide to upgrading PostgreSQL version `>= 12` to version `14` using `pg_dump` and `psql`. Based on [Upgrade a PostgreSQL database with docker.](https://hollo.me/devops/upgrade-postgresql-database-with-docker.html)
**Note:** following this guide you'd need to stop some containers and it would make your plausible instance temporarily unavailable.
---
### Plan
1. dump contents of the old version PostgreSQL to a file in a mounted volume
1. replace old version PostgreSQL with new version PostgreSQL
1. load dump from the mounted volume into new version PostgreSQL
---
### Steps
1. Add a backup volume to `plausible_db` in your `docker-compose.yml`
```diff
plausible_db:
image: postgres:12
restart: always
volumes:
- db-data:/var/lib/postgresql/data
+ - ./backup:/backup
environment:
- POSTGRES_PASSWORD=postgres
```
2. Stop relevant containers to avoid writing to old `plausible_db`
```console
> docker compose stop plausible plausible_db
[+] Running 2/2
⠿ Container hosting-plausible-1 Stopped 6.5s
⠿ Container hosting-plausible_db-1 Stopped 0.2s
```
3. Restart `plausible_db` container to attach volume
```console
> docker compose up plausible_db -d
[+] Running 1/1
⠿ Container hosting-plausible_db-1 Started 0.3s
```
4. Dump old `plausible_db` contents to a backup file
```console
> docker compose exec plausible_db sh -c "pg_dump -U postgres plausible_db > /backup/plausible_db.bak"
```
5. (Optional) verify backup went OK
```console
> ls backup
plausible_db.bak
> head backup/plausible_db.bak
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.12 (Debian 12.12-1.pgdg110+1)
-- Dumped by pg_dump version 12.12 (Debian 12.12-1.pgdg110+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
```
6. Edit `docker-compose.yml` to use new PostgreSQL version, here we update from `v12` to `v14`, alpine flavour.
```diff
plausible_db:
- image: postgres:12
+ image: postgres:14-alpine
restart: always
volumes:
- db-data:/var/lib/postgresql/data
- ./backup:/backup
environment:
- POSTGRES_PASSWORD=postgres
```
7. Ensure relevant containers are stopped
```console
> docker compose stop plausible plausible_db
[+] Running 2/2
⠿ Container hosting-plausible-1 Stopped 0.0s
⠿ Container hosting-plausible_db-1 Stopped 0.2s
```
8. Remove old `plausible_db` container to be able to nuke its volume in the next step
```console
> docker compose rm plausible_db
? Going to remove hosting-plausible_db-1 Yes
[+] Running 1/0
⠿ Container hosting-plausible_db-1 Removed 0.0s
```
9. Remove old `plausible_db` volume, mine is named `hosting_db-data`
```console
> docker volume ls
DRIVER VOLUME NAME
<...snip...>
local hosting_db-data
local hosting_event-data
<...snip...>
> docker volume rm hosting_db-data
hosting_db-data
```
10. Start new version `plausible_db` container
```console
> docker compose up plausible_db -d
[+] Running 9/9
⠿ plausible_db Pulled 9.3s
⠿ 9b18e9b68314 Already exists 0.0s
⠿ 75aada9edfc5 Pull complete 1.2s
⠿ 820773693750 Pull complete 1.2s
⠿ 8812bb04ef2e Pull complete 5.2s
⠿ 2ccec0f7805c Pull complete 5.2s
⠿ 833f9b98598e Pull complete 5.3s
⠿ 1eb578dc04e6 Pull complete 5.4s
⠿ c873bf6204df Pull complete 5.4s
[+] Running 2/2
⠿ Volume "hosting_db-data" Created 0.0s
⠿ Container hosting-plausible_db-1 Started 0.5s
```
11. Create new DB and load data into it
```console
> docker compose exec plausible_db createdb -U postgres plausible_db
> docker compose exec plausible_db sh -c "psql -U postgres -d plausible_db < /backup/plausible_db.bak"
SET
SET
SET
SET
SET
set_config
------------
(1 row)
SET
SET
SET
SET
CREATE EXTENSION
<...snip...>
```
12. Start all other containers
```console
> docker compose up -d
[+] Running 4/4
⠿ Container hosting-plausible_events_db-1 Running 0.0s
⠿ Container hosting-mail-1 Running 0.0s
⠿ Container hosting-plausible_db-1 Started 0.5s
⠿ Container hosting-plausible-1 Started 0.5s
```
13. (Optional) Remove backups from `docker-compose.yml` and your filesystem
```diff
plausible_db:
image: postgres:14-alpine
restart: always
volumes:
- db-data:/var/lib/postgresql/data
- - ./backup:/backup
environment:
- POSTGRES_PASSWORD=postgres
```
```
> rm -rf ./backup
```