diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 2c654d8..0000000 --- a/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM docker.io/bitnami/php-fpm:8.4 - -WORKDIR /app -RUN set -eux \ - && apt-get update && apt-get install -y --no-install-recommends \ - acl \ - && rm -rf /var/lib/apt/lists/* - -COPY ./symfony/composer.* ./symfony/symfony.* ./ -COPY ./symfony/.env.prod ./.env -RUN composer install \ - --no-cache \ - --no-dev \ - --no-progress \ - --no-scripts \ - --optimize-autoloader \ - --prefer-dist - -WORKDIR / -COPY ./scripts ./scripts - -WORKDIR /app -COPY ./symfony . - -RUN mkdir -p var/log var/cache && \ - chown -R www-data:www-data var && \ - chmod -R 775 var -RUN composer install \ - --no-cache \ - --no-dev \ - --no-progress \ - --optimize-autoloader \ - --prefer-dist -RUN php bin/console doctrine:migrations:migrate latest diff --git a/compose.yaml b/compose.yaml index 9feae35..718342b 100644 --- a/compose.yaml +++ b/compose.yaml @@ -4,7 +4,7 @@ networks: services: phpfpm: - build: . + build: ./symfony volumes: - ./php-fpm:/opt/bitnami/php/etc/php-fpm.d expose: @@ -24,3 +24,10 @@ services: volumes: - ./nginx:/opt/bitnami/nginx/conf/server_blocks - ./symfony:/app + + resticprofile: + build: ./resticprofile + depends_on: + - phpfpm + volumes: + - ./symfony/var:/app/var diff --git a/resticprofile/.gitignore b/resticprofile/.gitignore new file mode 100644 index 0000000..82398c3 --- /dev/null +++ b/resticprofile/.gitignore @@ -0,0 +1,2 @@ +.env +password.txt diff --git a/resticprofile/Dockerfile b/resticprofile/Dockerfile new file mode 100644 index 0000000..2f438fa --- /dev/null +++ b/resticprofile/Dockerfile @@ -0,0 +1,16 @@ +FROM docker.io/creativeprojects/resticprofile:latest +ENV TZ=UTC + +RUN set -eux && \ + apk update && \ + apk add sqlite && \ + mkdir -p /app/var/backups + +WORKDIR /etc/resticprofile + +COPY . . +RUN chmod +x db_dump.sh entrypoint.sh && \ + resticprofile schedule --all + +ENTRYPOINT ["/etc/resticprofile/entrypoint.sh"] +CMD ["crond", "-f", "-l", "2"] diff --git a/resticprofile/db_dump.sh b/resticprofile/db_dump.sh new file mode 100755 index 0000000..e7a8de9 --- /dev/null +++ b/resticprofile/db_dump.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +sql_dump_script = ".output +.dump +.exit" + +cd /app/var +for db in *.db +do + basename=$(echo "$db" | sed "s/\.db$//" | sed "s/\s/_/g") + timestamp=$(date +%Y-%m-%dT%H-%M-%S.%N) + echo "$sql_dump_script" \ + | sqlite3 "$db" \ + > "backups/${basename}_dump_${timestamp}.sql" +done diff --git a/resticprofile/entrypoint.sh b/resticprofile/entrypoint.sh new file mode 100644 index 0000000..4482f14 --- /dev/null +++ b/resticprofile/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +env >> /etc/environment + +echo "$@" +exec "$@" diff --git a/resticprofile/profiles.toml b/resticprofile/profiles.toml new file mode 100644 index 0000000..0481362 --- /dev/null +++ b/resticprofile/profiles.toml @@ -0,0 +1,46 @@ +#:schema https://creativeprojects.github.io/resticprofile/jsonschema/config-1.json +version = "1" + +[global] + initialize = true + log = "/var/log/resticprofile.log" + scheduler = "crond" + +[default] + description = "Back up database to BackBlazeB2 S3 Bucket" + env-file = ".env" + password-file = "password.txt" + repository = "s3:s3.eu-central-003.backblazeb2.com/joeac-net-backup/repo" + verbose = 2 + + [default.backup] + check-after = true + check-before = true + run-before = ". /scripts/db_dump.sh" + schedule = "*-*-* 03:30:00" + schedule-after-network-online = true + schedule-lock-wait = "2h" + schedule-log = "/var/log/resticprofile-schedule-backup.log" + schedule-permission = "system" + schedule-priority = "background" + source = [ + "/app/var/backups", + ] + + [default.forget] + keep-last = 2 + keep-monthly = 2 + schedule = "*-*-* 03:45:00" + schedule-after-network-online = true + schedule-lock-wait = "2h" + schedule-log = "/var/log/resticprofile-schedule-forget.log" + schedule-permission = "system" + schedule-priority = "background" + + [default.prune] + schedule = "*-*-* 04:00:00" + schedule-after-network-online = true + schedule-lock-wait = "2h" + schedule-log = "/var/log/resticprofile-schedule-prune.log" + schedule-permission = "system" + schedule-priority = "background" diff --git a/symfony/Dockerfile b/symfony/Dockerfile new file mode 100644 index 0000000..53bb1bd --- /dev/null +++ b/symfony/Dockerfile @@ -0,0 +1,38 @@ +FROM docker.io/bitnami/php-fpm:8.4 AS database +WORKDIR /app +COPY ./composer.* ./symfony.* ./ +COPY ./bin ./bin +COPY ./.env.prod ./.env +COPY ./config ./config +COPY ./migrations ./migrations +COPY ./src ./src +RUN mkdir public \ + && composer install --no-cache --no-progress \ + && php bin/console doctrine:migrations:migrate latest \ + && rm -rf composer.* symfony.* bin .env config migrations src vendor + +FROM database AS apt-install +RUN set -eux \ + && apt-get update && apt-get install -y --no-install-recommends \ + acl \ + && rm -rf /var/lib/apt/lists/* + +FROM apt-install AS composer-install +COPY --from=database /app/var /app/var +WORKDIR /app +COPY ./composer.* ./symfony.* ./ +COPY ./.env.prod ./.env +RUN composer install \ + --no-cache \ + --no-dev \ + --no-progress \ + --no-scripts \ + --optimize-autoloader + +FROM composer-install AS copy-src +COPY --from=composer-install /app /app +WORKDIR /app +COPY . . +RUN mkdir -p var/log var/cache && \ + chown -R www-data:www-data var && \ + chmod -R 775 var diff --git a/symfony/migrations/Version20250522212300.php b/symfony/migrations/Version20250522212300.php index 12f0e58..0f711a2 100644 --- a/symfony/migrations/Version20250522212300.php +++ b/symfony/migrations/Version20250522212300.php @@ -36,7 +36,7 @@ final class Version20250522212300 extends AbstractMigration public function up(Schema $schema): void { foreach (self::BLOG_POST_SLUGS as $slug) { - $blogPostPath = '../scripts/blog-migrated/' . $slug . '.yaml'; + $blogPostPath = './migrations/blog-migrated/' . $slug . '.yaml'; $blogPost = Yaml::parseFile($blogPostPath); $publishedDateTime = DateTime::createFromFormat('U', strval($blogPost['pubDate'])); diff --git a/scripts/blog-migrated/doctor_who_gayness_church.yaml b/symfony/migrations/blog-migrated/doctor_who_gayness_church.yaml similarity index 100% rename from scripts/blog-migrated/doctor_who_gayness_church.yaml rename to symfony/migrations/blog-migrated/doctor_who_gayness_church.yaml diff --git a/scripts/blog-migrated/does_resurrection_ground_works.yaml b/symfony/migrations/blog-migrated/does_resurrection_ground_works.yaml similarity index 100% rename from scripts/blog-migrated/does_resurrection_ground_works.yaml rename to symfony/migrations/blog-migrated/does_resurrection_ground_works.yaml diff --git a/scripts/blog-migrated/easter.yaml b/symfony/migrations/blog-migrated/easter.yaml similarity index 100% rename from scripts/blog-migrated/easter.yaml rename to symfony/migrations/blog-migrated/easter.yaml diff --git a/scripts/blog-migrated/euhwc_toast_to_the_lasses_2024.yaml b/symfony/migrations/blog-migrated/euhwc_toast_to_the_lasses_2024.yaml similarity index 100% rename from scripts/blog-migrated/euhwc_toast_to_the_lasses_2024.yaml rename to symfony/migrations/blog-migrated/euhwc_toast_to_the_lasses_2024.yaml diff --git a/scripts/blog-migrated/god_is_not_great.yaml b/symfony/migrations/blog-migrated/god_is_not_great.yaml similarity index 100% rename from scripts/blog-migrated/god_is_not_great.yaml rename to symfony/migrations/blog-migrated/god_is_not_great.yaml diff --git a/scripts/blog-migrated/llms_do_not_understand_anything.yaml b/symfony/migrations/blog-migrated/llms_do_not_understand_anything.yaml similarity index 100% rename from scripts/blog-migrated/llms_do_not_understand_anything.yaml rename to symfony/migrations/blog-migrated/llms_do_not_understand_anything.yaml diff --git a/scripts/blog-migrated/my_feed_and_reading_list.yaml b/symfony/migrations/blog-migrated/my_feed_and_reading_list.yaml similarity index 100% rename from scripts/blog-migrated/my_feed_and_reading_list.yaml rename to symfony/migrations/blog-migrated/my_feed_and_reading_list.yaml diff --git a/scripts/blog-migrated/no_more_youtube.yaml b/symfony/migrations/blog-migrated/no_more_youtube.yaml similarity index 100% rename from scripts/blog-migrated/no_more_youtube.yaml rename to symfony/migrations/blog-migrated/no_more_youtube.yaml diff --git a/scripts/blog-migrated/open_questions_about_sex.yaml b/symfony/migrations/blog-migrated/open_questions_about_sex.yaml similarity index 100% rename from scripts/blog-migrated/open_questions_about_sex.yaml rename to symfony/migrations/blog-migrated/open_questions_about_sex.yaml diff --git a/scripts/blog-migrated/paradox.yaml b/symfony/migrations/blog-migrated/paradox.yaml similarity index 100% rename from scripts/blog-migrated/paradox.yaml rename to symfony/migrations/blog-migrated/paradox.yaml diff --git a/scripts/blog-migrated/sapiens_on_religion.yaml b/symfony/migrations/blog-migrated/sapiens_on_religion.yaml similarity index 100% rename from scripts/blog-migrated/sapiens_on_religion.yaml rename to symfony/migrations/blog-migrated/sapiens_on_religion.yaml diff --git a/scripts/blog-migrated/science_and_philosophy.yaml b/symfony/migrations/blog-migrated/science_and_philosophy.yaml similarity index 100% rename from scripts/blog-migrated/science_and_philosophy.yaml rename to symfony/migrations/blog-migrated/science_and_philosophy.yaml diff --git a/scripts/blog-migrated/surprised_by_hope.yaml b/symfony/migrations/blog-migrated/surprised_by_hope.yaml similarity index 100% rename from scripts/blog-migrated/surprised_by_hope.yaml rename to symfony/migrations/blog-migrated/surprised_by_hope.yaml diff --git a/scripts/blog-migrated/tracking_pixels.yaml b/symfony/migrations/blog-migrated/tracking_pixels.yaml similarity index 100% rename from scripts/blog-migrated/tracking_pixels.yaml rename to symfony/migrations/blog-migrated/tracking_pixels.yaml diff --git a/scripts/blog-migrated/who_consecrates_the_temple.yaml b/symfony/migrations/blog-migrated/who_consecrates_the_temple.yaml similarity index 100% rename from scripts/blog-migrated/who_consecrates_the_temple.yaml rename to symfony/migrations/blog-migrated/who_consecrates_the_temple.yaml diff --git a/scripts/blog-migrated/word_hallucination_with_reference_to_llms.yaml b/symfony/migrations/blog-migrated/word_hallucination_with_reference_to_llms.yaml similarity index 100% rename from scripts/blog-migrated/word_hallucination_with_reference_to_llms.yaml rename to symfony/migrations/blog-migrated/word_hallucination_with_reference_to_llms.yaml diff --git a/scripts/blog/doctor_who_gayness_church.md b/symfony/migrations/blog/doctor_who_gayness_church.md similarity index 100% rename from scripts/blog/doctor_who_gayness_church.md rename to symfony/migrations/blog/doctor_who_gayness_church.md diff --git a/scripts/blog/does_resurrection_ground_works.md b/symfony/migrations/blog/does_resurrection_ground_works.md similarity index 100% rename from scripts/blog/does_resurrection_ground_works.md rename to symfony/migrations/blog/does_resurrection_ground_works.md diff --git a/scripts/blog/easter.md b/symfony/migrations/blog/easter.md similarity index 100% rename from scripts/blog/easter.md rename to symfony/migrations/blog/easter.md diff --git a/scripts/blog/euhwc_toast_to_the_lasses_2024.md b/symfony/migrations/blog/euhwc_toast_to_the_lasses_2024.md similarity index 100% rename from scripts/blog/euhwc_toast_to_the_lasses_2024.md rename to symfony/migrations/blog/euhwc_toast_to_the_lasses_2024.md diff --git a/scripts/blog/god_is_not_great.md b/symfony/migrations/blog/god_is_not_great.md similarity index 100% rename from scripts/blog/god_is_not_great.md rename to symfony/migrations/blog/god_is_not_great.md diff --git a/scripts/blog/llms_do_not_understand_anything.md b/symfony/migrations/blog/llms_do_not_understand_anything.md similarity index 100% rename from scripts/blog/llms_do_not_understand_anything.md rename to symfony/migrations/blog/llms_do_not_understand_anything.md diff --git a/scripts/blog/my_feed_and_reading_list.md b/symfony/migrations/blog/my_feed_and_reading_list.md similarity index 100% rename from scripts/blog/my_feed_and_reading_list.md rename to symfony/migrations/blog/my_feed_and_reading_list.md diff --git a/scripts/blog/newsboat-post.webp b/symfony/migrations/blog/newsboat-post.webp similarity index 100% rename from scripts/blog/newsboat-post.webp rename to symfony/migrations/blog/newsboat-post.webp diff --git a/scripts/blog/newsboat.webp b/symfony/migrations/blog/newsboat.webp similarity index 100% rename from scripts/blog/newsboat.webp rename to symfony/migrations/blog/newsboat.webp diff --git a/scripts/blog/no_more_youtube.md b/symfony/migrations/blog/no_more_youtube.md similarity index 100% rename from scripts/blog/no_more_youtube.md rename to symfony/migrations/blog/no_more_youtube.md diff --git a/scripts/blog/open_questions_about_sex.md b/symfony/migrations/blog/open_questions_about_sex.md similarity index 100% rename from scripts/blog/open_questions_about_sex.md rename to symfony/migrations/blog/open_questions_about_sex.md diff --git a/scripts/blog/paradox.md b/symfony/migrations/blog/paradox.md similarity index 100% rename from scripts/blog/paradox.md rename to symfony/migrations/blog/paradox.md diff --git a/scripts/blog/ranger.webp b/symfony/migrations/blog/ranger.webp similarity index 100% rename from scripts/blog/ranger.webp rename to symfony/migrations/blog/ranger.webp diff --git a/scripts/blog/sapiens_on_religion.md b/symfony/migrations/blog/sapiens_on_religion.md similarity index 100% rename from scripts/blog/sapiens_on_religion.md rename to symfony/migrations/blog/sapiens_on_religion.md diff --git a/scripts/blog/science_and_philosophy.md b/symfony/migrations/blog/science_and_philosophy.md similarity index 100% rename from scripts/blog/science_and_philosophy.md rename to symfony/migrations/blog/science_and_philosophy.md diff --git a/scripts/blog/surprised_by_hope.md b/symfony/migrations/blog/surprised_by_hope.md similarity index 100% rename from scripts/blog/surprised_by_hope.md rename to symfony/migrations/blog/surprised_by_hope.md diff --git a/scripts/blog/tracking_pixels.md b/symfony/migrations/blog/tracking_pixels.md similarity index 100% rename from scripts/blog/tracking_pixels.md rename to symfony/migrations/blog/tracking_pixels.md diff --git a/scripts/blog/w3m.webp b/symfony/migrations/blog/w3m.webp similarity index 100% rename from scripts/blog/w3m.webp rename to symfony/migrations/blog/w3m.webp diff --git a/scripts/blog/who_consecrates_the_temple.md b/symfony/migrations/blog/who_consecrates_the_temple.md similarity index 100% rename from scripts/blog/who_consecrates_the_temple.md rename to symfony/migrations/blog/who_consecrates_the_temple.md diff --git a/scripts/blog/word_hallucination_with_reference_to_llms.md b/symfony/migrations/blog/word_hallucination_with_reference_to_llms.md similarity index 100% rename from scripts/blog/word_hallucination_with_reference_to_llms.md rename to symfony/migrations/blog/word_hallucination_with_reference_to_llms.md diff --git a/scripts/migrateBlog.js b/symfony/migrations/migrateBlog.js similarity index 100% rename from scripts/migrateBlog.js rename to symfony/migrations/migrateBlog.js diff --git a/scripts/migrateLinks.js b/symfony/migrations/migrateLinks.js similarity index 100% rename from scripts/migrateLinks.js rename to symfony/migrations/migrateLinks.js diff --git a/todo.txt b/todo.txt index 0522574..6ce3f25 100644 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,5 @@ Add a most recent blog post to my home page Add a most recent note to my home page -Write a script to take a database dump -Write a systemd unit to back up a daily database dump to Backblaze Manage secrets in some better way than uncommitted .env files Start serving the website from a Raspberry Pi Add Next and Prev links to each note page