创建一个[Docker] Pixelfed实例并熟悉Docker入门
首先
我正在使用一个叫做Flickr的照片共享社交网站的免费计划。然而,最近我上传的照片越来越多,似乎快要达到免费计划的上限1000张了。虽然有付费升级到专业版的选项,但我并没有充分利用它作为社交网络,并且专业版的价格也每年涨得越来越高,这让我对未来感到犹豫。
因此,我开始考虑自己搭建一个图像管理服务器。为了实现可移植性和可再现性,我尝试使用Docker进行构建,但我几乎没有接触过Docker本身,并且与Pixelfed这个项目有关的日语资料也很少,因此在试错中搞得一头雾水。在这里,我将总结笔记。通过试错,我也逐渐熟悉了Docker,这或许也可以成为一个入门指南的样本。
关于Pixelfed
作为实现图像管理服务器的Web应用程序候选项之一,“Pixelfed”具有以下特点。
-
- 画像を中心とする分散型SNS。機能的にはInstagramに近いものになる
X (Twitter) やInstagramが、唯一のサーバにすべてのデータが集中する中央集権型SNSであるのに対して、複数のインスタンス(サーバ)が存在し、それらが相互につながっているという特徴がある。誰でも自分でインスタンスを立てることが可能
ActivityPubを実装しており、Fediverseに参加できる(MastodonやMisskeyの各インスタンスに所属するアカウントと相互にフォローできる)
コレクション機能が使える(Flickrでいえばアルバムに相当)
ブログパーツが提供されている
ハッシュタグをつけられる(検索できる)
如果有这样的功能,对于我个人的使用目的来说已经足够了。对于Fediverse,它的优先级并不是很高,但是从Mastodon或者Misskey等账号关注我会很方便。虽然我可以在现有的Pixelfed实例上创建一个账号,但是我认为创建一个独一无二的实例也是很有趣的,所以我开始使用Docker来研究如何创建Pixelfed实例。这样我就可以将自己拍摄的照片放在自己的管理下,也有这样的好处。
docker-compose.yml 存在,但是
Pixelfed的源代码中包含docker-compose.yml文件,因此认为可以在Docker中快速构建,但实际上找不到核心容器镜像,导致创建容器失败。
$ git clone https://github.com/pixelfed/pixelfed
$ cd pixelfed
$ docker compose up -d
Error response from daemon: manifest for pixelfed/pixelfed:latest not found: manifest unknown: manifest unknown
有一些第三方制作的容器映像,但我认为使用它们时不知道其内容是否合适,所以我还是想自己尝试制作一个。
抱歉
-
- 用語などの厳密性はあまり追求しません。
-
- あれこれ作ったり消したりしながらスクリーンショットを取っているので、コンテナIDの表示などが急に変わったりします。
-
- ローカルのDocker環境で一通り動きそうなことを確認しましたが、まだFediverseにつないだ実績はありません。
- テスト環境を前提とした設定が多く(セキュリティ面や各種チューニング)、公開用サーバにするには設定の見直しが必要です。
准备Docker环境
以下是本次的验证环境。
-
- Windows 10 Home 22H2
-
- Ubuntu 22.04 (WSL2)
- Docker Desktop 4.21.1
由于有很多关于安装WSL2和Docker Desktop的日语文章,所以在这里将省略。
-
- WSL2のインストールを分かりやすく解説【Windows10/11】 | チグサウェブ
- 【Docker Desktop】Windowsにインストール(WSL2) | チグサウェブ

根据需要,在WSL2安装的Ubuntu环境中预先安装文本编辑器等软件。
$ sudo apt-get install vim
$ sudo apt-get install emacs
# etc...
Pixelfed实例的整体情况
Pixelfed的代码是用PHP编写的。按照官方网站上的“运行你自己的Pixelfed网站”指南,配置环境。
服务器配置

-
- nginx: HTTPサーバ。ユーザーからのリクエストを受けて静的コンテンツを返す。PHPスクリプトについては自分では実行する機能を持たず、FPMサーバにリクエスト(○○のスクリプトを実行しろ)を転送し、その応答をユーザに返す(いわゆるリバースプロキシ)
-
- FPM (FastCGI Process Manager): PHPスクリプトを実行するサーバ。FPMにはスクリプト実行時の負荷軽減や高速化機能が含まれる。Pixelfedの大部分の処理はここで行われる
-
- MySQL: データベース (DB) サーバ
- Redis: Key-Valueストア。DBクエリ結果のキャッシュやセッション管理に使われている(おそらく)
这里只允许nginx服务器直接从Web进行访问。例如,如果要在一台VPS或物理服务器上运行这些服务,只需打开80号和443号端口即可。
此外,只有FPM服务器才会执行PHP,因此必须将PHP的环境和执行所需的所有模块都安装在FPM服务器上。
存储
如上所述,静态内容(如图像文件)由nginx处理,动态内容(PHP脚本)由FPM和另一个服务器处理。但是,仅将PHP脚本分离到FPM服务器上会给维护带来很大困难,而且由PHP脚本生成的图像(静态内容)必须在nginx服务器上,因此转移这些内容也是一项艰巨的任务。
因此,实际上两者将共享相同的存储空间。如果使用Docker,只需进行卷的设置即可。在本文中,将Pixelfed的安装目录设置为 /opt/pixelfed。
另外,我们还要将MySQL和Redis的数据持久化保存。在Docker中,默认情况下,容器消失时其中的数据也会全部消失。即使重新创建容器镜像和容器,情况也是一样的。如果设置了卷(volume),即使在这种情况下,数据也不会被删除。
基于以上,让我们构建如下所示的服务器和存储配置。在该图中,圆柱表示Docker的卷。

以下的说明是基于这个服务器配置进行的。
创建容器镜像
除非另有说明,否则所有操作都将在WSL2终端和文件系统上进行。
使用的中间件版本
-
- PHP 8.2.8
-
- nginx 1.25.1
-
- MariaDB 11.0.2
- Redis 7.0.12
目录结构
pixelfed/ : 作業ディレクトリの起点
├─ fpm/
│ ├─ configs/
│ │ ├─ cron-pixelfed
│ │ ├─ php.ini
│ │ ├─ php-fpm.conf
│ │ ├─ pixelfed.env
│ │ ├─ supervisord.conf
│ │ ├─ supervisor-cron.conf
│ │ └─ supervisor-pixelfed-horizon.conf
│ ├─ scripts/
│ │ └─ docker-entrypoint.sh
│ └─ Dockerfile
├─ web/
│ ├─ configs/
│ │ ├─ ssl/
│ │ │ ├─ server.crt
│ │ │ └─ server.key
│ │ └─ nginx.conf
│ └─ Dockerfile
└─ compose.yaml
Nginx容器
在pixelfed/web目录中创建一个Dockerfile。
# ベースとなるコンテナイメージ
FROM nginx:1.25
# メインとなるアプリケーションディレクトリ
WORKDIR /opt/pixelfed
# OSのユーザをシステムアカウントとして追加
RUN useradd -rU -s /bin/bash pixelfed
# 設定ファイルとSSL証明書のコピー
COPY ./configs/nginx.conf /etc/nginx/nginx.conf
COPY ./configs/ssl /etc/nginx/ssl
# ポート開放(コンテナ側で開放しているポートを指定)
EXPOSE 80
EXPOSE 443
在pixelfed/web下创建一个名为configs的目录,并在其中放置配置文件。
这是根据Pixelfed文档中的常规安装指南的内容,修改以在nginx 1.25.1上运行的版本。
user pixelfed;
events {}
http {
server {
listen 443 ssl; # IPv4用
listen [::]:443 ssl; # IPv6用
http2 on; # HTTP/2対応 (v1.25.1以降)
server_name pixelfed.internal; # ホスト名(実運用時は自分で取った独自ドメイン名を指定)
root /opt/pixelfed/public; # DocumentRoot
ssl_certificate /etc/nginx/ssl/server.crt; # SSL証明書(後述)
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES;
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
include /etc/nginx/mime.types;
default_type application/octet-stream;
index index.php;
charset utf-8;
client_max_body_size 32M; # 一度にPOSTできるデータ量(デフォルト値より増やしました)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass pixelfed-fpm:9000; # このpixelfed-fpmはFPMコンテナの名前
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param HTTP_PROXY "";
}
location ~ /\.(?!well-known).* {
deny all;
}
}
server { # HTTPアクセスをHTTPSにリダイレクトする設定
server_name pixelfed.internal; # 最初の方に書いたホスト名と同じ
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
}
另外,我们需要事先创建一个用于测试的SSL证书,并将其放置在pixelfed/web/configs/ssl目录中。
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout pixelfed/web/configs/ssl/server.key -out pixelfed/web/configs/ssl/server.crt
在这种状态下,移动到pixelfed/web目录中。
$ docker build -t pixelfed-web .

