I am running a Pixelfed instance for some time now at https://pixel.kushaldas.photography/kushal. This post contains quick setup instruction using docker/containers for the same.
Copy over .env.docker file
We will need .env.docker file and modify it as required, specially the following, you will have to write the values for each one of them.
APP_NAME=
APP_DOMAIN=
OPEN_REGISTRATION="false" # because personal site
ENFORCE_EMAIL_VERIFICATION="false" # because personal site
DB_PASSWORD=
# Extra values to db itself
MYSQL_DATABASE=
MYSQL_PASSWORD=
MYSQL_USER=
CACHE_DRIVER="redis"
BROADCAST_DRIVER="redis"
QUEUE_DRIVER="redis"
SESSION_DRIVER="redis"
REDIS_HOST="redis"
ACITIVITY_PUB="true"
LOG_CHANNEL="stderr"
The actual docker compose file:
---
services:
app:
image: zknt/pixelfed:2025-01-18
restart: unless-stopped
env_file:
- ./.env
volumes:
- "/data/app-storage:/var/www/storage"
- "./.env:/var/www/.env"
depends_on:
- db
- redis
# The port statement makes Pixelfed run on Port 8080, no SSL.
# For a real instance you need a frontend proxy instead!
ports:
- "8080:80"
worker:
image: zknt/pixelfed:2025-01-18
restart: unless-stopped
env_file:
- ./.env
volumes:
- "/data/app-storage:/var/www/storage"
- "./.env:/var/www/.env"
entrypoint: /worker-entrypoint.sh
depends_on:
- db
- redis
- app
healthcheck:
test: php artisan horizon:status | grep running
interval: 60s
timeout: 5s
retries: 1
db:
image: mariadb:11.2
restart: unless-stopped
env_file:
- ./.env
environment:
- MYSQL_ROOT_PASSWORD=CHANGE_ME
volumes:
- "/data/db-data:/var/lib/mysql"
redis:
image: zknt/redis
restart: unless-stopped
volumes:
- "redis-data:/data"
volumes:
redis-data:
I am using nginx
as the reverse proxy. Only thing to remember there is to
pass .well-known/acme-challenge
to the correct directory for letsencrypt
,
the rest should point to the contianer.