안녕하세요. 경민나스입니다. 제가 GPT통해서 완성하고 현재 사용하는 워드프레스 스크립트를 초급 입문자 분들에게 공유합니다.
워드프레스를 설치할 때, Redis와 MariaDB, 그리고 PostgreSQL까지 함께 구성하는 이유는 다음과 같습니다.
- 워드프레스는 기본적으로 글, 설정, 계정 정보 등을 저장할 데이터베이스(DB)가 필요합니다. 저는 MariaDB을 기준으로 진행하겠습니다.
- Redis는 워드프레스가 데이터베이스에서 정보를 읽고 쓰는 과정 중 일부를 캐싱해서, 속도를 빠르게 만들어주는 보조 역할을 합니다.
필수 구성 요소는 아니지만, 성능을 신경 쓰신다면 함께 쓰면 좋은 조합입니다. - PostgreSQL은 WPForms 같은 폼 플러그인(설문, 접수, 문의 메일폼 등)을 조금 더 확장성 있게 활용하고 싶은 분들을 위한 또 다른 데이터베이스입니다.
워드프레스 설치에 꼭 필요한 DB는 아니라서 선택 사항이지만, 설치 용량도 가볍고 부담이 적기 때문에 “설치하는 김에 같이 세팅해 두면 좋은 옵션” 정도로 보시면 됩니다.
그럼, 시작하겠습니다.
■ 1단계 : 설치 공간 준비하기
SSH로 NAS에 접속한 뒤 sudo -i로 root 권한으로 전환하고, 아래 스크립트를 실행합니다. ( 아래 Copy 하셔서 SSH에 복붙하시면 됩니다. )
#!/bin/sh
set -eu
BASE="/volume1/docker/wordpress"
TARGET="$BASE/8081"
# 1) 폴더 한꺼번에 생성(있으면 그대로)
mkdir -p "$TARGET/data" "$TARGET/mariadb" "$TARGET/postgres" "$TARGET/redis"
# 2) 권한 부여
chmod -R 777 "$BASE"
# 3) 결과 확인(선택)
ls -al "$TARGET"
( ※ wordpress 폴더에 777 권한을 부여하지 않으면 워드프레스 환경설정 파일인 wp-config.php를 수정할 때 권한 문제로 막혀 수정이 되지 않습니다. )
/volume1/docker/wordpress/8081 경로 아래에 data, mariadb, postgres, redis 폴더가 생성됩니다.