FPM容器
由于PHP官方提供了作为PHP-FPM服务器运行的容器映像,所以我们将以此为基础创建容器映像。由于原文较长,我将分段解释。接下来,我们将操作pixelfed/fpm目录中的内容。
Dockerfile的意思是什么?
以下是一个Dockerfile的示例。
# ベースとなるコンテナイメージ
FROM php:8.2-fpm
# メインとなるアプリケーションディレクトリ(nginxと同じにする)
WORKDIR /opt/pixelfed
# OSのユーザをシステムアカウントとして追加
RUN useradd -rU -s /bin/bash pixelfed
# 必要なパッケージを追加
RUN apt-get update \
&& apt-get -y install cron libicu-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libzip-dev supervisor \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# composerをインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer
# 必要なPHP拡張モジュールをインストール
RUN docker-php-ext-configure gd --with-jpeg --with-webp \
&& docker-php-ext-install bcmath exif gd intl mysqli pcntl pdo_mysql zip \
&& pecl install redis && docker-php-ext-enable redis
# 設定ファイルのコピー
COPY ./configs/pixelfed.env /.env-customized
COPY ./configs/php.ini /usr/local/etc/php
COPY ./configs/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
COPY ./configs/supervisord.conf /etc/supervisor
COPY ./configs/supervisor-pixelfed-horizon.conf ./configs/supervisor-cron.conf /etc/supervisor/conf.d
COPY ./configs/cron-pixelfed /etc/cron.d/pixelfed
# エントリーポイントのコピー
COPY ./scripts/docker-entrypoint.sh /
# 後述
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["php-fpm"]
我们可以通过使用 ENTRYPOINT 和 CMD 的组合,在docker-entrypoint.sh中编写容器启动时的处理代码。
关于ENTRYPOINT和CMD的关系,可以总结如下。
ENTRYPOINT表示“必须执行的命令”,CMD则表示“(默认的)参数”。-Pocketstudio.Net
终端点
docker-entrypoint.sh 的内容如下所示。请不要忘记给予执行权限!
#!/bin/bash -e
if [ ! -f /opt/pixelfed/.env ]
then
composer create-project pixelfed/pixelfed=0.11.8 /opt/pixelfed
chown -R pixelfed:pixelfed /opt/pixelfed
cd /opt/pixelfed
cp /.env-customized .env
php artisan key:generate
php artisan storage:link
php artisan migrate --force
php artisan import:cities
php artisan passport:keys
php artisan horizon:install
php artisan horizon:publish
php artisan route:cache
php artisan view:cache
php artisan config:cache
fi
# Run supervisor
supervisord -c /etc/supervisor/supervisord.conf
# execute a command given by CMD
exec "$@"
在这个脚本中,主要做了两件事。
- 只有在第一次运行容器(更准确地说,是在Pixelfed未安装时),才需要进行初始化处理并运行所需的服务(守护进程)。
当 IF 语句执行时,相当于执行1号选项。只有在第一次执行时,在启动服务器之前,进行 Pixelfed 的安装。是否是第一次执行是根据.env 文件的存在与否来判断的2。在容器启动时,执行的命令是 /docker-entrypoint.sh php-fpm,而 exec “$@” 将展开为 exec php-fpm,因此可以通过这种方法,在服务器 (php-fpm) 启动之前进行处理3。
关于2,我们会使用supervisord来运行需要在后台运行的服务(守护进程)。即使某些原因导致该服务停止,它也会自动检测并重新启动该服务。关于此设置,将在后文中提到。
PHP的配置文件
接著來建立PHP的設定檔案。首先,我們準備一個基本的設定檔案。我們從基本的映像中建立一個容器,並從那裡提取數據。從WSL2的終端機中操作。
$ docker pull php:8.2-fpm


