Установка WordPress Мультисайт(multisite) на локальном сервере. Режим поддоменов.

511

Добрый день. Сегодня расскажу как поставить мультисайт на локальном сервере.

Для чего он нужен? Для организации подразделов или поддоменом, при этом используя только один инстанс WordPress (т.е один каталог CMS). Более подробно вы можете ознакомиться в документации.

В данном гайде я буду акцентировать внимания именно на локальной установке, но так же будет применимо и для установки на хостинге. Для настроек на сервере можете использовать ссылку на документацию выше.

Проблема

В чем заключаем нюанс. Давайте вместе пройдем путь установки и сами увидим в чем загвоздка.
Для начала можно использовать любой локальный сервер. Для мака я использовал MAMP. Но сейчас я это буду делать через docker, так как и решение я нашел через него. Для установки вордпресс через докер можете воспользоваться моим гайдом.

Итого мы имеем чисто установленный вордпресс на localhost.

Хорошо. Теперь переходим к установки мультисайта по документации.
Заходим в wp-config.php и проставляем объявление:

define( 'WP_ALLOW_MULTISITE', true );

Теперь у нас в панели инструментов появилась настройка сети.

Переходим. И тут мы и сталкиваемся с проблемой.
По идее по гайду у нас должен появится выбор между двумя режимами: поддомены и подкаталоги
https://wp-kama.ru/wp-content/uploads/2016/09/multisite-install2.png.

Но в нашем случае мы видим только настройку подкаталоги, так как мы используем localhost.

Решение

Я не нашел явного решения через локалхост и через MAMP. Возможно есть какой то подход.

Мое решение выглядет так. Не понимаю в чем ограничение localhost, возможно это связано с зарезервированым названием. Мы изменяем нашу сборку Docker.
В сервисе wordpress мы прописываем hostname — с названием нашего произвольного сайта.

version: '3'
services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    command: "--default-authentication-plugin=mysql_native_password"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wpdb
      MYSQL_USER: user
      MYSQL_PASSWORD: password


  wordpress:
    image: wordpress:4.9.8
    container_name: wordpress
    restart: always
    volumes:
      - ./:/var/www/html/
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wpdb
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: password
    hostname: mysite.ru
    ports:
      - 80:80
      # - 443:443

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 3333:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORT: password

Перзапускаем докер.
Отлично. Но нужно прописать алиас на локальной машине для нашего сайта. В Mac/Linux заходим директорию etc и выбираем файл hosts.

sudo nano /etc/hosts

Прописываем алиас и сохраняем от имени администратора.

Отлично теперь наш сайт доступен по урлу mysite.ru (или тот который вы прописали).

Нам потребуется изменить в базе данных в таблице options поля названия сайта и домашней страницы, так как мы изменили домен.

И теперь заходим в те же настройки сети в админку и мы видим желаемый выбор конфигурации.

Жмем установить идем дальше по инструкции

После установки появляется стандартная панель по управлению сайтами.

Для проверки давайте добавим поддомен. У меня это будет test.
Его соответсвенно надо зарегистрировать в /etc/hosts

Все поддомен активен.

0
 

Установка WordPress через Docker. Простой docker-compose. (Install wordpress with docker-compose)

487

Создаем файл docker-compose.yml

Наша сборка будет состоять из 3-ех стандартных сервисов:

  • Сервис WordPress. Будет включать в себя сервер и файлы CMS
  • Сервис для БД, в нашем случае MySQL
  • Ну и так же поставим phpMyAdmin

Службы будут описаны и указаны в файле docker-compose.yml, который сначала необходимо создать в нашем каталоге:

mkdir wordpress-docker
cd wordpress-docker
touch docker-compose.yml

Можем открыть папку в любом удобном редакторе

У нас должен быть пустой файл docker-compose.yml внутри папки wordpress-docker. Открываем файл и прописываем сервис для mysql.

version: '3'
services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    command: "--default-authentication-plugin=mysql_native_password"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wpdb
      MYSQL_USER: user
      MYSQL_PASSWORD: password

В разделе сервисов мы добавили первое, которое называется db. Этот сервис связан образом mysql и, следовательно, предоставляет необходимый экземпляр базы данных MySQL.

command: "--default-authentication-plugin=mysql_native_password"

Эта команда

Эта команда позволяет нам запустить базу с включенной собственной аутентификацией по паролю.
Кроме того, нам нужно установить следующие переменные среды: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER и MYSQL_PASSWORD. Можете прописать свои.