저는 워드프레스를 여러개를 운영하면서 워드프레스의 구분을 빨간화살표처럼 8081, 8082, 8083 처럼 포트번호로 구분하고 있습니다.
단일 워드프레스를 운영하시거나, 다른 폴더로 구분하시려면 위에 TARGET=”$BASE/8081″ 에서 “8081”을 삭제하시거나 다른 이름으로 수정하셔도 됩니다.
■ 2단계 : htaccess, uploads.ini 만들기
설치 된 워드프레스는 파일, 플러그인, 테마 등의 업로드 제한이 걸려있습니다. 워드프레스를 설치하는 김에 여유있는 파일전송이 되도록 이 제한을 아예 풀어줍니다.
먼저 워드프레스가 설치될 data 폴더내의 htaccess 파일에 허용될 업로드 볼륨을 정의해 줍니다.
( 설치 폴더명을 다르게 정했다면 /volume1/docker/wordpress/8081/data 에서 8081을 수정해 주시면 됩니다 )
sudo mkdir -p /volume1/docker/wordpress/8081/data && sudo tee /volume1/docker/wordpress/8081/data/htaccess >/dev/null <<'EOF'
php_value upload_max_filesize 512M
php_value post_max_size 512M
php_value memory_limit 512M
php_value max_execution_time 300
php_value max_input_time 300
# BEGIN WordPress
# "BEGIN WordPress"와 "END WordPress" 사이의 지시문(줄)은
# 동적으로 생성되며 워드프레스 필터를 통해서만 수정해야합니다.
# 이 표시 사이의 지시문을 변경하면 덮어쓰게 됩니다.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
EOF
그 다음 uploads.ini 파일도 생성해 줍니다. ( 설치 폴더명을 다르게 정했다면 /volume1/docker/wordpress/8081/data/upload.ini 에서 8081을 수정해 주시면 됩니다 )
# 1) uploads.ini 생성
cat > /volume1/docker/wordpress/8081/data/uploads.ini <<'EOF'
file_uploads = On
memory_limit = 512M
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 600
EOF
# 2) 파일 내용 확인
cat /volume1/docker/wordpress/8081/data/uploads.ini
결론은, /volume1/docker/wordpress/8081/data 안에 htaccess와, uploads.ini 두 파일이 생성되어 있으면 정상입니다.
# 1) 두 파일 존재 여부(있으면 OK, 없으면 에러)
ls -l /volume1/docker/wordpress/8081/data/htaccess /volume1/docker/wordpress/8081/data/uploads.ini
# 2) (숨김파일 포함) 디렉토리에서 한 번 더 확인
ls -al /volume1/docker/wordpress/8081/data | grep -E '(\.htaccess|uploads\.ini)$'
# 3) 두 파일 내용 확인
echo "===== .htaccess ====="
cat /volume1/docker/wordpress/8081/data/htaccess
echo
echo "===== uploads.ini ====="
cat /volume1/docker/wordpress/8081/data/uploads.ini
htaccess와, uploads.ini이 빨간색으로 화인되면 정상입니다.
■ 2단계 : 빌드 업 하기
DSM에서의 설치는 Container Manager와 Portainer를 기준으로 설치하는 과정을 보여드리겠습니다.
저는 개인적으로 Portainer에서 컨테이너들을 관리하지만, 취향의 영역이기 때문에 둘 중에 하나 편한 방법으로 선택하시면 되겠습니다.
version: '3.9'
services:
wordpress:
image: wordpress:latest
container_name: WordPress-8081
hostname: wordpress
depends_on:
- db
- redis
- phpmyadmin
ports:
- "8081:80"
volumes:
# 워드프레스 코드 + 업로드 데이터
- /volume1/docker/wordpress/8081/data:/var/www/html:rw
# PHP 업로드 제한 설정
- /volume1/docker/wordpress/8081/data/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:rw
environment:
WORDPRESS_DB_HOST: WordPress-DB-8081:3306
WORDPRESS_DB_USER: wordpress_user_8081
WORDPRESS_DB_PASSWORD: wordpress@8081
WORDPRESS_DB_NAME: wordpress_name_8081
# 👉 여기부터는 Redis 캐시 설정 (wp-config.php 안에 자동으로 추가됨)
WORDPRESS_CONFIG_EXTRA: |
define('WP_REDIS_HOST', 'redis');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_CACHE_KEY_SALT', 'wp8081_');
define('WP_CACHE', true);
restart: on-failure:5
# (선택) 나중에 네트워크 분리하고 싶으면 networks: 에 wp-net 추가
db:
image: mariadb:latest # LTS 이미지 사용 권장
container_name: WordPress-DB-8081
hostname: db
security_opt:
- no-new-privileges:true
environment:
MYSQL_DATABASE: wordpress_name_8081
MYSQL_USER: wordpress_user_8081
MYSQL_PASSWORD: wordpress@8081
MYSQL_ROOT_PASSWORD: rootpass
TZ: Asia/Seoul
volumes:
- /volume1/docker/wordpress/8081/mariadb:/var/lib/mysql:rw
restart: on-failure:5
redis:
image: redis:latest
hostname: wordpress-redis
container_name: WordPress-REDIS-8081
# Synology 권한 맞춰서 쓰고 있으면 유지
# user: "1026:100"
command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
interval: 10s
timeout: 3s
retries: 5
volumes:
- /volume1/docker/wordpress/8081/redis:/data:rw
environment:
TZ: Asia/Seoul
restart: on-failure:5
phpmyadmin:
image: phpmyadmin:latest
container_name: WordPress-phpMyAdmin-8081
hostname: wordpress-phpmyadmin
ports:
- "2500:80"
environment:
PMA_HOST: db # db 서비스의 hostname과 맞추기
PMA_PORT: 3306
restart: on-failure:5
postgres:
image: postgres:16
container_name: WordPress-Postgres-8081
hostname: wordpress-postgres
environment:
POSTGRES_DB: extra_service_db
POSTGRES_USER: extra_user
POSTGRES_PASSWORD: strong_password_here
TZ: Asia/Seoul
volumes:
- /volume1/docker/wordpress/8081/postgres:/var/lib/postgresql/data:rw
restart: on-failure:5