FPM服务器已成功启动,现在将提取数据。以下为容器名称为fpm-test的情况。
$ docker cp fpm-test:/usr/local/etc/php/php.ini-development pixelfed/fpm/configs/php.ini
$ docker cp fpm-test:/usr/local/etc/php-fpm.d/www.conf pixelfed/fpm/configs/php-fpm.conf

398c398
< expose_php = On
---
> expose_php = Off
433c433
< memory_limit = 128M
---
> memory_limit = 512M
595c595
< ;error_log = syslog
---
> error_log = syslog
701c701
< post_max_size = 8M
---
> post_max_size = 32M
853c853
< upload_max_filesize = 2M
---
> upload_max_filesize = 32M
977c977
< ;date.timezone =
---
> date.timezone = Asia/Tokyo
1654c1654
< ;mbstring.language = Japanese
---
> mbstring.language = Japanese
1687c1687
< ;mbstring.encoding_translation = Off
---
> mbstring.encoding_translation = Off
28,29c28,29
< user = www-data
< group = www-data
---
> user = pixelfed
> group = pixelfed
Pixelfed的配置文件
以下是Pixelfed的设置。这是根据.env.testing进行修改的版本。
APP_NAME="Pixelfed Test" # 好きな名前に変更
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=https://pixelfed.internal # ここから4項目のドメイン名を変更、nginxの設定に合わせる
APP_DOMAIN="pixelfed.internal"
ADMIN_DOMAIN="pixelfed.internal"
SESSION_DOMAIN="pixelfed.internal"
TRUST_PROXIES="*"
LOG_CHANNEL=stack
DB_CONNECTION=mysql # DB_で始まる設定を変更、テストなのでとりあえずrootで
DB_HOST=pixelfed-mariadb
DB_PORT=3306
DB_DATABASE=pixelfed
DB_USERNAME=root
DB_PASSWORD=password
BROADCAST_DRIVER=redis # すべてredisに変更
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis
REDIS_SCHEME=tcp
REDIS_HOST=pixelfed-redis # この名前を変更
REDIS_PASSWORD=null
REDIS_PORT=6379
HORIZON_PREFIX="horizon-"
MAIL_DRIVER=log
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=false
PF_MAX_USERS=1000
MAX_PHOTO_SIZE=32768 # アップロードサイズ上限 (MB単位)
MAX_CAPTION_LENGTH=150
MAX_ALBUM_LENGTH=4
ACTIVITY_PUB=false
REMOTE_FOLLOW=false
ACTIVITYPUB_INBOX=false
ACTIVITYPUB_SHAREDINBOX=false
# Set these "true" to enable federation.
# You might need to also run:
# php artisan cache:clear
# php artisan optimize:clear
# php artisan optimize
PF_COSTAR_ENABLED=true
CS_BLOCKED_DOMAINS='example.org,example.net,example.com'
CS_CW_DOMAINS='example.org,example.net,example.com'
CS_UNLISTED_DOMAINS='example.org,example.net,example.com'
## Optional
#HORIZON_DARKMODE=false # Horizon theme darkmode
HORIZON_EMBED=false # Single Docker Container mode
ENABLE_CONFIG_CACHE=false
服务执行设置
首先是全局设置 supervisor。创建 pixelfed/fpm/configs/supervisord.conf 文件。
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
#nodaemon=true
#user=root
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
接下来,让我们进行各个服务的设置吧。要设置的服务有两个,分别是 cron 和 Horizon。
如果你熟悉Linux,你应该对cron这个服务很熟悉。它可以定期自动执行任务。在pixelfed/fpm/configs/supervisor-cron.conf文件中,你可以按以下方式进行配置。
[program:cron]
process_name=%(program_name)s_%(process_num)02d
command=cron -f
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/cron.log
作为cron任务,需要准备以下文件。
* * * * * pixelfed /usr/local/bin/php /opt/pixelfed/artisan schedule:run
另一个Horizon是用于管理图像优化和缩略图创建等任务的队列。
[program:pixelfed-horizon]
process_name=%(program_name)s_%(process_num)02d
command=php /opt/pixelfed/artisan horizon
autostart=true
autorestart=true
user=pixelfed
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/pixelfed-horizon.log
创建容器镜像 (Chuangjian rongqi jingxiang)
让我们开始创建FPM服务器的容器映像吧。切换到pixelfed/fpm目录下。
$ docker build -t pixelfed-fpm .
执行(需要几分钟)。