Добавляем WordPress сервис

Добавляем соотвествующий кусок кода описывающий сервис

wordpress:
    image: wordpress
    container_name: wordpress
    restart: always
    volumes:
      - ./:/var/www/html/
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wpdb
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: password
    ports:
      - 8080:80
      - 443:443

Здесь мы используем образ wordpress. Вы можете указать любую версию вида wordpress:4.9.8. Я буду использовать последнюю актуальную.


Свойство volumes используется для подключения каталога /var/www/html контейнера к локальной папке приложения. Все изменения, которые мы будем вносит в файлы папки нашего приложения буду отображать сразу в контейнере.


Кроме этого, мы снова используем раздел environment для установки значений для четырех переменных: WORDPRESS_DB_HOST, WORDPRESS_DB_NAME, WORDPRESS_DB_USER и WORDPRESS_DB_PASSWORD.
Значение, присвоенное WORDPRESS_DB_HOST, должно быть идентификатором сервиса базы данных ( в нашем случае db).

И мы обязательно сопоставим внутренний порт 80 с внешним портом 8080, чтобы WordPress был доступен через http://localhost:8080.

Добавляем phpMyAdmin

Вставляем код

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 3333:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORT: password

Здесь мы используем образ phpmyadmin/phpmyadmin (https://hub.docker.com/r/phpmyadmin/phpmyadmin).
Включаем доступ к базе данных для phpMyAdmin. Устанавливаем две переменные среды для этой службы:
PMA_HOST: необходимо указать имя службы базы данных (в нашем случае db)
MYSQL_ROOT_PASSWORD: необходимо установить пароль root MySQL (в нашем случае это просто password)

Внутренний порт 80 (на котором по умолчанию доступен phpMyAdmin) сопоставлен с внешним портом 3333, чтобы мы могли получить доступ к веб-интерфейсу пользователя phpMyAdmin с помощью URL http://localhost:3333 позже.

Итоговый файл docker-compose.yml

Это полная версия получившегося файла:

version: '3'
services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    command: "--default-authentication-plugin=mysql_native_password"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wpdb
      MYSQL_USER: user
      MYSQL_PASSWORD: password


  wordpress:
    image: wordpress:4.9.8
    container_name: wordpress
    restart: always
    volumes:
      - ./:/var/www/html/
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wpdb
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: password
    ports:
      - 8080:80
      - 443:443

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 3333:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORT: password

В целом все. Нам остается только запустить установщик наших сервисов:

docker-compose up

Заходим на наш http://localhost:8080 и получаем стартовую страницу установки:

Отлично все получилось.

0
 

Простой node.js cli

481

Привет. Сделаем простой node.js cli. У меня к примеру были задачи, что для какого скрипта надо было установить ряд настроек перед запуском. Собственно для сбора настроек я и решил воспользоваться простым терминальным интерфейсом.

Вначале я использовал стандартный модуль https://nodejsdev.ru/api/readline/. Но мне захотелось чуть более продвинутый интерфейс.

Давайте создадим простое приложение для расчета ИМТ(индекс массы тела).

Для этого мы будем использовать модуль inquirer.

Создаем проект. Устанавливаем модуль и вставляем изначальный шаблон. У меня это будет файл imt.js.

npm init
npm install inquirer
var inquirer = require('inquirer');
inquirer
  .prompt([
    /* Pass your questions in here */
  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
  })

Отлично.
Первый блок это блок вопросов. В нем мы описываем наши вопросы в виде массива объектов. Вопросы бывают разного типа.

Допустим мы спросим про имя (это будет строка), про пол (селект), рост (будет число) и вес (тоже будет число).

Вот что у нас получается.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: 'noname'
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: 'nogender'
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height',
        default: '0'
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: '0'
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
  })
  

Можем запустить код и посмотреть.

node imt.js

Мой результат

Отлично. На выходе мы получили console.log c объектом данных которые мы заполнили. У нас в вопросах есть поле default, как не сложно догадаться это значение, которое выставляет, если ответ был пропущен. Что ж давайте сделаем простую валидацию, чтобы все поля были обязательны для заполнения.

