20 Commits

Author SHA1 Message Date
eb28e41930 updates 2026-03-27 16:31:09 -04:00
559ab4e2a8 upd: entrypoint
Make sure the change the permissions to the var folder everytime we restart
2026-03-27 16:29:52 -04:00
4d1cfeadcd del: migrations
remove migrations folder as it is unnecessary since we have mutliple database types available
2026-03-27 15:53:59 -04:00
819f8b35b9 upd: gitignore
add migrations folder to gitignore
2026-03-27 15:49:08 -04:00
0e97468f7d upd: install
update migration commands to use entities instead of migration scripts
2026-03-27 15:48:07 -04:00
9f9ee82c6b upd: setup
remove backticks
2026-03-27 15:46:46 -04:00
e03dd0aaf7 upd: remove backtick 2026-03-27 14:50:31 -04:00
525c6a47a6 fix: dockerfile
several changes including cloning repo instead of file copy
fixed cron
copy temporary production .env file add importmap and asset-map
custom entrypoint
2026-03-27 14:45:55 -04:00
5af898a702 fix: readme
fixed install and setup commands
2026-03-27 14:43:51 -04:00
7ee5437f8a fix: ingestreferencecommand
fix label generation for canons of dort content
2026-03-27 14:43:29 -04:00
fa7af9d5c7 fix: install
adopted shell_exec instead of backtick for running a shell.
2026-03-27 14:42:38 -04:00
77ae65c2bd fix typo 2026-03-27 14:09:14 -04:00
9a496c07b0 upd: fontawesome
remove empty lines
2026-03-27 13:51:36 -04:00
95911a210a fix: main.css
fix path for fontawesome library
2026-03-27 13:49:15 -04:00
9482ea3708 upd: scripts
update permissions to install and setup.php along with adding #! to first line of files
2026-03-27 13:48:54 -04:00
82d03aeb6a upd: entrypoint permissions 2026-03-27 13:46:32 -04:00
3f1c9841a2 upd: lock files 2026-03-27 12:58:02 -04:00
9fdda7e2ba add: entrypoint 2026-03-27 12:55:06 -04:00
2e4028d623 upd: docker-compose
Add logging notation
2026-03-26 19:58:21 -04:00
5e6d63ef26 upd: Dockerfile
remove logrotate functionality in favor of docker native logging
2026-03-26 19:57:59 -04:00
26 changed files with 2300 additions and 2034 deletions

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@
/public/bundles/ /public/bundles/
/var/ /var/
/vendor/ /vendor/
/migrations/
###< symfony/framework-bundle ### ###< symfony/framework-bundle ###
###> phpunit/phpunit ### ###> phpunit/phpunit ###

View File

@@ -11,15 +11,13 @@ RUN apt update && \
libjpeg-dev \ libjpeg-dev \
libicu-dev \ libicu-dev \
libpq-dev \ libpq-dev \
libsqlite3-dev \
sqlite3 \ sqlite3 \
curl \ curl \
git \ git \
cron \ cron \
logrotate \
nano nano
RUN service start cron
RUN service enable cron
RUN docker-php-ext-configure gd --with-jpeg RUN docker-php-ext-configure gd --with-jpeg
RUN docker-php-ext-configure zip RUN docker-php-ext-configure zip
@@ -43,36 +41,38 @@ RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &&
RUN curl -sS https://get.symfony.com/cli/installer | bash && \ RUN curl -sS https://get.symfony.com/cli/installer | bash && \
mv /root/.symfony5/bin/symfony /usr/local/bin/symfony mv /root/.symfony5/bin/symfony /usr/local/bin/symfony
RUN cd /var/www/html ARG CACHEBURST=1
RUN git clone https://gitea.rkprather.com/ryan/sermon-notes.git ./ ARG BRANCH=master
WORKDIR /var/www/html
RUN git clone -b ${BRANCH} --single-branch https://gitea.rkprather.com/ryan/sermon-notes.git ./
RUN git config --global --add safe.directory /var/www/html
RUN mv 000-default.conf /etc/apache2/sites-available/ RUN mv 000-default.conf /etc/apache2/sites-available/
RUN echo "20 1 * * 6 root cd /var/www/html && /usr/local/bin/php bin/console app:get-audio > /var/log/sermon-notes.log 2>&1" > /etc/cron.d/get-audio RUN echo "20 1 * * 6 root cd /var/www/html && /usr/local/bin/php bin/console app:get-audio > /proc/1/fd/1 2>&1" > /etc/cron.d/get-audio
RUN chmod 644 /etc/cron.d/get-audio RUN chmod 644 /etc/cron.d/get-audio
RUN crontab /etc/cron.d/get-audio
RUN echo "/var/log/sermon-notes.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}" > /etc/logrotate.d/sermon-notes
RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-scripts --no-dev --optimize-autoloader RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-scripts --no-dev --optimize-autoloader
RUN /usr/local/bin/php bin/console asset-map:compile
RUN mkdir /data RUN mkdir /data
RUN mkdir /var/www/html/var/cache RUN mkdir -p /var/www/html/var/cache/prod
RUN mkdir /var/www/html/var/log RUN mkdir -p /var/www/html/var/log
RUN chown -R 33:33 /var/www/html /data RUN chown -R 33:33 /var/www/html /data
RUN find /var/www/html -type d -exec chmod 755 '{}' \; RUN find /var/www/html -type d -exec chmod 755 '{}' \;
RUN find /var/www/html -type f -exec chmod 644 '{}' \; RUN find /var/www/html -type f -exec chmod 644 '{}' \;
RUN chmod 755 /data RUN chmod 755 /data
RUN chmod 644 /data/*
RUN a2enmod rewrite setenvif headers RUN a2enmod rewrite setenvif headers
COPY prod.env /var/www/html/.env
RUN /usr/local/bin/php bin/console importmap:install
RUN /usr/local/bin/php bin/console asset-map:compile
RUN rm /var/www/html/.env
RUN chmod +x /var/www/html/bin/entrypoint.sh
EXPOSE 80 EXPOSE 80
ENTRYPOINT ["/var/www/html/bin/entrypoint.sh"]
CMD ["apache2-foreground"]

View File

@@ -28,11 +28,12 @@ This was my first publicly available docker container so I did not realize what
5. [`compose.shared-db.yml`](https://gitea.rkprather.com/ryan/sermon-notes/raw/branch/main/docker/compose.shared-db.yml) - compose file with no database image because you are planning on using an existing database container or bare metal server 5. [`compose.shared-db.yml`](https://gitea.rkprather.com/ryan/sermon-notes/raw/branch/main/docker/compose.shared-db.yml) - compose file with no database image because you are planning on using an existing database container or bare metal server
4. Pull the image `docker pull gitea.rkprather.com/ryan/sermon-notes:latest` 4. Pull the image `docker pull gitea.rkprather.com/ryan/sermon-notes:latest`
5. **NOTE: IF UPGRADING SKIP THIS STEP!!!** - Run the setup script, this will setup your .env file so that when you start the container everything will be where it is supposed to be. 5. **NOTE: IF UPGRADING SKIP THIS STEP!!!** - Run the setup script, this will setup your .env file so that when you start the container everything will be where it is supposed to be.
- `docker run --rm -it -v ${PWD}/.env:/var/www/html/.env gitea.rkprather.com/ryan/sermon-notes:latest /var/www/html/setup.php --{database-type} {--shared}` - `docker run --rm -it -v ${PWD}/.env:/var/www/html/.env gitea.rkprather.com/ryan/sermon-notes:latest php /var/www/html/setup.php --{database-type} {--shared}`
- `{database-type}` = `sqlite`, `mysql`, `mariadb`, or `pgsql` - `{database-type}` = `sqlite`, `mysql`, `mariadb`, or `pgsql`
- If you intend on this being connected to a shared database make sure that you specify `--shared`. - If you intend on this being connected to a shared database make sure that you specify `--shared`.
6. Start the container with compose `docker compose up -d` 6. Start the container with compose `docker compose up -d`
7. **NOTE: IF UPGRADING SKIP THIS STEP!!!** Run `docker exec -it sermon-notes /var/www/html/install.php`. This will run the `php composer` to populate the database with all the desired reference material. 7. **NOTE: IF UPGRADING SKIP THIS STEP!!!** Run `docker exec -it sermon-notes php /var/www/html/install.php`. This will run the `php composer` to populate the database with all the desired reference material.
- NOTE: You will see deprecation warnings, you can ignore these
8. Once complete you have a running system that you can navigate to in your browser with `http://{ip}:{port}`|`http://{hostname}:{port}`. Then you just need to register for an account. The first account that is created is made an admin so that you can access the `Reference Editor` and update any reference material if necessary. 8. Once complete you have a running system that you can navigate to in your browser with `http://{ip}:{port}`|`http://{hostname}:{port}`. Then you just need to register for an account. The first account that is created is made an admin so that you can access the `Reference Editor` and update any reference material if necessary.
## Operation ## Operation

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
@import 'fontawesome-all.min.css'; @import '../css/fontawesome-all.min.css';
@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600,400italic,600italic|Roboto+Slab:400,700"); @import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600,400italic,600italic|Roboto+Slab:400,700");
/* /*
Editorial by HTML5 UP Editorial by HTML5 UP

8
bin/entrypoint.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/bash
# Start the cron service in the background
service cron start
chown -R www-data:www-data /var/www/html/var
# Execute the default Docker CMD (which starts Apache in the foreground)
exec "$@"

3660
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +1,34 @@
services: services:
sermon-notes: sermon-notes:
image: gitea.rkprather.com/ryan/sermon-notes:latest image: gitea.rkprather.com/ryan/sermon-notes:1.3
container_name: sermon-notes container_name: sermon-notes
hostname: sermon-notes hostname: sermon-notes
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
ports: ports:
- ${HTTP_PORT}:80 - ${HTTP_PORT}:80
volumes: volumes:
- ${PWD}/.env:/var/www/html/.env - ${PWD}/.env:/var/www/html/.env
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
depends_on: depends_on:
- db - db
db: db:
image: mariadb image: mariadb:12.3
container_name: db container_name: db
hostname: db hostname: db
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
volumes: volumes:
- ${PWD}/db_data:/var/lib/mysql - ${PWD}/db_data:/var/lib/mysql

View File

@@ -1,22 +1,34 @@
services: services:
sermon-notes: sermon-notes:
image: gitea.rkprather.com/ryan/sermon-notes:latest image: gitea.rkprather.com/ryan/sermon-notes:1.3
container_name: sermon-notes container_name: sermon-notes
hostname: sermon-notes hostname: sermon-notes
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
ports: ports:
- ${HTTP_PORT}:80 - ${HTTP_PORT}:80
volumes: volumes:
- ${PWD}/.env:/var/www/html/.env - ${PWD}/.env:/var/www/html/.env
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
depends_on: depends_on:
- db - db
db: db:
image: mysql image: mysql:9.6
container_name: db container_name: db
hostname: db hostname: db
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
volumes: volumes:
- ${PWD}/db-data:/var/lib/mysql - ${PWD}/db-data:/var/lib/mysql

View File

@@ -1,14 +1,24 @@
services: services:
sermon-notes: sermon-notes:
container_name: sermon-notes container_name: sermon-notes
image: gitea.rkprather.com/ryan/sermon-notes:latest image: gitea.rkprather.com/ryan/sermon-notes:1.3
hostname: sermon-notes hostname: sermon-notes
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
ports: ports:
- ${HTTP_PORT}:80 - ${HTTP_PORT}:80
volumes: volumes:
- ${PWD}/.env:/var/www/html/.env - ${PWD}/.env:/var/www/html/.env
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
depends_on: depends_on:
- db - db
@@ -17,7 +27,9 @@ services:
container_name: db container_name: db
hostname: db hostname: db
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
volumes: volumes:
- ${PWD}/db-data:/var/lib/postgresql/data - ${PWD}/db-data:/var/lib/postgresql/data

View File

@@ -1,11 +1,20 @@
services: services:
sermon-notes: sermon-notes:
image: gitea.rkprather.com/ryan/sermon-notes:latest image: gitea.rkprather.com/ryan/sermon-notes:1.3
container_name: sermon-notes container_name: sermon-notes
hostname: sermon-notes hostname: sermon-notes
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
ports: ports:
- ${HTTP_PORT}:80 - ${HTTP_PORT}:80
volumes: volumes:
- ${PWD}/.env:/var/www/html/.env - ${PWD}/.env:/var/www/html/.env
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

View File

@@ -1,12 +1,21 @@
services: services:
sermon-notes: sermon-notes:
image: gitea.rkprather.com/ryan/sermon-notes:latest image: gitea.rkprather.com/ryan/sermon-notes:1.3
container_name: sermon-notes container_name: sermon-notes
hostname: sermon-notes hostname: sermon-notes
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
ports: ports:
- ${HTTP_PORT}:80 - ${HTTP_PORT}:80
volumes: volumes:
- ${PWD}/data:/data - ${PWD}/data:/data
- ${PWD}/.env:/var/www/html/.env - ${PWD}/.env:/var/www/html/.env
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

View File

@@ -1,28 +1,28 @@
#!/usr/local/bin/php #!/usr/bin/env php
<?php <?php
print "Updating packages and compiling assets".PHP_EOL; print "Updating packages and compiling assets".PHP_EOL;
`COMPOSE_ALLOW_SUPERUSER=1 composer update`; shell_exec("COMPOSE_ALLOW_SUPERUSER=1 composer update");
//`symfony console asset-map:compile`; //`symfony console asset-map:compile");
print "Creating database schema".PHP_EOL; print "Creating database schema".PHP_EOL;
`symfony console doctrine:database:create`; shell_exec("symfony console doctrine:database:create --if-not-exists");
print "Updating migrations and setting permissions for data folder".PHP_EOL; print "Updating migrations and setting permissions for data folder".PHP_EOL;
`symfony console doctrine:migrations:migrate --no-interaction`; shell_exec("symfony console doctrine:schema:create");
`chown -R www-data:www-data /data`; shell_exec("chown -R www-data:www-data /data /var/www/html/var/cache");
// import reference material // import reference material
print "Importing Bible and Eccumenical Creeds".PHP_EOL; print "Importing Bible and Eccumenical Creeds".PHP_EOL;
`symfony console app:ingest-bible /var/www/html/references/esv-bible`; shell_exec("symfony console app:ingest-bible /var/www/html/references/esv-bible");
`symfony console app:import-ref /var/www/html/references/creeds/Apostles 'Apostles Creed' creed apc`; shell_exec("symfony console app:import-ref /var/www/html/references/creeds/Apostles 'Apostles Creed' creed apc");
`symfony console app:import-ref /var/www/html/references/creeds/Athanasian 'Athanasian Creed' creed ath`; shell_exec("symfony console app:import-ref /var/www/html/references/creeds/Athanasian 'Athanasian Creed' creed ath");
`symfony console app:import-ref /var/www/html/references/creeds/Chalcedon 'Definition of Chalcedon' creed dc`; shell_exec("symfony console app:import-ref /var/www/html/references/creeds/Chalcedon 'Definition of Chalcedon' creed dc");
`symfony console app:import-ref /var/www/html/references/creeds/French 'French Confession' creed fc`; shell_exec("symfony console app:import-ref /var/www/html/references/creeds/French 'French Confession' creed fc");
`symfony console app:import-ref /var/www/html/references/creeds/Nicene 'Nicene Creed' creed nc`; shell_exec("symfony console app:import-ref /var/www/html/references/creeds/Nicene 'Nicene Creed' creed nc");
$dutchStandards = ( $dutchStandards = (
strtolower( strtolower(
@@ -32,9 +32,9 @@ $dutchStandards = (
if ($dutchStandards) { if ($dutchStandards) {
print "Importing Dutch Standards".PHP_EOL; print "Importing Dutch Standards".PHP_EOL;
`symfony console app:import-ref /var/www/html/references/bc Belgic belgic BC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/bc Belgic belgic BC{\$ndx}");
`symfony console app:import-heidelberg`; shell_exec("symfony console app:import-heidelberg");
`symfony console app:import-canons-of-dort`; shell_exec("symfony console app:import-ref /var/www/html/references/cd Canons cd CD");
} }
$westminsterStandards = ( $westminsterStandards = (
@@ -45,9 +45,9 @@ $westminsterStandards = (
if ($westminsterStandards) { if ($westminsterStandards) {
print "Importing Westminster Standards".PHP_EOL; print "Importing Westminster Standards".PHP_EOL;
`symfony console app:import-ref /var/www/html/references/wcf 'Westminster Confession' wcf WCF{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/wcf 'Westminster Confession' wcf WCF{\$ndx}");
`symfony console app:import-ref /var/www/html/references/wsc 'Westminster Shorter' wsc WSC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/wsc 'Westminster Shorter' wsc WSC{\$ndx}");
`symfony console app:import-wlc /var/www/html/references/wlc 'Westminster Larger' wlc WLC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/wlc 'Westminster Larger' wlc WLC{\$ndx}");
} }
$helveticConfessions = ( $helveticConfessions = (
@@ -58,8 +58,8 @@ $helveticConfessions = (
if ($helveticConfessions) { if ($helveticConfessions) {
print "Importing Helvitic standards".PHP_EOL; print "Importing Helvitic standards".PHP_EOL;
`symfony console app:import-ref /var/www/html/references/fhc 'First Helvetic Confession' 1hc 1HC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/fhc 'First Helvetic Confession' 1hc 1HC{\$ndx}");
`symfony console app:import-ref /var/www/html/references/shc 'Second Helvetic Confession' 2hc 2HC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/shc 'Second Helvetic Confession' 2hc 2HC{\$ndx}");
} }
$miscStandards = ( $miscStandards = (
@@ -70,12 +70,12 @@ $miscStandards = (
if ($miscStandards) { if ($miscStandards) {
print "Importing misc standards".PHP_EOL; print "Importing misc standards".PHP_EOL;
`symfony console app:import-ref /var/www/html/references/39a 'Thirty-Nine Articles' 39a 39A{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/39a 'Thirty-Nine Articles' 39a 39A{\$ndx}");
`symfony console app:import-ref /var/www/html/references/ac 'Augsberg Confession' agc AGC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/ac 'Augsberg Confession' agc AGC{\$ndx}");
`symfony console app:import-ref /var/www/html/references/lbc 'London Baptist Confession' lbc LBC{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/lbc 'London Baptist Confession' lbc LBC{\$ndx}");
`symfony console app:import-ref /var/www/html/references/lsc 'Luther\'s Small Catechism' lsc LSC`; shell_exec("symfony console app:import-ref /var/www/html/references/lsc 'Luther\'s Small Catechism' lsc LSC");
`symfony console app:import-ref /var/www/html/references/llc 'Luther\'s Large Catechism' llc LLC`; shell_exec("symfony console app:import-ref /var/www/html/references/llc 'Luther\'s Large Catechism' llc LLC");
`symfony console app:import-ref /var/www/html/references/sd 'Savoy Declaration' sd SD{\$ndx}`; shell_exec("symfony console app:import-ref /var/www/html/references/sd 'Savoy Declaration' sd SD{\$ndx}");
} }
print "Sermon Notes Ready".PHP_EOL.PHP_EOL; print "Sermon Notes Ready".PHP_EOL.PHP_EOL;

View File

View File

@@ -1,42 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240505234804 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE user (id BLOB NOT NULL --(DC2Type:uuid)
, email VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json)
, password VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON user (email)');
$this->addSql('CREATE TABLE messenger_messages (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, body CLOB NOT NULL, headers CLOB NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, available_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, delivered_at DATETIME DEFAULT NULL --(DC2Type:datetime_immutable)
)');
$this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)');
$this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)');
$this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE user');
$this->addSql('DROP TABLE messenger_messages');
}
}

View File

@@ -1,62 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240513011501 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE bible (id BLOB NOT NULL --(DC2Type:uuid)
, book VARCHAR(255) NOT NULL, chapter INTEGER NOT NULL, verse INTEGER NOT NULL, content CLOB DEFAULT NULL, book_index INTEGER NOT NULL, label VARCHAR(20) DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE TABLE note (id BLOB NOT NULL --(DC2Type:uuid)
, speaker_id BLOB DEFAULT NULL --(DC2Type:uuid)
, series_id BLOB DEFAULT NULL --(DC2Type:uuid)
, user_id BLOB DEFAULT NULL --(DC2Type:uuid)
, title VARCHAR(255) NOT NULL, date DATE NOT NULL, passage VARCHAR(255) NOT NULL, refs CLOB DEFAULT NULL --(DC2Type:json)
, text CLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_CFBDFA14D04A0F27 FOREIGN KEY (speaker_id) REFERENCES speaker (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_CFBDFA145278319C FOREIGN KEY (series_id) REFERENCES series (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_CFBDFA14A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_CFBDFA14D04A0F27 ON note (speaker_id)');
$this->addSql('CREATE INDEX IDX_CFBDFA145278319C ON note (series_id)');
$this->addSql('CREATE INDEX IDX_CFBDFA14A76ED395 ON note (user_id)');
$this->addSql('CREATE TABLE reference (id BLOB NOT NULL --(DC2Type:uuid)
, type VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255) NOT NULL, ndx INTEGER NOT NULL, content CLOB DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE TABLE series (id BLOB NOT NULL --(DC2Type:uuid)
, user_id BLOB DEFAULT NULL --(DC2Type:uuid)
, template_id BLOB DEFAULT NULL --(DC2Type:uuid)
, name VARCHAR(255) NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_3A10012DA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_3A10012D5DA0FB8 FOREIGN KEY (template_id) REFERENCES template (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_3A10012DA76ED395 ON series (user_id)');
$this->addSql('CREATE INDEX IDX_3A10012D5DA0FB8 ON series (template_id)');
$this->addSql('CREATE TABLE speaker (id BLOB NOT NULL --(DC2Type:uuid)
, user_id BLOB DEFAULT NULL --(DC2Type:uuid)
, name VARCHAR(255) NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_7B85DB61A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_7B85DB61A76ED395 ON speaker (user_id)');
$this->addSql('CREATE TABLE template (id BLOB NOT NULL --(DC2Type:uuid)
, user_id BLOB DEFAULT NULL --(DC2Type:uuid)
, name VARCHAR(255) NOT NULL, content CLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_97601F83A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_97601F83A76ED395 ON template (user_id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE bible');
$this->addSql('DROP TABLE note');
$this->addSql('DROP TABLE reference');
$this->addSql('DROP TABLE series');
$this->addSql('DROP TABLE speaker');
$this->addSql('DROP TABLE template');
}
}

View File

@@ -1,41 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240513161129 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__reference AS SELECT id, type, name, label, ndx, content FROM reference');
$this->addSql('DROP TABLE reference');
$this->addSql('CREATE TABLE reference (id BLOB NOT NULL --(DC2Type:uuid)
, type VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255) NOT NULL, ndx INTEGER DEFAULT NULL, content CLOB DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO reference (id, type, name, label, ndx, content) SELECT id, type, name, label, ndx, content FROM __temp__reference');
$this->addSql('DROP TABLE __temp__reference');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__reference AS SELECT id, type, name, label, ndx, content FROM reference');
$this->addSql('DROP TABLE reference');
$this->addSql('CREATE TABLE reference (id BLOB NOT NULL --(DC2Type:uuid)
, type VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255) NOT NULL, ndx INTEGER NOT NULL, content CLOB DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO reference (id, type, name, label, ndx, content) SELECT id, type, name, label, ndx, content FROM __temp__reference');
$this->addSql('DROP TABLE __temp__reference');
}
}

View File

@@ -1,43 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240527010736 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE note ADD COLUMN recording VARCHAR(255) DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__note AS SELECT id, speaker_id, series_id, user_id, title, date, passage, refs, text FROM note');
$this->addSql('DROP TABLE note');
$this->addSql('CREATE TABLE note (id BLOB NOT NULL --(DC2Type:uuid)
, speaker_id BLOB DEFAULT NULL --(DC2Type:uuid)
, series_id BLOB DEFAULT NULL --(DC2Type:uuid)
, user_id BLOB DEFAULT NULL --(DC2Type:uuid)
, title VARCHAR(255) NOT NULL, date DATE NOT NULL, passage VARCHAR(255) NOT NULL, refs CLOB DEFAULT NULL --(DC2Type:json)
, text CLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_CFBDFA14D04A0F27 FOREIGN KEY (speaker_id) REFERENCES speaker (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_CFBDFA145278319C FOREIGN KEY (series_id) REFERENCES series (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_CFBDFA14A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO note (id, speaker_id, series_id, user_id, title, date, passage, refs, text) SELECT id, speaker_id, series_id, user_id, title, date, passage, refs, text FROM __temp__note');
$this->addSql('DROP TABLE __temp__note');
$this->addSql('CREATE INDEX IDX_CFBDFA14D04A0F27 ON note (speaker_id)');
$this->addSql('CREATE INDEX IDX_CFBDFA145278319C ON note (series_id)');
$this->addSql('CREATE INDEX IDX_CFBDFA14A76ED395 ON note (user_id)');
}
}

View File

@@ -1,38 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240622233923 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE user ADD COLUMN meta_data CLOB DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, email, roles, password, name FROM user');
$this->addSql('DROP TABLE user');
$this->addSql('CREATE TABLE user (id BLOB NOT NULL --(DC2Type:uuid)
, email VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json)
, password VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO user (id, email, roles, password, name) SELECT id, email, roles, password, name FROM __temp__user');
$this->addSql('DROP TABLE __temp__user');
$this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON user (email)');
}
}

View File

@@ -1,43 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240717022017 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE shared_note (id BLOB NOT NULL --(DC2Type:uuid)
, note_id BLOB NOT NULL --(DC2Type:uuid)
, owner_id BLOB NOT NULL --(DC2Type:uuid)
, shared_user_id BLOB NOT NULL --(DC2Type:uuid)
, PRIMARY KEY(id), CONSTRAINT FK_754B918C26ED0855 FOREIGN KEY (note_id) REFERENCES note (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_754B918C26ED0855 ON shared_note (note_id)');
$this->addSql('CREATE TABLE shared_series (id BLOB NOT NULL --(DC2Type:uuid)
, series_id BLOB NOT NULL --(DC2Type:uuid)
, owner_id BLOB NOT NULL --(DC2Type:uuid)
, shared_user_id BLOB NOT NULL --(DC2Type:uuid)
, PRIMARY KEY(id), CONSTRAINT FK_59E803195278319C FOREIGN KEY (series_id) REFERENCES series (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('CREATE INDEX IDX_59E803195278319C ON shared_series (series_id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE shared_note');
$this->addSql('DROP TABLE shared_series');
}
}

View File

@@ -1,39 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260114224910 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE user ADD COLUMN home_church_rss VARCHAR(255) DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__user AS SELECT id, email, roles, password, name, meta_data FROM user');
$this->addSql('DROP TABLE user');
$this->addSql('CREATE TABLE user (id BLOB NOT NULL --(DC2Type:uuid)
, email VARCHAR(180) NOT NULL, roles CLOB NOT NULL --(DC2Type:json)
, password VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, meta_data CLOB DEFAULT NULL --(DC2Type:json)
, PRIMARY KEY(id))');
$this->addSql('INSERT INTO user (id, email, roles, password, name, meta_data) SELECT id, email, roles, password, name, meta_data FROM __temp__user');
$this->addSql('DROP TABLE __temp__user');
$this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON user (email)');
}
}

View File

@@ -1,49 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260217014215 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__messenger_messages AS SELECT id, body, headers, queue_name, created_at, available_at, delivered_at FROM messenger_messages');
$this->addSql('DROP TABLE messenger_messages');
$this->addSql('CREATE TABLE messenger_messages (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, body CLOB NOT NULL, headers CLOB NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, available_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, delivered_at DATETIME DEFAULT NULL --(DC2Type:datetime_immutable)
)');
$this->addSql('INSERT INTO messenger_messages (id, body, headers, queue_name, created_at, available_at, delivered_at) SELECT id, body, headers, queue_name, created_at, available_at, delivered_at FROM __temp__messenger_messages');
$this->addSql('DROP TABLE __temp__messenger_messages');
$this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__messenger_messages AS SELECT id, body, headers, queue_name, created_at, available_at, delivered_at FROM messenger_messages');
$this->addSql('DROP TABLE messenger_messages');
$this->addSql('CREATE TABLE messenger_messages (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, body CLOB NOT NULL, headers CLOB NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, available_at DATETIME NOT NULL --(DC2Type:datetime_immutable)
, delivered_at DATETIME DEFAULT NULL --(DC2Type:datetime_immutable)
)');
$this->addSql('INSERT INTO messenger_messages (id, body, headers, queue_name, created_at, available_at, delivered_at) SELECT id, body, headers, queue_name, created_at, available_at, delivered_at FROM __temp__messenger_messages');
$this->addSql('DROP TABLE __temp__messenger_messages');
$this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)');
$this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)');
$this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)');
}
}

View File

@@ -1,4 +1,4 @@
#!/usr/local/bin/php #!/usr/bin/env php
<?php <?php
@@ -8,7 +8,7 @@ if (!file_exists('/var/www/html/.env')) {
$cmd = getopt("", ["sqlite", "mysql", "mariadb", "pgsql", "shared"]); $cmd = getopt("", ["sqlite", "mysql", "mariadb", "pgsql", "shared"]);
$key = `openssl rand -base64 32 | tr -d '=' | tr -d '+' | tr -d '/' | tr -d ' '`; $key = shell_exec("openssl rand -base64 32 | tr -d '=' | tr -d '+' | tr -d '/' | tr -d ' '");
$key = substr($key, 0, 32); $key = substr($key, 0, 32);
$database_url = null; $database_url = null;
$getCreds = true; $getCreds = true;
@@ -53,7 +53,7 @@ if ($getCreds) {
$db_port = (isset($cmd['pgsql']) ? 5432 : 3306); $db_port = (isset($cmd['pgsql']) ? 5432 : 3306);
$db_name = 'sermon_notes'; $db_name = 'sermon_notes';
$db_user = 'root'; $db_user = 'root';
$pwd = `openssl rand -base64 32 | tr -d '=' | tr -d '+' | tr -d '/' | tr -d ' '`; $pwd = shell_exec("openssl rand -base64 32 | tr -d '=' | tr -d '+' | tr -d '/' | tr -d ' '");
$db_password = substr($pwd, 0, 32); $db_password = substr($pwd, 0, 32);
if (isset($cmd['pgsql'])) { if (isset($cmd['pgsql'])) {
@@ -85,7 +85,7 @@ $output = <<<EOF
APP_ENV=prod APP_ENV=prod
APP_DEBUG=0 APP_DEBUG=0
APP_SECRET=$key APP_SECRET=$key
MESSAGENER_TRANSPORT_DSN=doctrine://default?auto_setup=0 MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
HTTP_PORT=$http_port HTTP_PORT=$http_port
$creds$database_url $creds$database_url

View File

@@ -144,6 +144,10 @@ class IngestReferenceCommand extends Command
$ref->setContent($md); $ref->setContent($md);
$ref->setName($this->name); $ref->setName($this->name);
$ref->setType($this->type); $ref->setType($this->type);
if ($this->type == 'cd') {
$label = substr(basename($file), 0, -3);
}
$ref->setLabel($label); $ref->setLabel($label);
$this->io->success("Ingested {$this->name} as {$this->type}:{$label}"); $this->io->success("Ingested {$this->name} as {$this->type}:{$label}");

View File

@@ -14,6 +14,7 @@ use Symfony\Component\Uid\Uuid;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Table(name: 'app_user')]
#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_EMAIL', fields: ['email'])] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_EMAIL', fields: ['email'])]
class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSerializable class User implements UserInterface, PasswordAuthenticatedUserInterface, JsonSerializable
{ {

View File

@@ -1,4 +1,13 @@
{ {
"doctrine/deprecations": {
"version": "1.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.0",
"ref": "87424683adc81d7dc305eefec1fced883084aab9"
}
},
"doctrine/doctrine-bundle": { "doctrine/doctrine-bundle": {
"version": "2.12", "version": "2.12",
"recipe": { "recipe": {
@@ -91,6 +100,18 @@
".env" ".env"
] ]
}, },
"symfony/form": {
"version": "8.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.2",
"ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b"
},
"files": [
"config/packages/csrf.yaml"
]
},
"symfony/framework-bundle": { "symfony/framework-bundle": {
"version": "7.0", "version": "7.0",
"recipe": { "recipe": {
@@ -182,6 +203,18 @@
"tests/bootstrap.php" "tests/bootstrap.php"
] ]
}, },
"symfony/property-info": {
"version": "8.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.3",
"ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7"
},
"files": [
"config/packages/property_info.yaml"
]
},
"symfony/routing": { "symfony/routing": {
"version": "7.0", "version": "7.0",
"recipe": { "recipe": {