Redis容器,MySQL容器
暂时使用现有的图像创建容器(虽然仍有调整的空间,但首先将其置为可运行的测试环境),所以没有什么特别需要做的。
写作
现在,将我们迄今为止创建的所有内容合并为一个Pixelfed实例运行。
在起始目录(pixelfed目录)中创建一个名为compose.yaml的文件。
version: "3.8"
services:
web:
container_name: pixelfed-web # コンテナ名を用いて、TCPなどでコンテナ間通信ができる
build:
context: ./web
dockerfile: Dockerfile
volumes:
- app:/opt/pixelfed # appはボリューム名。このファイルの末尾で定義。/opt/pixelfedはマウントポイント
ports: # ポート開放(コンテナ外部側のポート番号:コンテナ内部側のポート番号)
- 80:80
- 443:443
fpm:
container_name: pixelfed-fpm
build:
context: ./fpm
dockerfile: Dockerfile
volumes:
- app:/opt/pixelfed # webとfpmで、同じストレージを同じ場所にマウントするのがポイント
redis:
container_name: pixelfed-redis
image: redis:7.0 # 既存のコンテナイメージ
volumes:
- redis:/data
mariadb:
container_name: pixelfed-mariadb
image: mariadb:11.0 # 既存のコンテナイメージ
volumes:
- db:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD=password # DBの設定
# ボリューム定義
volumes:
app:
name: pixelfed-app
db:
name: pixelfed-db
redis:
name: pixelfed-redis
在同一个目录下执行命令。
$ docker compose up -d

在这里,容器之间可以通过使用容器名称进行TCP等通信。nginx的设置和.env文件中出现pixelfed-fpm等是为了连接到其他容器。
从浏览器访问
需要以管理员权限在Windows端编辑hosts文件。
127.0.0.1 pixelfed.internal # この行を追記


尝试重新制作容器
好吧,我之前提到通过创建卷来删除容器而不会丢失数据,现在让我们验证一下这一点。
只需要保留音量,重新创建容器。