Для этого измени некоторые default значения, и воспользуемся методом validate. Это функция, параметром которого является наш ответ на вопрос, а тело собственно проверка. Если проверка пройдена то возвращаем true.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: '',
        validate: async (input) => {
            if (input == '' ) {
               return 'Please tell me your name';
            }
            return true;
         }
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: null,
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height(cm)',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your height in centimeters';
            }
            return true;
         }
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your weight in kilograms';
            }
            return true;
         }
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
  })
  

Теперь у нас появилась проверка

Почти все. Осталось добавить формулу рассчета массы тела из получившихся данных.

  1. Необходимо рассчитать индекс массы тела для мужчины ростом 185 см, вес которого равен 94 кг.
  2. Расчет ИМТ начнем с возведения роста в метрах в квадрат (для этого необходимо умножить число на само себя): 1,85×1,85=3,4225.
  3. Разделим вес в килограммах на полученное значение: I=94/3,4225=27,47.

Выведем индекс и заключение.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: '',
        validate: async (input) => {
            if (input == '' ) {
               return 'Please tell me your name';
            }
            return true;
         }
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: null,
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height(cm)',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your height in centimeters';
            }
            return true;
         }
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your weight in kilograms';
            }
            return true;
         }
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
    let squareHeight =  Math.pow((answers.height/100), 2)
    let index = answers.weight/squareHeight

    console.log('Your index ', index)
    if(index < 16) console.log('Pronounced lack of body weight')
    if(index > 16 && index < 18.5) console.log('Body weight deficit')
    if(index > 18.5 && index < 25) console.log('Normal weight')
    if(index > 25 && index < 30) console.log('Pre-obesity')
    if(index > 30 && index < 35) console.log('First-degree obesity')
    if(index > 35 && index < 42) console.log('Second-degree obesity')
    if(index > 42 ) console.log('Third-degree obesity')
   
  })
  

Наш итоговый результат

0
 

October CMS System\Models\MailSetting, Mail not found

441

У меня в компоненте возникла ошибка, что данные классы не были найдены.

Соответсвенно помогли импорты. Хотя в примерах импорты не указывались.



use System\Models\MailSetting as MailSetting;
use Mail;
0
 

Установка Express.js приложение на VPS с Nginx, PM2 и Ubuntu 18.04

665

0. Подготовка

Нам понадобится:

  • VPS с Ubuntu 18.04 и root доступом
  • Putty или другой SSH клиент
  • Шаблон простого Node.js + Express.js сервера (Я буду использовать этот)
  • Необязательно: домен с DNS записями с привязкой к вашему VPS

1. Создаем пользователя

Мы хотим создать нового пользователя с правами “sudo”, потому что это плохая практика использования root — пользователя в рабочей среде.

Я для примера создам пользователя с именем lukas.

# creating new user
adduser lukas# providing superuser rightsusermod -aG sudo lukas

Выйдем из терминала и залогинимся снова под новым пользователем. Так же отличная идея обновить систему

sudo apt-get update
sudo apt-get upgrade

2. Node.js

Есть много путей для установки node.js, но я предпочитаю  NVM (Node.js Version Manager). Мы установим node.js 10ой версии.

Примечание, на момент выхода перевода актуальная версия node.js 14 lts.

Мы загрузим установочный скрипт с curl (или альтернативно можно использовать wget). Так создастся папка .nvm в каталоге вашего пользователя. Внутри этой папки будут храниться ваши Node.js установки.

# this command will download install script with curl
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash# or use wget
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

Выйдем и залогинимся обратной. После этого надо убедится, что nvm стал доступен.

# check if installed
nvm --version
==> 0.33.11# list available Node.js versions
nvm ls-remote# choose one version and install it
# example of v10.4.1 installation
nvm install v10.4.1# check if installed properly
node --version
==> v10.4.1

NVM-это мощный инструмент, который позволяет устанавливать несколько версий node.js и переключаться между ними по своему усмотрению. Вы можете использовать команду “help” или обратится к документации  github page.

# check more nvm usage
nvm --help

Создаем простой сервер с Express.js

# go to your user's directory
cd /home/lukas# create folder simpleServer
mkdir simpleServer# go inside
cd simpleServer# create package.json
npm init -y# install Express.js
npm install express

Создайте файл с этим текстом внутри и сохраните его. Вы можете использовать nano или любой другой редактор.

# open nano
nano server.js# to save, press Ctrl + X ==> Y ==> Enter
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send("Hello World!");
});

const port = 3000;
const server = app.listen(port, () => {
  console.log(`Listening on http://localhost:${port}`);
});
# start server
node server.js
==> Listening on http://localhost:3000

Если вы зайдете на ваш сайт с портом 3000 (например http://dzen-code.ru:3000) , вы должны увидеть “Hello World!” в окне браузера.

3. PM2

Если вы сейчас закроете свой SSH-клиент, ваш веб-сайт перестанет работать. Нам понадобиться какой-то инструмент, который будет поддерживать наш сервер “живым”. Скажите привет PM2!

# globally install PM2
npm install pm2 -g# check if installed properly
pm2 -V
==> 2.10.4

PM2 будет поддерживать наш сервер в фоновом режиме, и если он упадет, PM2 автоматически перезапустит его.

# start our server with PM2
pm2 start server.js# check <YourVPSIpAddress>:3000 if your server is running

Сделаем запуск PM2 со стартом сервера

Если мы сейчас перезагрузим VPS, наш сервер не запустится. Сначала мы должны включить его. Документация тут.

pm2 startup
# this will generate another command that you need to run# We also need to save what processes
# should get started with pm2
pm2 save# reboot VPS and check if your website is up
sudo reboot

Как и NVM, PM2-это очень мощный инструмент, который может сделать гораздо больше, чем это. Можете ознакомится  с официальной документацие и “help” командой.

# get help!
pm2 help

4. Nginx

Установим Nginx:

sudo apt-get install nginx# check if installed
sudo nginx -v
==> nginx version: nginx/1.14.0 (Ubuntu)

Создадим конфигурационный файл нашего сервера

cd /etc/nginx/sites-availablesudo nano simpleServer

Внутрь файла поместим данный кусок кода

server {
listen 80;
server_name <YourVPSIpAddress>; location / {
proxy_pass http://localhost:3000/;
}
}

Если у вас установлен домен, то пропишите его таким образом:

# ...
server_name www.example.com example.com;
# ...

Более подробная информация Nginx documentation.

Финальные шаги

# check if your configuration is ok
sudo nginx -t# enable your configuration
sudo ln -s /etc/nginx/sites-available/simpleServer /etc/nginx/sites-enabled# restart nginx
sudo systemctl restart nginx

Ваш сервер должен быть доступен по вашему домену или ip <YourVPSIpAddress>.

Перевод https://medium.com/@panzelva/deploying-express-js-website-to-vps-with-nginx-pm2-and-ubuntu-18-04-8c5d32593211

+1
 

Запуск приложения node.js в фоновом режиме на сервере

611

Допустим у вас есть приложение или как в моем случае телеграм бот. И хочется его разместить на сервере. И в формате демона/сервиса.

Я предложу способ которым пользуюсь сам. Вообще есть несколько вариантов для этого. Н я остановился на пакете PM2.
Довольно красивая утилита и информативная.

Сначала соотвественно устанавливаем глобально пакет.

$ npm install pm2 -g

Далее заходим в директорию с нашим скриптом и через команду запускаем приложение в фоновый режим.

$ pm2 start bot.js

Ну и собственно все. Можно посмотреть наш результат. Выведется информация по запущенным приложениям.

$ pm2 list

Доп. информация соотвественно в доке https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/

0
 

WordPress, как получить слаг(путь) текущей страницы. (Wp how to get slug/path current page)

924

Предлагаю удобный сниппет. С его помощью можно легко получить текущий URL-адрес страницы на вашем сайте WordPress независимо от отображаемой страницы.

Не имеет значения, нужен ли вам URL-адрес для одного поста, URL-адрес страницы, домашняя страница, шаблон категории, шаблон тега, пользовательский тип поста или любой другой шаблон WordPress.

Так вернется полностью url. аналог функции get_site_url().

global $wp;
$current_url = home_url( add_query_arg( array(), $wp->request ) );

Так к примеру, если страница http://mysite.com/some-post, то вернется только слаг some-post.

global $wp;
$current_slug = add_query_arg( array(), $wp->request );

0
 

October Сms как получить все посты в шаблоне

576

Пример на стандартном плагине Blog от RainLab.
Допустим надо вывести посты не на страничке «все посты», а на другой и допустим не все количество? а только 15-ть.

Для этого вы воспользуемся классом плагина Post, непосредственно в нужной нам страничке в php блоке в хуке onStart. Получим все посты и занесем в переменную posts.

==
use RainLab\Blog\Models\Post;

function onStart()
{
    $this['posts'] = Post::orderBy('created_at', 'desc')->get();
}
==

Далее с этой переменной делаем что нам необходимо.
Во первых получим первые 15ть постов, во вторых через twig выведем их название в цикле.

==
use RainLab\Blog\Models\Post;

function onStart()
{
    $this['posts'] = Post::orderBy('created_at', 'desc')->limit(15)->get();
}
==

 {% for post in posts %}
  {{post.title}}
 {% endfor %}

0
 

Woocommerce. Как получить данныe товаров (заголовок, описание, картинку, цену и тд).

580

Для этого нам потребуется woocommerce класс WC_Product{}(ссылка на документацию), а точнее его объект с использованием id продукта.

$wc_product = wc_get_product( $post->ID );

А дальше стоит переместиться на страницу документации и ознакомиться с методами. Я приведу пример вывода базовой информации.

Используя объект $wc_product, выводим заголовок (title):

 $title = $wc_product->get_name()

ссылку (get_permalink):

 $permalink = $wc_product->get_permalink()

короткое описание (short_description):

 $short_description = $wc_product->get_short_description()

цена (price):

 $price_html = $wc_product->get_price_html()
+1
 

Деплой October CMS с Docker

933

October — это бесплатная самостоятельная платформа CMS с открытым исходным кодом, основанная на PHP-фреймворке Laravel. Эта статья научит вас, как развернуть October CMS с помощью docker, но если вы хотите получить дополнительную информацию об использовании October CMS, то я бы рекомендовал перейти на страницу туториалов.

Разверните сервер Ubuntu 18.04 с объемом оперативной памяти не менее 1 ГБ. Добавьте немного подкачки, если вы находитесь на чем-то вроде DigitalOcean, который использует локальные твердотельные накопители.

Шаги

Разверните сервер Ubuntu 18.04 с объемом оперативной памяти не менее 1 ГБ.

Установите docker и docker-compose.

Скачайте October CMS последней версии:

wget https://github.com/octobercms/october/archive/v1.1.0.tar.gz
tar --extract --gzip --file v1.1.0.tar.gz
rm v1.1.0.tar.gz
mv -i october-1.1.0 octobercms

Создайте файл docker-compose.yml на вашем сервере в папке с проектом (отредактируйте DB_PASSWORD и MYSQL_PASSWORD на что-то другое).

version: '2.2'
services:
  web:
    container_name: web
    restart: always
    image: aspendigital/octobercms:latest
    ports:
      - 80:80
    environment:
      - DB_TYPE=mysql
      - DB_HOST=db #DB_HOST should match the service name of the database container
      - DB_DATABASE=octobercms
      - DB_USERNAME=octobercms
      - DB_PASSWORD=octobercms
    volumes:
      - $HOME/octobercms/plugins:/var/www/html/plugins
      - $HOME/octobercms/storage/app:/var/www/html/storage/app
      - $HOME/octobercms/storage/logs:/var/www/html/storage/logs
      - $HOME/octobercms/themes:/var/www/html/themes

  db:
    image: mariadb
    container_name: db
    restart: always
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_DATABASE: octobercms
      MYSQL_USER: octobercms
      MYSQL_PASSWORD: octobercms
    volumes:
       - $HOME/volumes/mysql/data:/var/lib/mysql

Старт сервисов по порядку

Для начала поднимаем базу данных, чтобы убедиться, что она готова, поэтому запустите ее самостоятельно:

docker-compose up db

Когда она запустится то консоль выведет:

[Note] mysqld: ready for connections.

Далее запускаем приложение:

docker-compose up web

Настраиваем права

Веб-пользователь должен иметь возможность редактировать содержимое папок plugins, storage и themes, поэтому выполните следующие команды:

docker-compose exec web chown -R www-data /var/www/html/plugins
docker-compose exec web chown -R www-data /var/www/html/storage/app
docker-compose exec web chown -R www-data /var/www/html/storage/logs
docker-compose exec web chown -R www-data /var/www/html/themes

Запускаем миграции

Теперь выполните следующую команду для запуска миграции базы данных (создайте структуры таблиц и т. д.).

docker-compose exec web php artisan october:up

Заходим в админку

Переходим по ссылке /backend к URL-адресу. Затем войдите в систему с вашем именем пользователя и паролем.

Перевод статьи: https://blog.programster.org/deploy-october-cms-with-docker

+2