commit f4164b4abf5ad0e0f0c1d8be0ab5866804e2c374 Author: 3wc <3wc@doesthisthing.work> Date: Wed Apr 24 17:20:03 2024 -0300 Initial cut diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..e1fefd3 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,18 @@ +--- +kind: pipeline +name: deploy main branch to live site +steps: + - name: docker cp deploy + image: git.coopcloud.tech/coop-cloud/docker-cp-deploy:latest + settings: + host: server.example.com + service: wordpress_example_com_app + source: wp-content/themes/theme + exec_pre: rm -rf /var/www/html/wp-content/themes/theme/* + exec: composer install + dest: /var/www/html/ + deploy_key: + from_secret: drone_ssh_server.example.com + when: + branch: + - main diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..55029d8 --- /dev/null +++ b/.env.sample @@ -0,0 +1,38 @@ +############################################################################## +# REQUIRED SETTINGS (you will need these) # +############################################################################## + + +############################################################################## +# COMMON SETTINGS (you may need these) # +############################################################################## + +# If you don't have docker-compose, but do have newer docker, uncomment this +#DOCKER_COMPOSE=docker compose + +# Uncomment the following line if you need `sudo` to run Docker commands +#DOCKER_SUDO=1 + +# Wordpress debugging +WORDPRESS_DEBUG=1 + +############################################################################## +# RARE SETTINGS (you probably won't need these) # +############################################################################## + +# Connect to a remote database +#WORDPRESS_DB_HOST=fr.swarm.autonomic.zone +#WORDPRESS_DB_PASSWORD="see README.md" + +############################################################################## +# INFINITE NERD DEPTH SETTINGS (if you're changing these, good luck!) # +############################################################################## + +# Docker container names, probably just needs to be set once per project +PROJECT_NAME=foobar + +# Site URL, also just needs to be set once per project +SITE_URL=foobar.org + +# Multi-site config +#WORDPRESS_CONFIG_EXTRA="define('MULTISITE', true); define('SUBDOMAIN_INSTALL', true); define('DOMAIN_CURRENT_SITE', 'frms.localhost'); define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1); define('SUNRISE', true);" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b750cbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/.env + +/wp-content/** + +/data/** +!/data/.gitkeep + +.vscode/ +**.tar.gz +**.sql +**.zip diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1d9dd84 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,54 @@ +--- +version: "3" + +services: + wordpress: + image: "wordpress:6.2.0" + ports: + - "80:80" + dns: 4.2.2.4 + volumes: + - "./entrypoint.sh:/usr/local/bin/entrypoint.sh:z" + - "./wp-content:/var/www/html/wp-content/:z" + - "./composer.json:/var/www/html/composer.json:z" + - "./composer.lock:/var/www/html/composer.lock:z" + entrypoint: ["/usr/local/bin/entrypoint.sh"] + networks: + - backend + environment: + - WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-db} + - WORDPRESS_DB_USER=${WORDPRESS_DB_USER:-wordpress} + - WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-wordpress} + - WORDPRESS_DB_NAME=wordpress + - WORDPRESS_CONFIG_EXTRA=${WORDPRESS_CONFIG_EXTRA} + - WORDPRESS_DEBUG=${WORDPRESS_DEBUG} + - PHP_EXTENSIONS=calendar + - PAGER=more + container_name: "${PROJECT_NAME}_wordpress" + + db: + image: "mariadb:10.6" + volumes: + - "${MARIADB_VOLUME:-mariadb}:/var/lib/mysql" + networks: + - backend + environment: + - MYSQL_ROOT_PASSWORD=wordpress + - MYSQL_DATABASE=wordpress + - MYSQL_USER=wordpress + - MYSQL_PASSWORD=wordpress + container_name: "${PROJECT_NAME}_db" + + mailhog: + image: "mailhog/mailhog" + networks: + - backend + ports: + - "8025:8025" + container_name: "${PROJECT_NAME}_mailhog" + +volumes: + mariadb: + +networks: + backend: diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..c877aee --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +if [ -n "$PHP_EXTENSIONS" ]; then + for extension in $PHP_EXTENSIONS; do + if ! php -m | grep -q $extension; then + docker-php-ext-install $PHP_EXTENSIONS + fi + done +fi + +if ! id -u "user" >/dev/null ; then + useradd -u 1000 -m user + mkdir /var/www/html/vendor + chown -R user:user /var/www/html/vendor +fi + +if [ ! -x /usr/bin/zip ]; then + apt update && apt install unzip +fi + +if [ ! -x /usr/local/bin/wp ]; then + curl -z /usr/local/bin/wp -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar + chmod +x /usr/local/bin/wp +fi + +if [ ! -x /usr/local/bin/composer ]; then + mkdir -p /var/www/.composer + chown user:user /var/www/.composer + + curl https://getcomposer.org/installer -o /tmp/composer-setup.php + php -r "if (hash_file('sha384', '/tmp/composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" + php /tmp/composer-setup.php + rm /tmp/composer-setup.php + + mv /var/www/html/composer.phar /usr/local/bin/composer +fi + +export APACHE_RUN_USER=user +export APACHE_RUN_GROUP=user + +if [ -n "$@" ]; then + "$@" +fi + +# Upstream ENTRYPOINT +# https://github.com/docker-library/wordpress/blob/master/php7.4/apache/Dockerfile#L120 +/usr/local/bin/docker-entrypoint.sh apache2-foreground diff --git a/makefile b/makefile new file mode 100644 index 0000000..4286120 --- /dev/null +++ b/makefile @@ -0,0 +1,148 @@ +include .env + +.PHONY: up down stop prune ps shell shell_root wp logs + +default: up + +####################################### +# Variable admin +####################################### + +REQUIRED_BINS := docker +$(foreach bin,$(REQUIRED_BINS),\ + $(if $(shell command -v $(bin) 2> /dev/null),$(true),$(error Please install `$(bin)`))) + +ifeq ($(SITE_URL),) + $(error SITE_URL is not set) +endif + +ABRA ?= abra + +DOCKER_COMPOSE ?= docker-compose + +ifeq ($(DOCKER_SUDO), 1) + DOCKER = sudo docker + _DOCKER_COMPOSE = sudo $(DOCKER_COMPOSE) +else + DOCKER = docker + _DOCKER_COMPOSE = $(DOCKER_COMPOSE) +endif + +####################################### +# Core commands +####################################### + +## Start up containers. +up: + @echo "Starting up containers for $(PROJECT_NAME)..." + $(_DOCKER_COMPOSE) pull + $(_DOCKER_COMPOSE) up -d --remove-orphans + +## Stop containers. +down: stop + +## Start containers without updating. +start: + @echo "Starting containers for $(PROJECT_NAME) from where you left off..." + @$(_DOCKER_COMPOSE) start + +## Stop containers. +stop: + @echo "Stopping containers for $(PROJECT_NAME)..." + @$(_DOCKER_COMPOSE) stop + +## Remove containers and their volumes. +## You can optionally pass an argument with the service name to prune single container +prune: + @echo "Removing containers for $(PROJECT_NAME)..." + @$(_DOCKER_COMPOSE) down -v $(filter-out $@,$(MAKECMDGOALS)) + +ps: + @$(_DOCKER_COMPOSE) ps + +shell: + @$(_DOCKER_COMPOSE) exec -u user wordpress bash + +shell_root: + @$(_DOCKER_COMPOSE) exec wordpress bash + +## Executes `wp cli` +## Doesn't support --flag arguments. +wp: + $(_DOCKER_COMPOSE) exec -u user wordpress wp $(filter-out $@,$(MAKECMDGOALS)) + +## composer +## Doesn't support --flag arguments. +composer: + $(_DOCKER_COMPOSE) exec -u user wordpress composer $(filter-out $@,$(MAKECMDGOALS)) + +## Show vontainers' logs +## You can optinally pass an argument with the service name to limit logs +logs: + @$(_DOCKER_COMPOSE) logs -f $(filter-out $@,$(MAKECMDGOALS)) + +## Check that all required variables are defined +check: + @echo "$$(tput setaf 125)Watch out for any lines starting '-', which indicate settings in .env.sample which aren't in .env$$(tput sgr0)" + diff -u <(grep -v '^#' .env.sample | grep -v '^$$' | sed -e 's/=.*//g' | sort) <(grep -v '^#' .env | grep -v '^$$' | sed -e 's/=.*//g' | sort) || true + @echo "$$(tput setaf 125)The following command shouldn't show any differences; if it does, re-copy WORDPRESS_CONFIG_EXTRA fr4om .env.sample to .env$$(tput sgr0)" + diff -wu <(grep 'CONFIG_EXTRA' .env.sample ) <(grep 'CONFIG_EXTRA' .env) + +####################################### +# Content management +####################################### + +## Download wp-content files from site +uploads_fetch: + @echo -n "About to download ~1.5GB of data, overwriting existing data/uploads.tar.gz. - are you sure? [Y/n] " && read ans && if [ $${ans:-'Y'} = 'n' ]; then \ + printf $(_ERROR) "Aborting as requested\n"; \ + exit 1 ; \ + else \ + printf $(_SUCCESS) "OK" "Continuing" ; \ + $(ABRA) app run --no-tty $(SITE_URL) app tar --owner=0 --group=0 --no-same-owner --no-same-permissions -czf- /var/www/html/wp-content/uploads/ > data/uploads.tar.gz; \ + fi + +## Load latest wp-content from data/uploads.tar.gz +uploads_load: + tar -C wp-content --strip-components=4 -xzf data/uploads.tar.gz + +####################################### +# Wacky commands you probably won't need to use +####################################### + +## Download database from dev site +db_fetch: + $(ABRA) app run $(SITE_URL) db bash -c 'mysqldump -u root -p"$$(cat /run/secrets/db_root_password)" wordpress' | gzip > data/dbdump.sql.gz + +## Load latest database from ~/.abra/backups +db_load: + zcat data/dbdump.sql.gz | $(_DOCKER_COMPOSE) exec -T db mysql -u wordpress -pwordpress wordpress + +## Replace site URL +fix_url: + $(_DOCKER_COMPOSE) exec -u user wordpress wp --url=https://$(SITE_URL) search-replace --all-tables-with-prefix 'https://$(SITE_URL)' 'http://$(PROJECT_NAME).localhost' + $(_DOCKER_COMPOSE) exec -u user wordpress wp --url=https://$(SITE_URL) search-replace --all-tables-with-prefix '$(SITE_URL)' '$(PROJECT_NAME).localhost' + $(_DOCKER_COMPOSE) exec -u user wordpress wp --url=https://$(SITE_URL) search-replace --all-tables-with-prefix 'fashionrevolution.org' '$(PROJECT_NAME).localhost' + +set_local_password: + $(_DOCKER_COMPOSE) exec -u user wordpress wp user update admin --user_pass=password + +db_pull: db_fetch db_load fix_url + +## Sync wp-content from site +uploads_pull: uploads_fetch uploads_load + +## Download wp-content files from site +plugins_fetch: + $(ABRA) app run --no-tty $(SITE_URL) app tar --owner=0 --group=0 --no-same-owner --no-same-permissions -czf- /var/www/html/wp-content/plugins/ > data/plugins.tar.gz + +## Load latest plugins from data/plugins.tar.gz +plugins_load: + tar -C wp-content --strip-components=4 -xzf data/plugins.tar.gz + +## Sync plugins from site +plugins_pull: plugins_fetch plugins_load + +# "Arguments" for makefiles.. +# https://stackoverflow.com/a/6273809/1826109 +%: