<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[O's Tech Blog]]></title><description><![CDATA[Functional and Personal Projects]]></description><link>https://blog.mushdragon.com/</link><image><url>https://blog.mushdragon.com/favicon.png</url><title>O&apos;s Tech Blog</title><link>https://blog.mushdragon.com/</link></image><generator>Ghost 5.16</generator><lastBuildDate>Thu, 02 Apr 2026 19:23:37 GMT</lastBuildDate><atom:link href="https://blog.mushdragon.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Owncloud with Traefik]]></title><description><![CDATA[<p>This guide will create a running Owncloud Docker container with SSL certificates using Traefik. </p><!--kg-card-begin: markdown--><p>Create owncloud directory and files:</p>
<pre><code class="language-text">mkdir owncloud; cd owncloud
touch docker-compose.yml
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>docker-compose file</p>
<pre><code class="language-text">version: &apos;3.7&apos;

volumes:
  files:
    driver: local
  mysql:
    driver: local
  backup:
    driver: local
  redis:
    driver: local

services:
  owncloud:
    image: &quot;</code></pre>]]></description><link>https://blog.mushdragon.com/owncloud-with-traefik/</link><guid isPermaLink="false">612682a0ba8be5000124579e</guid><dc:creator><![CDATA[Orion Mondragon]]></dc:creator><pubDate>Wed, 25 Aug 2021 18:38:52 GMT</pubDate><media:content url="https://blog.mushdragon.com/content/images/2021/08/ownCloud-Trademark.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mushdragon.com/content/images/2021/08/ownCloud-Trademark.png" alt="Owncloud with Traefik"><p>This guide will create a running Owncloud Docker container with SSL certificates using Traefik. </p><!--kg-card-begin: markdown--><p>Create owncloud directory and files:</p>
<pre><code class="language-text">mkdir owncloud; cd owncloud
touch docker-compose.yml
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>docker-compose file</p>
<pre><code class="language-text">version: &apos;3.7&apos;

volumes:
  files:
    driver: local
  mysql:
    driver: local
  backup:
    driver: local
  redis:
    driver: local

services:
  owncloud:
    image: &quot;owncloud/server:latest&quot;
    container_name: &quot;owncloud&quot;
    restart: unless-stopped
    depends_on:
      - db
      - redis
    environment:
      - OWNCLOUD_DOMAIN=owncloud.mycooldomain.com
      - OWNCLOUD_DB_TYPE=mysql
      - OWNCLOUD_DB_NAME=owncloud
      - OWNCLOUD_DB_USERNAME=owncloud
      - OWNCLOUD_DB_PASSWORD=yourpassword&lt;-- same as &quot;MARIADB_PASSWORD&quot;
      - OWNCLOUD_DB_HOST=db
      - OWNCLOUD_ADMIN_USERNAME=admin
      - OWNCLOUD_ADMIN_PASSWORD=owncloudadminpassword &lt;--change
      - OWNCLOUD_UTF8MB4_ENABLED=true
      - OWNCLOUD_REDIS_ENABLED=true
      - OWNCLOUD_REDIS_HOST=redis
    networks:
      - proxy
      - internal
    labels:
      - &quot;traefik.enable=true&quot;
      - &quot;traefik.http.routers.owncloud-secure.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.owncloud-secure.rule=Host(`cloud.mycooldomain.net`)&quot;
        #- &quot;traefik.http.services.owncloud-service.loadbalancer.server.port=80&quot;
      - &quot;traefik.docker.network=proxy&quot;
    healthcheck:
      test: [&quot;CMD&quot;, &quot;/usr/bin/healthcheck&quot;]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - files:/mnt/data
  db:
   image: webhippie/mariadb:latest
   restart: unless-stopped
   environment:
     - MARIADB_ROOT_PASSWORD=myrootpassword &lt;--change
     - MARIADB_USERNAME=owncloud
     - MARIADB_PASSWORD=yourpassword &lt;--change
     - MARIADB_DATABASE=owncloud
     - MARIADB_MAX_ALLOWED_PACKET=128M
     - MARIADB_INNODB_LOG_FILE_SIZE=64M
     - MARIADB_INNODB_LARGE_PREFIX=ON
     - MARIADB_INNODB_FILE_FORMAT=Barracuda
   healthcheck:
     test: [&quot;CMD&quot;, &quot;/usr/bin/healthcheck&quot;]
     interval: 30s
     timeout: 10s
     retries: 5
   volumes:
     - mysql:/var/lib/mysql
     - backup:/var/lib/backup
   networks:
     - internal

  redis:
    image: webhippie/redis:latest
    container_name: &quot;redis&quot;
    restart: unless-stopped
    environment:
      - REDIS_DATABASES=1
    healthcheck:
      test: [&quot;CMD&quot;, &quot;/usr/bin/healthcheck&quot;]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
        - redis:/var/lib/redis
    networks:
      - internal

networks:
  proxy:
    external: true
  internal:
</code></pre>
<!--kg-card-end: markdown--><p>As you can see from the above example docker-compose.yml file, we will be utilizing the &quot;internal&quot; network for communication to our mysql container with our owncloud container as well as our standard &quot;proxy&quot; network for communication to traefik. This will ensure that our mysql container is not able to be reached externally from outside our local area network while allowing our owncloud container to be reached externally. <br><br>You&apos;ll want to ensure that your &quot;OWNCLOUD_DB_PASSWORD&quot; matches the &quot;MARIADB_PASSWORD&quot; in this file so that owncloud can access its database files properly. Be sure to alter each password with something of your own before running this container. <br><br>We have also made a volume declaration at the top of this docker-compose file to state that we would like to use the docker host&apos;s volume creation for our owncloud and database files. You can also use local paths if you would prefer to. Just be sure to remove the volume statement at the top of the docker-compose file before running it. <br><br>Last, but not least, we&apos;ve added labels to communicate with our traefik container that direct us to only use HTTPS protocol with owncloud externally and HTTP protocol internally as well as create our own sub domain to access. In the above example file, we&apos;ve chosen the sub domain &quot;cloud.mycooldomain.net&quot;. </p><!--kg-card-begin: markdown--><p>Create the container</p>
<pre><code class="language-text">docker-compose up -d
</code></pre>
<!--kg-card-end: markdown--><p>We&apos;ll need to give docker some time to download all the necessary images as well as the owncloud container to run its initial configuration process. Once ready, you should be able to access your owncloud web UI and login with the credentials you saved in the docker-compose file. For more information regarding configuring your Owncloud Server, see their <a href="https://doc.owncloud.com/server/10.8/">documentation page</a>.</p>]]></content:encoded></item><item><title><![CDATA[How To Use This Site]]></title><description><![CDATA[<p>The goal I had in mind when creating this site was to document all of my current works as well as make an easy to follow set of guides for anyone, with any skill set, to replicate. Nearly ALL of my guides will be utilizing the <a href="https://blog.mushdragon.com/traefik/">Traefik Docker Container</a>, in</p>]]></description><link>https://blog.mushdragon.com/start-here/</link><guid isPermaLink="false">6123a84bba8be5000124574c</guid><dc:creator><![CDATA[Orion Mondragon]]></dc:creator><pubDate>Mon, 23 Aug 2021 16:30:55 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1519389950473-47ba0277781c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fHRlY2h8ZW58MHx8fHwxNjI5OTA5Mzc2&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1519389950473-47ba0277781c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fHRlY2h8ZW58MHx8fHwxNjI5OTA5Mzc2&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="How To Use This Site"><p>The goal I had in mind when creating this site was to document all of my current works as well as make an easy to follow set of guides for anyone, with any skill set, to replicate. Nearly ALL of my guides will be utilizing the <a href="https://blog.mushdragon.com/traefik/">Traefik Docker Container</a>, in <a href="https://blog.mushdragon.com/docker-and-docker-compose/">Docker with Docker-Compose</a>, as a baseline configuration so you&apos;ll need to get this running first before proceeding with any other guides. Once this is working, all you&apos;ll need to do is follow any other guide to create your desired container&apos;s docker-compose.yml file and run it for seamless integration without the need for any service restarts or configuration file updates to Traefik or Docker. </p><p>I&apos;ll do my best to keep these guides updated with any new changes or version releases going forward. Please feel free to leave a comment if something isn&apos;t working properly or you&apos;d like to provide feedback on my methods as I am always willing to learn a better way. </p>]]></content:encoded></item><item><title><![CDATA[Wordpress with Traefik]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In this guide we&apos;ll be creating a docker container for <a href="https://wordpress.com">Wordpress</a> with some added flags in our docker-compose.yml file for Traefik to automatically see, generate certs, and start routing to. If you have not configured Traefik yet, please use my <a href="https://blog.mushdragon.com/traefik/">Traefik Configs</a> guide before proceeding.</p>
<p>We&apos;</p>]]></description><link>https://blog.mushdragon.com/wordpress-with-traefik/</link><guid isPermaLink="false">61227b534e4d5e000185ba45</guid><dc:creator><![CDATA[Orion Mondragon]]></dc:creator><pubDate>Mon, 23 Aug 2021 05:00:00 GMT</pubDate><media:content url="https://blog.mushdragon.com/content/images/2021/08/WordPress-Logo-2008-present.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.mushdragon.com/content/images/2021/08/WordPress-Logo-2008-present.png" alt="Wordpress with Traefik"><p>In this guide we&apos;ll be creating a docker container for <a href="https://wordpress.com">Wordpress</a> with some added flags in our docker-compose.yml file for Traefik to automatically see, generate certs, and start routing to. If you have not configured Traefik yet, please use my <a href="https://blog.mushdragon.com/traefik/">Traefik Configs</a> guide before proceeding.</p>
<p>We&apos;ll be using mysql and wordpress in our docker-compose.yml file. We&apos;ll also use the &quot;proxy&quot; network to communicate with our Traefik container as well as create the &quot;wordpress&quot; network that the wordpress container will use to communicate with its mysql instance so that mysql isn&apos;t exposed externally to anything.</p>
<p>Create the &quot;wordpress&quot; network</p>
<pre><code class="language-text">docker network create wordpress
</code></pre>
<p>Then create your docker-compose.yml with your favorite text editor</p>
<pre><code class="language-text">vim docker-compose.yml
</code></pre>
<p>Paste the below configs</p>
<pre><code class="language-text">version: &apos;3.7&apos;

services:
  db:
    image: &quot;sql:8.0.22&quot;
    container_name: &quot;db&quot;
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=db
      - MYSQL_ROOT_PASSWORD=changeme
      - MYSQL_USER=db
      - MYSQL_PASSWORD=changeme
    volumes:
      - &quot;path/to/db/files&quot;:/var/lib/mysql
    command: &apos;--default-authentication-plugin=sql_native_password&apos;
    networks:
      - wordpress

  wordpress:
    depends_on:
      - db
    image: &quot;wordpress:latest&quot;
    container_name: &quot;db&quot;
    restart: unless-stopped
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=db
      - WORDPRESS_DB_PASSWORD=changeme
      - WORDPRESS_DB_NAME=db
    volumes:
      - &quot;path/to/html/files&quot;:/var/www/html
      - &quot;path-to-file&quot;/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - proxy
      - wordpress
    labels:
      - &quot;traefik.enable=true&quot;
      - &quot;traefik.docker.network=proxy&quot;
      - &quot;traefik.http.routers.wordpress-secure.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.wordpress-secure.rule=Host(`yourdomain`)&quot;
      - &quot;traefik.http.routers.wordpress-secure.tls.certresolver=letsencrypt&quot;
networks:
  proxy:
    external: true
  wordpress:
</code></pre>
<p>Now we just run</p>
<pre><code class="language-text">docker-compose up -d
</code></pre>
<p>And...<em><strong>That&apos;s it</strong></em>!</p>
<p>After some time, you should be able to navigate to <a href="https://yourdomain/wp-admin">https://yourdomain/wp-admin</a> in your browser to finish your new Wordpress setup with a shiny new SSL certificate already in use.</p>
<h4 id="notes">Notes:</h4>
<p>In this file we&apos;ve added a volume for the &quot;uploads.ini&quot; file. The reason for this is so you don&apos;t have any issues with uploading images to your website that are over the (very small) default limit.</p>
<p>uploads.ini</p>
<pre><code class="language-text">file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
</code></pre>
<p>The configuration above will allow up to 500Mb files to be uploaded to your site. You probably don&apos;t need anything that large uploaded, so feel free to adjust to your needs.</p>
<p>You&apos;ll also want to ensure that you update the &quot;yourdomain&quot; and &quot;path-to..&quot; sections to match your installation.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[BitWarden With Traefik]]></title><description><![CDATA[<p>This guide will configure and start a working docker image with BitWarden. BitWarden is a fully-loaded password management suite that I have used for a few years now. It has browser/phone compatibility and will auto fill any password that I store into it for me. It&apos;s essentially</p>]]></description><link>https://blog.mushdragon.com/bitwarden/</link><guid isPermaLink="false">6122d588ba8be500012455c6</guid><dc:creator><![CDATA[Orion Mondragon]]></dc:creator><pubDate>Mon, 23 Aug 2021 04:17:20 GMT</pubDate><media:content url="https://blog.mushdragon.com/content/images/2021/08/bitwarden-logo.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mushdragon.com/content/images/2021/08/bitwarden-logo.png" alt="BitWarden With Traefik"><p>This guide will configure and start a working docker image with BitWarden. BitWarden is a fully-loaded password management suite that I have used for a few years now. It has browser/phone compatibility and will auto fill any password that I store into it for me. It&apos;s essentially is the paid version of Last Pass but <em>free</em> (open source). I would encourage you to check out their site for a complete list of services they offer <a href="https://bitwarden.com">here</a>. This guide will just get the implementation running and ready for use. Any further customization&apos;s should be referenced from BitWarden&apos;s site for accuracy and instruction. </p><p>Make a directory for your BitWarden files, create the docker-compose.yml file and paste in the configuration after updating the necessary fields for your installation</p><!--kg-card-begin: markdown--><pre><code class="language-text">mkdir -p bitwarden/bw-data; cd bitwarden/bw-data
vim docker-compose.yml
</code></pre>
<pre><code class="language-text">version: &apos;3.7&apos;

services:
  bitwarden:
    image: &quot;vaultwarden/server:latest&quot;
    container_name: &quot;bitwarden&quot;
    restart: always
    volumes:
      - ./bw-data:/data
    environment:
      - WEBSOCKET_ENABLED=true
    networks:
      - proxy
    labels:
      - &quot;traefik.enable=true&quot;
      - &quot;traefik.docker.network=proxy&quot;
      # Entry Point for https
      - &quot;traefik.http.routers.bitwarden-secure.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.bitwarden-secure.rule=Host(`bw.yourdomain`)&quot;
      - &quot;traefik.http.routers.bitwarden-secure.service=bitwarden-service&quot;
      - &quot;traefik.http.services.bitwarden-service.loadbalancer.server.port=80&quot;
      # websocket
      - &quot;traefik.http.routers.bitwarden-ws.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.bitwarden-ws.rule=Host(`bw.yourdomain`) &amp;&amp; Path(`/notifications/hub`)&quot;
      - &quot;traefik.http.middlewares.bitwarden-ws=bw-stripPrefix@file&quot;
      - &quot;traefik.http.routers.bitwarden-ws.service=bitwarden-websocket&quot;
      - &quot;traefik.http.services.bitwarden-websocket.loadbalancer.server.port=3012&quot;
      
networks:
  proxy:
    external: true

</code></pre>
<!--kg-card-end: markdown--><p>In this file you&apos;ll just need to update the lines that contain &quot;bw.yourdomain&quot; with <em><strong>your</strong></em> domain name. I&apos;ve added a sample docker-compose.yml file for reference of what the file should look like once completed:</p><!--kg-card-begin: markdown--><pre><code>version: &apos;3.7&apos;

services:
  bitwarden:
    image: &quot;vaultwarden/server:latest&quot;
    container_name: &quot;bitwarden&quot;
    restart: always
    volumes:
      - ./bw-data:/data
    environment:
      - WEBSOCKET_ENABLED=true
    networks:
      - proxy
    labels:
      - &quot;traefik.enable=true&quot;
      - &quot;traefik.docker.network=proxy&quot;
      # Entry Point for https
      - &quot;traefik.http.routers.bitwarden-secure.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.bitwarden-secure.rule=Host(`bw.mycooldomain.net`)&quot;
      - &quot;traefik.http.routers.bitwarden-secure.service=bitwarden-service&quot;
      - &quot;traefik.http.services.bitwarden-service.loadbalancer.server.port=80&quot;
      # websocket
      - &quot;traefik.http.routers.bitwarden-ws.entrypoints=websecure&quot;
      - &quot;traefik.http.routers.bitwarden-ws.rule=Host(`bw.mycooldomain.net`) &amp;&amp; Path(`/notifications/hub`)&quot;
      - &quot;traefik.http.middlewares.bitwarden-ws=bw-stripPrefix@file&quot;
      - &quot;traefik.http.routers.bitwarden-ws.service=bitwarden-websocket&quot;
      - &quot;traefik.http.services.bitwarden-websocket.loadbalancer.server.port=3012&quot;
      
networks:
  proxy:
    external: true

</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Run</p>
<pre><code class="language-text">docker-compose up -d
</code></pre>
<p>Give the installation about 10 minutes to complete before attempting to access your portal. One way to check whether the services have started is to open your traefik dashboard and watch for your &quot;routers&quot; and &quot;services&quot; sections to go up in count:</p>
<p><img src="https://blog.mushdragon.com/content/images/2021/08/Screenshot-from-2021-08-23-00-03-30.png" alt="BitWarden With Traefik" loading="lazy"></p>
<!--kg-card-end: markdown--><p>In the mean time, we&apos;ll need to make some changes to the config.json file. Within the &quot;bitwarden/bw-data&quot; path we just created. Below is the sample configuration for bw.mycooldomain.net:</p><!--kg-card-begin: markdown--><pre><code class="language-text">

  &quot;domain&quot;: &quot;http://bw.mycooldomain.net&quot;, #&lt;--change
  &quot;sends_allowed&quot;: true,
  &quot;disable_icon_download&quot;: false,
  &quot;signups_allowed&quot;: true,
  &quot;signups_verify&quot;: false,
  &quot;signups_verify_resend_time&quot;: 3600,
  &quot;signups_verify_resend_limit&quot;: 6,
  &quot;invitations_allowed&quot;: true,
  &quot;password_iterations&quot;: 100000,
  &quot;show_password_hint&quot;: false,
  &quot;admin_token&quot;: &quot;&quot;, #&lt;---------------------Add token hash
  &quot;invitation_org_name&quot;: &quot;bw.mycooldomain&quot;, #&lt;--change
  &quot;ip_header&quot;: &quot;X-Real-IP&quot;,
  &quot;icon_cache_ttl&quot;: 2592000,
  &quot;icon_cache_negttl&quot;: 259200,
  &quot;icon_download_timeout&quot;: 10,
  &quot;icon_blacklist_non_global_ips&quot;: true,
  &quot;disable_2fa_remember&quot;: false,
  &quot;authenticator_disable_time_drift&quot;: false,
  &quot;require_device_email&quot;: false,
  &quot;reload_templates&quot;: false,
  &quot;log_timestamp_format&quot;: &quot;%Y-%m-%d %H:%M:%S.%3f&quot;,
  &quot;disable_admin_token&quot;: false,
  &quot;_enable_yubico&quot;: true,
  &quot;_enable_duo&quot;: false,
  &quot;_enable_smtp&quot;: true,
  &quot;smtp_host&quot;: &quot;&quot;,
  &quot;smtp_ssl&quot;: true,
  &quot;smtp_explicit_tls&quot;: false,
  &quot;smtp_port&quot;: ,
  &quot;smtp_from&quot;: &quot;&quot;,
  &quot;smtp_from_name&quot;: &quot;&quot;,
  &quot;smtp_username&quot;: &quot;&quot;,
  &quot;smtp_password&quot;: &quot;&quot;,
  &quot;smtp_auth_mechanism&quot;: &quot;&quot;,
  &quot;smtp_timeout&quot;: 15,
  &quot;smtp_accept_invalid_certs&quot;: false,
  &quot;smtp_accept_invalid_hostnames&quot;: false,
  &quot;_enable_email_2fa&quot;: true,
  &quot;email_token_size&quot;: 6,
  &quot;email_expiration_time&quot;: 600,
  &quot;email_attempts_limit&quot;: 3
}

</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Create another password hash</p>
<pre><code class="language-text">htpasswd -nb admin &lt;password&gt;
</code></pre>
<p>Example</p>
<pre><code>htpasswd -nb admin mypassword
admin:$apr1$bDYpIv27$D8nt54IltqswqV/K5s8g20
</code></pre>
<p>Remember that we <em><strong>only</strong></em> need the password hash here so remove the</p>
<pre><code>admin:
</code></pre>
<p>that precedes the hash before pasting it into your configuration.</p>
<!--kg-card-end: markdown--><p>Save the file and restart BitWarden to login to the portal with your new password hash at bw.yourdomain/admin in your browser. From here, you&apos;ll need to add smtp information to send out email invitations as well as email confirmations for new account creation. I use <a href="https://support.google.com/a/answer/176600?hl=en">Google&apos;s SMTP</a> services for my configuration. Once you&apos;re through, test the email settings to just added and verify email receipt.</p><figure class="kg-card kg-image-card"><img src="https://blog.mushdragon.com/content/images/2021/08/smtp-settings-done.png" class="kg-image" alt="BitWarden With Traefik" loading="lazy" width="830" height="652" srcset="https://blog.mushdragon.com/content/images/size/w600/2021/08/smtp-settings-done.png 600w, https://blog.mushdragon.com/content/images/2021/08/smtp-settings-done.png 830w" sizes="(min-width: 720px) 720px"></figure><p>You are now ready to access your BitWarden Portal and register for an account! Go to https://bw.yourdomain (without the &quot;/admin&quot;) to create your account. Your BitWarden Server will send out a confirmation email using the smtp server you just created so you can confirm and login. If you already have a BitWarden account, you can export your entire password vault and import it here (like I did) to start using your own server instead of BitWarden&apos;s public servers. Refer to BitWarden&apos;s documentation for instructions on this process (linked above) if you are unsure how to accomplish this.</p>]]></content:encoded></item></channel></rss>