Skip to main content

Pixelfed

Die Alternative zu Instagram.

git clone https://github.com/pixelfed/pixelfed

Das Docker Image erstellen

cd /opt/pixelfed
docker build . -t pixelfed:{Current Date} -f contrib/docker/Dockerfile.apache

ersetze {Current Date} mit dem aktuellen datum: Beispielsweise:

<code>docker build . -t pixelfed:20210125 -f contrib/docker/Dockerfile.apache</code>

Damit erhalten die Images Tags damit diese später besser identifiziert werden können.

docker-compose.yml erstellen

Folgende Datei als docker-compose.yml Datei abspeichern. Alternativ ist ein abspeichern in docker-compose.override.yml möglich. Dies verhindert ein reset der Einstellungen, wenn mit git pull die neuen Dateien heruntergeladen werden. Trotzdem müssen beide Dateien vorhanden sein. (docker-compose.yml und docker-compose.override.yml)

docker-compose.yml
version: '3'
services:
  pixelfed:
    image: pixelfed:20210125 #replace with the tag you just made
    restart: unless-stopped
    ports:
      - "8080:80" #80 is the port inside the container, 8080 is the port outside
    env_file:
      - ./.env
    volumes:
      -./pixelfed-storage:/var/www/storage/;
      - ./app-bootstrap:/var/www/bootstrap/;
      - ./.env:/var/www/.env
    networks:
      - web
      - pixelfed
  db:
    image: mysql:8.0 # You can probably also get it to work with mariadb
    restart: unless-stopped
    networks:
     - pixelfed
    command: --default-authentication-plugin=mysql_native_password
    volumes:
     - db-data:/var/lib/mysql
    environment:
     - MYSQL_DATABASE=pixelfed
     - MYSQL_USER=${DB_USERNAME}
     - MYSQL_PASSWORD=${DB_PASSWORD}
     - MYSQL_RANDOM_ROOT_PASSWORD=true
  worker:
    image: pixelfed:20210125 #replace with the tag you just made
    restart: unless-stopped
    env_file:
      - ./.env
    volumes:
      - "pixelfed-storage:/var/www/storage"
      - "app-bootstrap:/var/www/bootstrap"
    networks:
      - web  # Required for ActivityPub
      - pixelfed
    command: gosu www-data php artisan horizon
  redis:
    image: redis:5-alpine
    restart: unless-stopped
    volumes:
      - "redis-data:/data"
    networks:
      - pixelfed
volumes: 
  redis-data:
  app-bootstrap:
  pixelfed-storage:
  db-data:
networks:
  pixelfed:
    internal: true
  web:
    external: true</code></pre></div>
.env Datei erstellen für die Einstellungen der Instanz

Nun die nötige .env Datei erstellen. Entsprechende Einträge ändern. Diese habe Markiert, den Rest so lassen wie er ist.

.env
APP_NAME="PixelDroid testing instance"
APP_ENV=production
APP_KEY= #leer lassen, wird später erstellt!
APP_DEBUG=false
#change this and the following 3 to your own domain
APP_URL=https://testing.pixeldroid.org #durch eigene Domain ersetzen
APP_DOMAIN="testing.pixeldroid.org" #durch eigene Domain ersetzen
ADMIN_DOMAIN="testing.pixeldroid.org" #durch eigene Domain ersetzen
SESSION_DOMAIN="testing.pixeldroid.org" #durch eigene Domain ersetzen
TRUST_PROXIES="*"
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=pixelfed
DB_USERNAME=pixelfed
DB_PASSWORD= CHANGE_ME #passwort generieren und einfügen
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis
REDIS_SCHEME=tcp
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="pixelfed@example.com"
MAIL_FROM_NAME="Pixelfed"
OPEN_REGISTRATION=true
ENFORCE_EMAIL_VERIFICATION=true
PF_MAX_USERS=1000
MAX_PHOTO_SIZE=64000
MAX_CAPTION_LENGTH=150
MAX_ALBUM_LENGTH=4
MAX_ACCOUNT_SIZE=10000000
IMAGE_QUALITY=100
ACTIVITY_PUB=true
AP_REMOTE_FOLLOW=true
AP_INBOX=true
PF_COSTAR_ENABLED=false
HORIZON_EMBED=true
OAUTH_ENABLED=true

Ordnerstruktur

Nun sollte die Ordnerstruktur so aussehen:

pixelfed_docker_compose
    pixelfed/
    .env
    docker-compose.yml

Erstmaliges starten der Container

Nun wird das Netzwerk erstellt,welches in der docker-compose.yml eingerichtet wurde:

docker network create web

docker-compose up -d ausführen. Dadurch werden die Container so gestartet, wie sie in der Docker-Kompositionsdatei konfiguriert wurden.

Dann werden wir den Schlüssel generieren, den wir in der .env Datei benötigen:

docker-compose exec app php artisan key:generate

Ausgabe mit ja beantworten.


Nun überprüfen, ob ein Schlüssel in der .env-Datei generiert wurde.