在这个状态下,转到pixelfed目录并再次进行compose操作。
$ docker compose up -d
这样一来,将再次创建并启动四个容器。然而,重新创建容器就像替换机器一样。真的有留下数据吗?
当你重新加载浏览器时,无论是登录状态还是其他方面,一切都会恢复如初,就像什么事情都没有发生一样(由于本次不需要安装Pixelfed,所以你应该可以立即从浏览器访问)。简单来说,如果容器的运行出现问题,只需重新创建即可;如果Docker所在的服务器运行不稳定,只需准备一个新的服务器并设置好Docker,然后在其上运行容器即可恢复正常(假设卷实体存放在外部存储介质中)。在AWS上使用时,也与自动伸缩配合得很好。
将音量调至静音,然后重新创建容器。


然后,再次执行compose命令。然后,像之前一样,会启动四个容器。
$ docker compose up -d

因此,确实有数据存储在卷中,即使删除容器,数据仍然保留,但如果删除卷,数据将被删除,这一点得到了确认。
附录:故障排除
我将总结在制定上述步骤时遇到的关键问题。
以下的解决方案已经全部反映在上述的设置中。
数据库的初始迁移失败
Pixelfed的配置文件中有.env.testing,但是将其重命名或复制为.env后使用,会导致php artisan migrate –force在中途失败。.env.testing中数据库使用的配置是SQLite,但这似乎不好,我将其更改为DB_CONNECTION=mysql并指定连接信息后,问题解决了。
测试是指的不是测试环境,而是指的是单元测试等吗?
当试图进行用户注册时会出现 “419 Page Expired” 的错误。
通过将.env文件的SESSION_DRIVER值设置为redis解决了这个问题。
这个问题和之前的问题一样,我信任了.env.testing文件的默认值(SESSION_DRIVER=array),结果陷入了困境。array似乎是一个完全不保留会话信息的设置。
上传超过数MB大小的图像会出现错误(如”413 Request Too Large”错误)。或者在图像上传时尝试应用特效或滤镜时,会永远显示处理中的图标(实际上是请求失败了)。
我们将重新审查PHP、nginx和Pixelfed的文件大小限制。有三个类似的设置,如果其中一个限制超出,将会导致错误,所以需要注意。
如果更改了.env文件中的MAX_PHOTO_SIZE的值但没有生效(上传页面上限大小没有变化),则可以尝试以下方法:
$ docker exec -it pixelfed-fpm bash
# コンテナに入って作業
$ cd /opt/pixelfed
$ php artisan config:clear
$ php artisan config:cache
我将执行并确认是否已生效。即使不成功,等待大约几十分钟后应该会生效。(详细情况不明)
上传的图片无法加载(缩略图显示为叉号或者显示为无图像)。
请确保 Web 服务器和 FPM 服务器使用相同的执行用户(UID)。具体来说,Web 服务器使用的是 nginx.conf 文件中的 “user pixelfed;” 行,而 FPM 服务器需要使用 php-fpm.conf (php-fpm.d/www.conf) 文件中的 “user = pixelfed” 和 “group = pixelfed” 两行。
FPM服务器会以600的权限保存上传的图片,并以700的权限创建所需的父目录。因此,为了让Web服务器(浏览器)能够读取文件,Web服务器也必须以相同的用户(UID)来运行。否则,尽管上传成功,但由于Web服务器没有访问权限,图片将无法在浏览器中显示。
缩略图未生成(仅显示较小尺寸,却加载了庞大的原始图像)。
缩略图创建(图像优化)过程由队列管理。如果之前提到的Horizon没有正确运行,那么加入队列的处理就无法执行,也就是说缩略图将永远无法创建,原始大小的图像将继续显示。
由于我自己的情况是因为PHP的GD模块没有JPEG支持,所以缩略图的创建出现了错误。您可以先安装libjpeg62-turbo-dev软件包,然后使用–with-jpeg选项安装GD模块即可解决该问题。
$ apt-get install libjpeg62-turbo-dev # libwebp-dev # WebPサポートを加えたい場合は追加
$ docker-php-ext-configure gd --with-jpeg # --with-webp
$ docker-php-ext-install gd
我参考了这个页面的内容。Dockerfile 的最佳实践 — Docker-docs-ja 1.9.0b 文档。