pgAdmin4をサービス化して自動起動設定

pgAdmin4をサービス化して自動起動したときの覚書。
本番環境はphpMyAdminと同じくブラウザでデータベースを確認できるようにする。

環境: CentOS Stream 8, nginx 1.20.2, pgAdmin4 6.6, certbot 1.24.0

インストールするまでは前の記事を参考に。
参考: pgAdmin4をCentOS8にvenvでインストール


unitファイル作成

参考サイト


システムサービス用unitファイルの置き場所に移動して一覧表示
# cd /etc/systemd/system
# ls

「systemctl enable」したシンボリックリンク一覧をみる
# ll multi-user.target.wants/

サービスの依存関係を見る
# systemctl list-dependencies

PostgreSQLのunitファイルを参考にして編集する。
# cp multi-user.target.wants/postgresql-14.service ./pgadmin4.service
# less pgadmin4.service

#
# pgAdmin4
#
[Unit]
Description=pgAdmin4 service with gunicorn
After=syslog.target
After=network.target

[Service]
User=nginx
Group=www

# Location of venv pgadmin4
Environment="PATH=/opt/software/python-venv/pgadmin4/bin/"
ExecStart=/opt/software/python-venv/pgadmin4/bin/gunicorn  --bind unix:/tmp/pgadmin4.sock --workers=1 --threads=25 --chdir /opt/software/python-venv/pgadmin4/lib/python3.9/site-packages/pgadmin4 pgAdmin4:app

[Install]
WantedBy=multi-user.target

systemdを再読み込して登録されているか確認
# systemctl daemon-reload
# systemctl list-unit-files --type=service
# systemctl status pgadmin4

起動してみる。
# systemctl start pgadmin4
# systemctl status pgadmin4

権限エラーになったので修正して起動。
# chown nginx.www -R /var/lib/pgadmin/
# chown nginx.www -R /var/log/pgadmin/
# systemctl start pgadmin4
# systemctl status pgadmin4

無事起動された。

自動起動登録して確認
# systemctl enable pgadmin4

Created symlink /etc/systemd/system/multi-user.target.wants/pgadmin4.service → /etc/systemd/system/pgadmin4.service.

# systemctl list-unit-files --type=service

再起動して確認
# reboot


nginxの設定

設定ファイルを編集。
# cd /etc/nginx/conf.d/
# less 00_default.conf

#
# pgAdmin4
#
server {
    listen       80;
    server_name  pgadmin.*; 
    location / {
        proxy_set_header Host $http_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_pass http://unix:/tmp/pgadmin4.sock;
    }
}

nginx再読み込み
# nginx -t
# systemctl reload nginx

ブラウザで表示して確認。

セキュリティを考えてBasic認証とIPアドレス制限とSSL暗号化する。
参考: nginxでBasic認証を設定
certbotが参照するための権限設定
# chown nginx.www /var/www/html/

nginx設定ファイル修正
# less 00_default.conf

#
# pgAdmin4
#
server {
    listen       80;
    server_name  pgadmin.*;

    # Basic Authentication
    auth_basic    "Secret Area for pgAdmin4";
    auth_basic_user_file  "/home/httpd/httpdocs/.htpasswd";

    # IP Limitation
    allow 123.456.7.89;
    deny all;

    location /.well-known/acme-challenge {
        auth_basic off;
        allow all;
        root /var/www/html/;
    }

    location / {
        proxy_set_header Host $http_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_pass http://unix:/tmp/pgadmin4.sock;
    }
}

nginx再読み込み。
# nginx -t
# systemctl reload nginx

certbotで証明書取得
# certbot certonly --webroot -w /var/www/html/ -d pgadmin.hoge.jp

nginx設定ファイル修正。最終版。
# less 00_default.conf

#
# pgAdmin4
#
server {
    listen       443 ssl;
    server_name  pgadmin.*;

    # Basic Authentication
    auth_basic    "Secret Area for pgAdmin4";
    auth_basic_user_file  "/home/httpd/httpdocs/.htpasswd";

    # IP Limitation
    allow 123.456.7.89;
    deny all;

    # Accept for Let's Encrypt(certbot)
    location /.well-known/acme-challenge {
        auth_basic off;
        access_log off;
        allow all;
        root /var/www/html/;
    }

    location / {
        proxy_set_header Host $http_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_pass http://unix:/tmp/pgadmin4.sock;
    }

    include conf.d/global/gzip.conf;
    include conf.d/global/ssl.conf;
    ssl_certificate         /etc/letsencrypt/live/pgadmin.hoge.jp/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/pgadmin.hoge.jp/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/pgadmin.hoge.jp/chain.pem;
}

nginx再読み込み。
# nginx -t
# systemctl reload nginx

ブラウザでアクセスして確認。


【関連記事】