Starten wir nun den Container neu, mit dem wir gerade die .env Datei, Stellen Sie sicher, dass die neue .env Datei is taken into account (config:cache) and do the database migration.

docker-compose restart app
docker-compose exec app php artisan config:cache
docker-compose exec app php artisan migrate

Wenn eine Abfrage erscheint, diese mit „ja“ beantworten.

Nginx einrichten

Nun gilt es Nginx einzurichten, damit die Webseite erreichbar ist. Zuerst im /etc/nginx/sites-available eine Datei erstellen pixelfed.conf. Dort folgenden Inhalt einfügen und ggf. anpassen.

server {
    listen 80;
    listen [::]:80;
    server_name pixelfed.yourdomain.tld;
    # enforce https
    return 301 https://$server_name$request_uri;
}
server {
    server_name pixelfed.yourdomain.tld;
    listen [::]:443 ssl;
    listen 443 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/pixelfed.yourdomain.tld/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/pixelfed.yourdomain.tld/privkey.pem; # managed by Certbot
    client_max_body_size 100M;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_x_forwarded_host;
        proxy_set_header X-Forwarded-Port $http_x_forwarded_port;
        proxy_redirect off;
        proxy_pass   http://127.0.0.1:8080;
    }
}

Danach ein ln-s /etc/nginx/sites-available/pixelfed.conf /etc/nginx/sites-enabled/pixelfed.conf

Nun muss das Zertifikat erstellt werden für diese neue Domain, damit die SSL Verschlüsselung funktioniert.

sudo certbot -d pixelfed.yourdomain.tld

Danach müssten die passenden Zertifikate in /etc/letsencrypt/live/pixelfed.yourdomain.tld/ liegen.

Vor dem Start des Containers und einem Neustart von Nginx sollte drauf geachtet werden, das der Wert client_max_body_size größer ist als der Wert, der in der .env Datei angegeben ist.

Danach Nginx neu starten (sudo systemctl restart nginx), oder (sudo nginx -s reload).

Ersteinrichtung beenden

Jetzt sollten man in der Lage sein, über die eingerichtete Domain auf Pixelfed zugreifen zu können. Überprüft ob alles in Ordnung ist, wenn ja, muss der erste Nutzer erstellt werden. Dieser wird dann zum Administrator ernannt.

Dazu in den Ordner wechseln, in dem sich die Datei docker-compose befindet, und folgendes ausführen:

docker-compose exec app php artisan user:create

Die Antworten folgendermaßen beantworten:

 Make this user an admin? (yes/no) [no]:
 > yes
 Manually verify email address? (yes/no) [no]:
 > yes
 Are you sure you want to create this user? (yes/no) [no]:
 > yes

Oauth und API Zugriff einrichten

Damit der API Zugriff überhaupt funktioniert, muss erstens OAUTH_ENABLED=true in der .env eingestellt sein, das ist bereits geschehen. Nun sind noch folgende Schritte notwendig.

docker-compose exec app php artisan passport:keys
docker-compose exec app php artisan config:cache
docker-compose exec app php artisan route:cache
docker-compose exec app php artisan passport:client --personal

Pixelfed Instanz aktualisieren

Hier die nötigen Befehle um Pixelfed zu akualisieren.

cd /opt/pixelfed_source
git checkout dev
git pull origin dev
git checkout dev
docker build . -t pixelfed:todaysdate -f contrib/docker/Dockerfile.apache

Um die innerhalb von docker-compose verwendeten Images zu aktualisieren, ersetze die Versionsnummer mit der aktuellen verfügbaren, danach diese herunterladen, Beispiel (docker pull mysql:8.0 redis:5-alpine)

Normalerweise würde man hier docker-compose pull verwenden, um alle zu erhalten, aber da ein angepasstes Image verwendet wird und anders getaggt wird, klappt das auf dem einfachen Wege nicht.

Als Nächstes wollen wir das neue Image verwenden: Bearbeiten Sie einfach die Datei docker-compose.yml und ersetzen Sie das alte Image durch das neue, das wir gerade erstellt haben. Falls eine docker-compose.override.yml verwendet wird, diese abändern.

Lassen Sie uns nun alle unsere Container löschen und neu erstellen, sodass wir die neuesten Versionen verwenden, die wir gerade erstellt haben. Dabei wird keines der benannten Volumes gelöscht, in denen sich die Daten befinden (denken Sie daran, dass die Container bei Docker keine Daten speichern, sondern nur die Anwendung, sodass beim Löschen der Container keine Daten gelöscht werden)

docker-compose down
docker-compose up -d

Pixelfed ist jetzt auf dem neuesten Stand, aber wir müssen noch von der vorherigen Version zu dieser migrieren, dazu immer folgendes ausführen.

docker-compose exec app php artisan migrate

Je nachdem von welcher Pixelfed Version man ein Update macht, müssen Sie weitere Befehle ausführt werden. In den Versionshinweisen findet man dazu mehr Informationen.

docker-compose exec app composer install
docker-compose exec app php artisan migrate --force
docker-compose exec app php artisan config:cache
docker-compose exec app php artisan route:cache
docker-compose exec app php artisan instance:actor