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 # 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 ### 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 ### 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 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. something could be improved.
### Upgrade guides
- [Upgrading `plausible_db` (PostgreSQL)](upgrade/postgres.md)

View File

@ -1,4 +1,4 @@
<yandex> <clickhouse>
<logger> <logger>
<level>warning</level> <level>warning</level>
<console>true</console> <console>true</console>
@ -11,4 +11,6 @@
<trace_log remove="remove"/> <trace_log remove="remove"/>
<metric_log remove="remove"/> <metric_log remove="remove"/>
<asynchronous_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> <profiles>
<default> <default>
<log_queries>0</log_queries> <log_queries>0</log_queries>
<log_query_threads>0</log_query_threads> <log_query_threads>0</log_query_threads>
</default> </default>
</profiles> </profiles>
</yandex> </clickhouse>

View File

@ -1,22 +1,19 @@
version: "3.3" version: "3.3"
services: services:
mail:
image: bytemark/smtp
restart: always
plausible_db: plausible_db:
image: postgres:12 # supported versions are 12, 13, and 14
image: postgres:14-alpine
restart: always restart: always
volumes: volumes:
- db-data:/var/lib/postgresql/data - ./data/postgres:/var/lib/postgresql/data
environment: environment:
- POSTGRES_PASSWORD=postgres - POSTGRES_PASSWORD=postgres
plausible_events_db: plausible_events_db:
image: yandex/clickhouse-server:21.3.2.5 image: clickhouse/clickhouse-server:23.3.7.5-alpine
restart: always restart: always
volumes: 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-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
- ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
ulimits: ulimits:
@ -25,22 +22,13 @@ services:
hard: 262144 hard: 262144
plausible: plausible:
image: plausible/analytics:latest image: plausible/analytics:v2.0
restart: always 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: depends_on:
- plausible_db - plausible_db
- plausible_events_db - plausible_events_db
- mail
ports: ports:
- 8000:8000 - 127.0.0.1:84:8000
env_file: env_file:
- plausible-conf.env - .env
volumes:
db-data:
driver: local
event-data:
driver: local
geoip:
driver: local

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
```